Updated on 2026-08-14
This commit is contained in:
parent
5436add409
commit
6176e8088b
10 changed files with 44 additions and 28 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue