From 135a8a22f0735b88971df7a3cd29d2245e1581a0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 14 Jul 2025 18:40:28 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../multi/DefaultMultiYieldBalanceFetcher.kt | 14 ++++++++++++- .../DefaultSingleYieldBalanceProducer.kt | 21 ++++++++++++++++--- .../staking/multi/MultiYieldBalanceFetcher.kt | 16 +++++++++++++- .../single/SingleYieldBalanceProducer.kt | 13 +++++++++++- .../TokenDetailsStakingInfoConverter.kt | 11 ++++++++++ 5 files changed, 69 insertions(+), 6 deletions(-) diff --git a/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcher.kt b/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcher.kt index ce8be6ef59..2e048f8797 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcher.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcher.kt @@ -52,6 +52,8 @@ internal class DefaultMultiYieldBalanceFetcher @Inject constructor( ) : MultiYieldBalanceFetcher { override suspend fun invoke(params: MultiYieldBalanceFetcher.Params): Either { + Timber.i("Start fetching yield balances for params:\n$params") + checkIsSupportedByWalletOrElse(userWalletId = params.userWalletId) { return it.left() } @@ -60,6 +62,8 @@ internal class DefaultMultiYieldBalanceFetcher @Inject constructor( return it.left() } + Timber.i("Staking IDs to fetch:\n${stakingIds.joinToString("\n")}") + return Either.catchOn(dispatchers.default) { yieldsBalancesStore.refresh(userWalletId = params.userWalletId, stakingIds = stakingIds) @@ -126,6 +130,13 @@ internal class DefaultMultiYieldBalanceFetcher @Inject constructor( val availableStakingIds = groupedStakingIds[true].orEmpty() val unavailableStakingIds = groupedStakingIds[false].orEmpty() + Timber.i( + """ + Available staking IDs: ${availableStakingIds.joinToString()} + Unavailable staking IDs: ${unavailableStakingIds.joinToString()} + """.trimIndent(), + ) + if (unavailableStakingIds.isNotEmpty()) { yieldsBalancesStore.storeError(userWalletId = userWalletId, stakingIds = unavailableStakingIds.toSet()) } @@ -138,7 +149,7 @@ internal class DefaultMultiYieldBalanceFetcher @Inject constructor( – stakingIds: ${stakingIds.joinToString()} """.trimIndent(), ) - Timber.d(exception) + Timber.i(exception) throw exception } } @@ -174,6 +185,7 @@ internal class DefaultMultiYieldBalanceFetcher @Inject constructor( .toSet() } + Timber.i("Successfully fetched yield balances for $userWalletId:\n${yieldBalances.joinToString("\n")}") yieldsBalancesStore.storeActual(userWalletId = userWalletId, values = yieldBalances) if (!allResponsesReceived(requests, yieldBalances)) { diff --git a/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt b/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt index 82a820ebae..bd38f407a4 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt @@ -47,11 +47,18 @@ internal class DefaultSingleYieldBalanceProducer @AssistedInject constructor( private var stakingId: StakingID? = null override fun produce(): Flow { + Timber.i("Producing yield balance for params:\n$params") + return multiYieldBalanceSupplier( params = MultiYieldBalanceProducer.Params(userWalletId = params.userWalletId), ) .mapNotNull { balances -> - val currentStakingId = getStakingId() ?: return@mapNotNull YieldBalance.Unsupported + val currentStakingId = getStakingId() + + if (currentStakingId == null) { + Timber.i("Staking ID is null for params: $params") + return@mapNotNull YieldBalance.Unsupported + } val currentBalances = balances.filter { it.getStakingId() == currentStakingId } @@ -66,7 +73,7 @@ internal class DefaultSingleYieldBalanceProducer @AssistedInject constructor( ), ) - Timber.w( + Timber.e( "Multiple balances found for staking ID $currentStakingId:\n%s", currentBalances.joinToString("\n"), ) @@ -79,7 +86,15 @@ internal class DefaultSingleYieldBalanceProducer @AssistedInject constructor( currentBalances.first() } } else { - currentBalances.firstOrNull() ?: YieldBalance.Unsupported + val balance = currentBalances.firstOrNull() + + if (balance != null) { + Timber.i("Yield balance found for $currentStakingId:\n$balance") + balance + } else { + Timber.i("No yield balance found for $currentStakingId:\n${YieldBalance.Unsupported}") + YieldBalance.Unsupported + } } } .distinctUntilChanged() diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/multi/MultiYieldBalanceFetcher.kt b/domain/staking/src/main/java/com/tangem/domain/staking/multi/MultiYieldBalanceFetcher.kt index 59123af3b9..47cdf88900 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/multi/MultiYieldBalanceFetcher.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/multi/MultiYieldBalanceFetcher.kt @@ -21,5 +21,19 @@ interface MultiYieldBalanceFetcher : FlowFetcher, - ) + ) { + + override fun toString(): String { + val currencyIdWithNetworkMap = currencyIdWithNetworkMap.entries.joinToString { + "${it.key.value} - ${it.value}" + } + + return """ + MultiYieldBalanceFetcher.Params( + userWalletId = $userWalletId, + currencyIdWithNetworkMap: $currencyIdWithNetworkMap + ) + """.trimIndent() + } + } } \ No newline at end of file diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleYieldBalanceProducer.kt b/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleYieldBalanceProducer.kt index 6b6391b82d..567a55c1ec 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleYieldBalanceProducer.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleYieldBalanceProducer.kt @@ -17,7 +17,18 @@ interface SingleYieldBalanceProducer : FlowProducer { val userWalletId: UserWalletId, val currencyId: CryptoCurrency.ID, val network: Network, - ) + ) { + + override fun toString(): String { + return """ + SingleYieldBalanceProducer.Params( + userWalletId = $userWalletId, + currencyId = $currencyId, + network = $network + ) + """.trimIndent() + } + } interface Factory : FlowProducer.Factory } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt index 5bdf57f4e7..82a04112f4 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt @@ -24,6 +24,7 @@ import com.tangem.lib.crypto.BlockchainUtils.isStakingRewardUnavailable import com.tangem.utils.Provider import com.tangem.utils.converter.Converter import com.tangem.utils.isNullOrZero +import timber.log.Timber import java.math.BigDecimal internal class TokenDetailsStakingInfoConverter( @@ -45,6 +46,7 @@ internal class TokenDetailsStakingInfoConverter( state: TokenDetailsState, stakingAvailability: StakingAvailability, ): StakingBlockUM? { + Timber.i("Define staking block for [${status.currency.id.value}] with availability:\n$stakingAvailability") return when (stakingAvailability) { StakingAvailability.TemporaryUnavailable -> StakingBlockUM.TemporaryUnavailable StakingAvailability.Unavailable -> null @@ -60,6 +62,15 @@ internal class TokenDetailsStakingInfoConverter( val iconState = state.tokenInfoBlockState.iconState + Timber.i( + """ + getStakingInfoBlock: + – yieldBalance: $yieldBalance + – stakingCryptoAmount: $stakingCryptoAmount + – stakingEntryInfo: $stakingEntryInfo + """.trimIndent(), + ) + return when { stakingCryptoAmount.isNullOrZero() && stakingEntryInfo != null -> { if (pendingBalances.isEmpty()) {