Updated on 2026-08-14

This commit is contained in:
Tangem 2025-02-13 11:59:11 +02:00
parent 5436add409
commit 6176e8088b
10 changed files with 44 additions and 28 deletions

View file

@ -2,13 +2,12 @@ package com.tangem.features.staking.impl.presentation.state.helpers
import arrow.core.getOrElse
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.TransactionSender
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.domain.staking.GetConstructedStakingTransactionUseCase
import com.tangem.domain.staking.GetStakingTransactionUseCase
import com.tangem.domain.staking.SaveUnsubmittedHashUseCase
import com.tangem.domain.staking.SubmitHashUseCase
import com.tangem.domain.staking.*
import com.tangem.domain.staking.model.SubmitHashData
import com.tangem.domain.staking.model.stakekit.NetworkType
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.domain.staking.model.stakekit.StakingError
import com.tangem.domain.staking.model.stakekit.Yield
@ -44,7 +43,7 @@ import java.math.BigDecimal
internal class StakingTransactionSender @AssistedInject constructor(
private val stateController: StakingStateController,
private val stakingBalanceUpdater: StakingBalanceUpdater.Factory,
private val getStakingTransactionUseCase: GetStakingTransactionUseCase,
private val getStakingTransactionsUseCase: GetStakingTransactionsUseCase,
private val getConstructedStakingTransactionUseCase: GetConstructedStakingTransactionUseCase,
private val sendTransactionUseCase: SendTransactionUseCase,
private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase,
@ -192,7 +191,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
val validatorAddress = validatorState.chosenValidator.address
val amount = getAmount(amountState, fee, confirmationState.reduceAmountBy)
return getStakingTransactionUseCase(
return getStakingTransactionsUseCase(
userWalletId = userWallet.walletId,
network = cryptoCurrencyStatus.currency.network,
params = ActionParams(
@ -216,19 +215,36 @@ internal class StakingTransactionSender @AssistedInject constructor(
onSendSuccess: (txUrl: String) -> Unit,
onSendError: (SendTransactionError?) -> Unit,
) {
if (fullTransactionsData.isEmpty()) return
val sortedTransactions = fullTransactionsData.sortedBy { it.stakeKitTransaction.stepIndex }
val firstTransaction = sortedTransactions.first()
val network = firstTransaction.stakeKitTransaction.network
val sendMode = if (network == NetworkType.SOLANA &&
firstTransaction.stakeKitTransaction.type == StakingTransactionType.SPLIT
) {
TransactionSender.MultipleTransactionSendMode.WAIT_AFTER_FIRST
} else {
TransactionSender.MultipleTransactionSendMode.DEFAULT
}
sendTransactionUseCase(
txsData = fullTransactionsData.map { it.tangemTransaction },
txsData = sortedTransactions.map { it.tangemTransaction },
userWallet = userWallet,
network = cryptoCurrencyStatus.currency.network,
sendMode = sendMode,
).fold(
ifLeft = { error ->
onSendError(error)
},
ifRight = { transactionHashes ->
submitHash(
transactions = fullTransactionsData.map { it.stakeKitTransaction },
transactions = sortedTransactions.map { it.stakeKitTransaction },
transactionHashes = transactionHashes,
)
val txUrl = getExplorerTransactionUrlUseCase(
txHash = transactionHashes.last(),
networkId = cryptoCurrencyStatus.currency.network.id,

View file

@ -10,7 +10,6 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.staking.impl.presentation.state.*
import com.tangem.features.staking.impl.presentation.state.utils.isCompositePendingActions
import com.tangem.features.staking.impl.presentation.state.utils.isTronStakedBalance
import com.tangem.lib.crypto.BlockchainUtils
import com.tangem.utils.extensions.isPositive
import com.tangem.utils.transformer.Transformer
import kotlinx.collections.immutable.ImmutableList
@ -45,10 +44,10 @@ internal class SetConfirmationStateInitTransformer(
override fun transform(prevState: StakingUiState): StakingUiState {
val actionType = when {
isEnter -> StakingActionCommonType.Enter
isImplicitExit || isExplicitExit -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled(prevState))
isImplicitExit || isExplicitExit -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled())
else -> when (pendingAction?.type) {
StakingActionType.STAKE -> StakingActionCommonType.Enter
StakingActionType.UNSTAKE -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled(prevState))
StakingActionType.UNSTAKE -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled())
StakingActionType.CLAIM_REWARDS,
StakingActionType.RESTAKE_REWARDS,
-> StakingActionCommonType.Pending.Rewards
@ -81,12 +80,7 @@ internal class SetConfirmationStateInitTransformer(
)
}
private fun isPartiallyUnstakeDisabled(state: StakingUiState): Boolean {
// TODO staking [REDACTED_TASK_KEY] support solana multisize hashes signing
if (BlockchainUtils.isSolana(state.cryptoCurrencyBlockchainId)) {
return true
}
private fun isPartiallyUnstakeDisabled(): Boolean {
val exitArgs = yieldArgs.exit ?: return false
val exitAmount = exitArgs.args[Yield.Args.ArgType.AMOUNT] ?: return false
val min = exitAmount.minimum ?: return false