Updated on 2026-08-14

This commit is contained in:
Tangem 2025-02-19 12:03:10 +04:00
parent 0bf2decb83
commit 36e7f2d07f
23 changed files with 212 additions and 70 deletions

View file

@ -1,5 +1,6 @@
package com.tangem.domain.tokens.operations
import com.tangem.domain.models.StatusSource
import com.tangem.domain.staking.model.stakekit.YieldBalance
import com.tangem.domain.tokens.model.*
import java.math.BigDecimal
@ -49,17 +50,27 @@ internal class CurrencyStatusOperations(
)
}
private fun createNoAccountStatus(status: NetworkStatus.NoAccount): CryptoCurrencyStatus.NoAccount =
CryptoCurrencyStatus.NoAccount(
private fun createNoAccountStatus(status: NetworkStatus.NoAccount): CryptoCurrencyStatus.NoAccount {
return CryptoCurrencyStatus.NoAccount(
amountToCreateAccount = status.amountToCreateAccount,
fiatAmount = if (quote == null) null else BigDecimal.ZERO,
priceChange = quote?.priceChange,
fiatRate = quote?.fiatRate,
networkAddress = status.address,
source = getResultStatusSource(
sources = listOf(
status.source,
(quote as? Quote.Value)?.source ?: StatusSource.ACTUAL,
),
),
)
}
private fun createStatus(status: NetworkStatus.Verified, yieldBalance: YieldBalance?): CryptoCurrencyStatus.Value {
val amount = when (val amount = status.amounts[currency.id]) {
private fun createStatus(
networkStatusValue: NetworkStatus.Verified,
yieldBalance: YieldBalance?,
): CryptoCurrencyStatus.Value {
val amount = when (val amount = networkStatusValue.amounts[currency.id]) {
null -> {
return CryptoCurrencyStatus.Loading
}
@ -69,10 +80,10 @@ internal class CurrencyStatusOperations(
is CryptoCurrencyAmountStatus.Loaded -> amount.value
}
val hasCurrentNetworkTransactions = status.pendingTransactions.isNotEmpty()
val currentTransactions = status.pendingTransactions.getOrElse(currency.id, ::emptySet)
val hasCurrentNetworkTransactions = networkStatusValue.pendingTransactions.isNotEmpty()
val currentTransactions = networkStatusValue.pendingTransactions.getOrElse(currency.id, ::emptySet)
val yieldBalanceData = yieldBalance as? YieldBalance.Data
val isCurrentAddressStaking = yieldBalanceData?.address == status.address.defaultAddress.value
val isCurrentAddressStaking = yieldBalanceData?.address == networkStatusValue.address.defaultAddress.value
val filteredTokenBalances = yieldBalanceData?.balance?.items?.filter {
it.token.coinGeckoId == currency.id.rawCurrencyId?.value
}
@ -94,14 +105,14 @@ internal class CurrencyStatusOperations(
priceChange = quote?.priceChange,
hasCurrentNetworkTransactions = hasCurrentNetworkTransactions,
pendingTransactions = currentTransactions,
networkAddress = status.address,
networkAddress = networkStatusValue.address,
yieldBalance = currentYieldBalance,
)
quote is Quote.Empty || ignoreQuote -> CryptoCurrencyStatus.NoQuote(
amount = amount,
hasCurrentNetworkTransactions = hasCurrentNetworkTransactions,
pendingTransactions = currentTransactions,
networkAddress = status.address,
networkAddress = networkStatusValue.address,
yieldBalance = currentYieldBalance,
)
quote is Quote.Value -> CryptoCurrencyStatus.Loaded(
@ -111,8 +122,15 @@ internal class CurrencyStatusOperations(
priceChange = quote.priceChange,
hasCurrentNetworkTransactions = hasCurrentNetworkTransactions,
pendingTransactions = currentTransactions,
networkAddress = status.address,
networkAddress = networkStatusValue.address,
yieldBalance = currentYieldBalance,
source = getResultStatusSource(
sources = listOf(
networkStatusValue.source,
currentYieldBalance?.source ?: StatusSource.ACTUAL,
quote.source,
),
),
)
else -> CryptoCurrencyStatus.Loading
}
@ -127,4 +145,18 @@ internal class CurrencyStatusOperations(
private fun calculateFiatAmount(amount: BigDecimal, fiatRate: BigDecimal): BigDecimal {
return amount * fiatRate
}
/*
* ACTUAL, ACTUAL, ACTUAL -> ACTUAL
* ACTUAL, ACTUAL, CACHE -> CACHE
* ACTUAL, ACTUAL, ONLY_CACHE -> ONLY_CACHE
* ACTUAL, CACHE, ONLY_CACHE -> ONLY_CACHE
*/
private fun getResultStatusSource(sources: List<StatusSource>): StatusSource {
return when {
sources.any { it == StatusSource.ONLY_CACHE } -> StatusSource.ONLY_CACHE
sources.any { it == StatusSource.CACHE } -> StatusSource.CACHE
else -> StatusSource.ACTUAL
}
}
}

View file

@ -2,6 +2,7 @@ package com.tangem.domain.tokens.mock
import arrow.core.NonEmptySet
import arrow.core.nonEmptySetOf
import com.tangem.domain.models.StatusSource
import com.tangem.domain.tokens.model.CryptoCurrencyAmountStatus
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.tokens.model.NetworkAddress
@ -76,7 +77,7 @@ internal object MockNetworks {
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
errorMessage = "",
isCached = false,
source = StatusSource.ACTUAL,
),
)
@ -92,7 +93,7 @@ internal object MockNetworks {
address = NetworkAddress.Single(
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
isCached = false,
source = StatusSource.ACTUAL,
),
)
@ -108,7 +109,7 @@ internal object MockNetworks {
address = NetworkAddress.Single(
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
isCached = false,
source = StatusSource.ACTUAL,
),
)
@ -125,7 +126,7 @@ internal object MockNetworks {
address = NetworkAddress.Single(
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
isCached = false,
source = StatusSource.ACTUAL,
),
)
}

View file

@ -1,6 +1,7 @@
package com.tangem.domain.tokens.mock
import arrow.core.nonEmptySetOf
import com.tangem.domain.models.StatusSource
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Quote
import java.math.BigDecimal
@ -12,70 +13,70 @@ internal object MockQuotes {
rawCurrencyId = MockTokens.token1.id.rawCurrencyId!!,
fiatRate = BigDecimal("1.23"),
priceChange = BigDecimal("0.01"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote2 = Quote.Value(
rawCurrencyId = MockTokens.token2.id.rawCurrencyId!!,
fiatRate = BigDecimal("2.34"),
priceChange = BigDecimal("-0.02"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote3 = Quote.Value(
rawCurrencyId = MockTokens.token3.id.rawCurrencyId!!,
fiatRate = BigDecimal("3.45"),
priceChange = BigDecimal("0.03"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote4 = Quote.Value(
rawCurrencyId = MockTokens.token4.id.rawCurrencyId!!,
fiatRate = BigDecimal("4.56"),
priceChange = BigDecimal("-0.04"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote5 = Quote.Value(
rawCurrencyId = MockTokens.token5.id.rawCurrencyId!!,
fiatRate = BigDecimal("5.67"),
priceChange = BigDecimal("0.05"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote6 = Quote.Value(
rawCurrencyId = MockTokens.token6.id.rawCurrencyId!!,
fiatRate = BigDecimal("6.78"),
priceChange = BigDecimal("-0.06"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote7 = Quote.Value(
rawCurrencyId = MockTokens.token7.id.rawCurrencyId!!,
fiatRate = BigDecimal("7.89"),
priceChange = BigDecimal("0.07"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote8 = Quote.Value(
rawCurrencyId = MockTokens.token8.id.rawCurrencyId!!,
fiatRate = BigDecimal("8.90"),
priceChange = BigDecimal("-0.08"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote9 = Quote.Value(
rawCurrencyId = MockTokens.token9.id.rawCurrencyId!!,
fiatRate = BigDecimal("9.01"),
priceChange = BigDecimal("0.09"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote10 = Quote.Value(
rawCurrencyId = MockTokens.token10.id.rawCurrencyId!!,
fiatRate = BigDecimal("10.12"),
priceChange = BigDecimal("-0.10"),
isCached = false,
source = StatusSource.ACTUAL,
)
val quote11 = Quote.Empty(CryptoCurrency.RawID("null"))

View file

@ -1,6 +1,7 @@
package com.tangem.domain.tokens.mock
import arrow.core.nonEmptyListOf
import com.tangem.domain.models.StatusSource
import com.tangem.domain.tokens.model.*
import java.math.BigDecimal
@ -74,6 +75,7 @@ internal object MockTokensStates {
networkAddress = NetworkAddress.Single(
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
source = StatusSource.ACTUAL,
),
)
@ -87,6 +89,7 @@ internal object MockTokensStates {
networkAddress = NetworkAddress.Single(
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
source = StatusSource.ACTUAL,
),
)
@ -100,6 +103,7 @@ internal object MockTokensStates {
networkAddress = NetworkAddress.Single(
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
source = StatusSource.ACTUAL,
),
)
@ -113,6 +117,7 @@ internal object MockTokensStates {
networkAddress = NetworkAddress.Single(
defaultAddress = NetworkAddress.Address(value = "mock", NetworkAddress.Address.Type.Primary),
),
source = StatusSource.ACTUAL,
),
)
@ -157,6 +162,7 @@ internal object MockTokensStates {
hasCurrentNetworkTransactions = false,
networkAddress = requireNotNull(networkStatus.value as? NetworkStatus.Verified).address,
yieldBalance = null,
source = StatusSource.ACTUAL,
)
}
status.copy(value = value)