Updated on 2026-08-14

This commit is contained in:
Tangem 2025-06-27 11:27:48 +04:00
parent d1c13037e0
commit 6626b53394
8 changed files with 85 additions and 53 deletions

View file

@ -3,7 +3,7 @@ package com.tangem.data.walletconnect.network.ethereum
import arrow.core.left
import com.tangem.blockchain.blockchains.ethereum.EthereumTransactionExtras
import com.tangem.blockchain.blockchains.ethereum.tokenmethods.ApprovalERC20TokenCallData
import com.tangem.blockchain.common.Amount
import com.tangem.blockchain.common.Amount as BlockchainAmount
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.blockchain.extensions.formatHex
@ -15,7 +15,9 @@ import com.tangem.data.walletconnect.sign.SignStateConverter.toResult
import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext
import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
import com.tangem.domain.core.lce.LceFlow
import com.tangem.domain.tokens.model.Amount
import com.tangem.domain.transaction.usecase.SendTransactionUseCase
import com.tangem.domain.walletconnect.model.WcApprovedAmount
import com.tangem.domain.walletconnect.model.WcEthMethod
import com.tangem.domain.walletconnect.usecase.method.*
import dagger.assisted.Assisted
@ -35,7 +37,7 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor(
WcApproval,
WcMutableFee {
private var approvalAmount: Amount? = null
private var approvalAmount: WcApprovedAmount? = null
private var dAppFee = WcEthTxHelper.getDAppFee(
network = context.network,
txParams = method.transaction,
@ -53,13 +55,19 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor(
val amount = WcEthTxHelper.getApprovedAmount(method.transaction.data, result)
?: return@map BlockAidTransactionCheck.Result.Plain(result)
val tokenInfo = amount.tokenInfo
if (!amount.isUnlimited) {
this@WcEthSendTransactionUseCase.approvalAmount = Amount(
currencySymbol = tokenInfo.symbol,
decimals = tokenInfo.decimals,
value = amount.approvedAmount,
)
}
this@WcEthSendTransactionUseCase.approvalAmount = WcApprovedAmount(
amount = if (!amount.isUnlimited) {
Amount(
currencySymbol = tokenInfo.symbol,
decimals = tokenInfo.decimals,
value = amount.approvedAmount,
)
} else {
null
},
logoUrl = tokenInfo.logoUrl,
chainId = tokenInfo.chainId,
)
BlockAidTransactionCheck.Result.Approval(
result = result,
approval = this,
@ -90,7 +98,9 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor(
val extras = uncompiled.extras as EthereumTransactionExtras
val callData = ApprovalERC20TokenCallData(
spenderAddress = uncompiled.sourceAddress,
amount = action.amount,
amount = action.amount?.amount?.let {
BlockchainAmount(currencySymbol = it.currencySymbol, decimals = it.decimals, value = it.value)
},
)
approvalAmount = action.amount
dAppFee = null
@ -119,11 +129,11 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor(
emitAll(delegate.invoke(transactionData))
}
override fun getAmount(): Amount? {
override fun getAmount(): WcApprovedAmount? {
return approvalAmount
}
override fun updateAmount(amount: Amount?) {
override fun updateAmount(amount: WcApprovedAmount?) {
middleAction(WcEthTxAction.UpdateApprovalAmount(amount))
}

View file

@ -3,7 +3,7 @@ package com.tangem.data.walletconnect.network.ethereum
import arrow.core.left
import com.tangem.blockchain.blockchains.ethereum.EthereumTransactionExtras
import com.tangem.blockchain.blockchains.ethereum.tokenmethods.ApprovalERC20TokenCallData
import com.tangem.blockchain.common.Amount
import com.tangem.blockchain.common.Amount as BlockchainAmount
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.blockchain.extensions.formatHex
@ -15,13 +15,11 @@ import com.tangem.data.walletconnect.sign.SignCollector
import com.tangem.data.walletconnect.sign.SignStateConverter.toResult
import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext
import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate
import com.tangem.domain.tokens.model.Amount
import com.tangem.domain.transaction.usecase.PrepareForSendUseCase
import com.tangem.domain.walletconnect.model.WcApprovedAmount
import com.tangem.domain.walletconnect.model.WcEthMethod
import com.tangem.domain.walletconnect.usecase.method.BlockAidTransactionCheck
import com.tangem.domain.walletconnect.usecase.method.WcApproval
import com.tangem.domain.walletconnect.usecase.method.WcMutableFee
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase
import com.tangem.domain.walletconnect.usecase.method.*
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
@ -43,7 +41,7 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
WcApproval,
WcMutableFee {
private var approvalAmount: Amount? = null
private var approvalAmount: WcApprovedAmount? = null
private var dAppFee = WcEthTxHelper.getDAppFee(
network = context.network,
txParams = method.transaction,
@ -61,10 +59,14 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
?: return@map BlockAidTransactionCheck.Result.Plain(result)
val tokenInfo = amount.tokenInfo
if (!amount.isUnlimited) {
approvalAmount = Amount(
currencySymbol = tokenInfo.symbol,
decimals = tokenInfo.decimals,
value = amount.approvedAmount,
approvalAmount = WcApprovedAmount(
amount = Amount(
currencySymbol = tokenInfo.symbol,
decimals = tokenInfo.decimals,
value = amount.approvedAmount,
),
logoUrl = tokenInfo.logoUrl,
chainId = tokenInfo.chainId,
)
}
BlockAidTransactionCheck.Result.Approval(
@ -98,7 +100,9 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
val extras = uncompiled.extras as EthereumTransactionExtras
val callData = ApprovalERC20TokenCallData(
spenderAddress = uncompiled.sourceAddress,
amount = action.amount,
amount = action.amount?.amount?.let {
BlockchainAmount(currencySymbol = it.currencySymbol, decimals = it.decimals, value = it.value)
},
)
approvalAmount = action.amount
dAppFee = null
@ -127,11 +131,11 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor(
return dAppFee
}
override fun getAmount(): Amount? {
override fun getAmount(): WcApprovedAmount? {
return approvalAmount
}
override fun updateAmount(amount: Amount?) {
override fun updateAmount(amount: WcApprovedAmount?) {
middleAction(WcEthTxAction.UpdateApprovalAmount(amount))
}

View file

@ -16,6 +16,7 @@ import com.tangem.blockchain.extensions.hexToBigDecimal
import com.tangem.blockchainsdk.utils.toBlockchain
import com.tangem.common.extensions.hexToBytes
import com.tangem.domain.models.network.Network
import com.tangem.domain.walletconnect.model.WcApprovedAmount
import com.tangem.domain.walletconnect.model.WcEthTransactionParams
import java.math.BigDecimal
@ -81,5 +82,5 @@ internal object WcEthTxHelper {
sealed interface WcEthTxAction {
data class UpdateFee(val fee: Fee) : WcEthTxAction
data class UpdateApprovalAmount(val amount: Amount?) : WcEthTxAction
data class UpdateApprovalAmount(val amount: WcApprovedAmount?) : WcEthTxAction
}