Updated on 2026-08-14
This commit is contained in:
parent
9c68c9ff00
commit
4f499f41c7
17 changed files with 159 additions and 179 deletions
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
@ -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?,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue