Updated on 2026-08-14

This commit is contained in:
Tangem 2025-07-29 13:43:28 +07:00
parent 9c68c9ff00
commit 4f499f41c7
17 changed files with 159 additions and 179 deletions

View file

@ -1,62 +0,0 @@
package com.tangem.features.walletconnect.transaction.converter
import com.tangem.domain.walletconnect.model.WcEthMethod
import com.tangem.domain.walletconnect.model.WcSolanaMethod
import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase
import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase
import com.tangem.features.send.v2.api.entity.FeeSelectorUM
import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM
import com.tangem.utils.converter.Converter
import javax.inject.Inject
internal class WcCommonTransactionUMConverter @Inject constructor(
private val signTypedDataUMConverter: WcSignTypedDataUMConverter,
private val signTransactionUMConverter: WcSignTransactionUMConverter,
private val sendTransactionUMConverter: WcSendTransactionUMConverter,
) : Converter<WcCommonTransactionUMConverter.Input, WcCommonTransactionUM?> {
override fun convert(value: Input): WcCommonTransactionUM? {
return when (value.useCase) {
is WcMessageSignUseCase -> {
when (value.useCase.method) {
is WcEthMethod.SignTypedData -> signTypedDataUMConverter.convert(
WcSignTypedDataUMConverter.Input(
useCase = value.useCase,
signState = value.signState,
signModel = value.signState.signModel as WcMessageSignUseCase.SignModel,
actions = value.actions,
),
)
is WcEthMethod.MessageSign, is WcSolanaMethod.SignMessage -> signTransactionUMConverter.convert(
WcSignTransactionUMConverter.Input(
useCase = value.useCase,
signState = value.signState,
signModel = value.signState.signModel as WcMessageSignUseCase.SignModel,
actions = value.actions,
),
)
else -> null
}
}
is WcTransactionUseCase -> sendTransactionUMConverter.convert(
WcSendTransactionUMConverter.Input(
useCase = value.useCase,
signState = value.signState,
actions = value.actions,
feeSelectorUM = value.feeSelectorUM,
),
)
else -> null
}
}
data class Input(
val useCase: WcSignUseCase<*>,
val signState: WcSignState<*>,
val actions: WcTransactionActionsUM,
val feeSelectorUM: FeeSelectorUM? = null,
)
}

View file

