Updated on 2026-08-14

This commit is contained in:
Tangem 2025-07-14 18:40:28 +04:00
parent 0e1e5e3a67
commit 135a8a22f0
5 changed files with 69 additions and 6 deletions

View file

@ -52,6 +52,8 @@ internal class DefaultMultiYieldBalanceFetcher @Inject constructor(
) : MultiYieldBalanceFetcher {
override suspend fun invoke(params: MultiYieldBalanceFetcher.Params): Either<Throwable, Unit> {
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)) {

View file

@ -47,11 +47,18 @@ internal class DefaultSingleYieldBalanceProducer @AssistedInject constructor(
private var stakingId: StakingID? = null
override fun produce(): Flow<YieldBalance> {
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()

View file

@ -21,5 +21,19 @@ interface MultiYieldBalanceFetcher : FlowFetcher<MultiYieldBalanceFetcher.Params
data class Params(
val userWalletId: UserWalletId,
val currencyIdWithNetworkMap: Map<CryptoCurrency.ID, Network>,
)
) {
override fun toString(): String {
val currencyIdWithNetworkMap = currencyIdWithNetworkMap.entries.joinToString {
"${it.key.value} - ${it.value}"
}
return """
MultiYieldBalanceFetcher.Params(
userWalletId = $userWalletId,
currencyIdWithNetworkMap: $currencyIdWithNetworkMap
)
""".trimIndent()
}
}
}

View file

@ -17,7 +17,18 @@ interface SingleYieldBalanceProducer : FlowProducer<YieldBalance> {
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<Params, SingleYieldBalanceProducer>
}

View file

@ -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()) {