From c3bfe301a560f0962af565af534e0971dfbfd079 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 12 Sep 2025 14:01:41 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../network/MockNetworkStatusFactory.kt | 1 + .../networks/utils/NetworkStatusFactory.kt | 30 +++++++++++++ .../UpdateWalletManagerResultFactory.kt | 39 +++++++++++----- .../models/currency/CryptoCurrencyStatus.kt | 10 +++++ .../domain/models/network/NetworkStatus.kt | 2 + .../models/yield/supply/YieldSupplyStatus.kt | 20 +++++++++ .../operations/CurrencyStatusOperations.kt | 4 ++ .../transformers/SetVisaInfoTransformer.kt | 1 + gradle/tangem_dependencies.toml | 4 +- .../models/UpdateWalletManagerResult.kt | 45 ++++++++++++++----- .../tangem/blockchainsdk/utils/NetworkExt.kt | 1 + 11 files changed, 133 insertions(+), 24 deletions(-) create mode 100644 domain/models/src/main/kotlin/com/tangem/domain/models/yield/supply/YieldSupplyStatus.kt diff --git a/common/test/src/main/java/com/tangem/common/test/domain/network/MockNetworkStatusFactory.kt b/common/test/src/main/java/com/tangem/common/test/domain/network/MockNetworkStatusFactory.kt index 34fac4a101..99a612b847 100644 --- a/common/test/src/main/java/com/tangem/common/test/domain/network/MockNetworkStatusFactory.kt +++ b/common/test/src/main/java/com/tangem/common/test/domain/network/MockNetworkStatusFactory.kt @@ -30,6 +30,7 @@ object MockNetworkStatusFactory { ), amounts = mapOf(), pendingTransactions = mapOf(), + yieldSupplyStatuses = mapOf(), source = source, ) .let(transform), diff --git a/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt b/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt index 018a340fd4..9c9742678c 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt @@ -8,6 +8,7 @@ import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.NetworkAddress import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.network.TxInfo +import com.tangem.domain.models.yield.supply.YieldSupplyStatus import timber.log.Timber /** Factory for creating [NetworkStatus] */ @@ -70,6 +71,10 @@ object NetworkStatusFactory { transactions = result.currentTransactions, currencies = addedCurrencies, ), + yieldSupplyStatuses = formatYieldSupplyStatuses( + amounts = result.currenciesAmounts, + currencies = addedCurrencies, + ), source = StatusSource.ACTUAL, ) } @@ -107,6 +112,31 @@ object NetworkStatusFactory { } } + private fun formatYieldSupplyStatuses( + amounts: Set, + currencies: Set, + ): Map { + return currencies.associate { currency -> + val amount = when (currency) { + is CryptoCurrency.Coin -> null + is CryptoCurrency.Token -> { + amounts.filterIsInstance() + .firstOrNull { amount -> + currency.id.rawCurrencyId == amount.currencyRawId && + currency.contractAddress.equals(amount.contractAddress, ignoreCase = true) + } + } + } + + if (amount == null) { + Timber.w("Unable to find amount for cryptocurrency: $currency") + currency.id to null + } else { + currency.id to amount.yieldSupplyStatus + } + } + } + private fun formatTransactions( transactions: Set, currencies: Set, diff --git a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt index 0d7e463bb3..55054ba3c8 100644 --- a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt +++ b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt @@ -1,24 +1,20 @@ package com.tangem.data.walletmanager -import com.tangem.blockchain.common.Amount -import com.tangem.blockchain.common.AmountType -import com.tangem.blockchain.common.Token -import com.tangem.blockchain.common.TransactionData -import com.tangem.blockchain.common.TransactionStatus -import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.common.* import com.tangem.blockchain.common.address.Address import com.tangem.blockchainsdk.models.UpdateWalletManagerResult import com.tangem.blockchainsdk.utils.amountToCreateAccount import com.tangem.data.walletmanager.utils.SdkAddressToAddressConverter import com.tangem.data.walletmanager.utils.TransactionDataToTxHistoryItemConverter import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.yield.supply.YieldSupplyStatus import timber.log.Timber import java.math.BigDecimal -/** Factory for creating [com.tangem.blockchainsdk.models.UpdateWalletManagerResult] */ +/** Factory for creating [UpdateWalletManagerResult] */ internal class UpdateWalletManagerResultFactory { - /** Get [com.tangem.blockchainsdk.models.UpdateWalletManagerResult.Verified] result for [walletManager] */ + /** Get [UpdateWalletManagerResult.Verified] result for [walletManager] */ fun getResult(walletManager: WalletManager): UpdateWalletManagerResult.Verified { val wallet = walletManager.wallet val addresses = getAvailableAddresses(wallet.addresses) @@ -110,7 +106,7 @@ internal class UpdateWalletManagerResultFactory { is AmountType.Token -> { val value = getCurrencyAmountValue(amount) ?: return null - UpdateWalletManagerResult.CryptoCurrencyAmount.Token( + UpdateWalletManagerResult.CryptoCurrencyAmount.Token.BasicToken( currencyRawId = type.token.id?.let(CryptoCurrency::RawID), contractAddress = type.token.contractAddress, value = value, @@ -121,6 +117,20 @@ internal class UpdateWalletManagerResultFactory { UpdateWalletManagerResult.CryptoCurrencyAmount.Coin(value = value) } + is AmountType.TokenYieldSupply -> { + val value = getCurrencyAmountValue(amount) ?: return null + + UpdateWalletManagerResult.CryptoCurrencyAmount.Token.YieldSupplyToken( + value = value, + currencyRawId = type.token.id?.let(CryptoCurrency::RawID), + contractAddress = type.token.contractAddress, + yieldSupplyStatus = YieldSupplyStatus( + isActive = type.isActive, + isInitialized = type.isInitialized, + isAllowedToSpend = type.isAllowedToSpend, + ), + ) + } is AmountType.FeeResource, is AmountType.Reserve, -> null @@ -147,7 +157,7 @@ internal class UpdateWalletManagerResultFactory { ) return tokens.mapTo(demoAmounts) { token -> - UpdateWalletManagerResult.CryptoCurrencyAmount.Token( + UpdateWalletManagerResult.CryptoCurrencyAmount.Token.BasicToken( currencyRawId = token.id?.let(CryptoCurrency::RawID), contractAddress = token.contractAddress, value = amountValue, @@ -188,6 +198,15 @@ internal class UpdateWalletManagerResultFactory { txInfo = txHistoryItem, ) } + is AmountType.TokenYieldSupply -> { + val txHistoryItem = txHistoryItemConverter.convert(data) ?: return null + + UpdateWalletManagerResult.CryptoCurrencyTransaction.Token( + tokenId = type.token.id, + contractAddress = type.token.contractAddress, + txInfo = txHistoryItem, + ) + } is AmountType.FeeResource, is AmountType.Reserve, -> null diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyStatus.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyStatus.kt index 64e478276e..0663a46f9f 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyStatus.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyStatus.kt @@ -6,6 +6,7 @@ import com.tangem.domain.models.network.NetworkAddress import com.tangem.domain.models.network.TxInfo import com.tangem.domain.models.serialization.SerializedBigDecimal import com.tangem.domain.models.staking.YieldBalance +import com.tangem.domain.models.yield.supply.YieldSupplyStatus import kotlinx.serialization.Serializable /** @@ -58,6 +59,12 @@ data class CryptoCurrencyStatus( /** Staking yield balance */ val yieldBalance: YieldBalance? get() = null + /** + * !!! DO NOT CONFUSE with STAKING YIELD BALANCE + * Yield supply status + */ + val yieldSupplyStatus: YieldSupplyStatus? get() = null + /** Sources */ val sources: Sources get() = Sources() } @@ -157,6 +164,7 @@ data class CryptoCurrencyStatus( override val fiatRate: SerializedBigDecimal, override val priceChange: SerializedBigDecimal, override val yieldBalance: YieldBalance?, + override val yieldSupplyStatus: YieldSupplyStatus?, override val hasCurrentNetworkTransactions: Boolean, override val pendingTransactions: Set, override val networkAddress: NetworkAddress, @@ -184,6 +192,7 @@ data class CryptoCurrencyStatus( override val fiatRate: SerializedBigDecimal?, override val priceChange: SerializedBigDecimal?, override val yieldBalance: YieldBalance?, + override val yieldSupplyStatus: YieldSupplyStatus?, override val hasCurrentNetworkTransactions: Boolean, override val pendingTransactions: Set, override val networkAddress: NetworkAddress, @@ -205,6 +214,7 @@ data class CryptoCurrencyStatus( data class NoQuote( override val amount: SerializedBigDecimal, override val yieldBalance: YieldBalance?, + override val yieldSupplyStatus: YieldSupplyStatus?, override val hasCurrentNetworkTransactions: Boolean, override val pendingTransactions: Set, override val networkAddress: NetworkAddress, diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/network/NetworkStatus.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/network/NetworkStatus.kt index 9911c172f3..d5f1834bf3 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/network/NetworkStatus.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/network/NetworkStatus.kt @@ -2,6 +2,7 @@ package com.tangem.domain.models.network import com.tangem.domain.models.StatusSource import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.yield.supply.YieldSupplyStatus import java.math.BigDecimal /** @@ -58,6 +59,7 @@ data class NetworkStatus(val network: Network, val value: Value) { val address: NetworkAddress, val amounts: Map, val pendingTransactions: Map>, + val yieldSupplyStatuses: Map, override val source: StatusSource, ) : Value() diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/yield/supply/YieldSupplyStatus.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/yield/supply/YieldSupplyStatus.kt new file mode 100644 index 0000000000..3a8165a366 --- /dev/null +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/yield/supply/YieldSupplyStatus.kt @@ -0,0 +1,20 @@ +package com.tangem.domain.models.yield.supply + +import kotlinx.serialization.Serializable + +/** + * Represents the status of yield supply for a cryptocurrency asset. + * + * This data class encapsulates the current state of yield supply, including whether it is active, + * initialized, and allowed to spend. + * + * @property isActive Indicates if the yield token is currently active. + * @property isInitialized Indicates if the yield token has been initialized. + * @property isAllowedToSpend Indicates if spending from the yield module is permitted. + */ +@Serializable +data class YieldSupplyStatus( + val isActive: Boolean, + val isInitialized: Boolean, + val isAllowedToSpend: Boolean, +) \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt index c1dc1ffb33..5a6576e4b3 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt @@ -94,6 +94,7 @@ internal class CurrencyStatusOperations( } else { null } + val yieldSupplyStatus = networkStatusValue.yieldSupplyStatuses[currency.id] val quoteValue = quoteStatus?.value @@ -108,6 +109,7 @@ internal class CurrencyStatusOperations( pendingTransactions = currentTransactions, networkAddress = networkStatusValue.address, yieldBalance = currentYieldBalance, + yieldSupplyStatus = yieldSupplyStatus, sources = CryptoCurrencyStatus.Sources( networkSource = networkStatusValue.source, quoteSource = quoteStatus?.value?.source ?: StatusSource.ACTUAL, @@ -120,6 +122,7 @@ internal class CurrencyStatusOperations( pendingTransactions = currentTransactions, networkAddress = networkStatusValue.address, yieldBalance = currentYieldBalance, + yieldSupplyStatus = yieldSupplyStatus, sources = CryptoCurrencyStatus.Sources( networkSource = networkStatusValue.source, quoteSource = quoteStatus?.value?.source ?: StatusSource.ACTUAL, @@ -135,6 +138,7 @@ internal class CurrencyStatusOperations( pendingTransactions = currentTransactions, networkAddress = networkStatusValue.address, yieldBalance = currentYieldBalance, + yieldSupplyStatus = yieldSupplyStatus, sources = CryptoCurrencyStatus.Sources( networkSource = networkStatusValue.source, quoteSource = quoteValue.source, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetVisaInfoTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetVisaInfoTransformer.kt index 2accc6f5b7..751185ccf4 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetVisaInfoTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetVisaInfoTransformer.kt @@ -135,6 +135,7 @@ internal class SetVisaInfoTransformer( fiatRate = visaCurrency.fiatRate, priceChange = visaCurrency.priceChange, yieldBalance = null, + yieldSupplyStatus = null, hasCurrentNetworkTransactions = false, pendingTransactions = emptySet(), networkAddress = visaCurrency.paymentAccountAddress, diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index 25b1732ddf..8b6c15d617 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,8 +5,8 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "develop-1222" -#tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds +#tangemBlockchainSdk = "develop-1222" +tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-561" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ tangemVico = "2.0.0-alpha.25-tangem12" diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/models/UpdateWalletManagerResult.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/models/UpdateWalletManagerResult.kt index 200f9c2d8b..7064211d88 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/models/UpdateWalletManagerResult.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/models/UpdateWalletManagerResult.kt @@ -2,6 +2,7 @@ package com.tangem.blockchainsdk.models import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.TxInfo +import com.tangem.domain.models.yield.supply.YieldSupplyStatus import java.math.BigDecimal /** Result of updating wallet manager */ @@ -65,18 +66,38 @@ sealed class UpdateWalletManagerResult { */ data class Coin(override val value: BigDecimal) : CryptoCurrencyAmount - /** - * Token - * - * @property currencyRawId crypto currency id - * @property contractAddress token contract address - * @property value amount value - */ - data class Token( - override val value: BigDecimal, - val currencyRawId: CryptoCurrency.RawID?, - val contractAddress: String, - ) : CryptoCurrencyAmount + sealed interface Token : CryptoCurrencyAmount { + val currencyRawId: CryptoCurrency.RawID? + val contractAddress: String + + /** + * Basic Token + * + * @property currencyRawId crypto currency id + * @property contractAddress token contract address + * @property value amount value + */ + data class BasicToken( + override val value: BigDecimal, + override val currencyRawId: CryptoCurrency.RawID?, + override val contractAddress: String, + ) : Token + + /** + * Yield Supply Token + * + * @property currencyRawId crypto currency id + * @property contractAddress token contract address + * @property value amount value + * @property yieldSupplyStatus status of the yield token + */ + data class YieldSupplyToken( + override val value: BigDecimal, + override val currencyRawId: CryptoCurrency.RawID?, + override val contractAddress: String, + val yieldSupplyStatus: YieldSupplyStatus, + ) : Token + } } /** Crypto currency transaction */ diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/NetworkExt.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/NetworkExt.kt index e6534bcb53..203d2fddbd 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/NetworkExt.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/NetworkExt.kt @@ -9,4 +9,5 @@ fun Network.toBlockchain(): Blockchain = id.toBlockchain() /** Converts [Network.ID] to [Blockchain] */ fun Network.ID.toBlockchain(): Blockchain = rawId.toBlockchain() +/** Converts [Network.RawID] to [Blockchain] */ fun Network.RawID.toBlockchain(): Blockchain = Blockchain.fromId(id = value) \ No newline at end of file