diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingPendingTransactionRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingPendingTransactionRepository.kt index 0b637744ab..008ea7161a 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingPendingTransactionRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingPendingTransactionRepository.kt @@ -3,25 +3,30 @@ package com.tangem.data.staking import com.tangem.domain.staking.model.PendingTransaction import com.tangem.domain.staking.model.stakekit.BalanceItem import com.tangem.domain.staking.repositories.StakingPendingTransactionRepository +import com.tangem.domain.wallets.models.UserWalletId +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArrayList internal class DefaultStakingPendingTransactionRepository : StakingPendingTransactionRepository { - private val pendingTransactions = CopyOnWriteArrayList() + private val pendingTransactionsMap = ConcurrentHashMap>() - override fun saveTransaction(transaction: PendingTransaction) { - pendingTransactions.add(transaction) + override fun saveTransaction(userWalletId: UserWalletId, transaction: PendingTransaction) { + val transactions = pendingTransactionsMap.computeIfAbsent(userWalletId) { CopyOnWriteArrayList() } + transactions.add(transaction) } - override fun removeTransactions(transactions: Set) { - pendingTransactions.removeAll(transactions) + override fun removeTransactions(userWalletId: UserWalletId, transactions: Set) { + pendingTransactionsMap[userWalletId]?.removeAll(transactions) } - override fun getTransactionsWithBalanceItems(): List> { - return pendingTransactions.mapNotNull { pendingTransaction -> + override fun getTransactionsWithBalanceItems( + userWalletId: UserWalletId, + ): List> { + return pendingTransactionsMap[userWalletId]?.mapNotNull { pendingTransaction: PendingTransaction -> PendingTransactionItemConverter.convert(pendingTransaction)?.let { balanceItem -> pendingTransaction to balanceItem } - } + } ?: emptyList() } } \ No newline at end of file diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt index 2c881ded88..01ac5388c9 100644 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt @@ -37,7 +37,7 @@ sealed class YieldBalance { // need to exclude rewards because their amount may change frequently return balance.items .filter { it.type != BalanceType.REWARDS } - .map { it.amount.toString() + it.type.toString() + it.groupId + it.validatorAddress } + .map { it.amount.toString() + it.type.toString() + it.groupId } .hashCode() } } diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingPendingTransactionsUseCase.kt b/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingPendingTransactionsUseCase.kt index 741456a4a8..15557232b0 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingPendingTransactionsUseCase.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingPendingTransactionsUseCase.kt @@ -5,6 +5,7 @@ import com.tangem.domain.staking.model.stakekit.BalanceItem import com.tangem.domain.staking.model.stakekit.StakingError import com.tangem.domain.staking.repositories.StakingErrorResolver import com.tangem.domain.staking.repositories.StakingPendingTransactionRepository +import com.tangem.domain.wallets.models.UserWalletId /** * Use case for getting saved staking pending transactions. @@ -14,9 +15,9 @@ class GetStakingPendingTransactionsUseCase( private val stakingErrorResolver: StakingErrorResolver, ) { - operator fun invoke(): Either> { + operator fun invoke(userWalletId: UserWalletId): Either> { return Either.catch { - stakingPendingTransactionRepository.getTransactionsWithBalanceItems().map { it.second } + stakingPendingTransactionRepository.getTransactionsWithBalanceItems(userWalletId).map { it.second } }.mapLeft { stakingErrorResolver.resolve(it) } 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 06a2c6cb68..82a55f65e7 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.StakingError import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.staking.repositories.StakingErrorResolver import com.tangem.domain.staking.repositories.StakingPendingTransactionRepository +import com.tangem.domain.wallets.models.UserWalletId import java.util.UUID class InvalidatePendingTransactionsUseCase( @@ -15,15 +16,18 @@ class InvalidatePendingTransactionsUseCase( private val stakingErrorResolver: StakingErrorResolver, ) { - operator fun invoke(yieldBalance: YieldBalance): Either> { + operator fun invoke( + userWalletId: UserWalletId, + yieldBalance: YieldBalance, + ): Either> { return Either.catch { if (yieldBalance is YieldBalance.Data) { val (balancesToDisplay, transactionsToRemove) = mergeRealAndPendingTransactions( yieldBalance = yieldBalance, - pending = stakingPendingTransactionRepository.getTransactionsWithBalanceItems(), + pending = stakingPendingTransactionRepository.getTransactionsWithBalanceItems(userWalletId), ) - stakingPendingTransactionRepository.removeTransactions(transactionsToRemove.toSet()) + stakingPendingTransactionRepository.removeTransactions(userWalletId, transactionsToRemove.toSet()) balancesToDisplay } else { diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/SavePendingTransactionUseCase.kt b/domain/staking/src/main/java/com/tangem/domain/staking/SavePendingTransactionUseCase.kt index 64ce855ae5..ef80e06e64 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/SavePendingTransactionUseCase.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/SavePendingTransactionUseCase.kt @@ -5,6 +5,7 @@ import com.tangem.domain.staking.model.PendingTransaction import com.tangem.domain.staking.model.stakekit.StakingError import com.tangem.domain.staking.repositories.StakingErrorResolver import com.tangem.domain.staking.repositories.StakingPendingTransactionRepository +import com.tangem.domain.wallets.models.UserWalletId /** * Use case for saving hash that failed to submit during staking confirmation @@ -14,9 +15,12 @@ class SavePendingTransactionUseCase( private val stakingErrorResolver: StakingErrorResolver, ) { - operator fun invoke(pendingTransaction: PendingTransaction): Either { + operator fun invoke(userWalletId: UserWalletId, transaction: PendingTransaction): Either { return Either.catch { - stakingPendingTransactionRepository.saveTransaction(pendingTransaction) + stakingPendingTransactionRepository.saveTransaction( + userWalletId = userWalletId, + transaction = transaction, + ) }.mapLeft { stakingErrorResolver.resolve(it) } diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingPendingTransactionRepository.kt b/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingPendingTransactionRepository.kt index 02bb96806b..708b8e1352 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingPendingTransactionRepository.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingPendingTransactionRepository.kt @@ -2,12 +2,13 @@ package com.tangem.domain.staking.repositories import com.tangem.domain.staking.model.PendingTransaction import com.tangem.domain.staking.model.stakekit.BalanceItem +import com.tangem.domain.wallets.models.UserWalletId interface StakingPendingTransactionRepository { - fun getTransactionsWithBalanceItems(): List> + fun getTransactionsWithBalanceItems(userWalletId: UserWalletId): List> - fun saveTransaction(transaction: PendingTransaction) + fun saveTransaction(userWalletId: UserWalletId, transaction: PendingTransaction) - fun removeTransactions(transactions: Set) + fun removeTransactions(userWalletId: UserWalletId, transactions: Set) } \ No newline at end of file diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt index 1fb3bbfbd7..f5b5d73ed4 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt @@ -264,7 +264,7 @@ internal class StakingTransactionSender @AssistedInject constructor( }.onRight { Timber.d("Successful hash submission") if (transaction.type != StakingTransactionType.FREEZE_ENERGY) { - savePendingTransactionUseCase.invoke(pendingTransaction) + savePendingTransactionUseCase.invoke(userWallet.walletId, pendingTransaction) } } } @@ -294,7 +294,8 @@ internal class StakingTransactionSender @AssistedInject constructor( rawCurrencyId = cryptoCurrencyStatus.currency.id.rawCurrencyId, validator = (confirmationState.validatorState as? ValidatorState.Content)?.chosenValidator, balancesId = (cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data)?.getBalancesUniqueId() ?: 0, - balanceItems = (cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data)?.balance?.items ?: emptyList() + balanceItems = (cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data)?.balance?.items + ?: emptyList(), ) } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetPossiblePendingTransactionTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetPossiblePendingTransactionTransformer.kt index cd352d6058..3c4b5e9c04 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetPossiblePendingTransactionTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetPossiblePendingTransactionTransformer.kt @@ -26,7 +26,8 @@ internal class SetPossiblePendingTransactionTransformer( rawCurrencyId = balanceState.rawCurrencyId, validator = balanceState.validator, balancesId = balancesId, - balanceItems = (cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data)?.balance?.items ?: emptyList() + balanceItems = (cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data)?.balance?.items + ?: emptyList(), ), ), ) diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt index d945d70c2f..6590a3b1c7 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt @@ -137,7 +137,7 @@ internal class StakingViewModel @Inject constructor( private val balancesToShow: List get() { return cryptoCurrencyStatus.value.yieldBalance?.let { - invalidatePendingTransactionsUseCase(it).getOrElse { emptyList() } + invalidatePendingTransactionsUseCase(userWallet.walletId, it).getOrElse { emptyList() } } ?: emptyList() } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index 154f26312f..fc41e514a8 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -152,7 +152,7 @@ internal class TokenDetailsViewModel @Inject constructor( private val swapTxJobHolder = JobHolder() private val selectedAppCurrencyFlow: StateFlow = createSelectedAppCurrencyFlow() private val stakingPendingBalances: List - get() = getStakingPendingTransactionsUseCase().getOrElse { emptyList() } + get() = getStakingPendingTransactionsUseCase(userWalletId).getOrElse { emptyList() } private var cryptoCurrencyStatus: CryptoCurrencyStatus? = null private var stakingEntryInfo: StakingEntryInfo? = null