From 1c27bc9e495468583f8b0fc346645cb5fcba977e Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Aug 2025 16:35:25 +0200 Subject: [PATCH 01/29] Updated on 2026-08-14 --- .../data/transaction/DefaultWalletAddressServiceRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt index e22b05cb02..10dba2b58b 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt @@ -50,7 +50,7 @@ class DefaultWalletAddressServiceRepository( ) if (walletManager is NameResolver) { - walletManager.reverseResolve(address.toByteArray()) + walletManager.reverseResolve(address) } else { ReverseResolveAddressResult.NotSupported } From 2cc5292f885e16de0f52391c79b3158f74fca3f0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Aug 2025 08:49:45 +0200 Subject: [PATCH 02/29] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index 418aa40d43..ea4cc8e58c 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,7 +5,7 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "releases-5.28-1206" +tangemBlockchainSdk = "releases-5.28-1207" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "releases-5.28-559" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From 07e98782d5578c83a24aeba4e4f95972eac7725b Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Aug 2025 16:14:45 +0500 Subject: [PATCH 03/29] Updated on 2026-08-14 --- .../DefaultTransactionRepository.kt | 20 +++++++++++-------- .../usecase/ValidateTransactionUseCase.kt | 18 ++++++++--------- .../v2/send/confirm/model/SendConfirmModel.kt | 12 +++++++++-- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index 7179221efb..437fbe7c78 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -240,15 +240,19 @@ internal class DefaultTransactionRepository( val validator = walletManager as? TransactionValidator if (validator != null) { - val transactionData = walletManager.createTransaction( - amount = amount, - fee = fee ?: Fee.Common(amount = amount), - destination = destination, - ).copy( - extras = getMemoExtras(networkId = network.rawId, memo = memo), - ) + try { + val transactionData = walletManager.createTransaction( + amount = amount, + fee = fee ?: Fee.Common(amount = amount), + destination = destination, + ).copy( + extras = getMemoExtras(networkId = network.rawId, memo = memo), + ) - validator.validate(transactionData = transactionData) + validator.validate(transactionData = transactionData) + } catch (ex: Exception) { + Result.failure(ex) + } } else { Timber.e("${walletManager?.wallet?.blockchain} does not support transaction validation") Result.success(Unit) diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateTransactionUseCase.kt index 499e222199..64db5bebf9 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateTransactionUseCase.kt @@ -21,14 +21,12 @@ class ValidateTransactionUseCase( destination: String, userWalletId: UserWalletId, network: Network, - ): Either = Either.catch { - transactionRepository.validateTransaction( - amount = amount, - fee = fee, - memo = memo, - destination = destination, - userWalletId = userWalletId, - network = network, - ).fold(onSuccess = { Unit.right() }, onFailure = { it.left() }) - } + ): Either = transactionRepository.validateTransaction( + amount = amount, + fee = fee, + memo = memo, + destination = destination, + userWalletId = userWalletId, + network = network, + ).fold(onSuccess = { Unit.right() }, onFailure = { it.left() }) } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt index 1fb318f5c1..284f09ebbf 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt @@ -139,8 +139,16 @@ internal class SendConfirmModel @Inject constructor( reduceAmountBy = amountState?.reduceAmountBy.orZero(), isIgnoreReduce = amountState?.isIgnoreReduce == true, enteredDestination = destinationUM?.addressTextField?.actualAddress, - fee = feeSelectorUM?.selectedFee, - feeError = (feeUM?.feeSelectorUM as? FeeSelectorUM.Error)?.error, + fee = if (uiState.value.isRedesignEnabled) { + feeUMV2?.selectedFeeItem?.fee + } else { + feeSelectorUM?.selectedFee + }, + feeError = if (uiState.value.isRedesignEnabled) { + (uiState.value.feeSelectorUM as? FeeSelectorUMRedesigned.Error)?.error + } else { + (feeUM?.feeSelectorUM as? FeeSelectorUM.Error)?.error + }, ) private var sendIdleTimer: Long = 0L From 0f9ee58183f1bf1bf7ba293af469cea9a6d846a9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Aug 2025 16:15:09 +0500 Subject: [PATCH 04/29] Updated on 2026-08-14 --- .../features/send/v2/sendnft/DefaultNFTSendComponent.kt | 2 +- .../tangem/features/send/v2/sendnft/model/NFTSendModel.kt | 7 +++++++ .../send/v2/sendnft/success/NFTSendSuccessComponent.kt | 3 ++- .../send/v2/sendnft/success/model/NFTSendSuccessModel.kt | 8 ++------ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt index b23440cfeb..2a66af2d55 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt @@ -111,7 +111,7 @@ internal class DefaultNFTSendComponent @AssistedInject constructor( val stackState by childStack.subscribeAsState() val state by model.uiState.collectAsStateWithLifecycle() - BackHandler(onBack = ::onChildBack) + BackHandler(onBack = model::onBackClick) SendContent( navigationUM = state.navigationUM, stackState = stackState, diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt index 90a8753b4a..11d9d7ba78 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/model/NFTSendModel.kt @@ -28,6 +28,7 @@ import com.tangem.domain.transaction.error.GetFeeError import com.tangem.domain.transaction.usecase.CreateNFTTransferTransactionUseCase import com.tangem.domain.transaction.usecase.GetFeeUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase +import com.tangem.features.nft.entity.NFTSendSuccessTrigger import com.tangem.features.send.v2.api.NFTSendComponent import com.tangem.features.send.v2.api.SendFeatureToggles import com.tangem.features.send.v2.api.entity.FeeSelectorUM @@ -74,6 +75,7 @@ internal class NFTSendModel @Inject constructor( private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val alertFactory: SendConfirmAlertFactory, private val sendFeatureToggles: SendFeatureToggles, + private val nftSendSuccessTrigger: NFTSendSuccessTrigger, ) : Model(), SendNFTComponentCallback, NFTSendSuccessComponent.ModelCallback { val params: NFTSendComponent.Params = paramsContainer.require() @@ -119,6 +121,11 @@ internal class NFTSendModel @Inject constructor( } override fun onBackClick() { + if (currentRouteFlow.value == ConfirmSuccess) { + modelScope.launch { + nftSendSuccessTrigger.triggerSuccessNFTSend() + } + } router.pop() } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/NFTSendSuccessComponent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/NFTSendSuccessComponent.kt index 76f7329658..e651f4f298 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/NFTSendSuccessComponent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/NFTSendSuccessComponent.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.tangem.common.ui.navigationButtons.NavigationModelCallback import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.child import com.tangem.core.decompose.model.getOrCreateModel @@ -85,7 +86,7 @@ internal class NFTSendSuccessComponent @AssistedInject constructor( val callback: ModelCallback, ) - interface ModelCallback { + interface ModelCallback : NavigationModelCallback { fun onResult(nftSendUM: NFTSendUM) } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/model/NFTSendSuccessModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/model/NFTSendSuccessModel.kt index 9352ec6898..7fc3951005 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/model/NFTSendSuccessModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/success/model/NFTSendSuccessModel.kt @@ -1,7 +1,6 @@ package com.tangem.features.send.v2.sendnft.success.model import androidx.compose.runtime.Stable -import com.tangem.common.routing.AppRouter import com.tangem.common.ui.navigationButtons.NavigationButton import com.tangem.common.ui.navigationButtons.NavigationUM import com.tangem.core.analytics.api.AnalyticsEventHandler @@ -31,7 +30,6 @@ internal class NFTSendSuccessModel @Inject constructor( paramsContainer: ParamsContainer, override val dispatchers: CoroutineDispatcherProvider, private val analyticsEventHandler: AnalyticsEventHandler, - private val appRouter: AppRouter, private val urlOpener: UrlOpener, private val shareManager: ShareManager, ) : Model() { @@ -64,16 +62,14 @@ internal class NFTSendSuccessModel @Inject constructor( isValid = true, ), ) - appRouter.pop() + params.callback.onBackClick() }, primaryButton = NavigationButton( textReference = resourceReference(R.string.common_close), iconRes = null, isEnabled = true, isHapticClick = false, - onClick = { - appRouter.pop() - }, + onClick = params.callback::onBackClick, ), prevButton = null, secondaryPairButtonsUM = NavigationButton( From 12cf1979fd8c88f4aed106933062b795f9170c55 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Aug 2025 13:08:32 +0500 Subject: [PATCH 05/29] Updated on 2026-08-14 --- .../v2/subcomponents/destination/model/SendDestinationModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt index d68153cd9e..8d73d20253 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt @@ -106,8 +106,8 @@ internal class SendDestinationModel @Inject constructor( ), ) } - initSenderAddress() } + initSenderAddress() } fun updateState(destinationUM: DestinationUM) { From 5805603e9a2099da5a7c340d624c21ed267988fb Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Aug 2025 12:47:58 +0500 Subject: [PATCH 06/29] Updated on 2026-08-14 --- .../ui/amountScreen/converters/AmountStateConverter.kt | 6 ++++++ .../converters/field/AmountFieldChangeTransformer.kt | 8 ++++---- .../amountScreen/converters/field/AmountFieldConverter.kt | 2 +- .../ui/amountScreen/preview/AmountStatePreviewData.kt | 7 +++++++ .../com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt | 6 +++++- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt index 2b60066ea7..23a9482b9e 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt @@ -120,6 +120,12 @@ class AmountStateConverterV2( val crypto = maxEnterAmount.amount.format { crypto(cryptoCurrencyStatus.currency) } val noFeeRate = cryptoCurrencyStatus.value.fiatRate.isNullOrZero() + if (cryptoCurrencyStatus.value is CryptoCurrencyStatus.Loading) { + return AmountState.Empty( + isRedesignEnabled = isRedesignEnabled, + ) + } + return AmountState.Data( title = value.title, availableBalance = if (isRedesignEnabled) { diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldChangeTransformer.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldChangeTransformer.kt index 4a490037ae..4187ce21d2 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldChangeTransformer.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldChangeTransformer.kt @@ -39,7 +39,7 @@ class AmountFieldChangeTransformer( val amountTextField = prevState.amountTextField - if (value.isEmpty()) return prevState.emptyState() + if (value.isEmpty()) return prevState.emptyState(maxEnterAmount.fiatRate) val cryptoDecimals = amountTextField.cryptoAmount.decimals val fiatDecimals = amountTextField.fiatAmount.decimals @@ -75,7 +75,7 @@ class AmountFieldChangeTransformer( error = when { isExceedBalance -> resourceReference(R.string.send_validation_amount_exceeds_balance) isLessThanMinimumIfProvided -> { - val minimumAmount = minimumTransactionAmount?.amount.format { + val minimumAmount = minimumTransactionAmount.amount.format { crypto(cryptoCurrencyStatus.currency) } @@ -96,7 +96,7 @@ class AmountFieldChangeTransformer( ) } - private fun AmountState.Data.emptyState(): AmountState.Data { + private fun AmountState.Data.emptyState(fiatRate: BigDecimal?): AmountState.Data { return copy( isPrimaryButtonEnabled = false, reduceAmountBy = BigDecimal.ZERO, @@ -104,7 +104,7 @@ class AmountFieldChangeTransformer( value = "", fiatValue = "", cryptoAmount = amountTextField.cryptoAmount.copy(value = BigDecimal.ZERO), - fiatAmount = amountTextField.fiatAmount.copy(value = BigDecimal.ZERO), + fiatAmount = amountTextField.fiatAmount.copy(value = if (fiatRate != null) BigDecimal.ZERO else null), isError = false, keyboardOptions = KeyboardOptions( imeAction = ImeAction.None, diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldConverter.kt index 9c42eeac7e..f0baf3a1e9 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountFieldConverter.kt @@ -100,8 +100,8 @@ class AmountFieldConverterV2( val cryptoAmount = cryptoDecimal.convertToAmount(cryptoCurrencyStatus.currency) val fiatRate = cryptoCurrencyStatus.value.fiatRate val (fiatValue, fiatDecimal) = when { - value.isEmpty() -> "" to BigDecimal.ZERO fiatRate.isNullOrZero() -> "" to null + value.isEmpty() -> "" to BigDecimal.ZERO else -> { val fiatDecimal = fiatRate?.multiply(cryptoDecimal) val fiatValue = fiatDecimal?.parseBigDecimal(FIAT_DECIMALS).orEmpty() diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/preview/AmountStatePreviewData.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/preview/AmountStatePreviewData.kt index a2db25c4dd..281270d273 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/preview/AmountStatePreviewData.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/preview/AmountStatePreviewData.kt @@ -93,6 +93,13 @@ object AmountStatePreviewData { amountTextField = amountWithValueState.amountTextField.copy(isFiatValue = false), ) + val amountStateV2WithoutRates = amountState.copy( + amountTextField = amountState.amountTextField.copy( + fiatAmount = amountState.amountTextField.fiatAmount.copy( + value = null, + ), + ), + ) val amountErrorState = amountWithValueState.copy( amountTextField = amountWithValueState.amountTextField.copy( isError = true, diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt index 96635bbc45..6360babb2d 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.BottomCenter import androidx.compose.ui.Alignment.Companion.TopCenter import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.graphicsLayer @@ -141,7 +142,6 @@ private fun AmountSecondary(amountUM: AmountState, onCurrencyChange: (Boolean) - AmountFieldCurrencyInfo( amountUM = amountUM, onCurrencyChange = onCurrencyChange, - ) AmountFieldError( isError = amountUM.amountTextField.isError, @@ -157,6 +157,8 @@ private fun AmountSecondary(amountUM: AmountState, onCurrencyChange: (Boolean) - @Composable private fun BoxScope.AmountFieldCurrencyInfo(amountUM: AmountState.Data, onCurrencyChange: (Boolean) -> Unit) { + val isFiatAvailable = amountUM.amountTextField.fiatAmount.value != null + Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp), @@ -168,6 +170,7 @@ private fun BoxScope.AmountFieldCurrencyInfo(amountUM: AmountState.Data, onCurre indication = null, onClick = { onCurrencyChange(!amountUM.amountTextField.isFiatValue) }, ) + .alpha(if (isFiatAvailable) 1f else 0f) .padding(4.dp), ) { val iconRotateState by animateFloatAsState( @@ -327,6 +330,7 @@ private class AmountFieldV2PreviewProvider : PreviewParameterProvider Date: Tue, 26 Aug 2025 15:58:52 +0300 Subject: [PATCH 07/29] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index ea4cc8e58c..e204e5cd97 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,7 +5,7 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "releases-5.28-1207" +tangemBlockchainSdk = "releases-5.28-1208" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "releases-5.28-559" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From bce16bf69280beaa4e85e7fb1da98fa32aefafe6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Aug 2025 10:34:28 +0200 Subject: [PATCH 08/29] Updated on 2026-08-14 --- .../features/tokenreceive/ui/TokenReceiveWarningContent.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt index 2aa8aeff9c..2d85ca786c 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt @@ -21,6 +21,7 @@ import com.tangem.core.ui.components.SecondaryButton import com.tangem.core.ui.components.SpacerH import com.tangem.core.ui.components.SpacerH12 import com.tangem.core.ui.components.SpacerH24 +import com.tangem.core.ui.components.SpacerW6 import com.tangem.core.ui.components.currency.icon.CurrencyIcon import com.tangem.core.ui.components.currency.icon.CurrencyIconState import com.tangem.core.ui.extensions.stringResourceSafe @@ -99,6 +100,8 @@ fun WarningBlock(networkName: String, networkIcon: Int, modifier: Modifier = Mod contentDescription = null, ) + SpacerW6() + Text( textAlign = TextAlign.Center, text = stringResourceSafe(R.string.domain_receive_assets_onboarding_network_name, networkName), From 6d461cf400ad1034c7b6013d453267f3cd0d96cb Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Aug 2025 16:27:33 +0200 Subject: [PATCH 09/29] Updated on 2026-08-14 --- core/res/src/main/res/values/strings.xml | 32 +++++ .../DefaultWalletAddressServiceRepository.kt | 2 +- .../domain/models/TokenReceiveConfig.kt | 3 +- .../GetReverseResolvedEnsAddressUseCase.kt | 8 +- .../impl/model/MarketsPortfolioModel.kt | 8 +- .../nft/receive/model/NFTReceiveModel.kt | 7 +- .../component/DefaultTokenReceiveComponent.kt | 2 +- .../component/TokenReceiveQrCodeComponent.kt | 3 +- .../tokenreceive/entity/ReceiveAddress.kt | 17 ++- .../model/TokenReceiveAssetsModel.kt | 1 - .../tokenreceive/model/TokenReceiveModel.kt | 49 ++++++-- .../model/TokenReceiveQrCodeModel.kt | 5 +- .../ui/TokenReceiveAssetsContent.kt | 112 ++++++++++-------- .../tokenreceive/ui/state/ReceiveAssetsUM.kt | 1 - .../tokendetails/model/TokenDetailsModel.kt | 7 +- .../WalletCurrencyActionsClickIntents.kt | 7 +- 16 files changed, 180 insertions(+), 84 deletions(-) diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index dc9ced8f5c..6eca54cb33 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -12,12 +12,20 @@ Set a %s-digit Access Code to unlock your wallet. Create Access Code Access code + You cannot create more than %1$s accounts. Archive one to add new. + Can’t add new account + Account archived + Archived accounts Recover + You’re about to recover “%1$s”. + Recover account Archived + Account created Archive account Archive You are archiving this account, but you can always get it back. Account + Account saved Account #%s — used for address derivation. Add account Save @@ -26,6 +34,9 @@ New account Add account Edit account + %1$s in %2$s + Account recovered + Long tap on an account to reorder accounts Keep Editing Discard Are you sure you want to discard new account? @@ -117,6 +128,16 @@ Please try again in 30 seconds or scan the card or ring Too many attempts You have disabled biometric authentication on your phone and will not be able to save wallets in the app. To save wallets, please enable the biometric authentication function in your phone settings. + An error occurred while processing your promo code. Please try again later. + Activation error + Your promo code was successfully activated. A bonus of 10 USDT in Bitcoin will be credited to your account within 14 days. + Promo Code Activated + This promo code has already been used and cannot be activated again. + Code unavailable + This promo code is not valid and cannot be activated. + Invalid code + A Bitcoin address is required to receive the bonus. Please add one to your wallet and retry the activation. + Bitcoin address required Start backup process Use a bank card or other payment methods @@ -152,6 +173,7 @@ Not enough ADA Accept Access denied + Accounts Add Add to portfolio Add token @@ -234,11 +256,17 @@ In progress Later %1$s left + Legacy Bitcoin Locked Main network month Network fee Amount sent will be reduced by %1$s (%2$s) to cover the selected fee level + + %d network + %d networks + + New address Next NFT No @@ -363,6 +391,7 @@ Details Check your internet connection or switch to a different network Terms of service + Default Address Receive assets Sending assets in other networks will result in permanent loss. %s network @@ -717,6 +746,9 @@ Join Now Share your code - earn 5 USDT per sale. Your friend gets 10% OFF. Get REWARDS for every friend! + Buy crypto + Enjoy zero fees when purchasing crypto via SEPA transfer. + Buy Crypto with SEPA Set up a single access code to protect all your devices. Protect Set an individual access code for each card or ring later. diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt index 10dba2b58b..23990f9704 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt @@ -31,7 +31,7 @@ class DefaultWalletAddressServiceRepository( blockchain = blockchain, derivationPath = network.derivationPath.value, ) - walletManager?.wallet?.ens + walletManager?.wallet?.ens.takeIf { it.isNullOrEmpty().not() } } } diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/TokenReceiveConfig.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/TokenReceiveConfig.kt index 728496ef05..d884942aeb 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/TokenReceiveConfig.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/TokenReceiveConfig.kt @@ -19,10 +19,9 @@ data class TokenReceiveConfig( data class ReceiveAddressModel( val nameService: NameService, val value: String, - val displayName: String, ) { enum class NameService { - Default, Ens + Default, Legacy, Ens } } diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetReverseResolvedEnsAddressUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetReverseResolvedEnsAddressUseCase.kt index 93f053818e..6d8eadf4e0 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetReverseResolvedEnsAddressUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/GetReverseResolvedEnsAddressUseCase.kt @@ -35,7 +35,13 @@ class GetReverseResolvedEnsAddressUseCase(private val walletAddressServiceReposi return when (reverseResolveAddressResult) { is ReverseResolveAddressResult.Error -> EnsAddress.Error(reverseResolveAddressResult.error) ReverseResolveAddressResult.NotSupported -> EnsAddress.NotSupported - is ReverseResolveAddressResult.Resolved -> EnsAddress.Address(reverseResolveAddressResult.name) + is ReverseResolveAddressResult.Resolved -> { + if (reverseResolveAddressResult.name.isEmpty()) { + EnsAddress.NotSupported + } else { + EnsAddress.Address(reverseResolveAddressResult.name) + } + } } } } \ No newline at end of file diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt index 60673724c0..f7a23493ed 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt @@ -26,6 +26,7 @@ import com.tangem.domain.models.ReceiveAddressModel import com.tangem.domain.models.TokenReceiveConfig import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network +import com.tangem.domain.models.network.NetworkAddress import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.isMultiCurrency @@ -399,16 +400,17 @@ internal class MarketsPortfolioModel @Inject constructor( ReceiveAddressModel( nameService = ReceiveAddressModel.NameService.Ens, value = ens, - displayName = ens, ), ) } addresses.availableAddresses.map { address -> add( ReceiveAddressModel( - nameService = ReceiveAddressModel.NameService.Default, + nameService = when (address.type) { + NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.NameService.Default + NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.NameService.Legacy + }, value = address.value, - displayName = "${cryptoCurrency.name} (${cryptoCurrency.symbol})", ), ) } diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt index 632959d7e8..0439b74aea 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt @@ -209,16 +209,17 @@ internal class NFTReceiveModel @Inject constructor( ReceiveAddressModel( nameService = ReceiveAddressModel.NameService.Ens, value = ens, - displayName = ens, ), ) } addresses.availableAddresses.map { address -> add( ReceiveAddressModel( - nameService = ReceiveAddressModel.NameService.Default, + nameService = when (address.type) { + NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.NameService.Default + NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.NameService.Legacy + }, value = address.value, - displayName = cryptoCurrency.symbol, ), ) } diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/DefaultTokenReceiveComponent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/DefaultTokenReceiveComponent.kt index 83b0cf3b6f..a6914ac4c4 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/DefaultTokenReceiveComponent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/DefaultTokenReceiveComponent.kt @@ -77,7 +77,7 @@ internal class DefaultTokenReceiveComponent @AssistedInject constructor( is TokenReceiveRoutes.QrCode -> TokenReceiveQrCodeComponent( appComponentContext = appComponentContext, params = TokenReceiveQrCodeComponent.TokenReceiveQrCodeParams( - network = model.params.config.cryptoCurrency.network.name, + cryptoCurrency = model.params.config.cryptoCurrency, address = model.state.value.addresses[config.addressId] ?: error("Address has to be there"), callback = model, onDismiss = ::dismiss, diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt index 8191f9a208..3eef391fc6 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.features.tokenreceive.entity.ReceiveAddress import com.tangem.features.tokenreceive.model.TokenReceiveQrCodeModel import com.tangem.features.tokenreceive.ui.TokenReceiveQrCodeContent @@ -31,7 +32,7 @@ internal class TokenReceiveQrCodeComponent( data class TokenReceiveQrCodeParams( val id: Int, - val network: String, + val cryptoCurrency: CryptoCurrency, val address: ReceiveAddress, val callback: TokenReceiveQrCodeModelCallback, val onDismiss: () -> Unit, diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt index 960dda1224..0157541c0c 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt @@ -1,16 +1,27 @@ package com.tangem.features.tokenreceive.entity +import androidx.compose.runtime.Immutable import com.tangem.core.ui.extensions.TextReference internal data class ReceiveAddress( val value: String, val type: Type, ) { + + @Immutable sealed interface Type { data object Ens : Type - data class Default( - val displayName: TextReference, - ) : Type + sealed interface Primary : Type { + + val displayName: TextReference + + data class Default( + val title: TextReference?, + override val displayName: TextReference, + ) : Primary + + data class Legacy(override val displayName: TextReference) : Primary + } } } \ No newline at end of file diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt index bf37b011e3..fb162c4c53 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt @@ -44,7 +44,6 @@ internal class TokenReceiveAssetsModel @Inject constructor( showMemoDisclaimer = params.showMemoDisclaimer, isEnsResultLoading = false, notificationConfigs = params.notificationConfigs, - fullName = params.fullName, ), ) diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt index 183d11d046..0c7e6de0bf 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt @@ -12,8 +12,8 @@ import com.tangem.core.ui.R import com.tangem.core.ui.clipboard.ClipboardManager import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter import com.tangem.core.ui.components.notifications.NotificationConfig +import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference -import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.wrappedList import com.tangem.domain.models.Asset import com.tangem.domain.models.ReceiveAddressModel @@ -25,6 +25,8 @@ import com.tangem.domain.transaction.usecase.GetReverseResolvedEnsAddressUseCase import com.tangem.features.tokenreceive.TokenReceiveComponent import com.tangem.features.tokenreceive.component.TokenReceiveModelCallback import com.tangem.features.tokenreceive.entity.ReceiveAddress +import com.tangem.features.tokenreceive.entity.ReceiveAddress.Type.Ens +import com.tangem.features.tokenreceive.entity.ReceiveAddress.Type.Primary import com.tangem.features.tokenreceive.route.TokenReceiveRoutes import com.tangem.features.tokenreceive.ui.state.TokenReceiveUM import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -103,17 +105,33 @@ internal class TokenReceiveModel @Inject constructor( } } - private fun mapAddresses(addresses: List): ImmutableMap { + private fun mapAddresses( + addresses: List, + networkName: String, + ): ImmutableMap { + val conditionToUseTitle = addresses.any { it.nameService == ReceiveAddressModel.NameService.Legacy } return buildMap { addresses.mapIndexed { index, model -> val type = when (model.nameService) { ReceiveAddressModel.NameService.Default -> { - ReceiveAddress.Type.Default( - displayName = stringReference(model.displayName), + Primary.Default( + displayName = TextReference.Res( + id = R.string.domain_receive_assets_onboarding_network_name, + formatArgs = wrappedList(networkName), + ), + title = if (conditionToUseTitle) { + TextReference.Res(R.string.domain_receive_assets_default_address) + } else { + null + }, ) } - ReceiveAddressModel.NameService.Ens -> ReceiveAddress.Type.Ens + ReceiveAddressModel.NameService.Ens -> Ens + ReceiveAddressModel.NameService.Legacy -> Primary.Legacy( + displayName = TextReference.Res(R.string.common_legacy_bitcoin_address), + ) } + put( key = index, value = ReceiveAddress( @@ -146,10 +164,18 @@ internal class TokenReceiveModel @Inject constructor( val newEnsAddresses = reverseResolveResult .filterIsInstance() .filterNot { it.name in currentAddressValues } - .map { ensAddress -> ReceiveAddress(value = ensAddress.name, type = ReceiveAddress.Type.Ens) } + .map { ensAddress -> ReceiveAddress(value = ensAddress.name, type = Ens) } val combinedAddresses = (state.value.addresses.values + newEnsAddresses) - .sortedWith(compareByDescending { it.type is ReceiveAddress.Type.Ens }) + .sortedWith( + compareBy { address -> + when (address.type) { + is Ens -> 0 + is Primary.Default -> 1 + is Primary.Legacy -> 2 + } + }, + ) val updatedAddresses = combinedAddresses .mapIndexed { index, address -> index to address } @@ -191,7 +217,10 @@ internal class TokenReceiveModel @Inject constructor( private fun getInitState(): TokenReceiveUM { return TokenReceiveUM( - addresses = mapAddresses(params.config.receiveAddress), + addresses = mapAddresses( + addresses = params.config.receiveAddress, + networkName = params.config.cryptoCurrency.network.name, + ), iconState = iconStateConverter.convert(params.config.cryptoCurrency), network = params.config.cryptoCurrency.network.name, isEnsResultLoading = false, @@ -201,13 +230,13 @@ internal class TokenReceiveModel @Inject constructor( private fun sendCopyActionAnalytic(receiveAddress: ReceiveAddress) { val event = when (receiveAddress.type) { - is ReceiveAddress.Type.Default -> { + is Primary -> { TokenReceiveNewAnalyticsEvent.ButtonCopyAddress( token = getTokenName(), blockchainName = params.config.cryptoCurrency.network.name, ) } - ReceiveAddress.Type.Ens -> { + Ens -> { TokenReceiveNewAnalyticsEvent.ButtonCopyEns( token = getTokenName(), blockchainName = params.config.cryptoCurrency.network.name, diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt index 68246b663f..0a1f5ccddd 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt @@ -6,7 +6,6 @@ import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.ui.extensions.TextReference import com.tangem.features.tokenreceive.component.TokenReceiveQrCodeComponent -import com.tangem.features.tokenreceive.entity.ReceiveAddress import com.tangem.features.tokenreceive.ui.state.QrCodeUM import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow @@ -25,9 +24,9 @@ internal class TokenReceiveQrCodeModel @Inject constructor( internal val state: StateFlow field = MutableStateFlow( QrCodeUM( - network = params.network, + network = params.cryptoCurrency.network.name, addressValue = params.address.value, - addressName = (params.address.type as? ReceiveAddress.Type.Default)?.displayName ?: TextReference.EMPTY, + addressName = TextReference.Str("${params.cryptoCurrency.name} (${params.cryptoCurrency.symbol})"), onCopyClick = { params.callback.onCopyClick(params.id) }, onShareClick = params.callback::onShareClick, ), diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt index 10f41e7e05..84c59aeb20 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.util.fastForEach import com.tangem.common.ui.notifications.NotificationUM import com.tangem.core.res.getStringSafe import com.tangem.core.ui.R +import com.tangem.core.ui.components.SpacerH import com.tangem.core.ui.components.SpacerH12 import com.tangem.core.ui.components.SpacerH8 import com.tangem.core.ui.components.SpacerW12 @@ -36,6 +37,7 @@ import com.tangem.core.ui.components.atoms.text.TextEllipsis import com.tangem.core.ui.components.buttons.small.TangemIconButton import com.tangem.core.ui.components.icons.identicon.IdentIcon import com.tangem.core.ui.components.notifications.Notification +import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.stringResourceSafe @@ -78,7 +80,6 @@ internal fun TokenReceiveAssetsContent(assetsUM: ReceiveAssetsUM) { onOpenQrCodeClick = assetsUM.onOpenQrCodeClick, addresses = assetsUM.addresses, snackbarHostState = snackbarHostState, - fullName = assetsUM.fullName, ) if (assetsUM.isEnsResultLoading) { @@ -125,7 +126,6 @@ private fun AddressBlock( onCopyClick: (id: Int) -> Unit, addresses: ImmutableMap, snackbarHostState: SnackbarHostState, - fullName: String, ) { val hapticFeedback = LocalHapticFeedback.current val coroutineScope = rememberCoroutineScope() @@ -133,8 +133,8 @@ private fun AddressBlock( val resources = context.resources addresses.entries.toList().fastForEach { entry -> - when (entry.value.type) { - is ReceiveAddress.Type.Default -> { + when (val type = entry.value.type) { + is ReceiveAddress.Type.Primary -> { key(entry.key) { AddressItem( onCopyClick = { @@ -152,8 +152,8 @@ private fun AddressBlock( hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) onOpenQrCodeClick(entry.key) }, - fullName = fullName, address = entry.value.value, + primaryType = type, ) SpacerH8() } @@ -184,9 +184,9 @@ private fun AddressBlock( @Composable private fun AddressItem( onOpenQrCodeClick: () -> Unit, - fullName: String, onCopyClick: () -> Unit, address: String, + primaryType: ReceiveAddress.Type.Primary, modifier: Modifier = Modifier, ) { Card( @@ -195,52 +195,68 @@ private fun AddressItem( colors = CardDefaults.cardColors(containerColor = TangemTheme.colors.background.action), onClick = onOpenQrCodeClick, ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 14.dp, horizontal = 12.dp), - verticalAlignment = Alignment.CenterVertically, + Column( + modifier = Modifier.padding(vertical = 14.dp, horizontal = 12.dp), ) { - IdentIcon( - address = address, - modifier = Modifier - .size(size = 36.dp) - .clip(shape = RoundedCornerShape(18.dp)), - ) - - SpacerW12() - - Column(modifier = Modifier.weight(1f)) { - EllipsisText( - text = stringResourceSafe(R.string.domain_receive_assets_onboarding_network_name, fullName), - ellipsis = TextEllipsis.Middle, - color = TangemTheme.colors.text.primary1, - style = TangemTheme.typography.subtitle1, - ) - - EllipsisText( - text = address, - ellipsis = TextEllipsis.Middle, - color = TangemTheme.colors.text.tertiary, - style = TangemTheme.typography.caption2, - ) + when (primaryType) { + is ReceiveAddress.Type.Primary.Default -> { + primaryType.title?.let { + Text( + text = it.resolveReference(), + style = TangemTheme.typography.subtitle2, + color = TangemTheme.colors.text.tertiary, + ) + SpacerH(12.dp) + } + } + is ReceiveAddress.Type.Primary.Legacy -> Unit } - SpacerW12() + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + IdentIcon( + address = address, + modifier = Modifier + .size(size = 36.dp) + .clip(shape = RoundedCornerShape(18.dp)), + ) - TangemIconButton( - modifier = Modifier.size(TangemTheme.dimens.size28), - iconRes = R.drawable.ic_qrcode_new_24, - onClick = onOpenQrCodeClick, - ) + SpacerW12() - SpacerW8() + Column(modifier = Modifier.weight(1f)) { + EllipsisText( + text = primaryType.displayName.resolveReference(), + ellipsis = TextEllipsis.Middle, + color = TangemTheme.colors.text.primary1, + style = TangemTheme.typography.subtitle1, + ) - TangemIconButton( - modifier = Modifier.size(TangemTheme.dimens.size28), - iconRes = R.drawable.ic_copy_new_24, - onClick = onCopyClick, - ) + EllipsisText( + text = address, + ellipsis = TextEllipsis.Middle, + color = TangemTheme.colors.text.tertiary, + style = TangemTheme.typography.caption2, + ) + } + + SpacerW12() + + TangemIconButton( + modifier = Modifier.size(TangemTheme.dimens.size28), + iconRes = R.drawable.ic_qrcode_new_24, + onClick = onOpenQrCodeClick, + ) + + SpacerW8() + + TangemIconButton( + modifier = Modifier.size(TangemTheme.dimens.size28), + iconRes = R.drawable.ic_copy_new_24, + onClick = onCopyClick, + ) + } } } } @@ -318,8 +334,9 @@ private fun Preview_TokenReceiveAssetsContent( private class TokenReceiveAssetsContentProvider : PreviewParameterProvider { val address = ReceiveAddress( value = "0xe5178c7d4d0e861ed2e9414e045b501226b0de8d", - type = ReceiveAddress.Type.Default( + type = ReceiveAddress.Type.Primary.Default( displayName = stringReference("Etherium address"), + title = null, ), ) private val config = ReceiveAssetsUM( @@ -338,7 +355,6 @@ private class TokenReceiveAssetsContentProvider : PreviewParameterProvider diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/state/ReceiveAssetsUM.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/state/ReceiveAssetsUM.kt index 3953389152..905b3c0878 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/state/ReceiveAssetsUM.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/state/ReceiveAssetsUM.kt @@ -12,5 +12,4 @@ internal data class ReceiveAssetsUM( val onCopyClick: (id: Int) -> Unit, val isEnsResultLoading: Boolean, val notificationConfigs: ImmutableList, - val fullName: String, ) \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt index 7f2de4ef2c..ddba4024a8 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt @@ -1089,16 +1089,17 @@ internal class TokenDetailsModel @Inject constructor( ReceiveAddressModel( nameService = ReceiveAddressModel.NameService.Ens, value = ens, - displayName = ens, ), ) } addresses.availableAddresses.map { address -> add( ReceiveAddressModel( - nameService = ReceiveAddressModel.NameService.Default, + nameService = when (address.type) { + NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.NameService.Default + NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.NameService.Legacy + }, value = address.value, - displayName = "${cryptoCurrency.name} (${cryptoCurrency.symbol})", ), ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt index 71d5e76c5e..8e7103d993 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt @@ -673,16 +673,17 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( ReceiveAddressModel( nameService = ReceiveAddressModel.NameService.Ens, value = ens, - displayName = ens, ), ) } networkAddress.availableAddresses.map { address -> add( ReceiveAddressModel( - nameService = ReceiveAddressModel.NameService.Default, + nameService = when (address.type) { + NetworkAddress.Address.Type.Primary -> ReceiveAddressModel.NameService.Default + NetworkAddress.Address.Type.Secondary -> ReceiveAddressModel.NameService.Legacy + }, value = address.value, - displayName = "${cryptoCurrencyStatus.currency.name} (${cryptoCurrencyStatus.currency.symbol})", ), ) } From 289050de3773794a26eab65b6fd326c223d260d9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Aug 2025 14:02:59 +0300 Subject: [PATCH 10/29] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt index 436d1a2ef3..0f9059d367 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt @@ -85,7 +85,7 @@ internal class DeepLinkFactory @Inject constructor( fun checkRoutingReadiness(appRoute: AppRoute) { permittedAppRoute.value = when (appRoute) { AppRoute.Initial, - AppRoute.Home, + is AppRoute.Home, is AppRoute.Welcome, is AppRoute.Disclaimer, is AppRoute.Stories, From 101012938ecf889a1534de1b5a67dc33ae3de962 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Aug 2025 14:03:29 +0300 Subject: [PATCH 11/29] Updated on 2026-08-14 --- .../kotlin/com/tangem/features/home/impl/model/HomeModel.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt b/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt index 70636eda60..10ae9abbf8 100644 --- a/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt +++ b/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt @@ -28,6 +28,7 @@ import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.core.wallets.error.SaveWalletError import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.settings.usercountry.GetUserCountryUseCase import com.tangem.domain.settings.usercountry.models.UserCountry @@ -75,6 +76,7 @@ internal class HomeModel @Inject constructor( private val generateBuyTangemCardLinkUseCase: GenerateBuyTangemCardLinkUseCase, private val urlOpener: UrlOpener, private val userWalletsListManager: UserWalletsListManager, + private val reduxStateHolder: ReduxStateHolder, @GlobalUiMessageSender private val uiMessageSender: UiMessageSender, ) : Model() { @@ -206,6 +208,7 @@ internal class HomeModel @Inject constructor( } }, ifRight = { + reduxStateHolder.onUserWalletSelected(userWallet) setLoading(false) sendSignedInCardAnalyticsEvent(scanResponse) appRouter.replaceAll(AppRoute.Wallet) From 54094ffa2f5050929ea0f4a318cc500372356839 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Aug 2025 16:17:25 +0500 Subject: [PATCH 12/29] Updated on 2026-08-14 --- .../swap/v2/impl/amount/model/SwapAmountModel.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index 3c4c055991..cce6ac9985 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -105,10 +105,10 @@ internal class SwapAmountModel @Inject constructor( private var secondaryMaximumAmountBoundary: EnterAmountBoundary? = null private var secondaryMinimumAmountBoundary: EnterAmountBoundary? = null - var userCountry: UserCountry = UserCountry.Other(Locale.getDefault().country) + private var userCountry: UserCountry = UserCountry.Other(Locale.getDefault().country) val bottomSheetNavigation: SlotNavigation = SlotNavigation() - var showBestRateAnimation: Boolean = false + private var showBestRateAnimation: Boolean = false val uiState: StateFlow field = MutableStateFlow(params.amountUM) @@ -134,7 +134,10 @@ internal class SwapAmountModel @Inject constructor( } fun onStart() { - startLoadingQuotesTask(isSilentReload = false) + quoteTaskScheduler.scheduleTask( + scope = modelScope, + task = loadQuotesTask(), + ) } fun onStop() { From 5e17abbf91460d8566d2659bd2c991fbf79eefbc Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Aug 2025 16:18:02 +0500 Subject: [PATCH 13/29] Updated on 2026-08-14 --- .../v2/impl/amount/model/SwapAmountModel.kt | 12 ++--- .../SwapAmountSetQuotesTransformer.kt | 6 ++- .../SwapAmountValueChangeTransformer.kt | 1 + .../SwapAmountValueMaxTransformer.kt | 49 ++++++++++--------- 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index cce6ac9985..616b5a1166 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -536,18 +536,17 @@ internal class SwapAmountModel @Inject constructor( } as? AmountState.Data val fromAmountValue = fromAmount?.amountTextField?.cryptoAmount?.value.orZero() - - if (fromAmount?.amountTextField?.isError == true || fromAmountValue.isNullOrZero()) { + val isAmountScreen = params is SwapAmountComponentParams.AmountParams + val isAmountError = fromAmount?.amountTextField?.isError == true || fromAmountValue.isNullOrZero() + if (isAmountScreen && isAmountError) { uiState.transformerUpdate(SwapQuoteEmptyStateTransformer) return } - val swapGroups = state.swapCurrencies.getGroupWithDirection(state.swapDirection) - - uiState.transformerUpdate(SwapQuoteLoadingStateTransformer) + if (!isSilentReload) { uiState.transformerUpdate(SwapQuoteLoadingStateTransformer) } modelScope.launch { - val quotes = swapGroups.available.filter { + val quotes = state.swapCurrencies.getGroupWithDirection(state.swapDirection).available.filter { it.currencyStatus.currency.id == toCryptoCurrency.id }.flatMap { it.providers @@ -594,7 +593,6 @@ internal class SwapAmountModel @Inject constructor( needApplyFcaRestrictions = userCountry.needApplyFCARestrictions(), ), ) - feeSelectorReloadTrigger.triggerUpdate() } } diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSetQuotesTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSetQuotesTransformer.kt index adfcc37a91..941fa7e8ec 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSetQuotesTransformer.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSetQuotesTransformer.kt @@ -34,8 +34,10 @@ internal class SwapAmountSetQuotesTransformer( val sortedQuotes = quotes.sortedWith(SwapQuotesComparator) val bestQuote = findBestQuote(quotes) ?: SwapQuoteUM.Empty + val quotesWithDiff = getQuotesWithDiff(sortedQuotes, bestQuote, isSingleProvider) val selectedQuote = if (isSilentReload && prevState.selectedQuote !is SwapQuoteUM.Loading) { - prevState.selectedQuote + quotesWithDiff.firstOrNull { it.provider?.providerId == prevState.selectedQuote.provider?.providerId } + ?: prevState.selectedQuote } else { (bestQuote as? SwapQuoteUM.Content)?.copy( diffPercent = DifferencePercent.Best, @@ -55,7 +57,7 @@ internal class SwapAmountSetQuotesTransformer( if (updatedState !is SwapAmountUM.Content) return prevState return updatedState.copy( - isPrimaryButtonEnabled = updatedState.isPrimaryButtonEnabled && quotes.isNotEmpty(), + isPrimaryButtonEnabled = updatedState.isPrimaryButtonEnabled && quotesWithDiff.isNotEmpty(), swapQuotes = getQuotesWithDiff(sortedQuotes, bestQuote, isSingleProvider), ) } diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt index c364fd36a0..639f994b78 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt @@ -45,6 +45,7 @@ internal class SwapAmountValueChangeTransformer( ) return (updatedState as? SwapAmountUM.Content)?.copy( + isPrimaryButtonEnabled = false, selectedQuote = if (updatedState.isPrimaryButtonEnabled) { SwapQuoteUM.Empty } else { diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueMaxTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueMaxTransformer.kt index 59c38f1c94..abc50a6e78 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueMaxTransformer.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueMaxTransformer.kt @@ -16,31 +16,34 @@ internal class SwapAmountValueMaxTransformer( override fun transform(prevState: SwapAmountUM): SwapAmountUM { if (prevState !is SwapAmountUM.Content) return prevState - return prevState - .copy(selectedQuote = SwapQuoteUM.Loading) - .updateAmount( - onPrimaryAmount = { primaryStatus -> + val updatedState = prevState.updateAmount( + onPrimaryAmount = { primaryStatus -> + copy( + amountField = AmountFieldSetMaxAmountTransformer( + cryptoCurrencyStatus = primaryStatus, + maxAmount = primaryMaximumAmountBoundary, + minAmount = primaryMinimumAmountBoundary, + ).transform(prevState.primaryAmount.amountField), + ) + }, + onSecondaryAmount = { secondaryStatus -> + if (secondaryMaximumAmountBoundary != null) { copy( amountField = AmountFieldSetMaxAmountTransformer( - cryptoCurrencyStatus = primaryStatus, - maxAmount = primaryMaximumAmountBoundary, - minAmount = primaryMinimumAmountBoundary, - ).transform(prevState.primaryAmount.amountField), + cryptoCurrencyStatus = secondaryStatus, + maxAmount = secondaryMaximumAmountBoundary, + minAmount = secondaryMinimumAmountBoundary, + ).transform(prevState.secondaryAmount.amountField), ) - }, - onSecondaryAmount = { secondaryStatus -> - if (secondaryMaximumAmountBoundary != null) { - copy( - amountField = AmountFieldSetMaxAmountTransformer( - cryptoCurrencyStatus = secondaryStatus, - maxAmount = secondaryMaximumAmountBoundary, - minAmount = secondaryMinimumAmountBoundary, - ).transform(prevState.secondaryAmount.amountField), - ) - } else { - this - } - }, - ) + } else { + this + } + }, + ) + + return (updatedState as? SwapAmountUM.Content)?.copy( + isPrimaryButtonEnabled = false, + selectedQuote = SwapQuoteUM.Loading, + ) ?: updatedState } } \ No newline at end of file From cf705ab04e4fe6af056149bbfb2690bc6f173498 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Aug 2025 16:18:15 +0500 Subject: [PATCH 14/29] Updated on 2026-08-14 --- .../model/converter/SwapProviderStateConverter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/converter/SwapProviderStateConverter.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/converter/SwapProviderStateConverter.kt index 4a7a127735..317f0d733f 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/converter/SwapProviderStateConverter.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/chooseprovider/model/converter/SwapProviderStateConverter.kt @@ -42,7 +42,7 @@ internal class SwapProviderStateConverter( val additionalBadge = when { needApplyFCARestrictions && provider.isRestrictedByFCA() -> AdditionalBadge.FCAWarningList - isNeedBestRateBadge && isBestRate && !needApplyFCARestrictions -> AdditionalBadge.BestTrade + isNeedBestRateBadge && isBestRate -> AdditionalBadge.BestTrade else -> AdditionalBadge.Empty } From 99532083092af11974f209724d031fedb9edcea1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 Aug 2025 16:18:20 +0500 Subject: [PATCH 15/29] Updated on 2026-08-14 --- .../v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt | 6 ++++-- .../sendviaswap/analytics/SendWithSwapAnalyticEvents.kt | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt index bc241e0ec0..712782f490 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt @@ -94,13 +94,15 @@ internal class DefaultSendWithSwapComponent @AssistedInject constructor( ) activeComponent.updateState(model.uiState.value.destinationUM) } - is SendWithSwapConfirmComponent -> if (model.currentRoute.value.isEditMode) { + is SendWithSwapConfirmComponent -> { analyticsEventHandler.send( CommonSendAnalyticEvents.ConfirmationScreenOpened( categoryName = model.analyticCategoryName, ), ) - activeComponent.updateState(model.uiState.value) + if (model.currentRoute.value.isEditMode) { + activeComponent.updateState(model.uiState.value) + } } } model.currentRoute.emit(stack.active.configuration) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt index ad1927f7cd..6daa91c3d8 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt @@ -2,6 +2,7 @@ package com.tangem.features.swap.v2.impl.sendviaswap.analytics import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.AnalyticsParam.Key.FEE_TYPE import com.tangem.core.analytics.models.AnalyticsParam.Key.PROVIDER import com.tangem.core.analytics.models.AnalyticsParam.Key.RECEIVE_BLOCKCHAIN import com.tangem.core.analytics.models.AnalyticsParam.Key.RECEIVE_TOKEN @@ -24,7 +25,7 @@ internal sealed class SendWithSwapAnalyticEvents( event = "Send With Swap In Progress Screen Opened", params = mapOf( PROVIDER to providerName, - "Commission" to if (feeType is AnalyticsParam.FeeType.Normal) "Market" else "Fast", + FEE_TYPE to if (feeType is AnalyticsParam.FeeType.Normal) "Market" else "Fast", SEND_TOKEN to fromToken.symbol, RECEIVE_TOKEN to toToken.symbol, SEND_BLOCKCHAIN to fromToken.network.name, From 9f3ead841c56dd508afbd7c64e51c6a05216b58d Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 13:53:49 +0500 Subject: [PATCH 16/29] Updated on 2026-08-14 --- .../confirm/model/NFTSendConfirmModel.kt | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt index 45ace3d940..0cd5ed9676 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt @@ -120,8 +120,16 @@ internal class NFTSendConfirmModel @Inject constructor( get() = ConfirmData( enteredDestination = destinationUM?.addressTextField?.actualAddress, enteredMemo = destinationUM?.memoTextField?.value, - fee = feeSelectorUM?.selectedFee, - feeError = (feeUM?.feeSelectorUM as? FeeSelectorUM.Error)?.error, + fee = if (uiState.value.isRedesignEnabled) { + (uiState.value.feeSelectorUM as? FeeSelectorUMRedesigned.Content)?.selectedFeeItem?.fee + } else { + feeSelectorUM?.selectedFee + }, + feeError = if (uiState.value.isRedesignEnabled) { + (uiState.value.feeSelectorUM as? FeeSelectorUMRedesigned.Error)?.error + } else { + (feeUM?.feeSelectorUM as? FeeSelectorUM.Error)?.error + }, ) private var sendIdleTimer: Long = 0L @@ -255,11 +263,15 @@ internal class NFTSendConfirmModel @Inject constructor( private fun initialState() { val confirmUM = uiState.value.confirmUM - val feeUM = uiState.value.feeUM + val isEmptyFee = if (uiState.value.isRedesignEnabled) { + uiState.value.feeSelectorUM !is FeeSelectorUMRedesigned.Content + } else { + uiState.value.feeUM is FeeUM.Empty + } modelScope.launch { val isShowTapHelp = isSendTapHelpEnabledUseCase().getOrElse { false } - if (confirmUM is ConfirmUM.Empty || feeUM is FeeUM.Empty) { + if (confirmUM is ConfirmUM.Empty || isEmptyFee) { _uiState.update { it.copy( confirmUM = NFTSendConfirmInitialStateTransformer( @@ -277,11 +289,17 @@ internal class NFTSendConfirmModel @Inject constructor( notificationsUpdateListener.hasErrorFlow .onEach { hasError -> _uiState.update { - val feeUM = it.feeUM as? FeeUM.Content - val feeSelectorUM = feeUM?.feeSelectorUM as? FeeSelectorUM.Content + val isFeeNotNull = if (uiState.value.isRedesignEnabled) { + it.feeSelectorUM is FeeSelectorUMRedesigned.Content + } else { + val feeUM = it.feeUM as? FeeUM.Content + val feeSelectorUM = feeUM?.feeSelectorUM as? FeeSelectorUM.Content + feeSelectorUM != null + } + it.copy( confirmUM = (it.confirmUM as? ConfirmUM.Content)?.copy( - isPrimaryButtonEnabled = !hasError && feeSelectorUM != null, + isPrimaryButtonEnabled = !hasError && isFeeNotNull, ) ?: it.confirmUM, ) } @@ -290,9 +308,8 @@ internal class NFTSendConfirmModel @Inject constructor( } private fun verifyAndSendTransaction() { - val destination = destinationUM?.addressTextField?.actualAddress ?: return - val memo = destinationUM?.memoTextField?.value - val fee = feeSelectorUM?.selectedFee ?: return + val destination = confirmData.enteredDestination ?: return + val fee = confirmData.fee ?: return val ownerAddress = cryptoCurrencyStatus.value.networkAddress?.defaultAddress?.value ?: return val sdkNFTAsset = NFTSdkAssetConverter.convertBack(params.nftAsset) @@ -302,7 +319,7 @@ internal class NFTSendConfirmModel @Inject constructor( ownerAddress = ownerAddress, nftAsset = sdkNFTAsset.second, fee = fee, - memo = memo, + memo = confirmData.enteredMemo, destinationAddress = destination, userWalletId = userWallet.walletId, network = cryptoCurrency.network, From 09d6f9baa617378f90d8c4287cf877c426f31569 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 13:56:04 +0500 Subject: [PATCH 17/29] Updated on 2026-08-14 --- .../features/send/v2/entrypoint/model/SendEntryPointModel.kt | 5 ++++- .../send/v2/subcomponents/amount/model/SendAmountModel.kt | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt index 984330ba7d..f18192f9f9 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt @@ -69,6 +69,9 @@ internal class SendEntryPointModel @Inject constructor( } override fun onBack() { - router.pop() + modelScope.launch { + sendAmountUpdateTrigger.triggerUpdateAmount(lastSavedAmount) + router.pop() + } } } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt index 72f75f5424..f1079ab4ee 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt @@ -257,6 +257,11 @@ internal class SendAmountModel @Inject constructor( private fun confirmConvertToToken() { val amountParams = params as? SendAmountComponentParams.AmountParams ?: return val amountFieldData = uiState.value as? AmountState.Data + _uiState.update { + (it as? AmountState.Data)?.copy( + isPrimaryButtonEnabled = false, + ) ?: it + } amountParams.callback.onConvertToAnotherToken(amountFieldData?.amountTextField?.value.orEmpty()) } From 2c03b864e69d44a5b347a50b33c4d2a48150d07c Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 15:13:59 +0300 Subject: [PATCH 18/29] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../java/com/tangem/blockchainsdk/utils/Blockchain.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 7d225a195e..d3ba082fad 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 7d225a195eb001f9f4ce88aa4a6fa2d965b9159c +Subproject commit d3ba082fadbdb583a45cc1c714c57b382cbbe6ef diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt index 34d846e753..0449da0454 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt @@ -165,8 +165,8 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "zklink/test" -> Blockchain.ZkLinkNovaTestnet "pepecoin" -> Blockchain.Pepecoin "pepecoin/test" -> Blockchain.PepecoinTestnet - "hyperliquid" -> Blockchain.Hyperliquid - "hyperliquid/test" -> Blockchain.HyperliquidTestnet + "hyperevm" -> Blockchain.Hyperliquid + "hyperevm/test" -> Blockchain.HyperliquidTestnet else -> null } } @@ -329,8 +329,8 @@ fun Blockchain.toNetworkId(): String { Blockchain.ZkLinkNovaTestnet -> "zklink/test" Blockchain.Pepecoin -> "pepecoin" Blockchain.PepecoinTestnet -> "pepecoin/test" - Blockchain.Hyperliquid -> "hyperliquid" - Blockchain.HyperliquidTestnet -> "hyperliquid/test" + Blockchain.Hyperliquid -> "hyperevm" + Blockchain.HyperliquidTestnet -> "hyperevm/test" } } From 2baea3992a740b71fe59692d2b972c4d8ee42266 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 12:55:16 +0500 Subject: [PATCH 19/29] Updated on 2026-08-14 --- .../v2/subcomponents/notifications/model/NotificationsModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt index da00a9307b..37519c11bd 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt @@ -287,7 +287,7 @@ internal class NotificationsModel @Inject constructor( ) { val validationError = validateTransactionUseCase( userWalletId = userWalletId, - amount = sendingAmount.convertToSdkAmount(currency), + amount = enteredAmount.convertToSdkAmount(currency), fee = fee, memo = memo, destination = destinationAddress, From a374c65a4eef11690650cbe00d3a59a7378f0967 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 15:46:20 +0300 Subject: [PATCH 20/29] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index e204e5cd97..05f6e8b112 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,7 +5,7 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "releases-5.28-1208" +tangemBlockchainSdk = "releases-5.28-1211" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "releases-5.28-559" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From ad6d1d5b1e0d73822fc90e2e80290e8f5301e83e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 16:11:48 +0200 Subject: [PATCH 21/29] Updated on 2026-08-14 --- .../TokenReceiveNewAnalyticsEvent.kt | 7 ++++++ .../v2/send/analytics/SendAnalyticEvents.kt | 6 +---- .../v2/send/analytics/SendAnalyticHelper.kt | 11 --------- .../component/TokenReceiveAssetsComponent.kt | 3 ++- .../component/TokenReceiveQrCodeComponent.kt | 3 ++- .../model/TokenReceiveAssetsModel.kt | 8 ++++++- .../tokenreceive/model/TokenReceiveModel.kt | 8 ++++--- .../model/TokenReceiveQrCodeModel.kt | 8 ++++++- .../tokendetails/model/TokenDetailsModel.kt | 10 +++++++- .../WalletCurrencyActionsClickIntents.kt | 23 ++++++++++++++----- 10 files changed, 57 insertions(+), 30 deletions(-) diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt index 424ac7f642..cf752c7e38 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/TokenReceiveNewAnalyticsEvent.kt @@ -4,6 +4,7 @@ import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.AnalyticsParam.Key.BLOCKCHAIN import com.tangem.core.analytics.models.AnalyticsParam.Key.ENS +import com.tangem.core.analytics.models.AnalyticsParam.Key.SOURCE import com.tangem.core.analytics.models.AnalyticsParam.Key.TOKEN_PARAM sealed class TokenReceiveNewAnalyticsEvent( @@ -27,11 +28,13 @@ sealed class TokenReceiveNewAnalyticsEvent( class ButtonCopyAddress( token: String, blockchainName: String, + tokenReceiveSource: TokenReceiveCopyActionSource, ) : TokenReceiveNewAnalyticsEvent( event = "Button - Copy Address", params = mapOf( TOKEN_PARAM to token, BLOCKCHAIN to blockchainName, + SOURCE to tokenReceiveSource.name, ), ) @@ -56,4 +59,8 @@ sealed class TokenReceiveNewAnalyticsEvent( BLOCKCHAIN to blockchainName, ), ) +} + +enum class TokenReceiveCopyActionSource { + Main, Token, Receive, QR } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt index c486cce7a4..acaf93aac4 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticEvents.kt @@ -24,7 +24,6 @@ internal sealed class SendAnalyticEvents( val feeType: AnalyticsParam.FeeType, val blockchain: String, val nonceNotEmpty: Boolean, - private val ensStatus: AnalyticsParam.EnsStatus, ) : SendAnalyticEvents( event = "Transaction Sent Screen Opened", params = mapOf( @@ -32,10 +31,7 @@ internal sealed class SendAnalyticEvents( FEE_TYPE to feeType.value, BLOCKCHAIN to blockchain, NONCE to nonceNotEmpty.toString().capitalize(), - ENS_ADDRESS to when (ensStatus) { - AnalyticsParam.EnsStatus.EMPTY -> false.toString() - AnalyticsParam.EnsStatus.FULL -> true.toString() - }, + ENS_ADDRESS to (blockchain == "Ethereum").toString(), ), ) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt index ad01b7a5c9..ab9490ce77 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/analytics/SendAnalyticHelper.kt @@ -28,7 +28,6 @@ internal class SendAnalyticHelper @Inject constructor( feeType = feeType, blockchain = cryptoCurrency.network.name, nonceNotEmpty = feeSelectorUM.nonce != null, - ensStatus = getEnsStatus(sendUM), ), ) analyticsEventHandler.send( @@ -53,14 +52,4 @@ internal class SendAnalyticHelper @Inject constructor( else -> Basic.TransactionSent.MemoType.Null } } - - private fun getEnsStatus(sendUM: SendUM): AnalyticsParam.EnsStatus { - val blockchainAddressForEns = - (sendUM.destinationUM as? DestinationUM.Content)?.addressTextField?.blockchainAddress - return if (blockchainAddressForEns != null) { - AnalyticsParam.EnsStatus.FULL - } else { - AnalyticsParam.EnsStatus.EMPTY - } - } } \ No newline at end of file diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveAssetsComponent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveAssetsComponent.kt index 7ece6e356d..692e3ae990 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveAssetsComponent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveAssetsComponent.kt @@ -8,6 +8,7 @@ import com.tangem.common.ui.notifications.NotificationUM import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource import com.tangem.features.tokenreceive.entity.ReceiveAddress import com.tangem.features.tokenreceive.model.TokenReceiveAssetsModel import com.tangem.features.tokenreceive.ui.TokenReceiveAssetsContent @@ -29,7 +30,7 @@ internal class TokenReceiveAssetsComponent( internal interface TokenReceiveAssetsModelCallback { fun onQrCodeClick(id: Int) - fun onCopyClick(id: Int) + fun onCopyClick(id: Int, source: TokenReceiveCopyActionSource) } data class TokenReceiveAssetsParams( diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt index 3eef391fc6..c33bcca97f 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/component/TokenReceiveQrCodeComponent.kt @@ -8,6 +8,7 @@ import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource import com.tangem.features.tokenreceive.entity.ReceiveAddress import com.tangem.features.tokenreceive.model.TokenReceiveQrCodeModel import com.tangem.features.tokenreceive.ui.TokenReceiveQrCodeContent @@ -26,7 +27,7 @@ internal class TokenReceiveQrCodeComponent( } internal interface TokenReceiveQrCodeModelCallback { - fun onCopyClick(id: Int) + fun onCopyClick(id: Int, source: TokenReceiveCopyActionSource) fun onShareClick(address: String) } diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt index fb162c4c53..5790e3e692 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveAssetsModel.kt @@ -6,6 +6,7 @@ import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer +import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource import com.tangem.domain.tokens.model.analytics.TokenReceiveNewAnalyticsEvent import com.tangem.features.tokenreceive.component.TokenReceiveAssetsComponent import com.tangem.features.tokenreceive.entity.ReceiveAddress @@ -38,7 +39,12 @@ internal class TokenReceiveAssetsModel @Inject constructor( internal val state: StateFlow field = MutableStateFlow( ReceiveAssetsUM( - onCopyClick = params.callback::onCopyClick, + onCopyClick = { + params.callback.onCopyClick( + id = it, + source = TokenReceiveCopyActionSource.Receive, + ) + }, onOpenQrCodeClick = params.callback::onQrCodeClick, addresses = params.addresses, showMemoDisclaimer = params.showMemoDisclaimer, diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt index 0c7e6de0bf..6ae1b86f6e 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt @@ -20,6 +20,7 @@ import com.tangem.domain.models.ReceiveAddressModel import com.tangem.domain.models.ens.EnsAddress import com.tangem.domain.models.network.Network import com.tangem.domain.tokens.SaveViewedTokenReceiveWarningUseCase +import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource import com.tangem.domain.tokens.model.analytics.TokenReceiveNewAnalyticsEvent import com.tangem.domain.transaction.usecase.GetReverseResolvedEnsAddressUseCase import com.tangem.features.tokenreceive.TokenReceiveComponent @@ -76,9 +77,9 @@ internal class TokenReceiveModel @Inject constructor( stackNavigation.push(configuration = TokenReceiveRoutes.QrCode(addressId = id)) } - override fun onCopyClick(id: Int) { + override fun onCopyClick(id: Int, source: TokenReceiveCopyActionSource) { val addressToCopy = state.value.addresses[id] ?: return - sendCopyActionAnalytic(addressToCopy) + sendCopyActionAnalytic(addressToCopy, source) clipboardManager.setText(text = addressToCopy.value, isSensitive = true) } @@ -228,12 +229,13 @@ internal class TokenReceiveModel @Inject constructor( ) } - private fun sendCopyActionAnalytic(receiveAddress: ReceiveAddress) { + private fun sendCopyActionAnalytic(receiveAddress: ReceiveAddress, source: TokenReceiveCopyActionSource) { val event = when (receiveAddress.type) { is Primary -> { TokenReceiveNewAnalyticsEvent.ButtonCopyAddress( token = getTokenName(), blockchainName = params.config.cryptoCurrency.network.name, + tokenReceiveSource = source, ) } Ens -> { diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt index 0a1f5ccddd..92bcd28bc0 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveQrCodeModel.kt @@ -5,6 +5,7 @@ import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.ui.extensions.TextReference +import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource import com.tangem.features.tokenreceive.component.TokenReceiveQrCodeComponent import com.tangem.features.tokenreceive.ui.state.QrCodeUM import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -27,7 +28,12 @@ internal class TokenReceiveQrCodeModel @Inject constructor( network = params.cryptoCurrency.network.name, addressValue = params.address.value, addressName = TextReference.Str("${params.cryptoCurrency.name} (${params.cryptoCurrency.symbol})"), - onCopyClick = { params.callback.onCopyClick(params.id) }, + onCopyClick = { + params.callback.onCopyClick( + id = params.id, + source = TokenReceiveCopyActionSource.QR, + ) + }, onShareClick = params.callback::onShareClick, ), ) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt index ddba4024a8..d0e4d0f29c 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt @@ -58,6 +58,8 @@ import com.tangem.domain.tokens.legacy.TradeCryptoAction import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason import com.tangem.domain.tokens.model.TokenActionsState import com.tangem.domain.tokens.model.analytics.TokenReceiveAnalyticsEvent +import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource +import com.tangem.domain.tokens.model.analytics.TokenReceiveNewAnalyticsEvent import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent.Companion.toReasonAnalyticsText import com.tangem.domain.tokens.model.analytics.TokenSwapPromoAnalyticsEvent @@ -876,7 +878,13 @@ internal class TokenDetailsModel @Inject constructor( vibratorHapticManager.performOneTime(TangemHapticEffect.OneTime.Click) clipboardManager.setText(text = defaultAddress, isSensitive = true) - analyticsEventsHandler.send(TokenReceiveAnalyticsEvent.ButtonCopyAddress(cryptoCurrency.symbol)) + analyticsEventsHandler.send( + TokenReceiveNewAnalyticsEvent.ButtonCopyAddress( + token = cryptoCurrency.symbol, + blockchainName = cryptoCurrency.network.name, + tokenReceiveSource = TokenReceiveCopyActionSource.Token, + ), + ) return resourceReference(R.string.wallet_notification_address_copied) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt index 8e7103d993..e7876af2a1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt @@ -49,6 +49,8 @@ import com.tangem.domain.tokens.RemoveCurrencyUseCase import com.tangem.domain.tokens.legacy.TradeCryptoAction import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason import com.tangem.domain.tokens.model.analytics.TokenReceiveAnalyticsEvent +import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource +import com.tangem.domain.tokens.model.analytics.TokenReceiveNewAnalyticsEvent import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent.Companion.AVAILABLE import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent.Companion.toReasonAnalyticsText @@ -174,10 +176,6 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( ), ) - analyticsEventHandler.send( - event = TokenReceiveAnalyticsEvent.ReceiveScreenOpened(cryptoCurrencyStatus.currency.symbol), - ) - event?.let { analyticsEventHandler.send(it) } if (tokenReceiveFeatureToggle.isNewTokenReceiveEnabled) { @@ -188,6 +186,9 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( } } } else { + analyticsEventHandler.send( + event = TokenReceiveAnalyticsEvent.ReceiveScreenOpened(cryptoCurrencyStatus.currency.symbol), + ) stateHolder.showBottomSheet( createReceiveBottomSheetContent( currency = cryptoCurrencyStatus.currency, @@ -206,7 +207,13 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( vibratorHapticManager.performOneTime(TangemHapticEffect.OneTime.Click) clipboardManager.setText(text = defaultAddress, isSensitive = true) - analyticsEventHandler.send(TokenReceiveAnalyticsEvent.ButtonCopyAddress(cryptoCurrency.symbol)) + analyticsEventHandler.send( + TokenReceiveNewAnalyticsEvent.ButtonCopyAddress( + token = cryptoCurrency.symbol, + blockchainName = cryptoCurrency.network.name, + tokenReceiveSource = TokenReceiveCopyActionSource.Main, + ), + ) return resourceReference(R.string.wallet_notification_address_copied) } @@ -235,7 +242,11 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( override fun onCopyAddressClick(cryptoCurrencyStatus: CryptoCurrencyStatus) { analyticsEventHandler.send( - event = TokenScreenAnalyticsEvent.ButtonCopyAddress(cryptoCurrencyStatus.currency.symbol), + event = TokenReceiveNewAnalyticsEvent.ButtonCopyAddress( + token = cryptoCurrencyStatus.currency.symbol, + blockchainName = cryptoCurrencyStatus.currency.network.name, + tokenReceiveSource = TokenReceiveCopyActionSource.Main, + ), ) modelScope.launch(dispatchers.main) { From fb53c32a6a5abdc92a6d4dc46d1a47907cc2a7fd Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 28 Aug 2025 20:56:12 +0500 Subject: [PATCH 22/29] Updated on 2026-08-14 --- .../converters/AmountStateConverter.kt | 9 +++++++-- .../field/AmountBoundaryUpdateTransformer.kt | 6 ++++-- .../v2/send/confirm/SendConfirmComponent.kt | 1 + .../v2/send/confirm/model/SendConfirmModel.kt | 16 +++++++++++++++ .../amount/SendAmountComponentParams.kt | 4 +++- .../amount/model/SendAmountModel.kt | 17 ++++++++++++++++ .../v2/impl/amount/model/SwapAmountModel.kt | 20 +++++++++++++++++++ .../converter/SwapAmountFieldConverter.kt | 1 + 8 files changed, 69 insertions(+), 5 deletions(-) diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt index 23a9482b9e..8212806067 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt @@ -13,6 +13,7 @@ import com.tangem.core.ui.extensions.combinedReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.wrappedList +import com.tangem.core.ui.extensions.orMaskWithStars import com.tangem.core.ui.format.bigdecimal.crypto import com.tangem.core.ui.format.bigdecimal.fiat import com.tangem.core.ui.format.bigdecimal.format @@ -97,7 +98,9 @@ class AmountStateConverter( * @property maxEnterAmount max enter amount data * @property cryptoCurrencyStatus current cryptocurrency status * @property iconStateConverter currency icon converter + * @property isBalanceHidden is balance hidden status */ +@Suppress("LongParameterList") class AmountStateConverterV2( private val clickIntents: AmountScreenClickIntents, private val appCurrency: AppCurrency, @@ -105,6 +108,7 @@ class AmountStateConverterV2( private val maxEnterAmount: EnterAmountBoundary, private val iconStateConverter: CryptoCurrencyToIconStateConverter, private val isRedesignEnabled: Boolean, + private val isBalanceHidden: Boolean, ) : Converter { private val amountFieldConverter by lazy(LazyThreadSafetyMode.NONE) { @@ -133,11 +137,12 @@ class AmountStateConverterV2( stringReference(crypto), stringReference(" $DOT "), stringReference(fiat), - ) + ).orMaskWithStars(isBalanceHidden) } else { resourceReference(R.string.common_crypto_fiat_format, wrappedList(crypto, fiat)) + .orMaskWithStars(isBalanceHidden) }, - availableBalanceShort = stringReference(crypto), + availableBalanceShort = stringReference(crypto).orMaskWithStars(isBalanceHidden), tokenName = stringReference(cryptoCurrencyStatus.currency.name), tokenIconState = iconStateConverter.convert(cryptoCurrencyStatus.currency), amountTextField = amountFieldConverter.convert(value.value), diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt index 7385fa9542..9639c7f781 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/field/AmountBoundaryUpdateTransformer.kt @@ -7,6 +7,7 @@ import com.tangem.core.ui.extensions.combinedReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.wrappedList +import com.tangem.core.ui.extensions.orMaskWithStars import com.tangem.core.ui.format.bigdecimal.crypto import com.tangem.core.ui.format.bigdecimal.fiat import com.tangem.core.ui.format.bigdecimal.format @@ -28,6 +29,7 @@ class AmountBoundaryUpdateTransformer( private val maxEnterAmount: EnterAmountBoundary, private val appCurrency: AppCurrency, private val isRedesignEnabled: Boolean, + private val isBalanceHidden: Boolean, ) : Transformer { override fun transform(prevState: AmountState): AmountState { @@ -47,8 +49,8 @@ class AmountBoundaryUpdateTransformer( } return prevState.copy( - availableBalance = availableBalance, - availableBalanceShort = stringReference(crypto), + availableBalance = availableBalance.orMaskWithStars(isBalanceHidden), + availableBalanceShort = stringReference(crypto).orMaskWithStars(isBalanceHidden), ) } } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt index a59c2345b7..cd417bc2f5 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/SendConfirmComponent.kt @@ -72,6 +72,7 @@ internal class SendConfirmComponent( userWalletId = params.userWallet.walletId, cryptoCurrency = params.cryptoCurrencyStatus.currency, cryptoCurrencyStatusFlow = params.cryptoCurrencyStatusFlow, + isBalanceHidingFlow = params.isBalanceHidingFlow, ), onResult = model::onAmountResult, onClick = model::showEditAmount, diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt index 284f09ebbf..5fcc8c9505 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt @@ -28,6 +28,7 @@ import com.tangem.domain.feedback.models.FeedbackEmailType import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.requireColdWallet +import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.settings.IsSendTapHelpEnabledUseCase import com.tangem.domain.settings.NeverShowTapHelpUseCase import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase @@ -105,6 +106,7 @@ internal class SendConfirmModel @Inject constructor( private val feeSelectorReloadTrigger: FeeSelectorReloadTrigger, private val feeReloadTrigger: SendFeeReloadTrigger, private val sendAmountReduceTrigger: SendAmountReduceTrigger, + private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, sendBalanceUpdaterFactory: SendBalanceUpdater.Factory, ) : Model(), SendConfirmClickIntents, FeeSelectorModelCallback, SendNotificationsComponent.ModelCallback { @@ -121,6 +123,9 @@ internal class SendConfirmModel @Inject constructor( private val _uiState = MutableStateFlow(params.state) val uiState = _uiState.asStateFlow() + val isBalanceHiddenFlow: StateFlow + field = MutableStateFlow(false) + private val amountState get() = uiState.value.amountUM as? AmountState.Data private val destinationUM @@ -164,6 +169,7 @@ internal class SendConfirmModel @Inject constructor( subscribeOnNotificationsUpdateTrigger() subscribeOnCheckFeeResultUpdates() initialState() + subscribeOnBalanceHidden() } fun updateState(state: SendUM) { @@ -519,6 +525,16 @@ internal class SendConfirmModel @Inject constructor( }.launchIn(modelScope) } + private fun subscribeOnBalanceHidden() { + getBalanceHidingSettingsUseCase() + .conflate() + .distinctUntilChanged() + .onEach { balanceHidingSettings -> + isBalanceHiddenFlow.update { balanceHidingSettings.isBalanceHidden } + } + .launchIn(modelScope) + } + private fun updateConfirmNotifications() { modelScope.launch { notificationsUpdateTrigger.triggerUpdate( diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt index 925d3780df..14a25b17b7 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponentParams.kt @@ -21,6 +21,7 @@ internal sealed class SendAmountComponentParams { abstract val isRedesignEnabled: Boolean abstract val cryptoCurrency: CryptoCurrency abstract val cryptoCurrencyStatusFlow: StateFlow + abstract val isBalanceHidingFlow: StateFlow data class AmountParams( override val state: AmountState, @@ -31,9 +32,9 @@ internal sealed class SendAmountComponentParams { override val isRedesignEnabled: Boolean, override val cryptoCurrency: CryptoCurrency, override val cryptoCurrencyStatusFlow: StateFlow, + override val isBalanceHidingFlow: StateFlow, val callback: ModelCallback, val currentRoute: StateFlow, - val isBalanceHidingFlow: StateFlow, ) : SendAmountComponentParams() data class AmountBlockParams( @@ -45,6 +46,7 @@ internal sealed class SendAmountComponentParams { override val isRedesignEnabled: Boolean, override val cryptoCurrency: CryptoCurrency, override val cryptoCurrencyStatusFlow: StateFlow, + override val isBalanceHidingFlow: StateFlow, val userWallet: UserWallet, val blockClickEnableFlow: StateFlow, ) : SendAmountComponentParams() diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt index f1079ab4ee..5d8475ae50 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt @@ -102,6 +102,7 @@ internal class SendAmountModel @Inject constructor( subscribeOnAmountReduceToTriggerUpdates() subscribeOnAmountIgnoreReduceTriggerUpdates() subscribeOnAmountUpdateTriggerUpdates() + subscribeOnBalanceHiddenUpdates() } private fun initAppCurrency() { @@ -119,6 +120,20 @@ internal class SendAmountModel @Inject constructor( }.launchIn(modelScope) } + private fun subscribeOnBalanceHiddenUpdates() { + params.isBalanceHidingFlow.onEach { isBalanceHidden -> + _uiState.update( + AmountBoundaryUpdateTransformer( + cryptoCurrencyStatus = cryptoCurrencyStatus, + maxEnterAmount = maxAmountBoundary, + appCurrency = appCurrency, + isRedesignEnabled = sendFeatureToggles.isSendRedesignEnabled, + isBalanceHidden = params.isBalanceHidingFlow.value, + ), + ) + }.launchIn(modelScope) + } + private fun subscribeOnCryptoCurrencyStatusFlow() { params.cryptoCurrencyStatusFlow .onEach { newCryptoCurrencyStatus -> @@ -150,6 +165,7 @@ internal class SendAmountModel @Inject constructor( maxEnterAmount = maxAmountBoundary, appCurrency = appCurrency, isRedesignEnabled = sendFeatureToggles.isSendRedesignEnabled, + isBalanceHidden = params.isBalanceHidingFlow.value, ), ) } else { @@ -168,6 +184,7 @@ internal class SendAmountModel @Inject constructor( maxEnterAmount = maxAmountBoundary, iconStateConverter = CryptoCurrencyToIconStateConverter(), isRedesignEnabled = sendFeatureToggles.isSendRedesignEnabled, + isBalanceHidden = params.isBalanceHidingFlow.value, ).convert( AmountParameters( title = resourceReference( diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index 616b5a1166..da04d1cf95 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -131,6 +131,7 @@ internal class SwapAmountModel @Inject constructor( subscribeOnAmountReduceByTriggerUpdates() subscribeOnAmountIgnoreReduceTriggerUpdates() subscribeOnReloadQuotesTriggerUpdates() + subscribeOnBalanceHiddenUpdates() } fun onStart() { @@ -322,6 +323,25 @@ internal class SwapAmountModel @Inject constructor( ) } + private fun subscribeOnBalanceHiddenUpdates() { + params.isBalanceHidingFlow.onEach { + val primaryCryptoCurrencyStatus = (uiState.value as? SwapAmountUM.Content)?.primaryCryptoCurrencyStatus + if (primaryCryptoCurrencyStatus != null) { + uiState.transformerUpdate( + SwapAmountPrimaryReadyStateTransformer( + userWallet = userWallet, + primaryCryptoCurrencyStatus = primaryCryptoCurrencyStatus, + appCurrency = appCurrency, + swapDirection = swapDirection, + clickIntents = this, + isBalanceHidden = params.isBalanceHidingFlow.value, + showBestRateAnimation = showBestRateAnimation, + ), + ) + } + }.launchIn(modelScope) + } + private fun confirmSendWithSwapClose() { val amountParams = params as? SwapAmountComponentParams.AmountParams ?: return val amountFieldData = uiState.value.primaryAmount.amountField as? AmountState.Data diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt index fd83068f8f..f1d7e06cb3 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt @@ -48,6 +48,7 @@ internal class SwapAmountFieldConverter( maxEnterAmount = maxEnterAmountConverter.convert(cryptoCurrencyStatus), iconStateConverter = iconStateConverter, isRedesignEnabled = true, + isBalanceHidden = isBalanceHidden, ).convert( AmountParameters( title = combinedReference( From 0d773d7ccc66a9d5ce4ee570f5e09748dbedc0dd Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 29 Aug 2025 12:34:11 +0500 Subject: [PATCH 23/29] Updated on 2026-08-14 --- .../analytics/CommonSendAmountAnalyticEvents.kt | 13 ++++++++++++- .../subcomponents/amount/model/SendAmountModel.kt | 6 +++++- .../swap/v2/impl/amount/model/SwapAmountModel.kt | 6 +++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/subcomponents/amount/analytics/CommonSendAmountAnalyticEvents.kt b/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/subcomponents/amount/analytics/CommonSendAmountAnalyticEvents.kt index 55d91be4b5..b3dbf385fb 100644 --- a/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/subcomponents/amount/analytics/CommonSendAmountAnalyticEvents.kt +++ b/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/subcomponents/amount/analytics/CommonSendAmountAnalyticEvents.kt @@ -1,6 +1,8 @@ package com.tangem.features.send.v2.api.subcomponents.amount.analytics import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam.Key.BLOCKCHAIN +import com.tangem.core.analytics.models.AnalyticsParam.Key.TOKEN_PARAM import com.tangem.core.analytics.models.AnalyticsParam.Key.TYPE sealed class CommonSendAmountAnalyticEvents( @@ -22,7 +24,16 @@ sealed class CommonSendAmountAnalyticEvents( /** Max amount button clicked */ data class MaxAmountButtonClicked( val categoryName: String, - ) : CommonSendAmountAnalyticEvents(category = categoryName, event = "Max Amount Taped") + val token: String, + val blockchain: String, + ) : CommonSendAmountAnalyticEvents( + category = categoryName, + event = "Max Amount Taped", + params = mapOf( + TOKEN_PARAM to token, + BLOCKCHAIN to blockchain, + ), + ) enum class SelectedCurrencyType(val value: String) { Token("Token"), diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt index 5d8475ae50..b3c517ceed 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt @@ -235,7 +235,11 @@ internal class SendAmountModel @Inject constructor( ), ) analyticsEventHandler.send( - CommonSendAmountAnalyticEvents.MaxAmountButtonClicked(categoryName = analyticsCategoryName), + CommonSendAmountAnalyticEvents.MaxAmountButtonClicked( + categoryName = analyticsCategoryName, + token = params.cryptoCurrency.symbol, + blockchain = params.cryptoCurrency.network.name, + ), ) } diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index da04d1cf95..aa2ef6ed3d 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -217,7 +217,11 @@ internal class SwapAmountModel @Inject constructor( override fun onMaxValueClick() { analyticsEventHandler.send( - CommonSendAmountAnalyticEvents.MaxAmountButtonClicked(categoryName = params.analyticsCategoryName), + CommonSendAmountAnalyticEvents.MaxAmountButtonClicked( + categoryName = params.analyticsCategoryName, + token = primaryCryptoCurrency.symbol, + blockchain = primaryCryptoCurrency.network.name, + ), ) uiState.transformerUpdate( SwapAmountValueMaxTransformer( From 8a74fcc5fb86ca194ac39006982c6f86d65a377d Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 29 Aug 2025 19:54:20 +0200 Subject: [PATCH 24/29] Updated on 2026-08-14 --- core/res/src/main/res/values/strings.xml | 1 + .../tokenreceive/entity/ReceiveAddress.kt | 5 +---- .../tokenreceive/model/TokenReceiveModel.kt | 18 ++++++++++-------- .../ui/TokenReceiveAssetsContent.kt | 16 ---------------- 4 files changed, 12 insertions(+), 28 deletions(-) diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 6eca54cb33..078e9b7128 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -392,6 +392,7 @@ Check your internet connection or switch to a different network Terms of service Default Address + Legacy Address Receive assets Sending assets in other networks will result in permanent loss. %s network diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt index 0157541c0c..b5264d8402 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/entity/ReceiveAddress.kt @@ -16,10 +16,7 @@ internal data class ReceiveAddress( val displayName: TextReference - data class Default( - val title: TextReference?, - override val displayName: TextReference, - ) : Primary + data class Default(override val displayName: TextReference) : Primary data class Legacy(override val displayName: TextReference) : Primary } diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt index 6ae1b86f6e..784431f702 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveModel.kt @@ -110,26 +110,28 @@ internal class TokenReceiveModel @Inject constructor( addresses: List, networkName: String, ): ImmutableMap { - val conditionToUseTitle = addresses.any { it.nameService == ReceiveAddressModel.NameService.Legacy } + val needUseToLegacyAndDefaultName = addresses.any { it.nameService == ReceiveAddressModel.NameService.Legacy } return buildMap { addresses.mapIndexed { index, model -> val type = when (model.nameService) { ReceiveAddressModel.NameService.Default -> { Primary.Default( - displayName = TextReference.Res( - id = R.string.domain_receive_assets_onboarding_network_name, - formatArgs = wrappedList(networkName), - ), - title = if (conditionToUseTitle) { + displayName = if (needUseToLegacyAndDefaultName) { TextReference.Res(R.string.domain_receive_assets_default_address) } else { - null + TextReference.Combined( + wrappedList( + TextReference.Str(networkName), + TextReference.Str(" "), + TextReference.Res(R.string.common_address), + ), + ) }, ) } ReceiveAddressModel.NameService.Ens -> Ens ReceiveAddressModel.NameService.Legacy -> Primary.Legacy( - displayName = TextReference.Res(R.string.common_legacy_bitcoin_address), + displayName = TextReference.Res(R.string.domain_receive_assets_legacy_address), ) } diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt index 84c59aeb20..73f31d7f8d 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt @@ -27,7 +27,6 @@ import androidx.compose.ui.util.fastForEach import com.tangem.common.ui.notifications.NotificationUM import com.tangem.core.res.getStringSafe import com.tangem.core.ui.R -import com.tangem.core.ui.components.SpacerH import com.tangem.core.ui.components.SpacerH12 import com.tangem.core.ui.components.SpacerH8 import com.tangem.core.ui.components.SpacerW12 @@ -198,20 +197,6 @@ private fun AddressItem( Column( modifier = Modifier.padding(vertical = 14.dp, horizontal = 12.dp), ) { - when (primaryType) { - is ReceiveAddress.Type.Primary.Default -> { - primaryType.title?.let { - Text( - text = it.resolveReference(), - style = TangemTheme.typography.subtitle2, - color = TangemTheme.colors.text.tertiary, - ) - SpacerH(12.dp) - } - } - is ReceiveAddress.Type.Primary.Legacy -> Unit - } - Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, @@ -336,7 +321,6 @@ private class TokenReceiveAssetsContentProvider : PreviewParameterProvider Date: Fri, 29 Aug 2025 21:24:01 +0300 Subject: [PATCH 25/29] Updated on 2026-08-14 --- core/res/src/main/res/values/strings.xml | 4 ++ .../amount/model/SendAmountModel.kt | 15 +++-- .../v2/impl/amount/model/SwapAmountModel.kt | 35 +++++----- .../converter/SwapAmountFieldConverter.kt | 15 +++-- .../SwapAmountBalanceHiddenTransformer.kt | 66 +++++++++++++++++++ .../SwapAmountPrimaryReadyStateTransformer.kt | 2 + ...wapAmountSecondaryReadyStateTransformer.kt | 2 + 7 files changed, 115 insertions(+), 24 deletions(-) create mode 100644 features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountBalanceHiddenTransformer.kt diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 078e9b7128..670cd963ee 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -530,6 +530,9 @@ Create Mobile Wallet This recovery phrase has already been imported Mobile Wallet + This device can’t be used for upgrade, it already contains another wallet. + Choose another device, this one can’t be used for upgrade. + An error occurred during the operation. Your funds stay safe and fully accessible during the process Funds access All private wallet data will be removed from the mobile app and stored securely on your Tangem device only @@ -981,6 +984,7 @@ Memo Check your network connection Network fee info unreachable + You send From From %s Gas limit diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt index b3c517ceed..b69ef65add 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt @@ -28,6 +28,7 @@ import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.tokens.GetMinimumTransactionAmountSyncUseCase import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason import com.tangem.domain.wallets.usecase.GetUserWalletUseCase +import com.tangem.domain.wallets.usecase.GetWalletsUseCase import com.tangem.features.send.v2.api.SendFeatureToggles import com.tangem.features.send.v2.api.entity.PredefinedValues import com.tangem.features.send.v2.api.subcomponents.amount.analytics.CommonSendAmountAnalyticEvents @@ -66,6 +67,7 @@ internal class SendAmountModel @Inject constructor( private val getUserWalletUseCase: GetUserWalletUseCase, private val rampStateManager: RampStateManager, private val sendAmountAlertFactory: SendAmountAlertFactory, + private val getWalletsUseCase: GetWalletsUseCase, ) : Model(), SendAmountClickIntents { private val params: SendAmountComponentParams = paramsContainer.require() @@ -176,6 +178,7 @@ internal class SendAmountModel @Inject constructor( private fun initialState() { if (uiState.value is AmountState.Empty && userWallet != null) { + val isSingleWallet = getWalletsUseCase.invokeSync().size == 1 _uiState.update { AmountStateConverterV2( clickIntents = this, @@ -187,10 +190,14 @@ internal class SendAmountModel @Inject constructor( isBalanceHidden = params.isBalanceHidingFlow.value, ).convert( AmountParameters( - title = resourceReference( - R.string.send_from_wallet_name, - WrappedList(listOf(userWallet?.name.orEmpty())), // TODO [REDACTED_TASK_KEY] - ), + title = if (isSingleWallet) { + resourceReference(R.string.send_from_title) + } else { + resourceReference( + R.string.send_from_wallet_name, + WrappedList(listOf(userWallet?.name.orEmpty())), // TODO [REDACTED_TASK_KEY] + ) + }, value = "", ), ) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index aa2ef6ed3d..b2e38a4172 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -35,6 +35,7 @@ import com.tangem.domain.swap.usecase.GetSwapQuoteUseCase import com.tangem.domain.swap.usecase.SelectInitialPairUseCase import com.tangem.domain.tokens.GetMinimumTransactionAmountSyncUseCase import com.tangem.domain.transaction.usecase.GetAllowanceUseCase +import com.tangem.domain.wallets.usecase.GetWalletsUseCase import com.tangem.features.send.v2.api.subcomponents.amount.analytics.CommonSendAmountAnalyticEvents import com.tangem.features.send.v2.api.subcomponents.feeSelector.FeeSelectorReloadTrigger import com.tangem.features.swap.v2.api.choosetoken.SwapChooseTokenNetworkListener @@ -91,6 +92,7 @@ internal class SwapAmountModel @Inject constructor( private val feeSelectorReloadTrigger: FeeSelectorReloadTrigger, private val shouldShowNotificationUseCase: ShouldShowNotificationUseCase, private val analyticsEventHandler: AnalyticsEventHandler, + private val getWalletsUseCase: GetWalletsUseCase, ) : Model(), SwapAmountClickIntents, SwapChooseProviderComponent.ModelCallback { private val params: SwapAmountComponentParams = paramsContainer.require() @@ -328,21 +330,18 @@ internal class SwapAmountModel @Inject constructor( } private fun subscribeOnBalanceHiddenUpdates() { - params.isBalanceHidingFlow.onEach { - val primaryCryptoCurrencyStatus = (uiState.value as? SwapAmountUM.Content)?.primaryCryptoCurrencyStatus - if (primaryCryptoCurrencyStatus != null) { - uiState.transformerUpdate( - SwapAmountPrimaryReadyStateTransformer( - userWallet = userWallet, - primaryCryptoCurrencyStatus = primaryCryptoCurrencyStatus, - appCurrency = appCurrency, - swapDirection = swapDirection, - clickIntents = this, - isBalanceHidden = params.isBalanceHidingFlow.value, - showBestRateAnimation = showBestRateAnimation, - ), - ) - } + params.isBalanceHidingFlow.onEach { isHidden -> + val isSingleWallet = getWalletsUseCase.invokeSync().size == 1 + uiState.transformerUpdate( + SwapAmountBalanceHiddenTransformer( + isBalanceHidden = isHidden, + isSingleWallet = isSingleWallet, + userWallet = userWallet, + appCurrency = appCurrency, + swapDirection = swapDirection, + clickIntents = this, + ), + ) }.launchIn(modelScope) } @@ -352,6 +351,7 @@ internal class SwapAmountModel @Inject constructor( val primaryCryptoCurrencyStatus = (uiState.value as? SwapAmountUM.Content)?.primaryCryptoCurrencyStatus if (primaryCryptoCurrencyStatus != null) { + val isSingleWallet = getWalletsUseCase.invokeSync().size == 1 uiState.transformerUpdate( SwapAmountPrimaryReadyStateTransformer( userWallet = userWallet, @@ -361,6 +361,7 @@ internal class SwapAmountModel @Inject constructor( clickIntents = this, isBalanceHidden = params.isBalanceHidingFlow.value, showBestRateAnimation = showBestRateAnimation, + isSingleWallet = isSingleWallet, ), ) } @@ -386,6 +387,7 @@ internal class SwapAmountModel @Inject constructor( ), ) } else { + val isSingleWallet = getWalletsUseCase.invokeSync().size == 1 uiState.transformerUpdate( SwapAmountPrimaryReadyStateTransformer( userWallet = userWallet, @@ -395,6 +397,7 @@ internal class SwapAmountModel @Inject constructor( clickIntents = this, isBalanceHidden = params.isBalanceHidingFlow.value, showBestRateAnimation = showBestRateAnimation, + isSingleWallet = isSingleWallet, ), ) } @@ -492,6 +495,7 @@ internal class SwapAmountModel @Inject constructor( val primaryStatus = (uiState.value as? SwapAmountUM.Content)?.primaryCryptoCurrencyStatus if (secondaryStatus != null && primaryStatus != null) { initCurrencies(primaryStatus, secondaryStatus) + val isSingleWallet = getWalletsUseCase.invokeSync().size == 1 uiState.transformerUpdate( SwapAmountSecondaryReadyStateTransformer( userWallet = userWallet, @@ -503,6 +507,7 @@ internal class SwapAmountModel @Inject constructor( clickIntents = this@SwapAmountModel, isBalanceHidden = params.isBalanceHidingFlow.value, showBestRateAnimation = showBestRateAnimation, + isSingleWallet = isSingleWallet, ), ) startLoadingQuotesTask(isSilentReload = false) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt index f1d7e06cb3..1962a4d356 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/converter/SwapAmountFieldConverter.kt @@ -25,6 +25,7 @@ internal class SwapAmountFieldConverter( private val userWallet: UserWallet, private val appCurrency: AppCurrency, private val clickIntents: AmountScreenClickIntents, + private val isSingleWallet: Boolean, ) { private val iconStateConverter = CryptoCurrencyToIconStateConverter() @@ -51,11 +52,15 @@ internal class SwapAmountFieldConverter( isBalanceHidden = isBalanceHidden, ).convert( AmountParameters( - title = combinedReference( - resourceReference(R.string.send_from_wallet_android), - stringReference(" "), - stringReference(userWallet.name), - ), + title = if (isSingleWallet) { + resourceReference(R.string.send_from_title) + } else { + combinedReference( + resourceReference(R.string.send_from_wallet_android), + stringReference(" "), + stringReference(userWallet.name), + ) + }, value = "", ), ), diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountBalanceHiddenTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountBalanceHiddenTransformer.kt new file mode 100644 index 0000000000..52fc0217cd --- /dev/null +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountBalanceHiddenTransformer.kt @@ -0,0 +1,66 @@ +package com.tangem.features.swap.v2.impl.amount.model.transformers + +import com.tangem.common.ui.amountScreen.AmountScreenClickIntents +import com.tangem.common.ui.amountScreen.models.AmountState +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.swap.models.SwapDirection +import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountFieldUM +import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountType +import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountUM +import com.tangem.features.swap.v2.impl.amount.model.converter.SwapAmountFieldConverter +import com.tangem.utils.transformer.Transformer + +internal class SwapAmountBalanceHiddenTransformer( + private val isBalanceHidden: Boolean, + private val isSingleWallet: Boolean, + private val userWallet: UserWallet, + private val appCurrency: AppCurrency, + private val swapDirection: SwapDirection, + private val clickIntents: AmountScreenClickIntents, +) : Transformer { + + override fun transform(prevState: SwapAmountUM): SwapAmountUM { + val content = prevState as? SwapAmountUM.Content ?: return prevState + + val amountFieldConverter = SwapAmountFieldConverter( + swapDirection = swapDirection, + isBalanceHidden = isBalanceHidden, + userWallet = userWallet, + appCurrency = appCurrency, + clickIntents = clickIntents, + isSingleWallet = isSingleWallet, + ) + + val recalculatedPrimary = amountFieldConverter.convert( + selectedType = SwapAmountType.From, + cryptoCurrencyStatus = content.primaryCryptoCurrencyStatus, + ) as SwapAmountFieldUM.Content + + val oldPrimary = content.primaryAmount as? SwapAmountFieldUM.Content + + val mergedAmountField = if ( + oldPrimary?.amountField is AmountState.Data && recalculatedPrimary.amountField is AmountState.Data + ) { + val oldData = oldPrimary.amountField + val newData = recalculatedPrimary.amountField + newData.copy( + amountTextField = oldData.amountTextField, + selectedButton = oldData.selectedButton, + isPrimaryButtonEnabled = oldData.isPrimaryButtonEnabled, + isSegmentedButtonsEnabled = oldData.isSegmentedButtonsEnabled, + isEditingDisabled = oldData.isEditingDisabled, + reduceAmountBy = oldData.reduceAmountBy, + isIgnoreReduce = oldData.isIgnoreReduce, + ) + } else { + recalculatedPrimary.amountField + } + + val updatedPrimaryAmount = recalculatedPrimary.copy( + amountField = mergedAmountField, + ) + + return content.copy(primaryAmount = updatedPrimaryAmount) + } +} \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountPrimaryReadyStateTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountPrimaryReadyStateTransformer.kt index 3279e896ab..b6ff17ca44 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountPrimaryReadyStateTransformer.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountPrimaryReadyStateTransformer.kt @@ -24,6 +24,7 @@ internal class SwapAmountPrimaryReadyStateTransformer( private val swapDirection: SwapDirection, private val isBalanceHidden: Boolean, private val showBestRateAnimation: Boolean, + private val isSingleWallet: Boolean, ) : Transformer { private val amountFieldConverter = SwapAmountFieldConverter( @@ -32,6 +33,7 @@ internal class SwapAmountPrimaryReadyStateTransformer( userWallet = userWallet, appCurrency = appCurrency, clickIntents = clickIntents, + isSingleWallet = isSingleWallet, ) override fun transform(prevState: SwapAmountUM): SwapAmountUM { diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSecondaryReadyStateTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSecondaryReadyStateTransformer.kt index 7a0a94e535..da85780483 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSecondaryReadyStateTransformer.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountSecondaryReadyStateTransformer.kt @@ -25,6 +25,7 @@ internal class SwapAmountSecondaryReadyStateTransformer( private val swapDirection: SwapDirection, private val isBalanceHidden: Boolean, private val showBestRateAnimation: Boolean, + private val isSingleWallet: Boolean, ) : Transformer { private val amountFieldConverter = SwapAmountFieldConverter( @@ -33,6 +34,7 @@ internal class SwapAmountSecondaryReadyStateTransformer( userWallet = userWallet, appCurrency = appCurrency, clickIntents = clickIntents, + isSingleWallet = isSingleWallet, ) override fun transform(prevState: SwapAmountUM): SwapAmountUM { From 161fa5502de009a32ec4387fa2d9e1368914f10c Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 29 Aug 2025 21:27:04 +0300 Subject: [PATCH 26/29] Updated on 2026-08-14 --- core/res/src/main/res/values-de/strings.xml | 154 ++++++++++++++++-- core/res/src/main/res/values-es/strings.xml | 18 +- core/res/src/main/res/values-fr/strings.xml | 10 ++ core/res/src/main/res/values-ja/strings.xml | 46 +++++- core/res/src/main/res/values-ru/strings.xml | 17 +- .../src/main/res/values-uk-rUA/strings.xml | 11 ++ core/res/src/main/res/values/strings.xml | 6 +- 7 files changed, 238 insertions(+), 24 deletions(-) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index ddcad5ed92..300a8bea78 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -4,11 +4,44 @@ Trotzdem überspringen Zugangscode nicht festgelegt Zugangscode eingeben + Falscher Zugangscode. Deine Hot-Wallet wird nach %s weiteren Fehlversuchen gelöscht. + Falscher Zugangscode. App wird bei %s weiteren Eingabefehlern gesperrt + Falscher Zugangscode.\nBitte warte %s Sekunden und versuche es erneut. Bestätige Deinen zuvor eingegebenen Code, um fortzufahren Zugangscode erneut eingeben Lege einen %s -stelligen Zugangscode fest, um Deine Wallet zu entsperren. Zugangscode erstellen Zugangscode + Du kannst nicht mehr erstellen als %1$s Konto/Konten. Archiviere eines, um es neu hinzuzufügen. + Neues Konto kann nicht hinzugefügt werden + Konto archiviert + Archivierte Konten + Wiederherstellen + Du bist dabei, dich zu erholen \"%1$s”. + Konto wiederherstellen + Archiviert + Konto erstellt + Archivkonto + Archiv + Du archivierst dieses Konto, kannst es aber jederzeit entarchivieren. + Konto + Konto gespeichert + Kontonummer %s – wird zur Adressableitung verwendet. + Konto hinzufügen + Speichern + Kontoname + Konto + Neues Konto + Konto hinzufügen + Konto bearbeiten + %1$s in %2$s + Konto wiederhergestellt + Tippe lange auf ein Konto, um die Konten neu anzuordnen + Weiter bearbeiten + Verwerfen + Bist Du sicher, dass Du das neue Konto verwerfen willst? + Bist Du sicher, dass Du die Bearbeitungen verwerfen willst? + Nicht gespeicherte Änderungen Du kannst Deinen Token nicht finden? Gehe zum Bereich „Markt“ auf der Hauptseite und fügen diesen zum kaufen im Portfolio hinzu. Du kannst Deinen Token nicht finden? Gehe zum Bereich „Markt“ auf der Hauptseite und fügen diesen zum verkaufen im Portfolio hinzu. Verkaufen @@ -43,12 +76,18 @@ Tokens im %1$s -Netzwerk werden von dieser Karte oder Ring aufgrund einer Firmware-Einschränkung nicht unterstützt. Hast du Probleme beim Scannen deiner Karte oder Ring? Diese Karte oder Ring ist für die Zusammenarbeit mit Tangem nicht geeignet + Verwenden %1$s, um Deine Wallet schnell und sicher zu entsperren und alle sensiblen Aktionen zu autorisieren, wie z. B. das Unterschreiben von Transaktionen. Für Hardware-Wallets benötigst Du weiterhin eine Karte zum signieren. Standardgebühr Aktiviere die Option Standardgebühr, um die Transaktionsgebühren automatisch festzulegen und die Gebührenseite beim Senden von Geldern zu überspringen. Du kannst bei Bedarf jederzeit zu dieser Seite zurückkehren. Gehe zu den Einstellungen, um die biometrische Authentifizierung in der Tangem-App zu aktivieren Biometrische Authentifizierung aktivieren + Wenn Du %1$s deaktivierst, musst Du Deinen Passcode eingeben, um die App zu entsperren und um mit Deiner Wallet zu interagieren. + Du wirst später nach dem Zugangscode Deiner Wallet gefragt, damit wir sie für die zukünftige Verwendung sicher aufbewahren können Dadurch werden alle gespeicherten Zugangscodes für die Wallet gelöscht. Jede weitere Operation mit der Wallet erfordert die Übermittlung des Zugangscodes. Durch das Entfernen der gespeicherten Geräte werden alle gespeicherten Wallets und deren Zugangscodes aus der App gelöscht. + Dadurch werden alle gespeicherten Wallet-Zugangscodes gelöscht. Für jede weitere Interaktion mit dem Wallet ist die Eingabe des Zugangscodes erforderlich. + Zugangscode erforderlich + Mit dieser Option wird die biometrische Authentifizierung für vertrauliche Aktionen deaktiviert. Du musst Deinen Zugangscode jedes Mal eingeben, z. B. wenn Du eine Transaktion unterzeichnest. Zugangscode speichern Bei Interaktionen mit deiner Karte oder Ring wird anstelle des Zugangscodes eine biometrische Authentifizierung abgefragt. Behalte die Wallet in der App @@ -58,6 +97,14 @@ Systemstandard Thema App Einstellungen + Wallet hinzufügen + Wähle eine Wallet zum Einloggen + Willkommen zurück! + + %s Karte + %s Karten + + Handy-Wallet Du hast Deine Wallet erfolgreich gesichert. Diese Wörter können bei Verlust nicht wiederhergestellt werden. Bewahre diese an einem sicheren Ort auf. Sicherung abgeschlossen @@ -81,6 +128,16 @@ Bitte versuche es in 30 Sekunden erneut oder scanne die Karte oder Ring Zu viele Versuche Du hast die biometrische Authentifizierung auf deinem Telefon deaktiviert und kannst keine Wallets in der App speichern. Um Wallets zu speichern, aktiviere bitte die biometrische Authentifizierung in deinen Telefoneinstellungen. + Bei der Bearbeitung Deines Aktionscodes ist ein Fehler aufgetreten. Bitte versuche es später noch einmal. + Fehler bei der Aktivierung + Dein Promo-Code wurde erfolgreich aktiviert. Ein Bonus von 10 USDT in Bitcoin wird Deinem Konto innerhalb von 14 Tagen gutgeschrieben. + Promo-Code aktiviert + Dieser Aktionscode wurde bereits verwendet und kann nicht erneut aktiviert werden. + Code nicht verfügbar + Dieser Aktionscode ist ungültig und kann nicht aktiviert werden. + Ungültiger Code + Für den Erhalt des Bonus ist eine Bitcoin-Adresse erforderlich. Bitte füge eine zu Deiner Wallet hinzu und starte die Aktivierung erneut. + Bitcoin-Adresse erforderlich Backup-Prozess starten Verwende eine Bankkarte oder eine andere Zahlungsmethode @@ -116,6 +173,7 @@ Nicht genug ADA Akzeptieren Zugang verweigert + Konten Hinzufügen Zum Portfolio hinzufügen Token hinzufügen @@ -168,6 +226,7 @@ Tage Entfernen + Deaktivieren Deaktiviert Trennen Erledigt @@ -197,16 +256,23 @@ In Arbeit Später %1$s übrig + Legacy Bitcoin Gesperrt Hauptnetz monat Netzgebühr Der überwiesene Betrag wird um %1$s (%2$s) gekürzt, um die gewählte Gebührenhöhe zu decken. + + %1$s Netzwerk + %1$s Netzwerke + + Neue Adresse Weiter NFT Nein Keine Adresse Nicht hinzugefügt + Nicht jetzt Jetzt OK Im Browser öffnen @@ -222,6 +288,7 @@ Ablehnen Neu laden Umbenennen + Erforderlich Speichern Änderungen speichern Suchen @@ -249,6 +316,7 @@ Unterstützung Unterstützte Netzwerke Tauschen + Tangem Allgemeine Geschäftsbedingungen Nutzungsbedingungen Heute @@ -260,6 +328,7 @@ Transaktionsstatus Transaktionen Überweisung + Die Daten konnten nicht geladen werden… Ich verstehe Es ist ein Fehler aufgetreten. Bitte versuche es erneut. Nicht erreichbar @@ -322,6 +391,11 @@ Details Überprüfe deine Internetverbindung oder wechseln zu einem anderen Netzwerk Nutzungsbedingungen + Standardadresse + Empfangen von Vermögenswerten + Das Senden von Vermögenswerten in anderen Netzwerken führt zu dauerhaftem Verlust. + %s Netzwerk + Sende Geld nur mit Hallo Support-Team, ich habe einen Fehler mit dem Code %s festgestellt. WalletConnect-Fehler Du hast eine Karte oder Ring aus einer anderen Wallet verwendet. Tippe auf die Karte oder Ring, die dieser Wallet zugeordnet ist. @@ -348,8 +422,8 @@ Der Betrag wurde in %1$s (%2$s Netzwerk) zurückerstattet. Besuche die Website des Anbieters zur Überprüfung KYC-Überprüfung durch den Anbieter erforderlich - Gekauft - Einkaufen + Kauf abgeschlossen + Kauf steht aus Warten auf Kauf... Transaktion abgebrochen Anzahlung bestätigt @@ -381,6 +455,7 @@ Anbieter Bester Preis Warnliste der FCA + Anbieter in FCA-Warnliste Verfügbar bis zu %s Erhältlich bei %s Für dieses Paar nicht verfügbar @@ -428,10 +503,19 @@ Karte oder Ring scannen An %s Im %s Netzwerk + Willst Du den Vorgang zur Erstellung des Zugangscodes wirklich beenden? Jetzt sichern Um die Einrichtung abzuschließen, sicher Deine Wallet und sicher den App-Zugriff mit einem Access Code. Jetzt beenden Wallet-Aktivierung abschließen + Um das Setup abzuschließen, sicher den App-Zugriff mit Access Code. + Wenn dies der Fall ist, musst Du von vorne beginnen. + Bist Du sicher, dass Du den Aktivierungsprozess beenden willst? + Wenn dies der Fall ist, musst Du von vorne beginnen. + Wiederherstellung einer bestehenden Wallet, die in Ihrem Google Drive-Backup gespeichert ist + Google Drive-Backup + Verbesser Deine Sicherheit sofort mit einer erstklassigen Hardware-Wallet von Tangem. + Hardware-Wallet Gehe zum Backup Um Deine Wallet mit einem Zugangscode zu sichern, führe zuerst die Sicherung durch. Sicherung zuerst beenden @@ -443,6 +527,21 @@ Bleibe über die neuesten Funktionen und Neuigkeiten auf dem Laufenden Sicherung der Seed-Phrase Mobile Wallet erstellen + Diese Wiederherstellungsphrase wurde bereits importiert + Mobile Wallet + Dein Geld bleibt während des gesamten Prozesses sicher und vollständig zugänglich + Zugang zu Geldern + Alle privaten Wallet-Daten werden aus der mobilen App entfernt und nur sicher auf Deinem Tangem-Gerät gespeichert + Allgemeine Sicherheit + Private Schlüssel werden von der App auf Deine Tangem-Karte oder Deinen Tangem-Ring verschoben + Schlüsselmigration + Gerät scannen + Upgrade starten + Du bist dabei, Deine Wallet auf Tangem Wallet zu aktualisieren. Dies wird Dein Vermögen mit cold-storage sicher verwahren. + Tangem Wallet + Upgrade auf Hardware Wallet + Bewahren Deine Kryptowährungen sicher auf - mit der erstklassigen Hardware-Wallet von Tangem. + Wallet mit einem Hardware-Backup aufrüsten Diese Informationen wurden mithilfe von KI generiert.\nTippe hier, wenn Du Fehler finden. Um den Zugangscode zu ändern, halte die Karte oder Ring wie oben gezeigt an das Gerät und entferne sie erst am Ende des Vorgangs. Um den Passcode zu ändern, halte die Karte oder Ring wie oben gezeigt an das Gerät und entferne sie erst am Ende des Vorgangs. @@ -647,6 +746,9 @@ Jetzt beitreten Teile Deinen Code – verdiene 5 USDT pro Verkauf. Deine Freunde erhalten 10 % Rabatt. Erhalte BELOHNUNGEN für jeden Freund! + Krypto kaufen + Profitiere von null Gebühren beim Kauf von Kryptowährungen per SEPA-Überweisung. + Krypto mit SEPA kaufen Du musst einen einzigen Zugangscode einrichten, um alle deine Geräte zu schützen Schützen Du kannst später auf jeder Karte oder Ring einen individuellen Zugangscode einrichten @@ -727,7 +829,7 @@ Keine Sicherungsgeräte Benachrichtigungen Eine Backupgerät hinzugefügt - Bereite deine Karte oder Ring vor + Bereite Deine Karte oder Deinen Ring vor Zweites Backupgerät hinzugefügt Um zu beginnen, lade einfach die wallet mit einem beliebigen Betrag auf Um zu beginnen, lade die Wallet einfach mit mehr als %1$s %2$s auf. @@ -769,6 +871,7 @@ Du kannst diesen Bildschirm schließen und den Transaktionsstatus auf dem Bildschirm mit den Token-Details überprüfen. Du kannst diesen Bildschirm schließen und den Transaktionsstatus auf dem Bildschirm mit den Token-Details überprüfen. Über + Du zahlst Gruppe erstellen Nach Guthaben Token organisieren @@ -866,6 +969,7 @@ %1$s, %2$s Ziel-Tag Adresse eingeben + ENS-Name oder Adresse eingeben Die Adresse stimmt mit der Adresse Ihrer Brieftasche überein Minimaler Betrag ist %s Minimaler Wechselgeld ist %s @@ -947,14 +1051,20 @@ Ungültiger Betrag Die Gebühr geht über die Bilanz hinaus Der Gesamtbetrag geht über die Bilanz hinaus + Bist Du sicher, dass Du den Empfangstoken ändern möchtest? Dadurch werden Dein zuvor eingegebenen Daten zurückgesetzt. + Token ändern Tauschen und senden Mit der Konvertierung fortfahren? Dadurch werden Deine vorherigen Daten gelöscht. + Konvertierung bestätigen Das Senden einer anderen Währung führt zu deren unwiderruflichem Verlust. Wähle das richtige Empfängernetzwerk Sende uns ein Token, und wir konvertieren es unterwegs. Dein Empfänger erhält genau das, was er braucht – nahtlos. - Wird an den Empfänger gesendet + Der Empfänger erhält + An den Empfänger Zu erhaltender Betrag + Empfänger erhält %s Möchtest Du die Konvertierung wirklich abbrechen? Deine bisherigen Daten werden gelöscht. + Konvertierung entfernen Senden mit Swap Transaktion gesendet Bereite das Scannen der Karte oder Ring vor, die du einrichten möchtest. @@ -1121,6 +1231,7 @@ Fehler bei der Gebührenschätzung. Bitte sende dein Feedback an den Support. Du wechselst Der Tausch dieser Menge ausgewählter Token hat erhebliche Auswirkungen auf den Preis und verringert dein Ergebnis. + Hoher Einfluss auf den Preis Unzureichende Mittel Erlaubnis erteilen Tauschen @@ -1207,6 +1318,7 @@ Wallet umbenennen Alle freischalten Alle mit %s freischalten + Grenzen Verfügbar für %d Tag Verfügbar für %d Tage @@ -1224,6 +1336,7 @@ Schon kann es losgehen! Du kannst Deine Verbindung \n auf der Website des Drittanbieters \n herstellen und zurück zur Tangem-App gelangen Zur Website gehen + Wallet wählen Fahren wir mit der Einrichtung Deines Kontos fort. Willkommen zurück! Folge den Schritten, um Dein Konto einzurichten. @@ -1300,8 +1413,11 @@ Entdecke die Tangem Wallet Geheimcode zum Schutz dieser Wallet. Wird für Anmeldung und Signaturen verwendet. Zugangscode festlegen/ändern + Zugangscode ändern Bleib stets über eingehende Wallet-Transaktionen und Tangem-Updates auf dem Laufenden. + Push-Benachrichtigungen funktionieren derzeit möglicherweise nicht auf Huawei-Geräten. Wir arbeiten aktiv an einer Lösung und werden in einem kommenden Update einen Fix veröffentlichen. Vielen Dank für Ihr Verständnis! Transaktionsbenachrichtigungen + Zugangscode festlegen Wallet-Einstellungen Tangem Verwende %s oder scanne eine Karte oder Ring, um den Zugriff auf deine Wallet freizuschalten. @@ -1329,8 +1445,8 @@ Die Genehmigung des Swaps ist im Gange und wird in Kürze abgeschlossen sein. Genehmigung in Arbeit Der Mindestbetrag für den Tausch beträgt %1$s. Bitte stelle sicher, dass der Restsaldo nach dem Swap nicht unter %2$s liegt. - Sie haben keine Token in Ihrem Portfolio, gegen die %s getauscht werden kann. Bitte fügen Sie einen anderen Token hinzu, um den Tausch durchzuführen. - Keine Token zum Tauschen verfügbar + Du hast keine Token in Deinem Portfolio, gegen die %s getauscht werden kann. Bitte füge einen anderen Token hinzu, um den Austausch zu ermöglichen. + Keine kompatiblen Token hinzugefügt Um eine Transaktion durchzuführen, du etwas etwas einzahlen %1$s %2$s Die Gebühr %s kann nicht gedeckt werden Der zu erhaltende Betrag muss mindestens %s betragen @@ -1389,7 +1505,7 @@ Wischen Sie nach unten, um zu aktualisieren, oder versuchen Sie es später erneut. Einige Netzwerke sind nicht erreichbar Einige Token-Guthaben konnten nicht aktualisiert werden - Nicht genug %s. Lade Dein XLM-Konto auf, um dieses Token zu verknüpfen + Nicht genug %s. Lade Dein XLM-Konto auf, um Trustline zu öffnen. Dies ist eine Testnet-Karte. Sie kann keine Transaktionen verarbeiten und sollte nur zu Test- und Entwicklungszwecken verwendet werden. Nur für Testzwecke Der Kontostand ist möglicherweise veraltet. Aktualisiere bittre die Seite. @@ -1416,6 +1532,7 @@ Wenn das Problem weiterhin besteht, wende Dich bitte an unseren Support. Wir haben einen unbekannten Fehler festgestellt. Tangem Wallet unterstützt derzeit nicht %s + Nicht unterstützte dApp Fehlercode: 8 005. Wenn das Problem weiterhin besteht, wende Dich bitte an unseren Support. Wir haben einen unbekannten Fehler festgestellt. Dieses Netzwerk %s wird von Tangem Wallet nicht unterstützt und kann nicht verbunden werden. @@ -1426,6 +1543,7 @@ Verifizierte Domain Falsche Karte oder falscher Ring in der App ausgewählt Wir haben eine Art Problem + Alle dApps getrennt Erlaubnis auszugeben Vertragsadresse Verbinden @@ -1434,7 +1552,9 @@ Netzwerke Unbegrenzt Wallet + Verbundene App Verbundene Netzwerke + Verbunden mit %1$s Anzeige des Kontostands und der Aktivitäten in Deiner Wallet Signiere die Transaktionen ohne eine Vorankündigung Genehmigung für Transaktionen anfordern @@ -1445,8 +1565,9 @@ Inhalt Daten kopieren Benutzerdefinierter Freibetrag + dApp getrennt Alle trennen - Alle dApp-Sitzungen werden getrennt. Ihre Wallet wird nicht mehr mit dApps verbunden sein. + Alle dApp-Sitzungen werden getrennt. Deien Wallet ist nicht mehr mit dApps verknüpft. Alle dApps trennen Versuchen Sie erneut, mit einer neuen URI zu koppeln Ungültige dApp-Domain @@ -1456,21 +1577,34 @@ Verbindungsvorschlag abgelaufen Geschätzte Wallet-Änderungen Die Transaktion konnte nicht simuliert werden. Bitte sei vorsichtig. + Die Schätzung wird nicht unterstützt für %s + Vorgeschlagen von %s + Lade Dein Guthaben auf, um die Netzwerkgebühr zu decken + Unzureichend %1$s Böswillige/ gefährliche Transaktion - Füge Deinem Profil für dieses Wallet das Netzwerk %s hinzu + Füge das Netzwerk %s zu Deinem Portfolio für diese Wallet hinzu Die Wallet verfügt über keine erforderlichen Netzwerke Neue Verbindung - Verbinde Deine Wallet mit einer anderen dApp + Verbinde Deine Wallet mit verschiedenen dApps Keine Sitzungen + Keine Wallet-Änderungen erkannt Es wurden potenzielle Risiken oder bösartiges Verhalten erkannt. Das Verbinden oder Signieren von Transaktionen kann zum Verlust von Geldern führen. Bekanntes Sicherheitsrisiko + Öffne die Web3-App und wähle die Option WalletConnect Anfrage von + Trotzdem signieren Art der Signatur + Für die dApp-Verbindung ist mindestens ein Netzwerk erforderlich + Ausgewählte Netzwerke angeben + Erfolgreich signiert An Transaktionsanfrage Transaktionsanfrage Unbegrenzte Menge + Stelle sicher, dass bei jedem Kopplungsversuch ein frischer und eindeutiger URI verwendet wird. + URI bereits verwendet WalletConnect + Verdächtige Transaktion Verwerfen Du hast eine unterbrochene Sicherung. Möchtest du diese fortsetzen? Ja, fortsetzen diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index fa2411cdf5..7abdfe3162 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -78,6 +78,16 @@ Por favor, inténtelo de nuevo en 30 segundos o escanee la tarjeta/anillo Demasiados intentos Ha desactivado la autenticación biométrica en su teléfono y no podrá guardar billeteras en la aplicación. Para guardar billeteras, active la función de autenticación biométrica en los ajustes de su teléfono. + Se produjo un error al procesar tu código promocional. Inténtalo de nuevo más tarde. + Error de activación + Su código promocional se ha activado correctamente. Un bono de 10 USDT en Bitcoin se abonará en su cuenta en un plazo de 14 días. + Código promocional activado + Este código promocional ya ha sido utilizado y no puede activarse de nuevo. + Código no disponible + Este código promocional no es válido y no puede activarse. + Código inválido + Se requiere una dirección de Bitcoin para recibir el bono. Añade una a tu billetera y vuelve a intentar la activación. + Se requiere una dirección de Bitcoin Iniciar proceso de backup Utilice una tarjeta bancaria u otros métodos de pago @@ -202,7 +212,7 @@ NFT No Ninguna dirección - No aregada + No agregada Ahora no Ahora OK @@ -250,8 +260,8 @@ Condiciones de uso Hoy - %d ficha - %d fichas + %d token + %d tokens Transacción fallida Estado de la transacción @@ -1348,7 +1358,7 @@ Para continuar, vuelva a conectar su sesión de dApp con la red requerida %s. Red no conectada Verifique su conexión de red - Tiempo de espera de la solicitud agotado + Tiempo de espera agotado Vuelva a su navegador y vuelva a conectarse a través de WalletConnect. La sesión de Wallet Connect se desconectó Firmar de todos modos diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index e907d8df01..97e1096155 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -60,6 +60,16 @@ Veuillez réessayer dans 30 secondes ou scannez la carte/bague Trop de tentatives Vous avez désactivé l\'authentification biométrique sur votre téléphone et ne pourrez pas enregistrer de portefeuilles dans l\'application. Pour enregistrer des portefeuilles, veuillez activer la fonction d\'authentification biométrique dans les paramètres de votre téléphone. + Une erreur s\'est produite lors du traitement de votre code promo. Veuillez réessayer plus tard. + Erreur d\'activation + Votre code promo a été activé avec succès. Un bonus de 10 USDT en Bitcoin sera crédité dans 14 jours. + Code promo activé + Ce code promo a déjà été utilisé et ne peut pas être activé à nouveau. + Code indisponible + Ce code promo n\'est pas valide et ne peut pas être activé. + Code invalide + Une adresse Bitcoin est nécessaire pour recevoir le bonus. Veuillez en ajouter une à votre portefeuille et réessayer l\'activation. + Adresse Bitcoin requise Démarrer le processus de sauvegarde Utilisez une carte bancaire ou d\'autres moyens de paiement diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index 2e061c0bce..2a0890b5cb 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -12,12 +12,20 @@ ウォレットのロックを解除するには、 %s桁のアクセスコードを設定します。 アクセスコードの作成 アクセスコード + %1$s個を超えるアカウントは作成できません。新しいアカウントを追加するには、1つをアーカイブしてください。 + 新しいアカウントを追加できません + アカウントはアーカイブされました + アーカイブされたアカウント 回復する + 「 %1$s 」を回復しようとしています。 + アカウントを回復する アーカイブ済み + アカウントを作成しました アカウントをアーカイブする アーカイブ このアカウントをアーカイブしますが、いつでも復元できます。 アカウント + アカウントが保存されました アカウント番号%s — アドレス導出に使用されます。 アカウントを追加 保存 @@ -26,6 +34,9 @@ 新しいアカウント アカウントを追加 アカウントを編集 + %1$s ( %2$s内) + アカウントが回復しました + アカウントを長押しして並べ替える 編集を続ける 破棄 新しいアカウントを破棄してもよろしいですか? @@ -116,6 +127,16 @@ 30秒後に再試行するか、カードまたはリングをスキャンしてください 試行回数が多すぎます お使いの携帯電話で生体認証が無効になっているため、アプリにウォレットを保存できません。ウォレットを保存するには、携帯電話の設定で生体認証機能を有効にしてください。 + プロモーションコードの処理中にエラーが発生しました。しばらくしてからもう一度お試しください。 + アクティベーションエラー + プロモーションコードが正常に有効化されました。14日以内に10 USDT相当のビットコインがアカウントに入金されます。 + プロモーションコードが有効になりました + このプロモーションコードは既に使用されているため、再度使うことはできません。 + コードが利用できません + このプロモーションコードは無効であり、有効化できません。 + 無効なコード + ボーナスを受け取るにはビットコインアドレスが必要です。ウォレットにビットコインアドレスを追加し、再度アクティベーションをお試しください。 + ビットコインアドレスが必要です バックアップ処理を開始する 銀行カードまたはその他の支払い方法を使用する @@ -149,6 +170,7 @@ ADAが不足しています。 受け入れる アクセスが拒否されました + アカウント 追加 ポートフォリオに追加 トークンを追加 @@ -229,11 +251,16 @@ 進行中 後で 残り%1$s + レガシービットコイン ロックされています メインネットワーク ネットワーク手数料 送金額は、選択された手数料レベルをカバーするため、%1$s (%2$s) 減額されます。 + + %dネットワーク + + 新しいアドレス NFT いいえ @@ -283,6 +310,7 @@ サポート 対応ネットワーク スワップ + Tangem 利用規約 利用規約 今日 @@ -356,12 +384,13 @@ 詳細 インターネット接続を確認するか、別のネットワークに切り替えてください。 利用規約 + デフォルトアドレス 資金を受け取る 他のネットワークで資産を送金すると、永久に失われます。 %sネットワーク 下記のみを使用して資金を送金する - サポートチームの皆様、コード %s のエラーが発生しました。 - WalletConnect エラー + こんにちは、サポートチームの皆さん、コード %s のエラーが発生しました。 + WalletConnectエラー 別のウォレットのカードまたはリングを使用しました。このウォレットにリンクしているカードまたはリングをタップしてください。 取引に必要な資金が不足しています。アカウントに入金してください。 マイトークン @@ -505,7 +534,7 @@ Tangemウォレット ハードウェアウォレットにアップグレード Tangemの業界最高水準のハードウェアウォレットで、暗号資産を安全に保管しましょう。 - ハードウェアバックアップでウォレットをアップグレード + ハードウェアバックアップで、ウォレットをアップグレード この情報はAIで生成されました。 \nエラーが見つかった場合は、ここをタップしてください。 アクセスコードを変更するには、上図のようにカードまたはリングをタップし、操作が終了するまで取り外さないでください。 パスコードを変更するには、上記のようにカードをタップし、操作が終了するまで取り外さないでください。 @@ -705,6 +734,9 @@ 今すぐ参加 コードを共有すると、販売ごとに5 USDTを獲得できます。お友達は10%割引になります。 友達への紹介で報酬を獲得しよう! + 暗号資産を買い付ける + SEPA送金で暗号資産を買い付けると、手数料はかかりません。 + SEPAで暗号資産を買い付ける すべてのデバイスを保護するには、単一のアクセスコードを設定してください。 保護する 後で各カードおよびリングに個別のアクセスコードを設定できます。 @@ -825,6 +857,7 @@ この画面を閉じて、トークンの詳細画面で取引状況を確認できます。 この画面を閉じて、トークンの詳細画面で取引状況を確認できます。 経由 + 支払い グループ 残高順 トークンを整理する @@ -1278,6 +1311,7 @@ 長くはかかりません。アカウントを設定しています。 長くはかかりません。アクティベーションを完了しています。 準備完了です! + 4桁のコードを設定します。 \nお支払いの際に使用されます。 PINの認証に失敗しました。もう一度お試しいただくか、別のコードを使用してください。 無効な暗証番号:連続や繰り返しを避けてください ウェブサイトに移動 @@ -1296,10 +1330,10 @@ Dapp%1$s 、BNB取引の署名を要求しています\n\n%2$s %1$sの取引注文\n価格: %2$s\n受取金額: %3$s\n支払金額: %4$s 取引の詳細:\n送信元: %1$s\n受取先: %2$s\n量: %3$s - クリップボードには WalletConnect コードが含まれています。コピーした値を使用するか、QRコードをスキャンしてください。 + クリップボードには WalletConnectコードが含まれています。コピーした値を使用するか、QRコードをスキャンしてください。 %1$sの取引を作成するリクエスト\n%2$s\n\n金額: %3$s\n手数料: %4$s\n合計: %5$s\n残高: %6$s 取引を送信できません。資金が足りません。 - WalletConnect セッションを確立できませんでした。しばらくしてからもう一度お試しください。 + WalletConnectセッションを確立できませんでした。しばらくしてからもう一度お試しください。 すべてのトークンがリストには追加されませんでした。まず追加してから、もう一度お試しください。不足しているトークン: \n メッセージの署名に失敗しました。\nもう一度お試しください。 WalletConnectセッションの確立に失敗しました:タイムアウトエラー。しばらくしてもう一度お試しください。 @@ -1478,7 +1512,7 @@ サポートされていないdApp エラーコード: 8 005。問題が解決しない場合は、お気軽にサポートまでお問い合わせください。 不明なエラーが発生しました - このネットワーク %s はTangem Walletでサポートされておらず、接続できません。 + このネットワーク%sはTangemウォレットでサポートされておらず、接続できません。 サポートされていないネットワーク Tangemは現在%sで必要なネットワークをサポートしていません。 未対応のネットワーク diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index befe0fd2d7..bb7cbe4247 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -59,6 +59,16 @@ Пожалуйста, попробуйте снова через 30 секунд или отсканируйте карту или кольцо Слишком много попыток Вы отключили биометрическую аутентификацию на вашем телефоне и не сможете сохранять кошельки в приложении. Для сохранения кошельков, пожалуйста, включите функцию биометрической аутентификации в настройках телефона. + При обработке промокода произошла ошибка. Пожалуйста, попробуйте позже. + Ошибка активации + Ваш промокод успешно активирован. Бонус 10 USDT в Bitcoin будет зачислен через 14 дней. + Промокод активирован + Этот промокод уже был использован и не может быть активирован повторно. + Код недоступен + Этот промокод недействителен и не может быть активирован. + Неверный код + Для зачисления бонуса нужен Bitcoin-адрес. Добавьте его в портфель и повторите активацию. + Требуется Bitcoin-адрес Начать резервное копирование Используйте банковскую карту или другие методы оплаты @@ -294,6 +304,8 @@ Подробности Проверьте подключение с интернетом или переключитесь на другую сеть Условия использования + Legacy адрес + Отправка средств в другой сети может повлечь потерю средств. Привет, команда поддержки, у меня возникла ошибка с кодом: %s Ошибка WalletConnect Вы использовали карту или кольцо от другого кошелька. Приложите карту или кольцо, связанную с этим кошельком. @@ -848,7 +860,7 @@ Это максимальное количество газа, которое будет потрачено на выполнение транзакции или контракта. Лимит газа предотвращает неожиданные или неограниченные расходы при выполнении транзакции. Цена газа Это стоимость, которую вы готовы заплатить за каждую единицу газа. Чем выше цена газа, тем быстрее ваша транзакция будет обработана. - Всё + Макс Максимальная сумма Комиссия не превысит Недопустимый Memo @@ -912,7 +924,7 @@ Обмен и отправка Продолжить с конвертацией? Это действие удалит предыдущие данные Подтвердить конвертацию - Отправьте любой токен, и мы конвертируем его по пути. Адресат получит именно то, что нужно — без лишних действий. + Выберите любой токен к получению. Ваш адресат получит ровно то, что вы выбрали — без лишних сложностей. Будет получено Получателю Сумма к получению @@ -1071,6 +1083,7 @@ Лучшие курсы Интуитивный обмен в пару касаний — без сложностей и ожидания Проще простого + Обмен через провайдера В сумму включено: \n• комиссия провайдера сервиса\n• комиссия сети за отправку %s от биржи обратно на адрес пользователя. В сумму включено: \n• комиссия провайдера сервиса\n• комиссия сети за отправку %1$s от биржи обратно на адрес пользователя \n\nПроскальзывание провайдера составляет до %2$s В сумму включена комиссия провайдера сервиса. diff --git a/core/res/src/main/res/values-uk-rUA/strings.xml b/core/res/src/main/res/values-uk-rUA/strings.xml index 5c7d9f4ef4..1175b3d951 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -59,6 +59,16 @@ Будь ласка, спробуйте знову через 30 секунд або відскануйте картку або кільце Забагато спроб Ви вимкнули біометричну автентифікацію на своєму телефоні і не зможете зберігати гаманці в додатку. Щоб зберегти гаманці, будь ласка, увімкніть функцію біометричної автентифікації в налаштуваннях телефону. + Під час обробки промокоду сталася помилка. Будь ласка, спробуйте пізніше. + Помилка активації + Ваш промокод успішно активовано. Бонус 10 USDT у Bitcoin буде зараховано через 14 днів. + Промокод активовано + Цей промокод уже був використаний і не може бути активований повторно. + Код недоступний + Цей промокод недійсний і не може бути активований. + Невірний код + Для зарахування бонусу потрібна Bitcoin-адреса. Додайте її до портфеля та повторіть активацію. + Потрібна Bitcoin-адреса Почніть процес резервного копіювання Використовуйте банківську картку або інші способи оплати @@ -906,6 +916,7 @@ Недопустима сума Комісія перевищує залишок Сума, що відправляється, перевищує залишок + Виберіть будь-який токен. Той, кому ви його надішлете, отримає саме те, що ви обрали — без жодних ускладнень. Трансакцію надіслано Підготуйтеся до сканування кільця або картки, яку ви хочете налаштувати. Забути гаманець diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 670cd963ee..5babd8c525 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -316,6 +316,7 @@ Support Supported networks Swap + Tangem Tangem Wallet terms and conditions Terms of Use @@ -545,7 +546,7 @@ Tangem Wallet Upgrade to Hardware Wallet Keep your crypto safe with Tangem’s best-in-class hardware wallet. - Upgrade wallet with a hardware
backup + Upgrade wallet with a hardware backup This information was generated with AI.\nTap here, if you find any errors. To change the access code tap the card or ring as shown above and do not remove until the end of the operation To change the passcode tap the card as shown above and do not remove until the end of the operation @@ -875,6 +876,7 @@ You can close this screen and check the transaction status on the token details screen. You can close this screen and check the transaction status on the token details screen. Via + You will pay Group By balance Organize tokens @@ -1062,7 +1064,7 @@ Confirm Conversion Sending any other currency will result in its irreversible loss. Select the correct recipient network - Send any token, and we’ll convert it on the way. Your recipient gets exactly what they need—seamlessly. + Choose any token to receive. Your recipient gets exactly what you selected—seamlessly. Recipient will receive To recipient Amount to receive From 3dc0dc3686948a7d04dea3620c27f3051d3af078 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 1 Sep 2025 07:38:00 +0000 Subject: [PATCH 27/29] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index 57e50cf4ac..05f6e8b112 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,13 +5,13 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "releases-5.27.0-1148" +tangemBlockchainSdk = "releases-5.28-1211" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "releases-5.27.0-519" +tangemCardSdk = "releases-5.28-559" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ tangemVico = "2.0.0-alpha.25-tangem12" #tangemVico = "0.0.1" # Keep it! - used for local builds ^ -tangemHotSdk = "develop-454" +tangemHotSdk = "develop-461" #tangemHotSdk = "0.0.1" # Keep it! - used for local builds ^ From 3aaa150cd3e2f93d20bf04b00ed2c7333ccb02dc Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 1 Sep 2025 11:11:20 +0200 Subject: [PATCH 28/29] Updated on 2026-08-14 --- .../buttons/small/TangemIconButton.kt | 5 ++- .../model/TokenReceiveWarningModel.kt | 2 - .../ui/TokenReceiveAssetsContent.kt | 5 ++- .../tokenreceive/ui/TokenReceiveContent.kt | 3 +- .../ui/TokenReceiveWarningContent.kt | 37 +++++++------------ .../tokenreceive/ui/state/WarningUM.kt | 1 - 6 files changed, 23 insertions(+), 30 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/small/TangemIconButton.kt b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/small/TangemIconButton.kt index c0d2dac09e..9cb8a2f121 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/small/TangemIconButton.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/small/TangemIconButton.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.tangem.core.ui.R import com.tangem.core.ui.res.TangemTheme @@ -30,6 +31,7 @@ import com.tangem.core.ui.res.TangemThemePreview * @param shape icon button shape * @param background background color * @param iconTint icon color + * @param innerPadding icon padding inside background area * * [Show in Figma](https://www.figma.com/design/14ISV23YB1yVW1uNVwqrKv/Android?node-id=4105-1439&t=nnYBX1qCZmUNhBDf-4) */ @@ -41,6 +43,7 @@ fun TangemIconButton( shape: RoundedCornerShape = RoundedCornerShape(24.dp), background: Color = TangemTheme.colors.button.secondary, iconTint: Color = TangemTheme.colors.icon.secondary, + innerPadding: Dp = 4.dp, ) { Icon( painter = rememberVectorPainter(ImageVector.vectorResource(iconRes)), @@ -50,7 +53,7 @@ fun TangemIconButton( .size(24.dp) .clip(shape) .background(background) - .padding(4.dp) + .padding(innerPadding) .clickable( onClick = onClick, ), diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveWarningModel.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveWarningModel.kt index 8c686c07a7..7d57f2d60d 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveWarningModel.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/model/TokenReceiveWarningModel.kt @@ -4,7 +4,6 @@ import androidx.compose.runtime.Stable import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer -import com.tangem.core.ui.extensions.iconResId import com.tangem.features.tokenreceive.component.TokenReceiveWarningComponent import com.tangem.features.tokenreceive.ui.state.WarningUM import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -27,7 +26,6 @@ internal class TokenReceiveWarningModel @Inject constructor( iconState = params.iconState, onWarningAcknowledged = params.callback::onWarningAcknowledged, network = params.network.name, - networkIcon = params.network.iconResId, ), ) } \ No newline at end of file diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt index 73f31d7f8d..0bc0d7a0c7 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveAssetsContent.kt @@ -230,6 +230,7 @@ private fun AddressItem( TangemIconButton( modifier = Modifier.size(TangemTheme.dimens.size28), + innerPadding = 6.dp, iconRes = R.drawable.ic_qrcode_new_24, onClick = onOpenQrCodeClick, ) @@ -239,6 +240,7 @@ private fun AddressItem( TangemIconButton( modifier = Modifier.size(TangemTheme.dimens.size28), iconRes = R.drawable.ic_copy_new_24, + innerPadding = 6.dp, onClick = onCopyClick, ) } @@ -276,8 +278,9 @@ private fun EnsItem(onCopyClick: () -> Unit, address: String, modifier: Modifier ) TangemIconButton( - modifier = Modifier.size(28.dp), + modifier = Modifier.size(TangemTheme.dimens.size28), iconRes = R.drawable.ic_copy_new_24, + innerPadding = 6.dp, onClick = onCopyClick, ) } diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveContent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveContent.kt index 75ee1fb93f..f4e495de55 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveContent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveContent.kt @@ -1,6 +1,7 @@ package com.tangem.features.tokenreceive.ui import androidx.compose.animation.animateContentSize +import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -83,7 +84,7 @@ internal fun TokenReceiveContent( ) { Children( stack = stackState, - animation = stackAnimation(fade()), + animation = stackAnimation(fade(animationSpec = tween(durationMillis = 100))), modifier = modifier .fillMaxSize() .animateContentSize(), diff --git a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt index 2d85ca786c..25c47e9b3c 100644 --- a/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt +++ b/features/token-recieve/impl/src/main/java/com/tangem/features/tokenreceive/ui/TokenReceiveWarningContent.kt @@ -3,15 +3,12 @@ package com.tangem.features.tokenreceive.ui import android.content.res.Configuration import androidx.compose.foundation.background import androidx.compose.foundation.layout.* -import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -47,15 +44,17 @@ internal fun TokenReceiveWarningContent(warningUM: WarningUM) { horizontalAlignment = Alignment.CenterHorizontally, ) { CurrencyIcon( - modifier = Modifier.size(size = 56.dp), + modifier = Modifier + .padding(8.dp) + .size(size = 64.dp), state = warningUM.iconState, - shouldDisplayNetwork = false, + shouldDisplayNetwork = true, iconSize = 56.dp, ) SpacerH24() - WarningBlock(networkIcon = warningUM.networkIcon, networkName = warningUM.network) + WarningBlock(networkName = warningUM.network) SpacerH12() @@ -80,7 +79,7 @@ internal fun TokenReceiveWarningContent(warningUM: WarningUM) { } @Composable -fun WarningBlock(networkName: String, networkIcon: Int, modifier: Modifier = Modifier) { +fun WarningBlock(networkName: String, modifier: Modifier = Modifier) { Column( modifier = modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, @@ -92,23 +91,14 @@ fun WarningBlock(networkName: String, networkIcon: Int, modifier: Modifier = Mod color = TangemTheme.colors.text.primary1, ) - Row(verticalAlignment = Alignment.CenterVertically) { - Icon( - modifier = Modifier.size(20.dp), - painter = painterResource(id = networkIcon), - tint = Color.Unspecified, - contentDescription = null, - ) + SpacerW6() - SpacerW6() - - Text( - textAlign = TextAlign.Center, - text = stringResourceSafe(R.string.domain_receive_assets_onboarding_network_name, networkName), - style = TangemTheme.typography.h3, - color = TangemTheme.colors.text.primary1, - ) - } + Text( + textAlign = TextAlign.Center, + text = stringResourceSafe(R.string.domain_receive_assets_onboarding_network_name, networkName), + style = TangemTheme.typography.h3, + color = TangemTheme.colors.text.primary1, + ) } } @@ -139,7 +129,6 @@ private class TokenReceiveWarningContentProvider : PreviewParameterProvider Unit, ) \ No newline at end of file From 7a5996534255b9c33a8daedd4a508ad69dcaa697 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 1 Sep 2025 09:44:54 +0000 Subject: [PATCH 29/29] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index 05f6e8b112..c57f7b4239 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,13 +5,13 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "releases-5.28-1211" +tangemBlockchainSdk = "develop-1205" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "releases-5.28-559" +tangemCardSdk = "develop-557" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ tangemVico = "2.0.0-alpha.25-tangem12" #tangemVico = "0.0.1" # Keep it! - used for local builds ^ -tangemHotSdk = "develop-461" +tangemHotSdk = "develop-525" #tangemHotSdk = "0.0.1" # Keep it! - used for local builds ^