diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt index 9b97bcafce..5049b25bb6 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt @@ -13,10 +13,10 @@ import com.tangem.domain.core.lce.Lce import com.tangem.domain.exchange.ExpressAvailabilityState import com.tangem.domain.exchange.RampStateManager import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason import com.tangem.domain.tokens.repository.CurrenciesRepository +import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -37,11 +37,10 @@ internal class DefaultRampManager( private val cryptoCurrencyConverter = CryptoCurrencyConverter(excludedBlockchains) override suspend fun availableForBuy( - scanResponse: ScanResponse, - userWalletId: UserWalletId, + userWallet: UserWallet, cryptoCurrency: CryptoCurrency, ): ScenarioUnavailabilityReason { - val availabilityState = runCatching { getOnrampAvailableState(userWalletId, cryptoCurrency) } + val availabilityState = runCatching { getOnrampAvailableState(userWallet.walletId, cryptoCurrency) } .getOrNull() ?: ExpressAvailabilityState.Error diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/NetworkHasDerivationUseCase.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/NetworkHasDerivationUseCase.kt index aaa5711ded..92cb369c80 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/NetworkHasDerivationUseCase.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/NetworkHasDerivationUseCase.kt @@ -4,13 +4,18 @@ import arrow.core.Either import com.tangem.blockchainsdk.utils.toBlockchain import com.tangem.domain.common.util.hasDerivation import com.tangem.domain.models.network.Network -import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.wallets.models.UserWallet class NetworkHasDerivationUseCase { - operator fun invoke(scanResponse: ScanResponse, network: Network): Either { - val blockchain = network.toBlockchain() - val derivationPath = network.derivationPath.value - return Either.catch { derivationPath != null && scanResponse.hasDerivation(blockchain, derivationPath) } + operator fun invoke(userWallet: UserWallet, network: Network): Either = Either.catch { + when (userWallet) { + is UserWallet.Cold -> { + val blockchain = network.toBlockchain() + val derivationPath = network.derivationPath.value + derivationPath != null && userWallet.scanResponse.hasDerivation(blockchain, derivationPath) + } + is UserWallet.Hot -> true + } } } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/exchange/RampStateManager.kt b/domain/legacy/src/main/java/com/tangem/domain/exchange/RampStateManager.kt index 0655c427d6..488a604d5f 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/exchange/RampStateManager.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/exchange/RampStateManager.kt @@ -3,9 +3,9 @@ package com.tangem.domain.exchange import arrow.core.Either import com.tangem.domain.core.lce.Lce import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason +import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import kotlinx.coroutines.flow.Flow @@ -14,11 +14,7 @@ import kotlinx.coroutines.flow.Flow */ interface RampStateManager { - suspend fun availableForBuy( - scanResponse: ScanResponse, - userWalletId: UserWalletId, - cryptoCurrency: CryptoCurrency, - ): ScenarioUnavailabilityReason + suspend fun availableForBuy(userWallet: UserWallet, cryptoCurrency: CryptoCurrency): ScenarioUnavailabilityReason /** * Check if [CryptoCurrency] is available for sell diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/actions/BaseActionsFactory.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/actions/BaseActionsFactory.kt index 16463ebb63..407d308fa6 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/actions/BaseActionsFactory.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/actions/BaseActionsFactory.kt @@ -62,8 +62,7 @@ internal open class BaseActionsFactory( currency: CryptoCurrency, ): ScenarioUnavailabilityReason { return rampStateManager.availableForBuy( - userWalletId = userWallet.walletId, - scanResponse = userWallet.scanResponse, + userWallet = userWallet, cryptoCurrency = currency, ) } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt index cbaed64847..2970584dc3 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt @@ -204,12 +204,9 @@ internal class OnboardingNoteTopUpModel @Inject constructor( } private fun loadAvailableForBuy(cryptoCurrencyStatus: CryptoCurrencyStatus) { - val userWalletId = userWallet?.walletId ?: return - modelScope.launch { val availableForBuy = rampStateManager.availableForBuy( - scanResponse = scanResponse, - userWalletId = userWalletId, + userWallet = userWallet ?: return@launch, cryptoCurrency = cryptoCurrencyStatus.currency, ) _uiState.update { diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt index 4f6245b649..5d814942e4 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt @@ -83,8 +83,7 @@ internal class OnrampOperationModel @Inject constructor( fun onHotTokenClick(status: CryptoCurrencyStatus) { modelScope.launch { val unavailabilityReason = rampStateManager.availableForBuy( - scanResponse = selectedUserWallet.scanResponse, - userWalletId = params.userWalletId, + userWallet = selectedUserWallet, cryptoCurrency = status.currency, ) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/model/OnrampTokenListModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/model/OnrampTokenListModel.kt index b412ffc487..2a40893a63 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/model/OnrampTokenListModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/model/OnrampTokenListModel.kt @@ -229,8 +229,7 @@ internal class OnrampTokenListModel @Inject constructor( return when (params.filterOperation) { OnrampOperation.BUY -> { rampStateManager.availableForBuy( - scanResponse = userWallet.scanResponse, - userWalletId = params.userWalletId, + userWallet = userWallet, cryptoCurrency = status.currency, ).isAvailable() } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt index b0ee98e1a4..55966eb359 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt @@ -70,7 +70,6 @@ import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.domain.wallets.models.requireColdWallet import com.tangem.domain.wallets.usecase.GetExploreUrlUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.feature.tokendetails.deeplink.TokenDetailsDeepLinkActionListener @@ -442,16 +441,15 @@ internal class TokenDetailsModel @Inject constructor( private fun updateTopBarMenu() { modelScope.launch(dispatchers.main) { - val hasDerivations = - networkHasDerivationUseCase( - scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY] - network = cryptoCurrency.network, - ).getOrElse { false } + val hasDerivations = networkHasDerivationUseCase( + userWallet = userWallet, + network = cryptoCurrency.network, + ).getOrElse { false } val isSupported = isXPUBSupported() internalUiState.value = stateFactory.getStateWithUpdatedMenu( - cardTypesResolver = userWallet.scanResponse.cardTypesResolver, + userWallet = userWallet, hasDerivations = hasDerivations, isSupported = isSupported, ) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSkeletonStateConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSkeletonStateConverter.kt index 05bb854ee4..a78e619a41 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSkeletonStateConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSkeletonStateConverter.kt @@ -14,7 +14,6 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network import com.tangem.domain.staking.GetStakingIntegrationIdUseCase import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.domain.wallets.models.requireColdWallet import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.feature.tokendetails.presentation.tokendetails.model.TokenDetailsClickIntents import com.tangem.feature.tokendetails.presentation.tokendetails.state.* @@ -101,7 +100,7 @@ internal class TokenDetailsSkeletonStateConverter( val isBitcoin = isBitcoin(cryptoCurrency.network.rawId) val hasDerivations = networkHasDerivationUseCase( - scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY] + userWallet = userWallet, network = cryptoCurrency.network, ).getOrElse { false } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt index 4819797954..1f62bb2fc0 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt @@ -14,7 +14,7 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.TangemTheme import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.card.NetworkHasDerivationUseCase -import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.NetworkAddress @@ -29,6 +29,7 @@ import com.tangem.domain.tokens.model.TokenActionsState import com.tangem.domain.tokens.model.warnings.CryptoCurrencyWarning import com.tangem.domain.txhistory.models.TxHistoryListError import com.tangem.domain.txhistory.models.TxHistoryStateError +import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.feature.tokendetails.presentation.tokendetails.model.TokenDetailsClickIntents @@ -348,7 +349,7 @@ internal class TokenDetailsStateFactory( } fun getStateWithUpdatedMenu( - cardTypesResolver: CardTypesResolver, + userWallet: UserWallet, hasDerivations: Boolean, isSupported: Boolean, ): TokenDetailsState { @@ -356,7 +357,7 @@ internal class TokenDetailsStateFactory( copy( topAppBarConfig = topAppBarConfig.copy( tokenDetailsAppBarMenuConfig = topAppBarConfig.tokenDetailsAppBarMenuConfig - ?.updateMenu(cardTypesResolver, hasDerivations, isSupported), + ?.updateMenu(userWallet, hasDerivations, isSupported), ), ) } @@ -385,11 +386,16 @@ internal class TokenDetailsStateFactory( } private fun TokenDetailsAppBarMenuConfig.updateMenu( - cardTypesResolver: CardTypesResolver, + userWallet: UserWallet, hasDerivations: Boolean, isSupported: Boolean, ): TokenDetailsAppBarMenuConfig? { - if (cardTypesResolver.isSingleWalletWithToken()) return null + if (userWallet is UserWallet.Cold && + userWallet.scanResponse.cardTypesResolver.isSingleWalletWithToken() + ) { + return null + } + return copy( items = buildList { if (isSupported && hasDerivations) {