@ -2,7 +2,9 @@ package com.tangem.features.walletconnect.transaction.converter
import com.tangem.domain.walletconnect.model.WcEthMethod
import com.tangem.domain.walletconnect.model.WcSolanaMethod
import com.tangem.domain.walletconnect.usecase.method.*
import com.tangem.domain.walletconnect.usecase.method.WcMethodContext
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
import com.tangem.features.send.v2.api.entity.FeeSelectorUM
import com.tangem.features.walletconnect.transaction.entity.blockaid.WcSendReceiveTransactionCheckResultsUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM
@ -20,7 +22,7 @@ internal class WcSendTransactionUMConverter @Inject constructor(
private val requestBlockUMConverter: WcTransactionRequestBlockUMConverter,
) : Converter<WcSendTransactionUMConverter.Input, WcSendTransactionUM?> {
override fun convert(value: Input): WcSendTransactionUM? = when (value.useCase.method) {
override fun convert(value: Input): WcSendTransactionUM? = when (value.context.method) {
is WcEthMethod.SendTransaction,
is WcEthMethod.SignTransaction,
is WcSolanaMethod.SignAllTransaction,
@ -31,23 +33,23 @@ internal class WcSendTransactionUMConverter @Inject constructor(
onSend = value.actions.onSign,
appInfo = appInfoContentUMConverter.convert(
WcTransactionAppInfoContentUMConverter.Input(
session = value.useCase.session,
session = value.context.session,
onShowVerifiedAlert = value.actions.onShowVerifiedAlert,
),
),
feeState = constructFeeState(useCase = value.useCase, actions = value.actions),
walletName = value.useCase.session.wallet.name.takeIf { value.useCase.session.showWalletInfo },
networkInfo = networkInfoUMConverter.convert(value.useCase.network),
feeState = value.feeState,
walletName = value.context.session.wallet.name.takeIf { value.context.session.showWalletInfo },
networkInfo = networkInfoUMConverter.convert(value.context.network),
estimatedWalletChanges = WcSendReceiveTransactionCheckResultsUM(),
isLoading = value.signState.domainStep == WcSignStep.Signing,
address = WcAddressConverter.convert(value.useCase.derivationState),
address = WcAddressConverter.convert(value.context.derivationState),
),
feeSelectorUM = value.feeSelectorUM ?: FeeSelectorUM.Loading,
transactionRequestInfo = WcTransactionRequestInfoUM(
blocks = buildList {
addAll(
requestBlockUMConverter.convert(
WcTransactionRequestBlockUMConverter.Input(value.useCase.rawSdkRequest),
WcTransactionRequestBlockUMConverter.Input(value.context.rawSdkRequest),
),
)
}.toImmutableList(),
@ -57,17 +59,9 @@ internal class WcSendTransactionUMConverter @Inject constructor(
else -> null
}
private fun constructFeeState(
useCase: WcTransactionUseCase,
actions: WcTransactionActionsUM,
): WcTransactionFeeState {
val mutableFee = useCase as? WcMutableFee ?: return WcTransactionFeeState.None
val dAppFee = mutableFee.dAppFee()
return WcTransactionFeeState.Success(dAppFee = dAppFee, onClick = actions.onShowFeeBottomSheet)
}
data class Input(
val useCase: WcTransactionUseCase,
val context: WcMethodContext,
val feeState: WcTransactionFeeState,
val signState: WcSignState<*>,
val actions: WcTransactionActionsUM,
val feeSelectorUM: FeeSelectorUM?,

View file

@ -1,6 +1,7 @@
package com.tangem.features.walletconnect.transaction.converter
import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase
import com.tangem.domain.walletconnect.usecase.method.WcMethodContext
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM
@ -23,25 +24,25 @@ internal class WcSignTransactionUMConverter @Inject constructor(
onSign = value.actions.onSign,
appInfo = appInfoContentUMConverter.convert(
WcTransactionAppInfoContentUMConverter.Input(
session = value.useCase.session,
session = value.context.session,
onShowVerifiedAlert = value.actions.onShowVerifiedAlert,
),
),
walletName = value.useCase.session.wallet.name.takeIf { value.useCase.session.showWalletInfo },
networkInfo = networkInfoUMConverter.convert(value.useCase.network),
walletName = value.context.session.wallet.name.takeIf { value.context.session.showWalletInfo },
networkInfo = networkInfoUMConverter.convert(value.context.network),
isLoading = value.signState.domainStep == WcSignStep.Signing,
address = WcAddressConverter.convert(value.useCase.derivationState),
address = WcAddressConverter.convert(value.context.derivationState),
),
transactionRequestInfo = WcTransactionRequestInfoUM(
requestBlockUMConverter.convert(
WcTransactionRequestBlockUMConverter.Input(value.useCase.rawSdkRequest, value.signModel),
WcTransactionRequestBlockUMConverter.Input(value.context.rawSdkRequest, value.signModel),
).toImmutableList(),
onCopy = value.actions.onCopy,
),
)
data class Input(
val useCase: WcMessageSignUseCase,
val context: WcMethodContext,
val signState: WcSignState<*>,
val signModel: WcMessageSignUseCase.SignModel,
val actions: WcTransactionActionsUM,

View file

@ -1,6 +1,7 @@
package com.tangem.features.walletconnect.transaction.converter
import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase
import com.tangem.domain.walletconnect.usecase.method.WcMethodContext
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM
@ -23,20 +24,20 @@ internal class WcSignTypedDataUMConverter @Inject constructor(
onSign = value.actions.onSign,
appInfo = appInfoContentUMConverter.convert(
WcTransactionAppInfoContentUMConverter.Input(
session = value.useCase.session,
session = value.context.session,
onShowVerifiedAlert = value.actions.onShowVerifiedAlert,
),
),
walletName = value.useCase.session.wallet.name.takeIf { value.useCase.session.showWalletInfo },
networkInfo = networkInfoUMConverter.convert(value.useCase.network),
address = WcAddressConverter.convert(value.useCase.derivationState),
walletName = value.context.session.wallet.name.takeIf { value.context.session.showWalletInfo },
networkInfo = networkInfoUMConverter.convert(value.context.network),
address = WcAddressConverter.convert(value.context.derivationState),
isLoading = value.signState.domainStep == WcSignStep.Signing,
),
transactionRequestInfo = WcTransactionRequestInfoUM(
blocks = buildList {
addAll(
requestBlockUMConverter.convert(
WcTransactionRequestBlockUMConverter.Input(value.useCase.rawSdkRequest, value.signModel),
WcTransactionRequestBlockUMConverter.Input(value.context.rawSdkRequest, value.signModel),
),
)
}.toImmutableList(),
@ -45,7 +46,7 @@ internal class WcSignTypedDataUMConverter @Inject constructor(
)
data class Input(
val useCase: WcMessageSignUseCase,
val context: WcMethodContext,
val signState: WcSignState<*>,
val signModel: WcMessageSignUseCase.SignModel,
val actions: WcTransactionActionsUM,

View file

@ -36,11 +36,12 @@ import com.tangem.features.send.v2.api.subcomponents.feeSelector.FeeSelectorRelo
import com.tangem.features.send.v2.api.subcomponents.feeSelector.entity.FeeSelectorData
import com.tangem.features.walletconnect.connections.routing.WcInnerRoute
import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams
import com.tangem.features.walletconnect.transaction.converter.WcCommonTransactionUMConverter
import com.tangem.features.walletconnect.transaction.converter.WcHandleMethodErrorConverter
import com.tangem.features.walletconnect.transaction.converter.WcSendTransactionUMConverter
import com.tangem.features.walletconnect.transaction.entity.blockaid.WcSendReceiveTransactionCheckResultsUM
import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionModel
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionFeeState
import com.tangem.features.walletconnect.transaction.entity.send.WcSendTransactionUM
import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes
import com.tangem.features.walletconnect.transaction.ui.blockaid.WcSendAndReceiveBlockAidUiConverter
@ -62,7 +63,7 @@ internal class WcSendTransactionModel @Inject constructor(
private val router: Router,
private val clipboardManager: ClipboardManager,
private val useCaseFactory: WcRequestUseCaseFactory,
private val converter: WcCommonTransactionUMConverter,
private val converter: WcSendTransactionUMConverter,
private val blockAidUiConverter: WcSendAndReceiveBlockAidUiConverter,
private val getFeeUseCase: GetFeeUseCase,
private val getNetworkCoinUseCase: GetNetworkCoinStatusUseCase,
@ -198,20 +199,28 @@ internal class WcSendTransactionModel @Inject constructor(
is Lce.Error -> WcSendReceiveTransactionCheckResultsUM(isLoading = false)
is Lce.Loading -> WcSendReceiveTransactionCheckResultsUM(isLoading = true)
}
val feeState = when {
useCase is WcMutableFee ->
WcTransactionFeeState
.Success(dAppFee = useCase.dAppFee(), onClick = { onShowFeeBottomSheet() })
else -> WcTransactionFeeState.None
}
val actions = WcTransactionActionsUM(
onShowVerifiedAlert = ::showVerifiedAlert,
onDismiss = { cancel(useCase) },
onSign = { onSign(securityCheck.getOrNull()) },
onCopy = { copyData(useCase.rawSdkRequest.request.params) },
)
var transactionUM = converter.convert(
WcCommonTransactionUMConverter.Input(
useCase = useCase,
WcSendTransactionUMConverter.Input(
context = useCase,
feeState = feeState,
signState = signState,
actions = WcTransactionActionsUM(
onShowVerifiedAlert = ::showVerifiedAlert,
onDismiss = { cancel(useCase) },
onSign = { onSign(securityCheck.getOrNull()) },
onCopy = { copyData(useCase.rawSdkRequest.request.params) },
onShowFeeBottomSheet = ::onShowFeeBottomSheet,
),
actions = actions,
feeSelectorUM = uiState.value?.feeSelectorUM,
),
) as? WcSendTransactionUM
)
transactionUM = transactionUM?.copy(
transaction = transactionUM.transaction.copy(estimatedWalletChanges = blockAidState),
spendAllowance = blockAidState.spendAllowance,

View file

@ -11,13 +11,16 @@ import com.tangem.core.decompose.navigation.Router
import com.tangem.core.decompose.ui.UiMessageSender
import com.tangem.core.ui.clipboard.ClipboardManager
import com.tangem.domain.walletconnect.WcRequestUseCaseFactory
import com.tangem.domain.walletconnect.model.WcEthMethod
import com.tangem.domain.walletconnect.model.WcSolanaMethod
import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase
import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams
import com.tangem.features.walletconnect.transaction.converter.WcCommonTransactionUMConverter
import com.tangem.features.walletconnect.transaction.converter.WcHandleMethodErrorConverter
import com.tangem.features.walletconnect.transaction.converter.WcSignTransactionUMConverter
import com.tangem.features.walletconnect.transaction.converter.WcSignTypedDataUMConverter
import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionModel
import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM
import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionUM
@ -40,7 +43,8 @@ internal class WcSignTransactionModel @Inject constructor(
private val router: Router,
private val clipboardManager: ClipboardManager,
private val useCaseFactory: WcRequestUseCaseFactory,
private val converter: WcCommonTransactionUMConverter,
private val signTypedDataUMConverter: WcSignTypedDataUMConverter,
private val signTransactionUMConverter: WcSignTransactionUMConverter,
) : Model(), WcCommonTransactionModel {
private val params = paramsContainer.require<WcTransactionModelParams>()
@ -58,24 +62,44 @@ internal class WcSignTransactionModel @Inject constructor(
useCase.invoke()
.onEach { signState ->
if (signingIsDone(signState)) return@onEach
val signTransactionUM = converter.convert(
WcCommonTransactionUMConverter.Input(
useCase = useCase,
signState = signState,
actions = WcTransactionActionsUM(
onShowVerifiedAlert = ::showVerifiedAlert,
onDismiss = { cancel(useCase) },
onSign = useCase::sign,
onCopy = { copyData(useCase.rawSdkRequest.request.params) },
),
),
) as? WcSignTransactionUM
val signTransactionUM = convertToUI(useCase, signState)
_uiState.emit(signTransactionUM)
}
.launchIn(this)
}
}
private fun convertToUI(
useCase: WcMessageSignUseCase,
signState: WcSignState<WcMessageSignUseCase.SignModel>,
): WcSignTransactionUM? {
val actions = WcTransactionActionsUM(
onShowVerifiedAlert = ::showVerifiedAlert,
onDismiss = { cancel(useCase) },
onSign = useCase::sign,
onCopy = { copyData(useCase.rawSdkRequest.request.params) },
)
return when (useCase.method) {
is WcEthMethod.SignTypedData -> signTypedDataUMConverter.convert(
WcSignTypedDataUMConverter.Input(
context = useCase,
signState = signState,
signModel = signState.signModel,
actions = actions,
),
)
is WcEthMethod.MessageSign, is WcSolanaMethod.SignMessage -> signTransactionUMConverter.convert(
WcSignTransactionUMConverter.Input(
context = useCase,
signState = signState,
signModel = signState.signModel,
actions = actions,
),
)
else -> null
}
}
override fun dismiss() {
_uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop()
}