diff --git a/common/test/src/main/java/com/tangem/common/test/domain/walletmanager/MockUpdateWalletManagerResultFactory.kt b/common/test/src/main/java/com/tangem/common/test/domain/walletmanager/MockUpdateWalletManagerResultFactory.kt index 7abe7f7217..645598c7cd 100644 --- a/common/test/src/main/java/com/tangem/common/test/domain/walletmanager/MockUpdateWalletManagerResultFactory.kt +++ b/common/test/src/main/java/com/tangem/common/test/domain/walletmanager/MockUpdateWalletManagerResultFactory.kt @@ -67,10 +67,12 @@ class MockUpdateWalletManagerResultFactory { value = BigDecimal.ONE, currencyRawId = CryptoCurrency.RawID("token"), contractAddress = "0xTokenAddress", - yieldSupplyStatus = YieldSupplyStatus( + yieldSupplyStatus = + YieldSupplyStatus( isActive = true, isInitialized = true, isAllowedToSpend = false, + effectiveProtocolBalance = BigDecimal.ONE, ), ), ), diff --git a/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt index 9b7763de26..a5d7fe36e0 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt @@ -19,6 +19,7 @@ import com.tangem.domain.models.StatusSource import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.yieldSupplyKey +import com.tangem.domain.models.currency.yieldSupplyNotAllAmountSupplied import com.tangem.domain.models.staking.YieldBalance import com.tangem.domain.staking.utils.getTotalWithRewardsStakingBalance import com.tangem.utils.StringsSigns.DASH_SIGN @@ -246,7 +247,9 @@ class TokenItemStateConverter( isFlickering = status.value.isFlickering(), icons = buildList { if (status.value.yieldSupplyStatus?.isActive == true && - status.value.yieldSupplyStatus?.isAllowedToSpend == false) { + status.value.yieldSupplyStatus?.isAllowedToSpend == false || + status.yieldSupplyNotAllAmountSupplied() + ) { TokenItemState.FiatAmountState.Content.IconUM( iconRes = R.drawable.ic_alert_triangle_20, tint = IconTint.Warning, diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt b/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt index 37dfea2ebb..8d7cd539c0 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/network/entity/NetworkStatusDM.kt @@ -119,6 +119,7 @@ sealed interface NetworkStatusDM { @Json(name = "is_active") val isActive: Boolean, @Json(name = "is_initialized") val isInitialized: Boolean, @Json(name = "is_allowed_to_spend") val isAllowedToSpend: Boolean, + @Json(name = "effective_protocol_balance") val effectiveProtocolBalance: BigDecimal? = null, ) @JsonClass(generateAdapter = true) diff --git a/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverter.kt index 4dddbb56bc..8f8c4c7792 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverter.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverter.kt @@ -23,6 +23,7 @@ internal class NetworkYieldSupplyStatusConverter( isActive = it.isActive, isInitialized = it.isInitialized, isAllowedToSpend = it.isAllowedToSpend, + effectiveProtocolBalance = it.effectiveProtocolBalance, ) id to status @@ -38,6 +39,7 @@ internal class NetworkYieldSupplyStatusConverter( isActive = yieldSupplyStatus.isActive, isInitialized = yieldSupplyStatus.isInitialized, isAllowedToSpend = yieldSupplyStatus.isAllowedToSpend, + effectiveProtocolBalance = yieldSupplyStatus.effectiveProtocolBalance, ) } } diff --git a/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverterTest.kt b/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverterTest.kt index 0d16b0ac0a..c42a8a9a9d 100644 --- a/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverterTest.kt +++ b/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverterTest.kt @@ -62,6 +62,7 @@ internal class NetworkStatusDataModelConverterTest { isActive = false, isInitialized = false, isAllowedToSpend = false, + effectiveProtocolBalance = BigDecimal.ONE, ), ID( prefix = Prefix.COIN_PREFIX, @@ -94,6 +95,7 @@ internal class NetworkStatusDataModelConverterTest { isActive = false, isInitialized = false, isAllowedToSpend = false, + effectiveProtocolBalance = BigDecimal.ONE, ), ), ), diff --git a/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverterTest.kt b/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverterTest.kt index 1c21deff5d..af36491079 100644 --- a/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverterTest.kt +++ b/data/networks/src/test/java/com/tangem/data/networks/converters/NetworkYieldSupplyStatusConverterTest.kt @@ -8,6 +8,7 @@ import com.tangem.domain.models.network.Network import com.tangem.domain.models.yield.supply.YieldSupplyStatus import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance +import java.math.BigDecimal @TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class NetworkYieldSupplyStatusConverterTest { @@ -21,6 +22,7 @@ internal class NetworkYieldSupplyStatusConverterTest { isActive = true, isInitialized = true, isAllowedToSpend = true, + effectiveProtocolBalance = BigDecimal.ONE, ) @Test @@ -70,6 +72,7 @@ internal class NetworkYieldSupplyStatusConverterTest { isActive = true, isInitialized = true, isAllowedToSpend = true, + effectiveProtocolBalance = BigDecimal.ONE, ) } } \ No newline at end of file diff --git a/data/networks/src/test/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverterTest.kt b/data/networks/src/test/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverterTest.kt index 2ca9c9e06c..5e7375de67 100644 --- a/data/networks/src/test/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverterTest.kt +++ b/data/networks/src/test/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverterTest.kt @@ -68,6 +68,7 @@ internal class SimpleNetworkStatusConverterTest { isActive = false, isInitialized = false, isAllowedToSpend = false, + effectiveProtocolBalance = BigDecimal.ONE, ), ), ), @@ -103,6 +104,7 @@ internal class SimpleNetworkStatusConverterTest { isActive = false, isInitialized = false, isAllowedToSpend = false, + effectiveProtocolBalance = BigDecimal.ONE, ), ), source = StatusSource.CACHE, diff --git a/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt b/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt index 2350f4e822..caa0cf1566 100644 --- a/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt +++ b/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt @@ -272,6 +272,7 @@ internal class NetworkStatusFactoryTest(private val model: Model) { isActive = false, isInitialized = false, isAllowedToSpend = false, + effectiveProtocolBalance = BigDecimal.ONE, ), ), ), diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrencyChecksRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrencyChecksRepository.kt index 485f1afd18..ff39057e0a 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrencyChecksRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrencyChecksRepository.kt @@ -181,7 +181,7 @@ internal class DefaultCurrencyChecksRepository( blockchain = token.network.toBlockchain(), derivationPath = token.network.derivationPath.value, ) ?: error("Wallet manager not found") - walletManager.getProtocolBalance( + walletManager.getEffectiveProtocolBalance( token = Token( symbol = token.symbol, contractAddress = token.contractAddress, 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 55054ba3c8..a8d65edb01 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 @@ -128,6 +128,7 @@ internal class UpdateWalletManagerResultFactory { isActive = type.isActive, isInitialized = type.isInitialized, isAllowedToSpend = type.isAllowedToSpend, + effectiveProtocolBalance = type.effectiveProtocolBalance, ), ) } diff --git a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt index 12c2a98044..c761bd1160 100644 --- a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt +++ b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt @@ -91,24 +91,26 @@ internal class DefaultYieldSupplyTransactionRepository( ) } - override suspend fun getProtocolBalance(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): BigDecimal? = - withContext(dispatchers.io) { - require(cryptoCurrency is CryptoCurrency.Token) - runCatching { - val walletManager = walletManagersFacade.getOrCreateWalletManager( - userWalletId = userWalletId, - blockchain = cryptoCurrency.network.toBlockchain(), - derivationPath = cryptoCurrency.network.derivationPath.value, - ) ?: error("Wallet manager not found") - walletManager.getProtocolBalance( - token = Token( - symbol = cryptoCurrency.symbol, - contractAddress = cryptoCurrency.contractAddress, - decimals = cryptoCurrency.decimals, - ), - ) - }.onFailure(Timber::e).getOrThrow() - } + override suspend fun getEffectiveProtocolBalance( + userWalletId: UserWalletId, + cryptoCurrency: CryptoCurrency, + ): BigDecimal? = withContext(dispatchers.io) { + require(cryptoCurrency is CryptoCurrency.Token) + runCatching { + val walletManager = walletManagersFacade.getOrCreateWalletManager( + userWalletId = userWalletId, + blockchain = cryptoCurrency.network.toBlockchain(), + derivationPath = cryptoCurrency.network.derivationPath.value, + ) ?: error("Wallet manager not found") + walletManager.getEffectiveProtocolBalance( + token = Token( + symbol = cryptoCurrency.symbol, + contractAddress = cryptoCurrency.contractAddress, + decimals = cryptoCurrency.decimals, + ), + ) + }.onFailure(Timber::e).getOrThrow() + } @Suppress("LongParameterList") private suspend fun buildEnterTransactions( @@ -222,6 +224,17 @@ internal class DefaultYieldSupplyTransactionRepository( ): YieldSupplyStatus? = withContext(dispatchers.io) { runCatching { val sdkSupplyStatus = walletManager.getYieldSupplyStatus(cryptoCurrency.contractAddress) + val protocolBalance = if (sdkSupplyStatus?.isActive == true) { + walletManager.getEffectiveProtocolBalance( + token = Token( + symbol = cryptoCurrency.symbol, + contractAddress = cryptoCurrency.contractAddress, + decimals = cryptoCurrency.decimals, + ), + ) + } else { + null + } val isAllowedToSpend = walletManager.isAllowedToSpend( Token( symbol = cryptoCurrency.symbol, @@ -234,6 +247,7 @@ internal class DefaultYieldSupplyTransactionRepository( isActive = sdkSupplyStatus?.isActive == true, isInitialized = sdkSupplyStatus?.isInitialized == true, isAllowedToSpend = isAllowedToSpend, + effectiveProtocolBalance = protocolBalance, ) }.onFailure(Timber::e).getOrNull() } diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyExtensions.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyExtensions.kt index b3fb460bdb..532c2f1621 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyExtensions.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/currency/CryptoCurrencyExtensions.kt @@ -2,4 +2,20 @@ package com.tangem.domain.models.currency fun CryptoCurrency.Token.yieldSupplyKey(): String { return "${network.backendId}_$contractAddress" +} + +fun CryptoCurrencyStatus.yieldSupplyNotAllAmountSupplied(): Boolean { + if (this.currency !is CryptoCurrency.Token) return false + + val supplyStatus = this.value.yieldSupplyStatus + if (supplyStatus?.isActive != true) return false + + val protocolBalance = supplyStatus.effectiveProtocolBalance + val amount = this.value.amount + + return if (protocolBalance != null && amount != null) { + amount > protocolBalance + } else { + false + } } \ No newline at end of file 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 index 3a8165a366..138dc5ad5b 100644 --- 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 @@ -1,5 +1,6 @@ package com.tangem.domain.models.yield.supply +import com.tangem.domain.models.serialization.SerializedBigDecimal import kotlinx.serialization.Serializable /** @@ -11,10 +12,12 @@ import kotlinx.serialization.Serializable * @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. - */ + * @property effectiveProtocolBalance Indicates the balance (excluding service fee) + * */ @Serializable data class YieldSupplyStatus( val isActive: Boolean, val isInitialized: Boolean, val isAllowedToSpend: Boolean, + val effectiveProtocolBalance: SerializedBigDecimal?, ) \ No newline at end of file diff --git a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyTransactionRepository.kt b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyTransactionRepository.kt index 68982a6e66..dccf5c9e1d 100644 --- a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyTransactionRepository.kt +++ b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/YieldSupplyTransactionRepository.kt @@ -23,5 +23,5 @@ interface YieldSupplyTransactionRepository { suspend fun getYieldContractAddress(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): String? - suspend fun getProtocolBalance(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): BigDecimal? + suspend fun getEffectiveProtocolBalance(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): BigDecimal? } \ No newline at end of file diff --git a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetProtocolBalanceUseCase.kt b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetProtocolBalanceUseCase.kt index a36158a7b6..3bc5de3b71 100644 --- a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetProtocolBalanceUseCase.kt +++ b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetProtocolBalanceUseCase.kt @@ -19,7 +19,7 @@ class YieldSupplyGetProtocolBalanceUseCase( ): Either = Either.catch { requireNotNull(cryptoCurrency as CryptoCurrency.Token) - yieldSupplyTransactionRepository.getProtocolBalance( + yieldSupplyTransactionRepository.getEffectiveProtocolBalance( userWalletId = userWalletId, cryptoCurrency = cryptoCurrency, ) diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt index 268470e09f..a74719003c 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt @@ -102,10 +102,11 @@ internal class YieldSupplyActiveModel @Inject constructor( private fun subscribeOnCurrencyUpdates() { cryptoCurrencyStatusFlow.onEach { cryptoCurrencyStatus -> - val protocolBalance = yieldSupplyGetProtocolBalanceUseCase( - userWalletId = params.userWallet.walletId, - cryptoCurrency = cryptoCurrency, - ).getOrNull() + val protocolBalance = cryptoCurrencyStatus.value.yieldSupplyStatus?.effectiveProtocolBalance + ?: yieldSupplyGetProtocolBalanceUseCase( + userWalletId = params.userWallet.walletId, + cryptoCurrency = cryptoCurrency, + ).getOrNull() val approvalNotification = if (cryptoCurrencyStatus.value.yieldSupplyStatus?.isAllowedToSpend != true) { NotificationUM.Error( diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index f3ceb42d40..1cd201c597 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,7 +5,7 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "releases-5.30-1283" +tangemBlockchainSdk = "releases-5.30-1285" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "releases-5.30-567" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^