From df9ecedf672adbbfe3e6592c3413d756b84101ee Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 29 Jul 2025 20:53:48 +0400 Subject: [PATCH] Updated on 2026-08-14 --- core/res/src/main/res/values-ja/strings.xml | 2 + core/res/src/main/res/values-ru/strings.xml | 1 + core/res/src/main/res/values/strings.xml | 2 + .../components/notifications/Notification.kt | 13 +++--- .../tangem/data/blockaid/BlockAidMapper.kt | 2 + .../models/transaction/ValidationResult.kt | 5 +++ .../connections/utils/WcAlertsFactory.kt | 9 ++-- .../WcSendReceiveTransactionCheckResultsUM.kt | 14 ++++++- .../model/WcSendTransactionModel.kt | 28 ++++++++++--- .../transaction/routes/WcTransactionRoutes.kt | 8 +++- .../blockaid/TransactionCheckResultsItem.kt | 12 ++++-- .../WcSendAndReceiveBlockAidUiConverter.kt | 18 ++++++-- .../blockaid/WcTransactionCheckErrorItem.kt | 42 ++++++++++++++----- .../send/WcSendTransactionModalBottomSheet.kt | 19 ++++++--- 14 files changed, 135 insertions(+), 40 deletions(-) diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index 543d824195..af6731c66e 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -1440,6 +1440,8 @@ 取引リクエスト 取引リクエスト 無制限 + 各ペアリング試行で、新しくユニークなURIが使用されていることを確認します + URIはすでに使用されています ウォレットコネクト 破棄 バックアップが中断されました。再開しますか? diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 71e9bf29d3..5a430645a7 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -1184,6 +1184,7 @@ Получите доступ к более чем 13 000 криптовалют. Покупайте, продавайте, обменивайте и стейкайте в один клик. Свяжите до трех карт для резервного копирования. Откройте Tangem Wallet Получайте уведомления о входящих транзакциях в кошельке и обновлениях Tangem. + В настоящий момент push-уведомления могут не работать на устройствах Huawei. Мы уже работаем над решением этой проблемы и планируем исправление в ближайших обновлениях. Спасибо за понимание! Уведомления о транзакциях Настройки кошелька Tangem diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 9afd794d7f..18834e5cbc 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -1351,6 +1351,7 @@ Secret code to protect this wallet. Used for login and signatures. Set/Change Access Code Stay notified on wallet incoming transactions and Tangem updates. + Push notifications may currently not work on Huawei devices. We\'re actively working on a solution and will release a fix in an upcoming update. Thank you for your understanding! Transaction Notifications Wallet settings Tangem @@ -1510,6 +1511,7 @@ Ensure that each pairing attempt uses a fresh and unique URI URI already used Wallet connect + Suspicious transaction Discard You have an interrupted backup. Do you want to resume? Yes, resume diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt b/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt index 10bfdbba1d..569384917c 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt @@ -211,11 +211,14 @@ internal fun TextsBlock( SpacerH(height = TangemTheme.dimens.spacing2) } - Text( - text = subtitle.resolveReference(), - color = subtitleColor, - style = TangemTheme.typography.caption2, - ) + val subtitleText = subtitle.resolveReference() + if (subtitleText.isNotEmpty()) { + Text( + text = subtitleText, + color = subtitleColor, + style = TangemTheme.typography.caption2, + ) + } } } diff --git a/data/blockaid/src/main/kotlin/com/tangem/data/blockaid/BlockAidMapper.kt b/data/blockaid/src/main/kotlin/com/tangem/data/blockaid/BlockAidMapper.kt index e245687538..857ec25986 100644 --- a/data/blockaid/src/main/kotlin/com/tangem/data/blockaid/BlockAidMapper.kt +++ b/data/blockaid/src/main/kotlin/com/tangem/data/blockaid/BlockAidMapper.kt @@ -16,6 +16,7 @@ import org.json.JSONArray private const val SUCCESS_STATUS = "Success" private const val DOMAIN_CHECKED_STATUS = "hit" private const val VALIDATION_SAFE_STATUS = "Benign" +private const val VALIDATION_WARNING_STATUS = "Warning" internal object BlockAidMapper { @@ -32,6 +33,7 @@ internal object BlockAidMapper { validation = when { from.validation.status != SUCCESS_STATUS -> ValidationResult.FAILED_TO_VALIDATE from.validation.resultType == VALIDATION_SAFE_STATUS -> ValidationResult.SAFE + from.validation.resultType == VALIDATION_WARNING_STATUS -> ValidationResult.WARNING else -> ValidationResult.UNSAFE }, simulation = if (from.simulation.status != SUCCESS_STATUS) { diff --git a/domain/blockaid/models/src/main/kotlin/com/domain/blockaid/models/transaction/ValidationResult.kt b/domain/blockaid/models/src/main/kotlin/com/domain/blockaid/models/transaction/ValidationResult.kt index 0adde02aa8..7f3e1a141c 100644 --- a/domain/blockaid/models/src/main/kotlin/com/domain/blockaid/models/transaction/ValidationResult.kt +++ b/domain/blockaid/models/src/main/kotlin/com/domain/blockaid/models/transaction/ValidationResult.kt @@ -15,6 +15,11 @@ enum class ValidationResult { */ UNSAFE, + /** + * Transaction was confirmed suspicious + */ + WARNING, + /** * Validation wasn't performed, BlockAid cannot guarantee transaction's safety */ diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt index 686b3ff2a7..587d3936b5 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt @@ -17,8 +17,8 @@ internal object WcAlertsFactory { createUnknownDomainAlert() is WcTransactionRoutes.Alert.Type.UnsafeDomain -> createUnsafeDomainAlert() - is WcTransactionRoutes.Alert.Type.MaliciousInfo -> - createMaliciousDAppAlert(alertType.description, alertType.onClick) + is WcTransactionRoutes.Alert.Type.BlockAidErrorInfo -> + createMaliciousDAppAlert(alertType.description, alertType.onClick, alertType.iconType, alertType.iconBgType) is WcTransactionRoutes.Alert.Type.UnknownError -> createUnknownErrorAlert(alertType.errorMessage, alertType.onDismiss) } @@ -154,11 +154,14 @@ internal object WcAlertsFactory { private fun createMaliciousDAppAlert( description: String?, activeButtonOnClick: (() -> Unit), + iconType: Type, + iconBgType: MessageBottomSheetUMV2.Icon.BackgroundType, ): MessageBottomSheetUMV2 { return messageBottomSheetUM { infoBlock { icon(R.drawable.img_knight_shield_32) { - backgroundType = MessageBottomSheetUMV2.Icon.BackgroundType.Attention + type = iconType + backgroundType = iconBgType } title = resourceReference(R.string.security_alert_title) if (!description.isNullOrEmpty()) { diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/blockaid/WcSendReceiveTransactionCheckResultsUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/blockaid/WcSendReceiveTransactionCheckResultsUM.kt index 096af30724..57b9c03f54 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/blockaid/WcSendReceiveTransactionCheckResultsUM.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/blockaid/WcSendReceiveTransactionCheckResultsUM.kt @@ -6,6 +6,16 @@ import com.tangem.features.walletconnect.transaction.entity.approve.WcSpendAllow internal data class WcSendReceiveTransactionCheckResultsUM( val estimatedWalletChanges: WcEstimatedWalletChangesUM? = null, val spendAllowance: WcSpendAllowanceUM? = null, - val notificationText: TextReference? = null, + val notification: BlockAidNotificationUM? = null, val isLoading: Boolean = true, -) \ No newline at end of file +) + +internal data class BlockAidNotificationUM( + val type: Type, + val title: TextReference, + val text: TextReference? = null, +) { + internal enum class Type { + ERROR, WARNING + } +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt index 2455b74700..965e4430b8 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt @@ -15,6 +15,8 @@ import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.navigation.Router import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.ui.clipboard.ClipboardManager +import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetUMV2 +import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetUMV2.Icon.Type import com.tangem.core.ui.extensions.stringReference import com.tangem.domain.core.lce.Lce import com.tangem.domain.models.network.Network @@ -251,10 +253,10 @@ internal class WcSendTransactionModel @Inject constructor( } private fun onSign(securityCheck: BlockAidTransactionCheck.Result?) { - if (securityCheck?.result?.validation == ValidationResult.UNSAFE) { - showMaliciousAlert(securityCheck.result.description) - } else { - sign() + when (securityCheck?.result?.validation) { + ValidationResult.UNSAFE -> showMaliciousAlert(securityCheck.result.description) + ValidationResult.WARNING -> showWarningAlert(securityCheck.result.description) + else -> sign() } securityCheck?.result?.validation?.let { securityStatus -> val event = WcAnalyticEvents.NoticeSecurityAlert( @@ -265,6 +267,7 @@ internal class WcSendTransactionModel @Inject constructor( when (securityStatus) { ValidationResult.SAFE -> Unit ValidationResult.UNSAFE, + ValidationResult.WARNING, ValidationResult.FAILED_TO_VALIDATE, -> analytics.send(event) } @@ -288,7 +291,22 @@ internal class WcSendTransactionModel @Inject constructor( } private fun showMaliciousAlert(description: String?) { - val type = WcTransactionRoutes.Alert.Type.MaliciousInfo(description = description, onClick = ::signFromAlert) + val type = WcTransactionRoutes.Alert.Type.BlockAidErrorInfo( + description = description, + onClick = ::signFromAlert, + iconType = Type.Warning, + iconBgType = MessageBottomSheetUMV2.Icon.BackgroundType.Warning, + ) + stackNavigation.pushNew(WcTransactionRoutes.Alert(type)) + } + + private fun showWarningAlert(description: String?) { + val type = WcTransactionRoutes.Alert.Type.BlockAidErrorInfo( + description = description, + onClick = ::signFromAlert, + iconType = Type.Attention, + iconBgType = MessageBottomSheetUMV2.Icon.BackgroundType.Attention, + ) stackNavigation.pushNew(WcTransactionRoutes.Alert(type)) } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt index 4c23abfde5..44b4ae7531 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt @@ -3,6 +3,7 @@ package com.tangem.features.walletconnect.transaction.routes import androidx.compose.runtime.Immutable import com.tangem.core.decompose.navigation.Route import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent +import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetUMV2 import kotlinx.serialization.Serializable @Serializable @@ -27,7 +28,12 @@ internal sealed class WcTransactionRoutes : TangemBottomSheetConfigContent, Rout data class Verified(val appName: String) : Type() data object UnknownDomain : Type() data object UnsafeDomain : Type() - data class MaliciousInfo(val description: String?, val onClick: () -> Unit) : Type() + data class BlockAidErrorInfo( + val description: String?, + val onClick: () -> Unit, + val iconType: MessageBottomSheetUMV2.Icon.Type, + val iconBgType: MessageBottomSheetUMV2.Icon.BackgroundType, + ) : Type() data class UnknownError(val errorMessage: String?, val onDismiss: () -> Unit) : Type() } } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/TransactionCheckResultsItem.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/TransactionCheckResultsItem.kt index 0ff92d4802..b70cf31f20 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/TransactionCheckResultsItem.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/TransactionCheckResultsItem.kt @@ -11,11 +11,11 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.tangem.core.ui.extensions.TextReference -import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.walletconnect.impl.R +import com.tangem.features.walletconnect.transaction.entity.blockaid.BlockAidNotificationUM import com.tangem.features.walletconnect.transaction.entity.blockaid.WcEstimatedWalletChangeUM import com.tangem.features.walletconnect.transaction.entity.blockaid.WcEstimatedWalletChangesUM import com.tangem.features.walletconnect.transaction.entity.blockaid.WcSendReceiveTransactionCheckResultsUM @@ -36,8 +36,8 @@ internal fun TransactionCheckResultsItem( if (item.isLoading) { WcEstimatedWalletChangesLoadingItem() } else { - if (item.notificationText != null) { - WcTransactionCheckErrorItem(item.notificationText.resolveReference()) + if (item.notification != null) { + WcTransactionCheckErrorItem(item.notification) } if (item.estimatedWalletChanges != null) { WcEstimatedWalletChangesItem(item.estimatedWalletChanges) @@ -70,7 +70,11 @@ private class TransactionCheckResultsItemProvider : PreviewParameterProvider { override fun convert(value: Input): WcSendReceiveTransactionCheckResultsUM { - val description = value.result.description + val description = value.result.description?.let { if (it.isNotEmpty()) TextReference.Str(it) else null } return WcSendReceiveTransactionCheckResultsUM( isLoading = false, - notificationText = when (value.result.validation) { + notification = when (value.result.validation) { ValidationResult.SAFE, ValidationResult.FAILED_TO_VALIDATE -> null - ValidationResult.UNSAFE -> if (!description.isNullOrEmpty()) TextReference.Str(description) else null + ValidationResult.UNSAFE -> BlockAidNotificationUM( + type = BlockAidNotificationUM.Type.ERROR, + title = TextReference.Res(R.string.wc_malicious_transaction), + text = description, + ) + ValidationResult.WARNING -> BlockAidNotificationUM( + type = BlockAidNotificationUM.Type.WARNING, + title = TextReference.Res(R.string.wc_warning_transaction), + text = description, + ) }, estimatedWalletChanges = (value.result.simulation as? SimulationResult.Success)?.data?.let { data -> when (data) { diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcTransactionCheckErrorItem.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcTransactionCheckErrorItem.kt index a8431340b3..a5d01a0246 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcTransactionCheckErrorItem.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcTransactionCheckErrorItem.kt @@ -11,26 +11,42 @@ import androidx.compose.ui.tooling.preview.Preview import com.tangem.core.ui.components.notifications.Notification 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.resolveReference import com.tangem.core.ui.res.TangemColorPalette import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.walletconnect.impl.R +import com.tangem.features.walletconnect.transaction.entity.blockaid.BlockAidNotificationUM @Composable -internal fun WcTransactionCheckErrorItem(notificationText: String, modifier: Modifier = Modifier) { +internal fun WcTransactionCheckErrorItem(notification: BlockAidNotificationUM, modifier: Modifier = Modifier) { Notification( modifier = modifier .fillMaxWidth(), config = NotificationConfig( - title = resourceReference(R.string.wc_malicious_transaction), - subtitle = TextReference.Str(notificationText), - iconResId = R.drawable.ic_alert_circle_24, + title = notification.title, + subtitle = TextReference.Str(notification.text?.resolveReference() ?: ""), + iconResId = when (notification.type) { + BlockAidNotificationUM.Type.ERROR -> R.drawable.ic_alert_circle_24 + BlockAidNotificationUM.Type.WARNING -> R.drawable.ic_alert_triangle_20 + }, ), - containerColor = TangemColorPalette.Amaranth.copy(alpha = 0.1f), - titleColor = TangemTheme.colors.text.warning, - subtitleColor = TangemTheme.colors.text.primary1, - iconTint = TangemTheme.colors.icon.warning, + containerColor = when (notification.type) { + BlockAidNotificationUM.Type.ERROR -> TangemColorPalette.Amaranth.copy(alpha = 0.1f) + BlockAidNotificationUM.Type.WARNING -> TangemColorPalette.Dark1.copy(alpha = 0.1f) + }, + titleColor = when (notification.type) { + BlockAidNotificationUM.Type.ERROR -> TangemTheme.colors.text.warning + BlockAidNotificationUM.Type.WARNING -> TangemTheme.colors.text.primary1 + }, + subtitleColor = when (notification.type) { + BlockAidNotificationUM.Type.ERROR -> TangemTheme.colors.text.primary1 + BlockAidNotificationUM.Type.WARNING -> TangemTheme.colors.text.tertiary + }, + iconTint = when (notification.type) { + BlockAidNotificationUM.Type.ERROR -> TangemTheme.colors.icon.warning + BlockAidNotificationUM.Type.WARNING -> TangemTheme.colors.icon.attention + }, ) } @@ -43,7 +59,13 @@ private fun WcTransactionCheckErrorItemPreview() { modifier = Modifier .background(TangemTheme.colors.background.tertiary), ) { - WcTransactionCheckErrorItem("The transaction approves erc20 tokens to a known malicious address") + WcTransactionCheckErrorItem( + BlockAidNotificationUM( + type = BlockAidNotificationUM.Type.ERROR, + title = TextReference.Res(R.string.wc_malicious_transaction), + text = TextReference.Str("The transaction approves erc20 tokens to a known malicious address"), + ), + ) } } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/send/WcSendTransactionModalBottomSheet.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/send/WcSendTransactionModalBottomSheet.kt index 6d0df9a6db..4fd316dde9 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/send/WcSendTransactionModalBottomSheet.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/send/WcSendTransactionModalBottomSheet.kt @@ -29,6 +29,7 @@ import com.tangem.features.walletconnect.connections.entity.VerifiedDAppState import com.tangem.features.walletconnect.connections.ui.WcAppInfoItem import com.tangem.features.walletconnect.impl.R import com.tangem.features.walletconnect.transaction.components.PreviewFeeSelectorBlockComponent +import com.tangem.features.walletconnect.transaction.entity.blockaid.BlockAidNotificationUM import com.tangem.features.walletconnect.transaction.entity.blockaid.WcEstimatedWalletChangeUM import com.tangem.features.walletconnect.transaction.entity.blockaid.WcEstimatedWalletChangesUM import com.tangem.features.walletconnect.transaction.entity.blockaid.WcSendReceiveTransactionCheckResultsUM @@ -173,8 +174,10 @@ private class WcSendTransactionStateProvider : CollectionPreviewParameterProvide appSubtitle = "react-app.walletconnect.com", ), estimatedWalletChanges = WcSendReceiveTransactionCheckResultsUM( - notificationText = TextReference.Str( - "The transaction approves erc20 tokens to a known malicious address", + notification = BlockAidNotificationUM( + type = BlockAidNotificationUM.Type.ERROR, + title = TextReference.Res(R.string.wc_malicious_transaction), + text = TextReference.Str("The transaction approves erc20 tokens to a known malicious address"), ), estimatedWalletChanges = WcEstimatedWalletChangesUM( items = persistentListOf( @@ -210,8 +213,10 @@ private class WcSendTransactionStateProvider : CollectionPreviewParameterProvide appSubtitle = "react-app.walletconnect.com", ), estimatedWalletChanges = WcSendReceiveTransactionCheckResultsUM( - notificationText = TextReference.Str( - "The transaction approves erc20 tokens to a known malicious address", + notification = BlockAidNotificationUM( + type = BlockAidNotificationUM.Type.ERROR, + title = TextReference.Res(R.string.wc_malicious_transaction), + text = TextReference.Str("The transaction approves erc20 tokens to a known malicious address"), ), estimatedWalletChanges = WcEstimatedWalletChangesUM( items = persistentListOf( @@ -246,8 +251,10 @@ private class WcSendTransactionStateProvider : CollectionPreviewParameterProvide appSubtitle = "react-app.walletconnect.com", ), estimatedWalletChanges = WcSendReceiveTransactionCheckResultsUM( - notificationText = TextReference.Str( - "The transaction approves erc20 tokens to a known malicious address", + notification = BlockAidNotificationUM( + type = BlockAidNotificationUM.Type.ERROR, + title = TextReference.Res(R.string.wc_malicious_transaction), + text = TextReference.Str("The transaction approves erc20 tokens to a known malicious address"), ), estimatedWalletChanges = WcEstimatedWalletChangesUM( items = persistentListOf(