diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/blockaid/models/response/Trace.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/blockaid/models/response/Trace.kt index 89f2f3db60..84040fc6a5 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/blockaid/models/response/Trace.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/blockaid/models/response/Trace.kt @@ -5,7 +5,7 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) data class Trace( - @Json(name = "exposed") val exposed: Exposed, + @Json(name = "exposed") val exposed: Exposed?, @Json(name = "asset") val asset: NftAsset, ) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthTxHelper.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthTxHelper.kt index fdffc8a26d..a2fc3d4224 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthTxHelper.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthTxHelper.kt @@ -49,7 +49,9 @@ internal object WcEthTxHelper { .hexToBigDecimal() .movePointLeft(blockchain.decimals()) - val callData = CompiledSmartContractCallData(txParams.data.removePrefix(HEX_PREFIX).hexToBytes()) + val callData = txParams.data?.removePrefix(HEX_PREFIX)?.hexToBytes()?.let { + CompiledSmartContractCallData(it) + } return TransactionData.Uncompiled( amount = Amount(value, blockchain), fee = dAppFee, @@ -62,10 +64,10 @@ internal object WcEthTxHelper { ) } - fun getApprovedAmount(txData: String, result: CheckTransactionResult): ApprovedAmount? { + fun getApprovedAmount(txData: String?, result: CheckTransactionResult): ApprovedAmount? { val approvalMethodId = ApprovalERC20TokenCallData("", null).methodId - val isApprovalWcMethod = txData.startsWith(approvalMethodId) - if (!isApprovalWcMethod) return null + val isApprovalWcMethod = txData?.startsWith(approvalMethodId) + if (isApprovalWcMethod != true) return null val simulation = result.simulation as? SimulationResult.Success ?: return null val approves = (simulation.data as? SimulationData.Approve)?.approvedAmounts diff --git a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthTransactionParams.kt b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthTransactionParams.kt index cdde8975d6..af30e62722 100644 --- a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthTransactionParams.kt +++ b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthTransactionParams.kt @@ -12,7 +12,7 @@ data class WcEthTransactionParams( val to: String?, @Json(name = "data") - val data: String, + val data: String?, @Json(name = "gas") val gas: String?, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt index 188c4bc5d2..241a8ba2bf 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt @@ -8,23 +8,40 @@ import com.tangem.features.walletconnect.transaction.entity.common.WcTransaction import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoItemUM import com.tangem.utils.converter.Converter import kotlinx.collections.immutable.persistentListOf +import org.json.JSONArray import javax.inject.Inject +private const val DATA_FIELD = "data" + internal class WcTransactionRequestBlockUMConverter @Inject constructor() : Converter { - override fun convert(value: Input) = WcTransactionRequestBlockUM( - persistentListOf( - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_signature_type), - description = value.rawSdkRequest.request.method, + override fun convert(value: Input): WcTransactionRequestBlockUM { + val params = value.rawSdkRequest.request.params + return WcTransactionRequestBlockUM( + persistentListOf( + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_signature_type), + description = value.rawSdkRequest.request.method, + ), + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_contents), + description = value.signModel?.humanMsg ?: params.tryExtractData() ?: params, + ), ), - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_contents), - description = value.signModel?.humanMsg ?: value.rawSdkRequest.request.params, - ), - ), - ) + ) + } + + private fun String.tryExtractData() = try { + val array = JSONArray(this) + if (array.length() > 0 && array.getJSONObject(0).has(DATA_FIELD)) { + array.getJSONObject(0).getString(DATA_FIELD) + } else { + null + } + } catch (ignore: Exception) { + null + } data class Input( val rawSdkRequest: WcSdkSessionRequest, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcApproveTransactionUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcApproveTransactionUM.kt deleted file mode 100644 index b8107b23c1..0000000000 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcApproveTransactionUM.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.tangem.features.walletconnect.transaction.entity.approve - -import androidx.annotation.DrawableRes -import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent -import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM -import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM -import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM - -internal data class WcApproveTransactionUM( - val transaction: WcApproveTransactionItemUM, - val transactionRequestInfo: WcTransactionRequestInfoUM, - val customAllowance: WcCustomAllowanceUM, -) - -internal data class WcApproveTransactionItemUM( - val onDismiss: () -> Unit, - val onSend: () -> Unit, - val appInfo: WcTransactionAppInfoContentUM, - val spendAllowance: WcSpendAllowanceUM? = null, - val walletName: String, - val networkInfo: WcNetworkInfoUM, - val networkFee: String? = null, - val isLoading: Boolean = false, -) : TangemBottomSheetConfigContent - -internal data class WcCustomAllowanceUM( - @DrawableRes val networkIconRes: Int, - val tokenIconUrl: String, - val amountText: String, - val isUnlimited: Boolean, -) : TangemBottomSheetConfigContent \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcCustomAllowanceUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcCustomAllowanceUM.kt new file mode 100644 index 0000000000..28f8405259 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcCustomAllowanceUM.kt @@ -0,0 +1,11 @@ +package com.tangem.features.walletconnect.transaction.entity.approve + +import androidx.annotation.DrawableRes +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent + +internal data class WcCustomAllowanceUM( + @DrawableRes val networkIconRes: Int, + val tokenIconUrl: String, + val amountText: String, + val isUnlimited: Boolean, +) : TangemBottomSheetConfigContent \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcSpendAllowanceUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcSpendAllowanceUM.kt index d3609afa63..1a7b10dca6 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcSpendAllowanceUM.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/approve/WcSpendAllowanceUM.kt @@ -1,6 +1,9 @@ package com.tangem.features.walletconnect.transaction.entity.approve +import com.tangem.core.ui.extensions.TextReference + internal data class WcSpendAllowanceUM( - val amountText: String, - val tokenImageUrl: String, + val amountText: TextReference, + val tokenSymbol: String, + val tokenImageUrl: String?, ) \ No newline at end of file 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 418d483031..096af30724 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 @@ -1,9 +1,11 @@ package com.tangem.features.walletconnect.transaction.entity.blockaid import com.tangem.core.ui.extensions.TextReference +import com.tangem.features.walletconnect.transaction.entity.approve.WcSpendAllowanceUM internal data class WcSendReceiveTransactionCheckResultsUM( val estimatedWalletChanges: WcEstimatedWalletChangesUM? = null, + val spendAllowance: WcSpendAllowanceUM? = null, val notificationText: TextReference? = null, val isLoading: Boolean = true, ) \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/approve/WcApproveTransactionModalBottomSheet.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/approve/WcApproveTransactionModalBottomSheet.kt deleted file mode 100644 index 6e1ffd76e9..0000000000 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/approve/WcApproveTransactionModalBottomSheet.kt +++ /dev/null @@ -1,133 +0,0 @@ -package com.tangem.features.walletconnect.transaction.ui.approve - -import android.content.res.Configuration -import androidx.compose.animation.animateContentSize -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.tooling.preview.Devices -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider -import androidx.compose.ui.unit.dp -import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig -import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheet -import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTitle -import com.tangem.core.ui.components.divider.DividerWithPadding -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.connections.entity.VerifiedDAppState -import com.tangem.features.walletconnect.connections.ui.WcAppInfoItem -import com.tangem.features.walletconnect.impl.R -import com.tangem.features.walletconnect.transaction.entity.approve.WcApproveTransactionItemUM -import com.tangem.features.walletconnect.transaction.entity.approve.WcSpendAllowanceUM -import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM -import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM -import com.tangem.features.walletconnect.transaction.ui.common.* - -@Composable -internal fun WcApproveTransactionModalBottomSheetContent( - state: WcApproveTransactionItemUM, - onClickTransactionRequest: () -> Unit, -) { - Column( - modifier = Modifier - .padding(horizontal = TangemTheme.dimens.spacing16), - ) { - Column( - modifier = Modifier - .clip(RoundedCornerShape(TangemTheme.dimens.radius14)) - .background(color = TangemTheme.colors.background.action) - .fillMaxWidth() - .animateContentSize(), - ) { - WcSmallTitleItem(R.string.wc_request_from) - WcAppInfoItem( - iconUrl = state.appInfo.appIcon, - title = state.appInfo.appName, - subtitle = state.appInfo.appSubtitle, - verifiedDAppState = state.appInfo.verifiedState, - ) - DividerWithPadding(start = 0.dp, end = 0.dp) - WcTransactionRequestItem( - iconRes = R.drawable.ic_doc_new_24, - modifier = Modifier - .fillMaxWidth() - .clickable { onClickTransactionRequest() } - .padding(TangemTheme.dimens.spacing12), - ) - } - Column(modifier = Modifier.padding(top = TangemTheme.dimens.spacing16)) { - if (state.spendAllowance != null) { - WcSpendAllowanceItem(state.spendAllowance) - Spacer(Modifier.height(TangemTheme.dimens.spacing16)) - } - WcSendTransactionItems( - walletName = state.walletName, - networkInfo = state.networkInfo, - networkFee = state.networkFee, - ) - WcTransactionRequestButtons( - modifier = Modifier.padding(vertical = TangemTheme.dimens.spacing16), - onDismiss = state.onDismiss, - onClickActiveButton = state.onSend, - activeButtonText = resourceReference(R.string.common_send), - isLoading = state.isLoading, - ) - } - } -} - -@Composable -@Preview(showBackground = true, device = Devices.PIXEL_7_PRO) -@Preview(showBackground = true, device = Devices.PIXEL_7_PRO, uiMode = Configuration.UI_MODE_NIGHT_YES) -private fun WcApproveTransactionBottomSheetPreview( - @PreviewParameter(WcApproveTransactionStateProvider::class) state: WcApproveTransactionItemUM, -) { - TangemThemePreview { - TangemModalBottomSheet( - config = TangemBottomSheetConfig( - isShown = true, - onDismissRequest = {}, - content = state, - ), - containerColor = TangemTheme.colors.background.tertiary, - title = { - TangemModalBottomSheetTitle( - title = resourceReference(R.string.wallet_connect_title), - endIconRes = R.drawable.ic_close_24, - onEndClick = {}, - startIconRes = null, - onStartClick = {}, - ) - }, - content = { - WcApproveTransactionModalBottomSheetContent(state = state, onClickTransactionRequest = {}) - }, - ) - } -} - -private class WcApproveTransactionStateProvider : CollectionPreviewParameterProvider( - listOf( - WcApproveTransactionItemUM( - onDismiss = {}, - onSend = {}, - appInfo = WcTransactionAppInfoContentUM( - appName = "React App", - appIcon = "", - verifiedState = VerifiedDAppState.Verified {}, - appSubtitle = "react-app.walletconnect.com", - ), - spendAllowance = WcSpendAllowanceUM(amountText = "Unlimited USDT", tokenImageUrl = ""), - walletName = "Tangem 2.0", - networkInfo = WcNetworkInfoUM(name = "Ethereum", iconRes = R.drawable.img_eth_22), - networkFee = "~ 0.22 $", - ), - ), -) \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/approve/WcSpendAllowanceItem.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/approve/WcSpendAllowanceItem.kt index 2c1322217f..a6de96e855 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/approve/WcSpendAllowanceItem.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/approve/WcSpendAllowanceItem.kt @@ -13,7 +13,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import com.tangem.features.walletconnect.impl.R import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp import coil.compose.AsyncImage +import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.features.walletconnect.transaction.entity.approve.WcSpendAllowanceUM @@ -23,17 +25,14 @@ import com.tangem.features.walletconnect.transaction.ui.common.WcSmallTitleItem internal fun WcSpendAllowanceItem(spendAllowance: WcSpendAllowanceUM, modifier: Modifier = Modifier) { Column( modifier = modifier - .clip(RoundedCornerShape(TangemTheme.dimens.radius14)) + .clip(RoundedCornerShape(14.dp)) .background(TangemTheme.colors.background.action) .fillMaxWidth() - .padding( - end = TangemTheme.dimens.spacing12, - bottom = TangemTheme.dimens.spacing12, - ), + .padding(end = 12.dp, bottom = 12.dp), ) { WcSmallTitleItem(R.string.wc_allow_to_spend) - Spacer(modifier = Modifier.height(TangemTheme.dimens.spacing8)) + Spacer(modifier = Modifier.height(8.dp)) Row( verticalAlignment = Alignment.CenterVertically, @@ -46,15 +45,16 @@ internal fun WcSpendAllowanceItem(spendAllowance: WcSpendAllowanceUM, modifier: AsyncImage( model = spendAllowance.tokenImageUrl, modifier = Modifier - .size(TangemTheme.dimens.size24) + .padding(start = 12.dp) + .size(24.dp) .clip(CircleShape), contentDescription = null, ) - Spacer(modifier = Modifier.width(TangemTheme.dimens.spacing12)) + Spacer(modifier = Modifier.width(8.dp)) AnimatedContent( - targetState = spendAllowance.amountText, + targetState = "${spendAllowance.amountText.resolveReference()} ${spendAllowance.tokenSymbol}", label = "Animate Spend allowance text", ) { amount -> Text( @@ -75,7 +75,7 @@ internal fun WcSpendAllowanceItem(spendAllowance: WcSpendAllowanceUM, modifier: color = TangemTheme.colors.text.tertiary, ) - Spacer(modifier = Modifier.width(TangemTheme.dimens.spacing8)) + Spacer(modifier = Modifier.width(8.dp)) Icon( painter = painterResource(id = R.drawable.ic_edit_new_12), 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 6a8cb9829e..6cf15fa757 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 @@ -19,12 +19,11 @@ import com.tangem.features.walletconnect.impl.R 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 +import com.tangem.features.walletconnect.transaction.ui.approve.WcSpendAllowanceItem import kotlinx.collections.immutable.persistentListOf @Composable internal fun TransactionCheckResultsItem(item: WcSendReceiveTransactionCheckResultsUM, modifier: Modifier = Modifier) { - if (item.notificationText == null && item.estimatedWalletChanges == null) return - Column( modifier = modifier .fillMaxWidth(), @@ -38,6 +37,8 @@ internal fun TransactionCheckResultsItem(item: WcSendReceiveTransactionCheckResu } if (item.estimatedWalletChanges != null) { WcEstimatedWalletChangesItem(item.estimatedWalletChanges) + } else if (item.spendAllowance != null) { + WcSpendAllowanceItem(item.spendAllowance) } else { WcEstimatedWalletChangesNotLoadedItem() } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangeRow.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangeRow.kt index e4dcdea2ea..6e3dc9a87d 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangeRow.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangeRow.kt @@ -63,7 +63,7 @@ internal fun WcEstimatedWalletChangeRow(item: WcEstimatedWalletChangeUM, modifie } } - Spacer(modifier = Modifier.width(12.dp)) + Spacer(modifier = Modifier.width(8.dp)) AsyncImage( model = item.tokenIconUrl, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangeUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangeUMConverter.kt new file mode 100644 index 0000000000..c51cc78fbb --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangeUMConverter.kt @@ -0,0 +1,40 @@ +package com.tangem.features.walletconnect.transaction.ui.blockaid + +import com.domain.blockaid.models.transaction.simultation.AmountInfo +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.format.bigdecimal.crypto +import com.tangem.core.ui.format.bigdecimal.format +import com.tangem.features.walletconnect.transaction.entity.blockaid.WcEstimatedWalletChangeUM +import com.tangem.utils.converter.Converter +import java.math.BigDecimal +import javax.inject.Inject + +internal class WcEstimatedWalletChangeUMConverter @Inject constructor() : + Converter { + + override fun convert(value: Input): WcEstimatedWalletChangeUM { + return when (val amountInfo = value.amountInfo) { + is AmountInfo.FungibleTokens -> WcEstimatedWalletChangeUM( + iconRes = value.iconRes, + title = resourceReference(value.titleRes), + description = "${value.sign} ${amountInfo.amount.amountText()} ${amountInfo.token.symbol}", + tokenIconUrl = amountInfo.token.logoUrl, + ) + is AmountInfo.NonFungibleTokens -> WcEstimatedWalletChangeUM( + iconRes = value.iconRes, + title = resourceReference(value.titleRes), + description = amountInfo.name, + tokenIconUrl = amountInfo.logoUrl, + ) + } + } + + private fun BigDecimal.amountText() = format { crypto("", DECIMALS_AMOUNT) } + + data class Input( + val amountInfo: AmountInfo, + val iconRes: Int, + val titleRes: Int, + val sign: String? = null, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesLoadingItem.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesLoadingItem.kt index abd604faa3..6fee1c04e0 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesLoadingItem.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesLoadingItem.kt @@ -36,7 +36,7 @@ internal fun WcEstimatedWalletChangesLoadingItem(modifier: Modifier = Modifier) Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(bottom = 14.dp), + modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 14.dp), ) { CircularProgressIndicator( color = TangemTheme.colors.icon.accent, @@ -45,7 +45,8 @@ internal fun WcEstimatedWalletChangesLoadingItem(modifier: Modifier = Modifier) ) Text( modifier = modifier - .fillMaxWidth(), + .fillMaxWidth() + .padding(start = 8.dp), text = stringResourceSafe(R.string.wc_common_loading), color = TangemTheme.colors.text.disabled, style = TangemTheme.typography.body2, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesNotLoadedItem.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesNotLoadedItem.kt index 04671ce12c..de2a38ce6a 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesNotLoadedItem.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcEstimatedWalletChangesNotLoadedItem.kt @@ -35,7 +35,7 @@ internal fun WcEstimatedWalletChangesNotLoadedItem(modifier: Modifier = Modifier Text( modifier = modifier .fillMaxWidth() - .padding(start = 12.dp, bottom = 14.dp), + .padding(start = 12.dp, end = 12.dp, bottom = 14.dp), text = stringResourceSafe(R.string.wc_estimated_wallet_changes_not_simulated), color = TangemTheme.colors.text.tertiary, style = TangemTheme.typography.body2, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcSendAndReceiveBlockAidUiConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcSendAndReceiveBlockAidUiConverter.kt index 89890d3b27..9212d3adf1 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcSendAndReceiveBlockAidUiConverter.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcSendAndReceiveBlockAidUiConverter.kt @@ -6,28 +6,34 @@ import com.domain.blockaid.models.transaction.ValidationResult import com.domain.blockaid.models.transaction.simultation.AmountInfo import com.domain.blockaid.models.transaction.simultation.SimulationData import com.tangem.core.ui.extensions.TextReference -import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.format.bigdecimal.crypto import com.tangem.core.ui.format.bigdecimal.format import com.tangem.features.walletconnect.impl.R -import com.tangem.features.walletconnect.transaction.entity.blockaid.WcSendReceiveTransactionCheckResultsUM 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 +import com.tangem.utils.StringsSigns import com.tangem.utils.converter.Converter import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList +import java.math.BigDecimal import javax.inject.Inject -private const val DECIMALS_AMOUNT = 2 +internal const val DECIMALS_AMOUNT = 2 -internal class WcSendAndReceiveBlockAidUiConverter @Inject constructor() : +internal class WcSendAndReceiveBlockAidUiConverter @Inject constructor( + private val estimatedWalletChangeUMConverter: WcEstimatedWalletChangeUMConverter, + private val spendAllowanceUMConverter: WcSpendAllowanceUMConverter, +) : Converter { override fun convert(value: CheckTransactionResult): WcSendReceiveTransactionCheckResultsUM { return WcSendReceiveTransactionCheckResultsUM( isLoading = false, notificationText = when (value.validation) { ValidationResult.SAFE, ValidationResult.FAILED_TO_VALIDATE -> null - ValidationResult.UNSAFE -> TextReference.Str("") // TODO("Add text after approve with designer") + // TODO("Add text after approve with designer") + ValidationResult.UNSAFE -> + TextReference.Str("The transaction approves tokens to a known malicious address") }, estimatedWalletChanges = (value.simulation as? SimulationResult.Success)?.data?.let { data -> when (data) { @@ -36,24 +42,38 @@ internal class WcSendAndReceiveBlockAidUiConverter @Inject constructor() : val items: ImmutableList = ( data.send.map { when (it) { - is AmountInfo.FungibleTokens -> it.toUM( - iconRes = R.drawable.ic_send_new_24, - titleRes = R.string.common_send, + is AmountInfo.FungibleTokens -> estimatedWalletChangeUMConverter.convert( + WcEstimatedWalletChangeUMConverter.Input( + amountInfo = it, + iconRes = R.drawable.ic_receive_new_24, + titleRes = R.string.common_send, + sign = StringsSigns.MINUS, + ), ) - is AmountInfo.NonFungibleTokens -> it.toUM( - iconRes = R.drawable.ic_send_new_24, - titleRes = R.string.common_send, + is AmountInfo.NonFungibleTokens -> estimatedWalletChangeUMConverter.convert( + WcEstimatedWalletChangeUMConverter.Input( + amountInfo = it, + iconRes = R.drawable.ic_send_new_24, + titleRes = R.string.common_send, + ), ) } } + data.receive.map { when (it) { - is AmountInfo.FungibleTokens -> it.toUM( - iconRes = R.drawable.ic_receive_new_24, - titleRes = R.string.common_receive, + is AmountInfo.FungibleTokens -> estimatedWalletChangeUMConverter.convert( + WcEstimatedWalletChangeUMConverter.Input( + amountInfo = it, + iconRes = R.drawable.ic_receive_new_24, + titleRes = R.string.common_receive, + sign = StringsSigns.PLUS, + ), ) - is AmountInfo.NonFungibleTokens -> it.toUM( - iconRes = R.drawable.ic_receive_new_24, - titleRes = R.string.common_receive, + is AmountInfo.NonFungibleTokens -> estimatedWalletChangeUMConverter.convert( + WcEstimatedWalletChangeUMConverter.Input( + amountInfo = it, + iconRes = R.drawable.ic_receive_new_24, + titleRes = R.string.common_receive, + ), ) } } @@ -62,25 +82,15 @@ internal class WcSendAndReceiveBlockAidUiConverter @Inject constructor() : } } }, + spendAllowance = (value.simulation as? SimulationResult.Success)?.data?.let { data -> + when (data) { + is SimulationData.SendAndReceive -> null + is SimulationData.Approve -> data.approvedAmounts.map { spendAllowanceUMConverter.convert(it) } + .firstOrNull() + } + }, ) } } -private fun AmountInfo.FungibleTokens.toUM(iconRes: Int, titleRes: Int): WcEstimatedWalletChangeUM { - val amountText = amount.format { crypto(token.symbol, DECIMALS_AMOUNT) } - return WcEstimatedWalletChangeUM( - iconRes = iconRes, - title = resourceReference(titleRes), - description = "- $amountText", - tokenIconUrl = token.logoUrl, - ) -} - -private fun AmountInfo.NonFungibleTokens.toUM(iconRes: Int, titleRes: Int): WcEstimatedWalletChangeUM { - return WcEstimatedWalletChangeUM( - iconRes = iconRes, - title = resourceReference(titleRes), - description = name, - tokenIconUrl = logoUrl, - ) -} \ No newline at end of file +internal fun BigDecimal.amountText() = format { crypto("", DECIMALS_AMOUNT) } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcSpendAllowanceUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcSpendAllowanceUMConverter.kt new file mode 100644 index 0000000000..2d9a1a739f --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/blockaid/WcSpendAllowanceUMConverter.kt @@ -0,0 +1,21 @@ +package com.tangem.features.walletconnect.transaction.ui.blockaid + +import com.domain.blockaid.models.transaction.simultation.ApprovedAmount +import com.tangem.core.ui.extensions.TextReference +import com.tangem.features.walletconnect.impl.R +import com.tangem.features.walletconnect.transaction.entity.approve.WcSpendAllowanceUM +import com.tangem.utils.converter.Converter +import javax.inject.Inject + +internal class WcSpendAllowanceUMConverter @Inject constructor() : Converter { + + override fun convert(value: ApprovedAmount) = WcSpendAllowanceUM( + amountText = if (value.isUnlimited) { + TextReference.Res(R.string.wc_common_unlimited) + } else { + TextReference.Str(value.approvedAmount.amountText()) + }, + tokenSymbol = value.tokenInfo.symbol, + tokenImageUrl = value.tokenInfo.logoUrl, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/common/WcSmallTitleItem.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/common/WcSmallTitleItem.kt index 501084213c..5cff971145 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/common/WcSmallTitleItem.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/common/WcSmallTitleItem.kt @@ -15,7 +15,7 @@ fun WcSmallTitleItem(@StringRes textRex: Int, modifier: Modifier = Modifier) { Text( modifier = modifier .fillMaxWidth() - .padding(top = 12.dp, start = 12.dp), + .padding(top = 12.dp, start = 12.dp, end = 12.dp), text = stringResourceSafe(textRex), color = TangemTheme.colors.text.tertiary, style = TangemTheme.typography.subtitle2,