From 1df2f17b7946d7062643a92ca899d43ad8fccb4a Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 11 Nov 2024 11:40:19 +0200 Subject: [PATCH] Updated on 2026-08-14 --- .../InvalidatePendingTransactionsUseCase.kt | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt b/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt index eb07d96ab9..29e7148ee2 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt @@ -8,6 +8,7 @@ import com.tangem.domain.staking.model.stakekit.action.StakingAction import com.tangem.domain.staking.model.stakekit.action.StakingActionType import com.tangem.domain.staking.repositories.StakingErrorResolver import com.tangem.utils.extensions.isEqualTo +import java.math.BigDecimal import java.util.UUID class InvalidatePendingTransactionsUseCase( @@ -50,9 +51,15 @@ class InvalidatePendingTransactionsUseCase( StakingActionType.UNLOCK_LOCKED -> { modifyBalancesByStatus(balances, action, BalanceType.LOCKED) } - StakingActionType.UNSTAKE, StakingActionType.RESTAKE -> { + StakingActionType.RESTAKE -> { modifyBalancesByStatus(balances, action, BalanceType.STAKED) } + StakingActionType.UNSTAKE -> { + val isFullUnstake = modifyBalancesByStatus(balances, action, BalanceType.STAKED) + if (!isFullUnstake) { + processPartialUnstake(balances, action) + } + } else -> { // intentionally do nothing } @@ -86,12 +93,19 @@ class InvalidatePendingTransactionsUseCase( ) } - private fun modifyBalancesByStatus(balances: MutableList, action: StakingAction, type: BalanceType) { + private fun modifyBalancesByStatus( + balances: MutableList, + action: StakingAction, + type: BalanceType, + ): Boolean { val index = findBalanceIndex(balances, action, type) if (index != -1) { balances[index] = balances[index].copy(isPending = true) + return true } + + return false } private fun findBalanceIndex(balances: MutableList, action: StakingAction, type: BalanceType): Int { @@ -99,4 +113,31 @@ class InvalidatePendingTransactionsUseCase( !it.isPending && it.amount isEqualTo action.amount && it.type == type } } + + private fun processPartialUnstake(balances: MutableList, action: StakingAction) { + val (index, pendingActionAmount) = findPartialUnstake(balances, action) + + if (index != -1) { + val amount = balances[index].amount + balances[index] = balances[index].copy( + amount = amount - pendingActionAmount, + ) // remnants of real one + + balances.add( + balances[index].copy( + amount = pendingActionAmount, + isPending = true, + ), + ) // pending with amount from action + } + } + + private fun findPartialUnstake(balances: MutableList, action: StakingAction): Pair { + val index = balances.indexOfFirst { + !it.isPending && action.amount < it.amount && + it.type == BalanceType.STAKED && + it.validatorAddress == action.validatorAddress + } + return index to action.amount + } } \ No newline at end of file