From 167ac2859860179296d2080ce8df15217bd339f2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Jul 2025 14:31:22 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../data/staking/DefaultStakingRepository.kt | 6 +-- .../converters/YieldBalanceListConverter.kt | 16 -------- .../model/stakekit/YieldBalanceList.kt | 23 ------------ .../staking/repositories/StakingRepository.kt | 5 +-- .../BaseCurrencyStatusOperations.kt | 17 +++++---- .../CachedCurrenciesStatusesOperations.kt | 37 +++++++------------ .../utils/CurrencyStatusProxyCreator.kt | 17 ++++----- 7 files changed, 35 insertions(+), 86 deletions(-) delete mode 100644 data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceListConverter.kt delete mode 100644 domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt index 3f04117797..fbdea80804 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt @@ -14,7 +14,6 @@ import com.tangem.blockchainsdk.utils.toCoinId import com.tangem.blockchainsdk.utils.toMigratedCoinId import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toCompressedPublicKey -import com.tangem.data.staking.converters.YieldBalanceListConverter import com.tangem.data.staking.converters.YieldConverter import com.tangem.data.staking.converters.action.ActionStatusConverter import com.tangem.data.staking.converters.action.EnterActionResponseConverter @@ -45,7 +44,6 @@ import com.tangem.domain.staking.model.StakingEntryInfo import com.tangem.domain.staking.model.stakekit.NetworkType import com.tangem.domain.staking.model.stakekit.Yield import com.tangem.domain.staking.model.stakekit.YieldBalance -import com.tangem.domain.staking.model.stakekit.YieldBalanceList import com.tangem.domain.staking.model.stakekit.action.StakingAction import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType import com.tangem.domain.staking.model.stakekit.action.StakingActionStatus @@ -401,15 +399,13 @@ internal class DefaultStakingRepository( override suspend fun getMultiYieldBalanceSync( userWalletId: UserWalletId, cryptoCurrencies: List, - ): YieldBalanceList { + ): List? { val stakingIds = cryptoCurrencies.mapNotNull { stakingIdFactory.create(userWalletId = userWalletId, currencyId = it.id, network = it.network) } return stakingBalanceStoreV2.getAllSyncOrNull(userWalletId) ?.filter { it.getStakingId() in stakingIds } - ?.let { YieldBalanceListConverter.convert(value = it.toSet()) } - ?: YieldBalanceList.Error } override suspend fun isAnyTokenStaked(userWalletId: UserWalletId): Boolean { diff --git a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceListConverter.kt b/data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceListConverter.kt deleted file mode 100644 index 63bc4d1655..0000000000 --- a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceListConverter.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tangem.data.staking.converters - -import com.tangem.domain.staking.model.stakekit.YieldBalance -import com.tangem.domain.staking.model.stakekit.YieldBalanceList -import com.tangem.utils.converter.Converter - -internal object YieldBalanceListConverter : Converter, YieldBalanceList> { - - override fun convert(value: Set): YieldBalanceList { - return if (value.isEmpty()) { - YieldBalanceList.Empty - } else { - YieldBalanceList.Data(balances = value.toList()) - } - } -} \ No newline at end of file diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt deleted file mode 100644 index 23aebbbdb4..0000000000 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.tangem.domain.staking.model.stakekit - -sealed class YieldBalanceList { - - data class Data(val balances: List) : YieldBalanceList() { - - fun getBalance(address: String?, integrationId: String?): YieldBalance { - return balances.firstOrNull { yieldBalance -> - val data = yieldBalance as? YieldBalance.Data - val balance = data?.balance - - val isCorrectAddress = address != null && address == data?.address - val isCorrectIntegration = integrationId != null && balance?.integrationId == integrationId - - isCorrectIntegration && isCorrectAddress - } ?: YieldBalance.Error(integrationId = integrationId, address = address) - } - } - - data object Empty : YieldBalanceList() - - data object Error : YieldBalanceList() -} \ No newline at end of file diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt b/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt index 854a9c6018..dce26456cb 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt @@ -5,20 +5,19 @@ import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.common.transaction.Fee import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network +import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.staking.model.StakingApproval import com.tangem.domain.staking.model.StakingAvailability import com.tangem.domain.staking.model.StakingEntryInfo import com.tangem.domain.staking.model.stakekit.NetworkType import com.tangem.domain.staking.model.stakekit.Yield import com.tangem.domain.staking.model.stakekit.YieldBalance -import com.tangem.domain.staking.model.stakekit.YieldBalanceList import com.tangem.domain.staking.model.stakekit.action.StakingAction import com.tangem.domain.staking.model.stakekit.action.StakingActionStatus import com.tangem.domain.staking.model.stakekit.action.StakingActionType import com.tangem.domain.staking.model.stakekit.transaction.ActionParams import com.tangem.domain.staking.model.stakekit.transaction.StakingGasEstimate import com.tangem.domain.staking.model.stakekit.transaction.StakingTransaction -import com.tangem.domain.models.wallet.UserWalletId import kotlinx.coroutines.flow.Flow import java.math.BigDecimal @@ -54,7 +53,7 @@ interface StakingRepository { suspend fun getMultiYieldBalanceSync( userWalletId: UserWalletId, cryptoCurrencies: List, - ): YieldBalanceList + ): List? suspend fun createAction(userWalletId: UserWalletId, network: Network, params: ActionParams): StakingAction diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/BaseCurrencyStatusOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/BaseCurrencyStatusOperations.kt index 6485199c9a..80744461c7 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/BaseCurrencyStatusOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/BaseCurrencyStatusOperations.kt @@ -19,7 +19,6 @@ import com.tangem.domain.quotes.QuotesRepository import com.tangem.domain.quotes.single.SingleQuoteStatusProducer import com.tangem.domain.quotes.single.SingleQuoteStatusSupplier import com.tangem.domain.staking.model.stakekit.YieldBalance -import com.tangem.domain.staking.model.stakekit.YieldBalanceList import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.single.SingleYieldBalanceProducer import com.tangem.domain.staking.single.SingleYieldBalanceSupplier @@ -396,17 +395,21 @@ abstract class BaseCurrencyStatusOperations( private suspend fun getYieldBalancesSync( userWalletId: UserWalletId, cryptoCurrencies: List, - ): Either { + ): Either> { return catch( block = { - stakingRepository.getMultiYieldBalanceSync( + val balances = stakingRepository.getMultiYieldBalanceSync( userWalletId = userWalletId, cryptoCurrencies = cryptoCurrencies, - ).right() - }, - catch = { - Error.EmptyYieldBalances.left() + ) + + if (balances.isNullOrEmpty()) { + Error.EmptyYieldBalances.left() + } else { + balances.right() + } }, + catch = { Error.EmptyYieldBalances.left() }, ) } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CachedCurrenciesStatusesOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CachedCurrenciesStatusesOperations.kt index 2ce1024d2d..2861f1eb19 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CachedCurrenciesStatusesOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CachedCurrenciesStatusesOperations.kt @@ -14,6 +14,7 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.quote.QuoteStatus +import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier import com.tangem.domain.networks.single.SingleNetworkStatusFetcher @@ -24,7 +25,7 @@ import com.tangem.domain.quotes.multi.MultiQuoteStatusFetcher import com.tangem.domain.quotes.single.SingleQuoteStatusProducer import com.tangem.domain.quotes.single.SingleQuoteStatusSupplier import com.tangem.domain.staking.model.stakekit.YieldBalance -import com.tangem.domain.staking.model.stakekit.YieldBalanceList +import com.tangem.domain.staking.model.stakekit.YieldBalance.Unsupported.integrationId import com.tangem.domain.staking.multi.MultiYieldBalanceFetcher import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.single.SingleYieldBalanceProducer @@ -36,7 +37,6 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.operations.CurrenciesStatusesOperations.Error import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.utils.extractAddress -import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.extensions.addOrReplace import com.tangem.utils.extensions.isSingleItem import kotlinx.coroutines.* @@ -128,9 +128,9 @@ class CachedCurrenciesStatusesOperations( val (networks, currenciesIds) = getIds(currencies) fun createCurrenciesStatuses( - maybeQuotes: Either>?, - maybeNetworkStatuses: Either>?, - maybeYieldBalances: Either?, + maybeQuotes: Either>, + maybeNetworkStatuses: Either>, + maybeYieldBalances: Either>, isUpdating: Boolean, ) = createCurrenciesStatuses( currencies = currencies, @@ -229,7 +229,7 @@ class CachedCurrenciesStatusesOperations( currencies: NonEmptyList, maybeQuotes: Either>?, maybeNetworkStatuses: Either>?, - maybeYieldBalances: Either?, + maybeYieldBalances: Either>?, isUpdating: Boolean, ): Lce> = lce { isLoading.set(isUpdating) @@ -264,20 +264,20 @@ class CachedCurrenciesStatusesOperations( } private fun findYieldBalanceOrNull( - yieldBalances: YieldBalanceList?, + yieldBalances: List?, currency: CryptoCurrency, networkStatus: NetworkStatus?, ): YieldBalance? { - if (yieldBalances !is YieldBalanceList.Data) return null + if (yieldBalances.isNullOrEmpty()) return null val supportedIntegration = stakingRepository.getSupportedIntegrationId(currency.id) if (supportedIntegration.isNullOrBlank()) return null - return yieldBalances.getBalance( - address = extractAddress(networkStatus), - integrationId = supportedIntegration, - ) + val address = extractAddress(networkStatus) + + return yieldBalances.firstOrNull { it.integrationId == supportedIntegration && it.address == address } + ?: YieldBalance.Error(integrationId = supportedIntegration, address = address) } private fun getCurrencies(userWalletId: UserWalletId): EitherFlow> { @@ -369,7 +369,7 @@ class CachedCurrenciesStatusesOperations( private fun getYieldsBalancesUpdates( userWalletId: UserWalletId, cryptoCurrencies: List, - ): EitherFlow { + ): EitherFlow> { return channelFlow { val state = MutableStateFlow(emptyList()) @@ -394,18 +394,9 @@ class CachedCurrenciesStatusesOperations( } state - .onEach(::send) + .onEach { send(it.right()) } .launchIn(scope = this) } - .map, Either> { balances -> - val yieldBalanceList = if (balances.isEmpty()) { - YieldBalanceList.Empty - } else { - YieldBalanceList.Data(balances) - } - - yieldBalanceList.right() - } .distinctUntilChanged() } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/utils/CurrencyStatusProxyCreator.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/utils/CurrencyStatusProxyCreator.kt index 0dca67d61a..f6e74db9ca 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/utils/CurrencyStatusProxyCreator.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/utils/CurrencyStatusProxyCreator.kt @@ -8,7 +8,7 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.quote.QuoteStatus import com.tangem.domain.staking.model.stakekit.YieldBalance -import com.tangem.domain.staking.model.stakekit.YieldBalanceList +import com.tangem.domain.staking.model.stakekit.YieldBalance.Unsupported.integrationId import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.operations.CurrenciesStatusesOperations.Error @@ -52,12 +52,12 @@ class CurrencyStatusProxyCreator( fun createCurrenciesStatuses( currencies: NonEmptyList, maybeQuotes: Either>?, - maybeNetworkStatuses: Either>?, - maybeYieldBalances: Either?, + maybeNetworkStatuses: Either>, + maybeYieldBalances: Either>, ): Either> = either { var quotesRetrievingFailed = false - val networksStatuses = maybeNetworkStatuses?.bind()?.toNonEmptySetOrNull() + val networksStatuses = maybeNetworkStatuses.bind().toNonEmptySetOrNull() val quoteStatuses: Set? = maybeQuotes?.fold( ifLeft = { quotesRetrievingFailed = true @@ -71,7 +71,7 @@ class CurrencyStatusProxyCreator( }, ) - val yieldBalances = maybeYieldBalances?.getOrNull() + val yieldBalances = maybeYieldBalances.getOrNull() currencies.map { currency -> val quote = quoteStatuses?.firstOrNull { it.rawCurrencyId == currency.id.rawCurrencyId } @@ -80,13 +80,12 @@ class CurrencyStatusProxyCreator( val supportedIntegration = stakingRepository.getSupportedIntegrationId(currency.id) val yieldBalance = if (supportedIntegration.isNullOrEmpty().not()) { - (yieldBalances as? YieldBalanceList.Data)?.getBalance( - address = address, - integrationId = supportedIntegration, - ) + yieldBalances?.firstOrNull { it.integrationId == supportedIntegration && it.address == address } + ?: YieldBalance.Error(integrationId = supportedIntegration, address = address) } else { null } + createCurrencyStatus( currency = currency, quoteStatus = quote,