From 535bb9b8c3eb28ddeef7fa6537fffd3360dd6d82 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 7 Jul 2025 20:17:00 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/ApplicationEntryPoint.kt | 3 - .../java/com/tangem/tap/TangemApplication.kt | 5 - .../tap/common/extensions/WalletManager.kt | 44 ------ .../tap/common/redux/global/GlobalAction.kt | 16 -- .../common/redux/global/GlobalMiddleware.kt | 75 +-------- .../tap/common/redux/global/GlobalReducer.kt | 22 --- .../tap/common/redux/global/GlobalState.kt | 4 - .../java/com/tangem/tap/di/ActivityModule.kt | 7 +- .../tangem/tap/features/demo/DemoHelper.kt | 5 +- .../tap/features/home/redux/HomeMiddleware.kt | 1 - .../tangem/tap/features/main/MainViewModel.kt | 35 ++++- .../features/onboarding/OnboardingManager.kt | 6 - .../ui/dialogs/WalletActivationErrorDialog.kt | 2 +- .../middlewares/TradeCryptoMiddleware.kt | 92 +---------- .../features/welcome/model/WelcomeModel.kt | 1 - .../exchangeServices/CardExchangeRules.kt | 31 ---- .../CurrencyExchangeManager.kt | 148 ------------------ .../exchangeServices/DefaultRampManager.kt | 53 ++----- .../exchangeServices/ExchangeService.kt | 55 +------ .../exchangeServices/mercuryo/MercuryoApi.kt | 42 ----- .../mercuryo/MercuryoEnvironment.kt | 32 ---- .../mercuryo/MercuryoService.kt | 116 -------------- .../moonpay/MoonPayService.kt | 23 +-- .../com/tangem/tap/proxy/AppStateHolder.kt | 2 - .../tap/proxy/redux/DaggerGraphState.kt | 2 - .../tap/routing/utils/DeepLinkFactory.kt | 8 +- .../tap/routing/utils/DeepLinkFactoryTest.kt | 17 +- .../configs/feature_toggles_config.json | 4 - .../deeplink/global/BuyCurrencyDeepLink.kt | 19 --- .../domain/exchange/RampStateManager.kt | 4 - .../domain/tokens/legacy/TradeCryptoAction.kt | 10 -- .../impl/model/TokenActionsHandler.kt | 14 +- .../features/onramp/OnrampFeatureToggles.kt | 6 - .../deeplink/BuyRedirectDeepLinkHandler.kt | 10 -- .../onramp/DefaultOnrampFeatureToggles.kt | 11 -- .../features/onramp/OnrampFeatureModule.kt | 19 --- .../DefaultBuyRedirectDeepLinkHandler.kt | 49 ------ .../deeplink/di/OnrampDeeplinkModule.kt | 6 - .../selecttoken/model/OnrampOperationModel.kt | 39 ++--- .../DefaultTokenDetailsComponent.kt | 25 --- .../tokendetails/model/TokenDetailsModel.kt | 39 +---- .../model/intents/WalletClickIntents.kt | 6 - .../WalletCurrencyActionsClickIntents.kt | 37 +---- .../deeplink/WalletDeepLinksHandler.kt | 21 --- 44 files changed, 128 insertions(+), 1038 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt delete mode 100644 app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt delete mode 100644 app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt delete mode 100644 app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt delete mode 100644 app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoEnvironment.kt delete mode 100644 app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt delete mode 100644 core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt delete mode 100644 features/onramp/api/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureToggles.kt delete mode 100644 features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyRedirectDeepLinkHandler.kt delete mode 100644 features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt delete mode 100644 features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt delete mode 100644 features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyRedirectDeepLinkHandler.kt diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index aaeed5140b..c68bec0ed0 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -39,7 +39,6 @@ import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.tap.common.analytics.handlers.BlockchainExceptionHandler import com.tangem.tap.common.log.TangemAppLoggerInitializer @@ -118,8 +117,6 @@ interface ApplicationEntryPoint { fun getTransactionSignerFactory(): TransactionSignerFactory - fun getOnrampFeatureToggles(): OnrampFeatureToggles - fun getOnboardingV2FeatureToggles(): OnboardingV2FeatureToggles fun getOnboardingRepository(): OnboardingRepository diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 621f3eed14..337a48938a 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -58,7 +58,6 @@ import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.operations.attestation.api.TangemApiServiceSettings import com.tangem.tap.common.analytics.AnalyticsFactory @@ -186,9 +185,6 @@ abstract class TangemApplication : Application(), ImageLoaderFactory, Configurat private val transactionSignerFactory: TransactionSignerFactory get() = entryPoint.getTransactionSignerFactory() - private val onrampFeatureToggles: OnrampFeatureToggles - get() = entryPoint.getOnrampFeatureToggles() - private val onboardingV2FeatureToggles: OnboardingV2FeatureToggles get() = entryPoint.getOnboardingV2FeatureToggles() @@ -363,7 +359,6 @@ abstract class TangemApplication : Application(), ImageLoaderFactory, Configurat shareManager = shareManager, appRouter = appRouter, transactionSignerFactory = transactionSignerFactory, - onrampFeatureToggles = onrampFeatureToggles, environmentConfigStorage = environmentConfigStorage, onboardingV2FeatureToggles = onboardingV2FeatureToggles, onboardingRepository = onboardingRepository, diff --git a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt index acf3104c3f..55ebaa1ea3 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt @@ -3,16 +3,11 @@ package com.tangem.tap.common.extensions import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.blockchain.common.Wallet import com.tangem.blockchain.common.WalletManager -import com.tangem.blockchain.common.address.AddressType import com.tangem.blockchainsdk.utils.amountToCreateAccount import com.tangem.common.services.Result -import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.tap.common.TestActions -import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder import com.tangem.tap.domain.TapError import com.tangem.tap.domain.getFirstToken -import com.tangem.tap.domain.model.WalletAddressData -import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store import kotlinx.coroutines.delay @@ -57,43 +52,4 @@ suspend fun WalletManager.safeUpdate(isDemoCard: Boolean): Result = try } } } -} - -internal fun WalletManager.getTopUpUrl(cryptoCurrency: CryptoCurrency): String? { - val globalState = store.state.globalState - val defaultAddress = wallet.address - - return globalState.exchangeManager.getUrl( - action = CurrencyExchangeManager.Action.Buy, - cryptoCurrency = cryptoCurrency, - fiatCurrencyName = globalState.appCurrency.code, - walletAddress = defaultAddress, - isDarkTheme = MutableAppThemeModeHolder.isDarkThemeActive, - ) -} - -internal fun WalletManager?.getAddressData(): WalletAddressData? { - val wallet = this?.wallet ?: return null - - val addressDataList = wallet.createAddressesData() - return if (addressDataList.isEmpty()) null else addressDataList[0] -} - -private fun Wallet.createAddressesData(): List { - val listOfAddressData = mutableListOf() - // put a defaultAddress at the first place - addresses.forEach { - val addressData = WalletAddressData( - it.value, - it.type, - getShareUri(it.value), - getExploreUrl(it.value), - ) - if (it.type == AddressType.Default) { - listOfAddressData.add(0, addressData) - } else { - listOfAddressData.add(addressData) - } - } - return listOfAddressData } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 0a43a25887..404c7150f4 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -30,21 +30,5 @@ sealed class GlobalAction : Action { data class Success(val appCurrency: AppCurrency) : GlobalAction() } - data class UpdateWalletSignedHashes( - val walletSignedHashes: Int?, - val remainingSignatures: Int?, - val walletPublicKey: ByteArray, - ) : GlobalAction() - data class IsSignWithRing(val isSignWithRing: Boolean) : GlobalAction() - - object ExchangeManager : GlobalAction() { - object Init : GlobalAction() { - data class Success( - val exchangeManager: com.tangem.tap.network.exchangeServices.CurrencyExchangeManager, - ) : GlobalAction() - } - - object Update : GlobalAction() - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt index a75849544c..7e4af406fb 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt @@ -2,23 +2,14 @@ package com.tangem.tap.common.redux.global import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError -import com.tangem.common.extensions.guard import com.tangem.core.analytics.models.AnalyticsParam -import com.tangem.datasource.local.config.environment.EnvironmentConfig import com.tangem.domain.appcurrency.model.AppCurrency -import com.tangem.domain.common.LogConfig -import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.redux.StateDialog -import com.tangem.domain.wallets.models.requireColdWallet -import com.tangem.tap.common.extensions.* +import com.tangem.tap.common.extensions.dispatchDialogShow +import com.tangem.tap.common.extensions.dispatchWithMain +import com.tangem.tap.common.extensions.inject import com.tangem.tap.common.redux.AppState -import com.tangem.tap.network.exchangeServices.CardExchangeRules -import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager -import com.tangem.tap.network.exchangeServices.ExchangeService -import com.tangem.tap.network.exchangeServices.mercuryo.MercuryoEnvironment -import com.tangem.tap.network.exchangeServices.mercuryo.MercuryoService -import com.tangem.tap.network.exchangeServices.moonpay.MoonPayService import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store @@ -31,17 +22,17 @@ object GlobalMiddleware { val handler = globalMiddlewareHandler } -private val globalMiddlewareHandler: Middleware = { dispatch, appState -> +private val globalMiddlewareHandler: Middleware = { _, _ -> { nextDispatch -> { action -> - handleAction(action, appState) + handleAction(action) nextDispatch(action) } } } @Suppress("LongMethod", "ComplexMethod") -private fun handleAction(action: Action, appState: () -> AppState?) { +private fun handleAction(action: Action) { when (action) { is GlobalAction.ScanFailsCounter.ChooseBehavior -> { when (action.result) { @@ -51,42 +42,7 @@ private fun handleAction(action: Action, appState: () -> AppState?) { } } } - is GlobalAction.RestoreAppCurrency -> { - restoreAppCurrency() - } - is GlobalAction.ExchangeManager.Init -> { - val config = store.inject(DaggerGraphState::environmentConfigStorage).getConfigSync() - - scope.launch { - val scanResponseProvider: () -> ScanResponse? = { - val userWalletsListManager = store.inject(DaggerGraphState::generalUserWalletsListManager) - userWalletsListManager.selectedUserWalletSync?.requireColdWallet()?.scanResponse // TODO [REDACTED_TASK_KEY] - } - val cardProvider: () -> CardDTO? = { scanResponseProvider.invoke()?.card } - - val buyService = makeBuyExchangeService(config) - val sellService = makeSellExchangeService(config) - val exchangeManager = CurrencyExchangeManager( - buyService = buyService, - sellService = sellService, - primaryRules = CardExchangeRules(cardProvider), - ) - // TODO: for refactoring (after remove old design refactor CurrencyExchangeManager and use 1 instance) - store.inject(DaggerGraphState::appStateHolder).buyService = buyService - store.inject(DaggerGraphState::appStateHolder).sellService = sellService - store.inject(DaggerGraphState::appStateHolder).exchangeService = exchangeManager - store.dispatchOnMain(GlobalAction.ExchangeManager.Init.Success(exchangeManager)) - store.dispatchOnMain(GlobalAction.ExchangeManager.Update) - } - } - is GlobalAction.ExchangeManager.Init.Success -> {} - is GlobalAction.ExchangeManager.Update -> { - val exchangeManager = appState()?.globalState?.exchangeManager.guard { - store.dispatchDebugErrorNotification("exchangeManager is not initialized") - return - } - scope.launch { exchangeManager.update() } - } + is GlobalAction.RestoreAppCurrency -> restoreAppCurrency() } } @@ -119,21 +75,4 @@ private fun restoreAppCurrency() { store.dispatchWithMain(GlobalAction.RestoreAppCurrency.Success(currency)) } -} - -private fun makeSellExchangeService(environmentConfig: EnvironmentConfig): ExchangeService { - return MoonPayService( - apiKey = environmentConfig.moonPayApiKey, - secretKey = environmentConfig.moonPayApiSecretKey, - logEnabled = LogConfig.network.moonPayService, - ) -} - -private fun makeBuyExchangeService(environmentConfig: EnvironmentConfig): ExchangeService { - return MercuryoService( - environment = MercuryoEnvironment.prod( - widgetId = environmentConfig.mercuryoWidgetId, - secret = environmentConfig.mercuryoSecret, - ), - ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index 51da092058..a1ed71be61 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -1,7 +1,6 @@ package com.tangem.tap.common.redux.global import com.tangem.tap.common.redux.AppState -import com.tangem.utils.extensions.replaceBy import org.rekotlin.Action @Suppress("LongMethod", "ComplexMethod") @@ -26,24 +25,6 @@ fun globalReducer(action: Action, state: AppState): GlobalState { is GlobalAction.RestoreAppCurrency.Success -> { globalState.copy(appCurrency = action.appCurrency) } - is GlobalAction.UpdateWalletSignedHashes -> { - val card = globalState.scanResponse?.card ?: return globalState - val wallet = card.wallets - .firstOrNull { it.publicKey.contentEquals(action.walletPublicKey) } - ?: return globalState - - val newCardInstance = card.copy( - wallets = card.wallets.toMutableList().also { walletsMutable -> - walletsMutable.replaceBy( - item = wallet.copy( - totalSignedHashes = action.walletSignedHashes, - remainingSignatures = action.remainingSignatures, - ), - ) { it.index == wallet.index } - }, - ) - globalState.copy(scanResponse = globalState.scanResponse.copy(card = newCardInstance)) - } is GlobalAction.IsSignWithRing -> globalState.copy(isLastSignWithRing = action.isSignWithRing) is GlobalAction.ShowDialog -> { globalState.copy(dialog = action.stateDialog) @@ -51,9 +32,6 @@ fun globalReducer(action: Action, state: AppState): GlobalState { is GlobalAction.HideDialog -> { globalState.copy(dialog = null) } - is GlobalAction.ExchangeManager.Init.Success -> { - globalState.copy(exchangeManager = action.exchangeManager) - } else -> globalState } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index fb6bf4ae13..090cbc72f8 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -4,8 +4,6 @@ import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.redux.StateDialog import com.tangem.tap.domain.TapWalletManager -import com.tangem.tap.features.onboarding.OnboardingManager -import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import org.rekotlin.StateType data class GlobalState( @@ -16,7 +14,6 @@ data class GlobalState( val appCurrency: AppCurrency = AppCurrency.Default, val scanCardFailsCounter: Int = 0, val dialog: StateDialog? = null, - val exchangeManager: CurrencyExchangeManager = CurrencyExchangeManager.dummy(), val isLastSignWithRing: Boolean = false, ) : StateType @@ -24,6 +21,5 @@ typealias CryptoCurrencyName = String data class OnboardingState( val onboardingStarted: Boolean = false, - val onboardingManager: OnboardingManager? = null, val shouldResetOnCreate: Boolean = false, ) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/ActivityModule.kt b/app/src/main/java/com/tangem/tap/di/ActivityModule.kt index 368216c920..e5627b864f 100644 --- a/app/src/main/java/com/tangem/tap/di/ActivityModule.kt +++ b/app/src/main/java/com/tangem/tap/di/ActivityModule.kt @@ -10,7 +10,6 @@ import com.tangem.domain.tokens.GetPolkadotCheckHasImmortalUseCase import com.tangem.domain.tokens.GetPolkadotCheckHasResetUseCase import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.PolkadotAccountHealthCheckRepository -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.sdk.api.TangemSdkManager import com.tangem.tap.domain.scanCard.repository.DefaultScanCardRepository import com.tangem.tap.network.exchangeServices.DefaultRampManager @@ -53,18 +52,14 @@ internal object ActivityModule { getNetworkCoinStatusUseCase: GetNetworkCoinStatusUseCase, excludedBlockchains: ExcludedBlockchains, dispatchers: CoroutineDispatcherProvider, - onrampFeatureToggles: OnrampFeatureToggles, ): RampStateManager { return DefaultRampManager( - exchangeService = appStateHolder.exchangeService, - buyService = Provider { requireNotNull(appStateHolder.buyService) }, sellService = Provider { requireNotNull(appStateHolder.sellService) }, expressServiceLoader = expressServiceLoader, currenciesRepository = currenciesRepository, getNetworkCoinStatusUseCase = getNetworkCoinStatusUseCase, - excludedBlockchains = excludedBlockchains, dispatchers = dispatchers, - onrampFeatureToggles = onrampFeatureToggles, + excludedBlockchains = excludedBlockchains, ) } diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt index 577ac2f3a8..8427ef3c2f 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoHelper.kt @@ -43,9 +43,6 @@ object DemoHelper { } private fun getScanResponse(appState: () -> AppState?): ScanResponse? { - val state = appState() ?: return null - - return state.globalState.onboardingState.onboardingManager?.scanResponse - ?: state.globalState.scanResponse + return appState()?.globalState?.scanResponse } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index d020b24f18..c2882e49f7 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -61,7 +61,6 @@ private fun handleHomeAction(action: Action) { Analytics.send(IntroductionProcess.ScreenOpened()) store.dispatch(GlobalAction.RestoreAppCurrency) - store.dispatch(GlobalAction.ExchangeManager.Init) } is HomeAction.ReadCard -> { action.scope.launch { diff --git a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt index 404a978379..832de3675c 100644 --- a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt @@ -18,11 +18,15 @@ import com.tangem.core.ui.message.BottomSheetMessage import com.tangem.core.ui.message.EventMessageAction import com.tangem.core.ui.message.SnackbarMessage import com.tangem.datasource.api.common.config.managers.ApiConfigsManager +import com.tangem.datasource.local.config.environment.EnvironmentConfig +import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage import com.tangem.domain.appcurrency.FetchAppCurrenciesUseCase import com.tangem.domain.balancehiding.BalanceHidingSettings import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.balancehiding.ListenToFlipsUseCase import com.tangem.domain.balancehiding.UpdateBalanceHidingSettingsUseCase +import com.tangem.domain.common.LogConfig +import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.notifications.GetApplicationIdUseCase import com.tangem.domain.notifications.SendPushTokenUseCase import com.tangem.domain.notifications.models.ApplicationId @@ -46,6 +50,9 @@ import com.tangem.features.onramp.deeplink.OnrampDeepLink import com.tangem.tap.common.extensions.setContext import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.features.onboarding.products.wallet.redux.BackupDialog +import com.tangem.tap.network.exchangeServices.ExchangeService +import com.tangem.tap.network.exchangeServices.moonpay.MoonPayService +import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.store import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.wallet.BuildConfig @@ -58,7 +65,7 @@ import timber.log.Timber import javax.inject.Inject import kotlin.time.Duration.Companion.seconds -@Suppress("LongParameterList") +@Suppress("LongParameterList", "LargeClass") @HiltViewModel internal class MainViewModel @Inject constructor( private val updateBalanceHidingSettingsUseCase: UpdateBalanceHidingSettingsUseCase, @@ -88,6 +95,8 @@ internal class MainViewModel @Inject constructor( private val sendPushTokenUseCase: SendPushTokenUseCase, private val apiConfigsManager: ApiConfigsManager, private val multiQuoteUpdater: MultiQuoteUpdater, + private val appStateHolder: AppStateHolder, + private val environmentConfigStorage: EnvironmentConfigStorage, routingFeatureToggle: RoutingFeatureToggle, getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, ) : ViewModel() { @@ -120,6 +129,8 @@ internal class MainViewModel @Inject constructor( multiQuoteUpdater.subscribe() + initializeOffRamp() + observeFlips() displayBalancesHidingStatusToast() displayHiddenBalancesModalNotification() @@ -201,6 +212,28 @@ internal class MainViewModel @Inject constructor( .onRight { Timber.d("Staking token list was fetched successfully") } } + private fun initializeOffRamp() { + viewModelScope.launch { + val sellService = makeSellExchangeService(environmentConfig = environmentConfigStorage.getConfigSync()) + appStateHolder.sellService = sellService + + sellService.update() + } + } + + private fun makeSellExchangeService(environmentConfig: EnvironmentConfig): ExchangeService { + val cardProvider: () -> ScanResponse? = { + userWalletsListManager.selectedUserWalletSync?.requireColdWallet()?.scanResponse // TODO [REDACTED_TASK_KEY] + } + + return MoonPayService( + apiKey = environmentConfig.moonPayApiKey, + secretKey = environmentConfig.moonPayApiSecretKey, + logEnabled = LogConfig.network.moonPayService, + cardProvider = { cardProvider.invoke()?.card }, + ) + } + private fun observeFlips() { listenToFlipsUseCase().launchIn(viewModelScope) } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt deleted file mode 100644 index 8ea87b04a4..0000000000 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingManager.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.tangem.tap.features.onboarding - -import com.tangem.domain.models.scan.ScanResponse - -@Deprecated("Remove when navigation refactoring will be implemented") -class OnboardingManager(var scanResponse: ScanResponse) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt index aa0bf35450..d5851ab0ed 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt @@ -27,7 +27,7 @@ object WalletActivationErrorDialog { // changed on email support [REDACTED_TASK_KEY] Analytics.send(Basic.ButtonSupport(AnalyticsParam.ScreensSources.Intro)) - val scanResponse = store.state.globalState.onboardingState.onboardingManager?.scanResponse + val scanResponse = store.state.globalState.scanResponse ?: error("ScanResponse must be not null") val cardInfo = store.inject(DaggerGraphState::getCardInfoUseCase).invoke(scanResponse).getOrNull() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 2e92c8c5f4..d2f1baf710 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -1,30 +1,18 @@ package com.tangem.tap.features.wallet.redux.middlewares -import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager -import com.tangem.blockchainsdk.utils.toBlockchain -import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.Analytics -import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.NetworkAddress -import com.tangem.domain.onramp.model.OnrampSource import com.tangem.domain.tokens.legacy.TradeCryptoAction -import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.domain.wallets.models.requireColdWallet import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder -import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchNavigationAction import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.extensions.inject import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.demo.DemoHelper -import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager -import com.tangem.tap.network.exchangeServices.buyErc20TestnetTokens import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.tap.scope import com.tangem.tap.store -import kotlinx.coroutines.launch import org.rekotlin.Middleware @Deprecated("Will be removed soon") @@ -46,79 +34,10 @@ object TradeCryptoMiddleware { when (action) { is TradeCryptoAction.FinishSelling -> openReceiptUrl(action.transactionId) - is TradeCryptoAction.Buy -> proceedBuyAction(action) is TradeCryptoAction.Sell -> proceedSellAction(action) } } - private fun proceedBuyAction(action: TradeCryptoAction.Buy) { - val isOnrampEnabled = store.inject(DaggerGraphState::onrampFeatureToggles).isFeatureEnabled - if (isOnrampEnabled) { - proceedWithOnramp(action.userWallet.walletId, action.cryptoCurrencyStatus.currency, action.source) - } else { - proceedWithLegacyBuyAction(action) - } - } - - private fun proceedWithOnramp(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, source: OnrampSource) { - store.dispatchNavigationAction { - push( - AppRoute.Onramp( - userWalletId = userWalletId, - currency = cryptoCurrency, - source = source, - ), - ) - } - } - - private fun proceedWithLegacyBuyAction(action: TradeCryptoAction.Buy) { - val networkAddress = action.cryptoCurrencyStatus.value.networkAddress - ?.defaultAddress - ?.let(NetworkAddress.Address::value) - ?: return - - val status = action.cryptoCurrencyStatus - val currency = status.currency - val blockchain = currency.network.toBlockchain() - val exchangeManager = store.state.globalState.exchangeManager - val topUrl = exchangeManager.getUrl( - action = CurrencyExchangeManager.Action.Buy, - cryptoCurrency = currency, - fiatCurrencyName = action.appCurrencyCode, - walletAddress = networkAddress, - isDarkTheme = MutableAppThemeModeHolder.isDarkThemeActive, - ) - - scope.launch { - if (currency is CryptoCurrency.Token && currency.network.isTestnet) { - val walletManager = store.inject(DaggerGraphState::walletManagersFacade) - .getOrCreateWalletManager( - userWalletId = action.userWallet.walletId, - blockchain = blockchain, - derivationPath = currency.network.derivationPath.value, - ) - - if (walletManager !is EthereumWalletManager) { - store.dispatchDebugErrorNotification("Testnet tokens available only for the Ethereum") - return@launch - } - - buyErc20TestnetTokens( - card = action.userWallet.requireColdWallet().scanResponse.card, // TODO [REDACTED_TASK_KEY] - walletManager = walletManager, - destinationAddress = currency.contractAddress, - ) - return@launch - } - - topUrl?.let { - store.dispatchOpenUrl(it) - Analytics.send(Token.Topup.ScreenOpened()) - } - } - } - private fun proceedSellAction(action: TradeCryptoAction.Sell) { val networkAddress = action.cryptoCurrencyStatus.value.networkAddress ?.defaultAddress @@ -126,8 +45,7 @@ object TradeCryptoMiddleware { ?: return val currency = action.cryptoCurrencyStatus.currency - store.state.globalState.exchangeManager.getUrl( - action = CurrencyExchangeManager.Action.Sell, + store.inject(DaggerGraphState::appStateHolder).sellService?.getUrl( cryptoCurrency = currency, fiatCurrencyName = action.appCurrencyCode, walletAddress = networkAddress, @@ -140,9 +58,9 @@ object TradeCryptoMiddleware { private fun openReceiptUrl(transactionId: String) { store.dispatchNavigationAction(AppRouter::pop) - store.state.globalState.exchangeManager.getSellCryptoReceiptUrl( - action = CurrencyExchangeManager.Action.Sell, - transactionId = transactionId, - )?.let { store.dispatchOpenUrl(it) } + + val sellService = store.inject(DaggerGraphState::appStateHolder).sellService + sellService?.getSellCryptoReceiptUrl(transactionId = transactionId) + ?.let(store::dispatchOpenUrl) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt b/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt index 45fc140480..8b1dc10be1 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt @@ -131,6 +131,5 @@ internal class WelcomeModel @Inject constructor( private fun initGlobalState() { store.dispatch(GlobalAction.RestoreAppCurrency) - store.dispatch(GlobalAction.ExchangeManager.Init) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt deleted file mode 100644 index 54a3a0b6d6..0000000000 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CardExchangeRules.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.tangem.tap.network.exchangeServices - -import com.tangem.domain.common.TapWorkarounds.isStart2Coin -import com.tangem.domain.models.scan.CardDTO -import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.domain.model.Currency -import com.tangem.tap.features.demo.isDemoCard - -/** -[REDACTED_AUTHOR] - */ -class CardExchangeRules( - val cardProvider: () -> CardDTO?, -) : ExchangeRules { - - override fun availableForBuy(scanResponse: ScanResponse, currency: Currency): Boolean { - val card = scanResponse.card - - return when { - card.isDemoCard() -> true - card.isStart2Coin -> false - else -> true - } - } - - override fun availableForSell(currency: Currency): Boolean { - val card = cardProvider() ?: return false - - return !card.isStart2Coin - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt deleted file mode 100644 index 83fee90f6c..0000000000 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt +++ /dev/null @@ -1,148 +0,0 @@ -package com.tangem.tap.network.exchangeServices - -import com.tangem.Message -import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager -import com.tangem.blockchain.common.Amount -import com.tangem.blockchain.common.AmountType -import com.tangem.blockchain.common.transaction.TransactionFee -import com.tangem.blockchain.extensions.Result -import com.tangem.blockchainsdk.utils.toBlockchain -import com.tangem.domain.common.TapWorkarounds.isTangemTwins -import com.tangem.domain.core.utils.lceContent -import com.tangem.domain.core.utils.lceLoading -import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.scan.CardDTO -import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.common.extensions.inject -import com.tangem.tap.common.extensions.safeUpdate -import com.tangem.tap.common.redux.global.GlobalAction -import com.tangem.tap.domain.TangemSigner -import com.tangem.tap.domain.model.Currency -import com.tangem.tap.features.demo.isDemoCard -import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.tap.store -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import java.math.BigDecimal - -/** -[REDACTED_AUTHOR] - */ -class CurrencyExchangeManager( - private val buyService: ExchangeService, - private val sellService: ExchangeService, - private val primaryRules: ExchangeRules, -) : ExchangeService { - - override val initializationStatus: StateFlow - get() = _initializationStatus - - private val _initializationStatus: MutableStateFlow = - MutableStateFlow(value = lceLoading()) - - override suspend fun update() { - _initializationStatus.value = lceLoading() - - if (!store.inject(DaggerGraphState::onrampFeatureToggles).isFeatureEnabled) { - buyService.update() - } - - sellService.update() - - _initializationStatus.value = lceContent() - } - - override fun availableForBuy(scanResponse: ScanResponse, currency: Currency): Boolean { - return primaryRules.availableForBuy(scanResponse, currency) && - buyService.availableForBuy(scanResponse, currency) - } - - override fun availableForSell(currency: Currency): Boolean { - return primaryRules.availableForSell(currency) && sellService.availableForSell(currency) - } - - override fun getUrl( - action: Action, - cryptoCurrency: CryptoCurrency, - fiatCurrencyName: String, - walletAddress: String, - isDarkTheme: Boolean, - ): String? { - val blockchain = cryptoCurrency.network.toBlockchain() - if (blockchain.isTestnet()) return blockchain.getTestnetTopUpUrl() - - val urlBuilder = getExchangeUrlBuilder(action) - return urlBuilder.getUrl( - action, - cryptoCurrency, - fiatCurrencyName, - walletAddress, - isDarkTheme, - ) - } - - override fun getSellCryptoReceiptUrl(action: Action, transactionId: String): String? { - val urlBuilder = getExchangeUrlBuilder(action) - return urlBuilder.getSellCryptoReceiptUrl(action, transactionId) - } - - private fun getExchangeUrlBuilder(action: Action): ExchangeUrlBuilder { - return when (action) { - Action.Buy -> buyService - Action.Sell -> sellService - } - } - - enum class Action { Buy, Sell } - - companion object { - fun dummy(): CurrencyExchangeManager = CurrencyExchangeManager( - buyService = ExchangeService.dummy(), - sellService = ExchangeService.dummy(), - primaryRules = ExchangeRules.dummy(), - ) - } -} - -@Deprecated("Useless") -suspend fun buyErc20TestnetTokens(card: CardDTO, walletManager: EthereumWalletManager, destinationAddress: String) { - walletManager.safeUpdate(card.isDemoCard()) - - val amountToSend = Amount(walletManager.wallet.blockchain) - - val feeResult = walletManager.getFee(amountToSend, destinationAddress) as? Result.Success ?: return - val fee = when (val feeForTx = feeResult.data) { - is TransactionFee.Choosable -> feeForTx.minimum - is TransactionFee.Single -> feeForTx.normal - } - - val coinValue = walletManager.wallet.amounts[AmountType.Coin]?.value ?: BigDecimal.ZERO - if (coinValue < fee.amount.value) return - - val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins - val signer = TangemSigner( - cardId = card.cardId.takeIf { isCardNotBackedUp }, - tangemSdk = store.inject(DaggerGraphState::cardSdkConfigRepository).sdk, - initialMessage = Message(), - twinKey = null, - ) { signResponse -> - store.dispatch( - GlobalAction.UpdateWalletSignedHashes( - walletSignedHashes = signResponse.totalSignedHashes, - walletPublicKey = walletManager.wallet.publicKey.seedKey, - remainingSignatures = signResponse.remainingSignatures, - ), - ) - - store.dispatch(action = GlobalAction.IsSignWithRing(signResponse.isRing)) - } - - walletManager.send( - transactionData = walletManager.createTransaction( - amount = amountToSend, - fee = fee, - destination = destinationAddress, - ), - signer = signer, - ) -} \ No newline at end of file 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 ce11ee65f0..05b844c54b 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 @@ -20,7 +20,6 @@ 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.features.onramp.OnrampFeatureToggles import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runCatching @@ -30,14 +29,11 @@ import kotlinx.coroutines.flow.firstOrNull @Suppress("LongParameterList") internal class DefaultRampManager( - private val exchangeService: ExchangeService?, - private val buyService: Provider, private val sellService: Provider, private val expressServiceLoader: ExpressServiceLoader, private val currenciesRepository: CurrenciesRepository, private val getNetworkCoinStatusUseCase: GetNetworkCoinStatusUseCase, private val dispatchers: CoroutineDispatcherProvider, - private val onrampFeatureToggles: OnrampFeatureToggles, excludedBlockchains: ExcludedBlockchains, ) : RampStateManager { @@ -48,9 +44,9 @@ internal class DefaultRampManager( userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, ): ScenarioUnavailabilityReason { - val availabilityState = runCatching { - getOnrampAvailableState(scanResponse, userWalletId, cryptoCurrency) - }.getOrNull() ?: ExpressAvailabilityState.Error + val availabilityState = runCatching { getOnrampAvailableState(userWalletId, cryptoCurrency) } + .getOrNull() + ?: ExpressAvailabilityState.Error return availabilityState.toReason(cryptoCurrency.name) } @@ -64,7 +60,7 @@ internal class DefaultRampManager( block = { val serviceCurrency = cryptoCurrencyConverter.convertBack(status.currency) - exchangeService?.availableForSell(currency = serviceCurrency) ?: false + sellService().availableForSell(currency = serviceCurrency) }, catch = { raise(ScenarioUnavailabilityReason.NotSupportedBySellService(status.currency.name)) }, ) @@ -101,16 +97,6 @@ internal class DefaultRampManager( return availabilityState.toReason(cryptoCurrency.name) } - override fun getBuyInitializationStatus(): Flow { - return buyService.invoke().initializationStatus - } - - override suspend fun fetchBuyServiceData() { - runCatching(dispatchers.io) { - buyService.invoke().update() - } - } - override fun getSellInitializationStatus(): Flow { return sellService.invoke().initializationStatus } @@ -143,31 +129,20 @@ internal class DefaultRampManager( } private suspend fun getOnrampAvailableState( - scanResponse: ScanResponse, userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, ): ExpressAvailabilityState { - return when { - onrampFeatureToggles.isFeatureEnabled -> { - val asset = expressServiceLoader.getInitializationStatus(userWalletId).firstOrNull() - ?: return ExpressAvailabilityState.Loading - return when (asset) { - is Lce.Error -> ExpressAvailabilityState.Error - is Lce.Loading -> ExpressAvailabilityState.Loading - is Lce.Content -> { - val foundAsset = asset.getOrNull()?.find { cryptoCurrency.findAssetPredicate(it) } - foundAsset?.onrampAvailable?.toOnrampAvailabilityState() - ?: ExpressAvailabilityState.AssetNotFound - } - } + val asset = expressServiceLoader.getInitializationStatus(userWalletId).firstOrNull() + ?: return ExpressAvailabilityState.Loading + + return when (asset) { + is Lce.Error -> ExpressAvailabilityState.Error + is Lce.Loading -> ExpressAvailabilityState.Loading + is Lce.Content -> { + val foundAsset = asset.getOrNull()?.find { cryptoCurrency.findAssetPredicate(it) } + foundAsset?.onrampAvailable?.toOnrampAvailabilityState() + ?: ExpressAvailabilityState.AssetNotFound } - exchangeService != null -> { - exchangeService.availableForBuy( - scanResponse = scanResponse, - currency = cryptoCurrencyConverter.convertBack(cryptoCurrency), - ).toOnrampAvailabilityState() - } - else -> ExpressAvailabilityState.Error } } diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt index 1641baa48f..88ba965edc 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt @@ -1,75 +1,26 @@ package com.tangem.tap.network.exchangeServices import com.tangem.domain.core.lce.Lce -import com.tangem.domain.core.utils.lceLoading import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.domain.model.Currency -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow typealias ExchangeServiceInitializationStatus = Lce -interface Exchanger { - fun availableForBuy(scanResponse: ScanResponse, currency: Currency): Boolean - fun availableForSell(currency: Currency): Boolean -} - -interface ExchangeService : Exchanger, ExchangeUrlBuilder { +interface ExchangeService { val initializationStatus: StateFlow suspend fun update() - companion object { - fun dummy(): ExchangeService = object : ExchangeService { + fun availableForSell(currency: Currency): Boolean - override val initializationStatus: StateFlow = - MutableStateFlow(value = lceLoading()) - - override suspend fun update() {} - override fun availableForBuy(scanResponse: ScanResponse, currency: Currency): Boolean = false - override fun availableForSell(currency: Currency): Boolean = false - override fun getUrl( - action: CurrencyExchangeManager.Action, - cryptoCurrency: CryptoCurrency, - fiatCurrencyName: String, - walletAddress: String, - isDarkTheme: Boolean, - ): String? = null - - override fun getSellCryptoReceiptUrl( - action: CurrencyExchangeManager.Action, - transactionId: String, - ): String? = null - } - } -} - -interface ExchangeRules : Exchanger { - - companion object { - fun dummy(): ExchangeRules = object : ExchangeRules { - override fun availableForBuy(scanResponse: ScanResponse, currency: Currency): Boolean = false - override fun availableForSell(currency: Currency): Boolean = false - } - } -} - -interface ExchangeUrlBuilder { - @Suppress("LongParameterList") fun getUrl( - action: CurrencyExchangeManager.Action, cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, ): String? - fun getSellCryptoReceiptUrl(action: CurrencyExchangeManager.Action, transactionId: String): String? - - companion object { - const val SCHEME = "https" - const val SUCCESS_URL = "https://tangem.com/success" - } + fun getSellCryptoReceiptUrl(transactionId: String): String? } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt deleted file mode 100644 index 6709842bb5..0000000000 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoApi.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.tangem.tap.network.exchangeServices.mercuryo - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass -import retrofit2.http.GET -import retrofit2.http.Path - - -interface MercuryoApi { - - @GET("{apiVersion}/lib/currencies") - suspend fun currencies(@Path("apiVersion") apiVersion: String): MercuryoCurrenciesResponse -} - -@JsonClass(generateAdapter = true) -data class MercuryoCurrenciesResponse( - @Json(name = "status") val status: Int, - @Json(name = "data") val data: Data, -) { - @JsonClass(generateAdapter = true) - data class Data( - @Json(name = "fiat") val fiat: List, - @Json(name = "crypto") val crypto: List, - @Json(name = "config") val config: Config, - ) - - @JsonClass(generateAdapter = true) - data class Config( - @Json(name = "crypto_currencies") - val cryptoCurrencies: List, - ) - - @JsonClass(generateAdapter = true) - data class MercuryoCryptoCurrency( - @Json(name = "currency") - val currencySymbol: String, - @Json(name = "network") - val network: String, - @Json(name = "contract") - val contractAddress: String, - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoEnvironment.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoEnvironment.kt deleted file mode 100644 index 36fd477bc5..0000000000 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoEnvironment.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.tangem.tap.network.exchangeServices.mercuryo - -import com.tangem.datasource.api.common.createRetrofitInstance - -/** -[REDACTED_AUTHOR] - */ -data class MercuryoEnvironment( - val baseUrl: String, - val apiVersion: String, - val widgetId: String, - val secret: String, - val mercuryoApi: MercuryoApi, -) { - companion object { - private const val BASE_URL = "https://api.mercuryo.io/" - private const val API_VERSION = "v1.6" - - fun prod(widgetId: String, secret: String, apiVersion: String = API_VERSION): MercuryoEnvironment { - return MercuryoEnvironment( - baseUrl = BASE_URL, - apiVersion = apiVersion, - widgetId = widgetId, - secret = secret, - mercuryoApi = createRetrofitInstance( - baseUrl = BASE_URL, - logEnabled = false, - ).create(MercuryoApi::class.java), - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt deleted file mode 100644 index 16219f4094..0000000000 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.tangem.tap.network.exchangeServices.mercuryo - -import android.net.Uri -import com.tangem.blockchainsdk.utils.toBlockchain -import com.tangem.common.extensions.calculateSha512 -import com.tangem.common.extensions.toHexString -import com.tangem.common.services.Result -import com.tangem.common.services.performRequest -import com.tangem.data.onramp.legacy.mercuryoNetwork -import com.tangem.domain.core.utils.lceContent -import com.tangem.domain.core.utils.lceError -import com.tangem.domain.core.utils.lceLoading -import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.domain.model.Currency -import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager -import com.tangem.tap.network.exchangeServices.ExchangeService -import com.tangem.tap.network.exchangeServices.ExchangeServiceInitializationStatus -import com.tangem.tap.network.exchangeServices.ExchangeUrlBuilder -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import timber.log.Timber -import java.util.concurrent.CopyOnWriteArrayList - -/** -[REDACTED_AUTHOR] - */ -internal class MercuryoService(private val environment: MercuryoEnvironment) : ExchangeService { - - override val initializationStatus: StateFlow - get() = _initializationStatus - - private val _initializationStatus: MutableStateFlow = - MutableStateFlow(value = lceLoading()) - - private val api: MercuryoApi = environment.mercuryoApi - - private val availableMercuryoCurrencies = CopyOnWriteArrayList() - - override suspend fun update() { - Timber.i("Start updating") - _initializationStatus.value = lceLoading() - - val result = performRequest { api.currencies(environment.apiVersion) } - when { - result is Result.Success && result.data.status == RESPONSE_SUCCESS_STATUS_CODE -> { - handleSuccessfullyUpdatedData(data = result.data.data) - } - result is Result.Failure -> { - availableMercuryoCurrencies.clear() - - Timber.e("Failed to load currencies", result.error) - _initializationStatus.value = result.error.lceError() - } - } - } - - override fun availableForBuy(scanResponse: ScanResponse, currency: Currency): Boolean { - val mercuryoNetwork = currency.blockchain.mercuryoNetwork - val contractAddress = (currency as? Currency.Token)?.token?.contractAddress ?: "" - val availableCurrency = availableMercuryoCurrencies.firstOrNull { - it.currencySymbol == currency.currencySymbol && - it.network == mercuryoNetwork && - it.contractAddress.equals(contractAddress, ignoreCase = true) - } - return availableCurrency != null - } - - override fun availableForSell(currency: Currency): Boolean = false - - override fun getUrl( - action: CurrencyExchangeManager.Action, - cryptoCurrency: CryptoCurrency, - fiatCurrencyName: String, - walletAddress: String, - isDarkTheme: Boolean, - ): String { - if (action == CurrencyExchangeManager.Action.Sell) throw UnsupportedOperationException() - - val blockchain = cryptoCurrency.network.toBlockchain() - - val builder = Uri.Builder() - .scheme(ExchangeUrlBuilder.SCHEME) - .authority("exchange.mercuryo.io") - .appendQueryParameter("widget_id", environment.widgetId) - .appendQueryParameter("type", action.name.lowercase()) - .appendQueryParameter("currency", cryptoCurrency.symbol) - .appendQueryParameter("address", walletAddress) - .appendQueryParameter("signature", signature(walletAddress)) - .appendQueryParameter("fix_currency", "true") - .appendQueryParameter("redirect_url", ExchangeUrlBuilder.SUCCESS_URL) - if (isDarkTheme) builder.appendQueryParameter("theme", "1inch") - - blockchain.mercuryoNetwork?.let { - builder.appendQueryParameter("network", it) - } - - return builder.build().toString() - } - - override fun getSellCryptoReceiptUrl(action: CurrencyExchangeManager.Action, transactionId: String): String? = null - - private fun handleSuccessfullyUpdatedData(data: MercuryoCurrenciesResponse.Data) { - availableMercuryoCurrencies.clear() - availableMercuryoCurrencies.addAll(data.config.cryptoCurrencies) - - Timber.i("Successfully updated") - _initializationStatus.value = lceContent() - } - - private fun signature(address: String) = (address + environment.secret).calculateSha512().toHexString().lowercase() - - private companion object { - const val RESPONSE_SUCCESS_STATUS_CODE = 200 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt index d57da1a257..36b06ad6e9 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt @@ -6,17 +6,16 @@ import com.tangem.blockchainsdk.utils.toBlockchain import com.tangem.common.services.Result import com.tangem.common.services.performRequest import com.tangem.datasource.api.common.createRetrofitInstance +import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.extensions.withIOContext import com.tangem.domain.core.utils.lceContent import com.tangem.domain.core.utils.lceError import com.tangem.domain.core.utils.lceLoading import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.models.scan.CardDTO import com.tangem.tap.domain.model.Currency -import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.network.exchangeServices.ExchangeService import com.tangem.tap.network.exchangeServices.ExchangeServiceInitializationStatus -import com.tangem.tap.network.exchangeServices.ExchangeUrlBuilder.Companion.SCHEME import com.tangem.tap.network.exchangeServices.moonpay.models.MoonPayAvailableCurrency import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -28,6 +27,7 @@ class MoonPayService( private val apiKey: String, private val secretKey: String, private val logEnabled: Boolean, + private val cardProvider: () -> CardDTO?, ) : ExchangeService { override val initializationStatus: StateFlow @@ -102,9 +102,12 @@ class MoonPayService( } } - override fun availableForBuy(scanResponse: ScanResponse, currency: Currency): Boolean = false - override fun availableForSell(currency: Currency): Boolean { + val card = cardProvider() ?: return false + val checkCardExchange = !card.isStart2Coin + + if (!checkCardExchange) return false + if (!isSellAllowed()) return false val availableForSell = status?.availableForSell ?: return false @@ -125,15 +128,14 @@ class MoonPayService( } override fun getUrl( - action: CurrencyExchangeManager.Action, cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, ): String? { - if (action == CurrencyExchangeManager.Action.Buy) throw UnsupportedOperationException() - val blockchain = cryptoCurrency.network.toBlockchain() + if (blockchain.isTestnet()) return blockchain.getTestnetTopUpUrl() + val supportedCurrency = blockchain.moonPaySupportedCurrency ?: return null val moonpayCurrency = status?.availableForSell?.firstOrNull { when (cryptoCurrency) { @@ -165,7 +167,7 @@ class MoonPayService( return uri.build().toString() } - override fun getSellCryptoReceiptUrl(action: CurrencyExchangeManager.Action, transactionId: String): String { + override fun getSellCryptoReceiptUrl(transactionId: String): String { return Uri.Builder() .scheme(SCHEME) .authority(URL_SELL) @@ -185,8 +187,9 @@ class MoonPayService( return status?.responseUserStatus?.isSellAllowed ?: false } - companion object { + private companion object { const val URL_SELL = "sell.moonpay.com" + const val SCHEME = "https" } } diff --git a/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt b/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt index e45195044a..636647d8fc 100644 --- a/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt +++ b/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt @@ -19,8 +19,6 @@ import javax.inject.Inject class AppStateHolder @Inject constructor() : ReduxStateHolder { var mainStore: Store? = null - var exchangeService: ExchangeService? = null - var buyService: ExchangeService? = null var sellService: ExchangeService? = null override fun dispatch(action: Action) { diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt index e7817d2245..5cfc7781f2 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt @@ -32,7 +32,6 @@ import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.operations.attestation.CardArtworksProvider import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles @@ -68,7 +67,6 @@ data class DaggerGraphState( val shareManager: ShareManager? = null, val appRouter: AppRouter? = null, val transactionSignerFactory: TransactionSignerFactory? = null, - val onrampFeatureToggles: OnrampFeatureToggles? = null, val environmentConfigStorage: EnvironmentConfigStorage? = null, val onboardingV2FeatureToggles: OnboardingV2FeatureToggles? = null, val onboardingRepository: OnboardingRepository? = null, diff --git a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt index 798ad3a70f..436d1a2ef3 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt @@ -8,7 +8,10 @@ import com.tangem.data.card.sdk.CardSdkProvider import com.tangem.feature.referral.api.deeplink.ReferralDeepLinkHandler import com.tangem.features.markets.deeplink.MarketsDeepLinkHandler import com.tangem.features.markets.deeplink.MarketsTokenDetailDeepLinkHandler -import com.tangem.features.onramp.deeplink.* +import com.tangem.features.onramp.deeplink.BuyDeepLinkHandler +import com.tangem.features.onramp.deeplink.OnrampDeepLinkHandler +import com.tangem.features.onramp.deeplink.SellDeepLinkHandler +import com.tangem.features.onramp.deeplink.SwapDeepLinkHandler import com.tangem.features.send.v2.api.deeplink.SellRedirectDeepLinkHandler import com.tangem.features.staking.api.deeplink.StakingDeepLinkHandler import com.tangem.features.tokendetails.deeplink.TokenDetailsDeepLinkHandler @@ -33,7 +36,6 @@ internal class DeepLinkFactory @Inject constructor( private val cardSdkProvider: CardSdkProvider, private val onrampDeepLink: OnrampDeepLinkHandler.Factory, private val sellRedirectDeepLink: SellRedirectDeepLinkHandler.Factory, - private val buyRedirectDeepLink: BuyRedirectDeepLinkHandler.Factory, private val referralDeepLink: ReferralDeepLinkHandler.Factory, private val walletConnectDeepLink: WalletConnectDeepLinkHandler.Factory, private val walletDeepLink: WalletDeepLinkHandler.Factory, @@ -114,7 +116,7 @@ internal class DeepLinkFactory @Inject constructor( when (deeplinkUri.host) { DeepLinkRoute.Onramp.host -> onrampDeepLink.create(coroutineScope, queryParams) DeepLinkRoute.SellRedirect.host -> sellRedirectDeepLink.create(coroutineScope, queryParams) - DeepLinkRoute.BuyRedirect.host -> buyRedirectDeepLink.create(coroutineScope) + DeepLinkRoute.BuyRedirect.host -> Unit DeepLinkRoute.Referral.host -> referralDeepLink.create() DeepLinkRoute.Wallet.host -> walletDeepLink.create() DeepLinkRoute.TokenDetails.host -> tokenDetailsDeepLink.create( diff --git a/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt b/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt index 54c507c959..34c9ae969c 100644 --- a/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt +++ b/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt @@ -6,7 +6,10 @@ import com.tangem.data.card.sdk.CardSdkProvider import com.tangem.feature.referral.api.deeplink.ReferralDeepLinkHandler import com.tangem.features.markets.deeplink.MarketsDeepLinkHandler import com.tangem.features.markets.deeplink.MarketsTokenDetailDeepLinkHandler -import com.tangem.features.onramp.deeplink.* +import com.tangem.features.onramp.deeplink.BuyDeepLinkHandler +import com.tangem.features.onramp.deeplink.OnrampDeepLinkHandler +import com.tangem.features.onramp.deeplink.SellDeepLinkHandler +import com.tangem.features.onramp.deeplink.SwapDeepLinkHandler import com.tangem.features.send.v2.api.deeplink.SellRedirectDeepLinkHandler import com.tangem.features.staking.api.deeplink.StakingDeepLinkHandler import com.tangem.features.tokendetails.deeplink.TokenDetailsDeepLinkHandler @@ -34,9 +37,6 @@ class DeepLinkFactoryTest { private val sellRedirectDeepLinkFactory = mockk(relaxed = true) { every { create(any(), any()) } returns mockk() } - private val buyRedirectDeepLinkFactory = mockk(relaxed = true) { - every { create(any()) } returns mockk() - } private val referralDeepLinkFactory = mockk(relaxed = true) { every { create() } returns mockk() } @@ -81,7 +81,6 @@ class DeepLinkFactoryTest { cardSdkProvider = cardSdkProvider, onrampDeepLink = onrampDeepLinkFactory, sellRedirectDeepLink = sellRedirectDeepLinkFactory, - buyRedirectDeepLink = buyRedirectDeepLinkFactory, referralDeepLink = referralDeepLinkFactory, walletConnectDeepLink = walletConnectDeepLinkFactory, walletDeepLink = walletDeepLinkFactory, @@ -220,7 +219,6 @@ class DeepLinkFactoryTest { verify(inverse = true) { onrampDeepLinkFactory.create(any(), any()) sellRedirectDeepLinkFactory.create(any(), any()) - buyRedirectDeepLinkFactory.create(any()) referralDeepLinkFactory.create() walletConnectDeepLinkFactory.create(any()) walletDeepLinkFactory.create() @@ -277,12 +275,6 @@ class DeepLinkFactoryTest { every { mockedUri.queryParameterNames } returns emptySet() every { mockedUri.getQueryParameter(any()) } returns "" - // Test Buy Redirect - every { mockedUri.host } returns "redirect" - deepLinkFactory.handleDeeplink(mockedUri, testScope, isFromOnNewIntent) - advanceUntilIdle() - verify { buyRedirectDeepLinkFactory.create(eq(testScope)) } - // Test Referral every { mockedUri.host } returns "referral" deepLinkFactory.handleDeeplink(mockedUri, testScope, isFromOnNewIntent) @@ -333,7 +325,6 @@ class DeepLinkFactoryTest { verify(inverse = true) { onrampDeepLinkFactory.create(any(), any()) sellRedirectDeepLinkFactory.create(any(), any()) - buyRedirectDeepLinkFactory.create(any()) referralDeepLinkFactory.create() walletConnectDeepLinkFactory.create(any()) walletDeepLinkFactory.create() diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json index 7608be3109..d63c340831 100644 --- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json @@ -3,10 +3,6 @@ "name": "NEW_CARD_SCANNING_ENABLED", "version": "undefined" }, - { - "name": "ONRAMP_ENABLED", - "version": "5.24.2" - }, { "name": "VISA_ONBOARDING_ENABLED", "version": "undefined" diff --git a/core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt b/core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt deleted file mode 100644 index ff3cdaf90f..0000000000 --- a/core/deep-links/global/src/main/kotlin/com/tangem/core/deeplink/global/BuyCurrencyDeepLink.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.tangem.core.deeplink.global - -import com.tangem.core.deeplink.DeepLink - -@Deprecated("Use BuyDeepLinkHandler") -class BuyCurrencyDeepLink( - val onReceive: () -> Unit, -) : DeepLink() { - - override val uri = BUY_REDIRECT_DEEPLINK - - override fun onReceive(params: Map) { - onReceive() - } - - companion object { - private const val BUY_REDIRECT_DEEPLINK = "tangem://redirect?action=dismissBrowser" - } -} \ 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 ece1e97c5b..093dbc7445 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 @@ -37,10 +37,6 @@ interface RampStateManager { cryptoCurrency: CryptoCurrency, ): ScenarioUnavailabilityReason - suspend fun fetchBuyServiceData() - - fun getBuyInitializationStatus(): Flow> - suspend fun fetchSellServiceData() fun getSellInitializationStatus(): Flow> diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/legacy/TradeCryptoAction.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/legacy/TradeCryptoAction.kt index 58b0a13e7f..b7f00f81cb 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/legacy/TradeCryptoAction.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/legacy/TradeCryptoAction.kt @@ -1,22 +1,12 @@ package com.tangem.domain.tokens.legacy -import com.tangem.domain.onramp.model.OnrampSource import com.tangem.domain.tokens.model.CryptoCurrencyStatus -import com.tangem.domain.wallets.models.UserWallet import org.rekotlin.Action sealed class TradeCryptoAction : Action { data class FinishSelling(val transactionId: String) : TradeCryptoAction() - data class Buy( - val userWallet: UserWallet, - val cryptoCurrencyStatus: CryptoCurrencyStatus, - val source: OnrampSource, - val appCurrencyCode: String, - val checkUserLocation: Boolean = true, - ) : TradeCryptoAction() - data class Sell( val cryptoCurrencyStatus: CryptoCurrencyStatus, val appCurrencyCode: String, diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt index 4454da2273..38e24c6890 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt @@ -23,7 +23,6 @@ import com.tangem.domain.wallets.models.UserWallet import com.tangem.features.markets.impl.R import com.tangem.features.markets.portfolio.impl.loader.PortfolioData import com.tangem.features.markets.portfolio.impl.ui.state.TokenActionsBSContentUM -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.utils.Provider import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -41,14 +40,10 @@ internal class TokenActionsHandler @AssistedInject constructor( @Assisted private val onHandleQuickAction: (HandledQuickAction) -> Unit, private val isDemoCardUseCase: IsDemoCardUseCase, private val messageSender: UiMessageSender, - private val onrampFeatureToggles: OnrampFeatureToggles, private val shareManager: ShareManager, ) { private val disabledActionsInDemoMode = buildSet { - if (!onrampFeatureToggles.isFeatureEnabled) { - add(TokenActionsBSContentUM.Action.Buy) - } add(TokenActionsBSContentUM.Action.Sell) } @@ -132,12 +127,11 @@ internal class TokenActionsHandler @AssistedInject constructor( } private fun onBuyClick(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) { - reduxStateHolder.dispatch( - TradeCryptoAction.Buy( - userWallet = cryptoCurrencyData.userWallet, + router.push( + AppRoute.Onramp( + userWalletId = cryptoCurrencyData.userWallet.walletId, + currency = cryptoCurrencyData.status.currency, source = OnrampSource.MARKETS, - cryptoCurrencyStatus = cryptoCurrencyData.status, - appCurrencyCode = currentAppCurrency().code, ), ) } diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureToggles.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureToggles.kt deleted file mode 100644 index 7d46cb6ad1..0000000000 --- a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureToggles.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.tangem.features.onramp - -interface OnrampFeatureToggles { - - val isFeatureEnabled: Boolean -} \ No newline at end of file diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyRedirectDeepLinkHandler.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyRedirectDeepLinkHandler.kt deleted file mode 100644 index da300b5cc2..0000000000 --- a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyRedirectDeepLinkHandler.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.tangem.features.onramp.deeplink - -import kotlinx.coroutines.CoroutineScope - -interface BuyRedirectDeepLinkHandler { - - interface Factory { - fun create(coroutineScope: CoroutineScope): BuyRedirectDeepLinkHandler - } -} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt deleted file mode 100644 index db7f335efe..0000000000 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.tangem.features.onramp - -import com.tangem.core.configtoggle.feature.FeatureTogglesManager - -internal class DefaultOnrampFeatureToggles( - private val featureTogglesManager: FeatureTogglesManager, -) : OnrampFeatureToggles { - - override val isFeatureEnabled: Boolean - get() = featureTogglesManager.isFeatureEnabled(name = "ONRAMP_ENABLED") -} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt deleted file mode 100644 index c10c24183d..0000000000 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.tangem.features.onramp - -import com.tangem.core.configtoggle.feature.FeatureTogglesManager -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -internal object OnrampFeatureModule { - - @Provides - @Singleton - fun provideFeatureToggles(featureTogglesManager: FeatureTogglesManager): OnrampFeatureToggles { - return DefaultOnrampFeatureToggles(featureTogglesManager) - } -} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyRedirectDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyRedirectDeepLinkHandler.kt deleted file mode 100644 index 3e3f70ce4a..0000000000 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyRedirectDeepLinkHandler.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.tangem.features.onramp.deeplink - -import arrow.core.getOrElse -import com.tangem.core.analytics.api.AnalyticsEventHandler -import com.tangem.domain.tokens.GetCryptoCurrencyUseCase -import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent -import com.tangem.domain.wallets.models.isMultiCurrency -import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase -import com.tangem.features.onramp.OnrampFeatureToggles -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import timber.log.Timber - -internal class DefaultBuyRedirectDeepLinkHandler @AssistedInject constructor( - @Assisted scope: CoroutineScope, - onrampFeatureToggles: OnrampFeatureToggles, - getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, - getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase, - analyticsEventHandler: AnalyticsEventHandler, -) : BuyRedirectDeepLinkHandler { - - init { - // It is okay here, we are navigating from outside, and there is no other way to getting UserWallet - getSelectedWalletSyncUseCase().fold( - ifLeft = { - Timber.e("Error on getting user wallet: $it") - }, - ifRight = { userWallet -> - if (!onrampFeatureToggles.isFeatureEnabled && !userWallet.isMultiCurrency) { - scope.launch { - val cryptoCurrency = getCryptoCurrencyUseCase(userWallet.walletId).getOrElse { - Timber.e("Error on getting cryptoCurrency: $it") - return@launch - } - analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol)) - } - } - }, - ) - } - - @AssistedFactory - interface Factory : BuyRedirectDeepLinkHandler.Factory { - override fun create(coroutineScope: CoroutineScope): DefaultBuyRedirectDeepLinkHandler - } -} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt index 9b44b6bd3d..fafbf571a6 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt @@ -19,12 +19,6 @@ internal interface OnrampDeeplinkModule { @Singleton fun bindOnrampDeepLinkHandlerFactory(impl: DefaultOnrampDeepLinkHandler.Factory): OnrampDeepLinkHandler.Factory - @Binds - @Singleton - fun bindBuyRedirectDeepLinkHandler( - impl: DefaultBuyRedirectDeepLinkHandler.Factory, - ): BuyRedirectDeepLinkHandler.Factory - @Binds @Singleton fun bindBuyDeepLinkHandler(impl: DefaultBuyDeepLinkHandler.Factory): BuyDeepLinkHandler.Factory 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 00ed212513..4f6245b649 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 @@ -1,6 +1,7 @@ package com.tangem.features.onramp.selecttoken.model import arrow.core.getOrElse +import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter import com.tangem.common.ui.alerts.models.AlertDemoModeUM import com.tangem.core.analytics.api.AnalyticsEventHandler @@ -23,7 +24,6 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason import com.tangem.domain.wallets.models.requireColdWallet import com.tangem.domain.wallets.usecase.GetWalletsUseCase -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.features.onramp.impl.R import com.tangem.features.onramp.selecttoken.OnrampOperationComponent.Params import com.tangem.features.onramp.selecttoken.entity.OnrampOperationUM @@ -46,7 +46,6 @@ internal class OnrampOperationModel @Inject constructor( private val reduxStateHolder: ReduxStateHolder, private val isDemoCardUseCase: IsDemoCardUseCase, private val messageSender: UiMessageSender, - private val onrampFeatureToggles: OnrampFeatureToggles, private val rampStateManager: RampStateManager, ) : Model() { @@ -100,7 +99,7 @@ internal class OnrampOperationModel @Inject constructor( } private fun selectTokenIfDemoModeOff(status: CryptoCurrencyStatus) { - if (params is Params.Sell || !onrampFeatureToggles.isFeatureEnabled) { + if (params is Params.Sell) { showErrorIfDemoModeOrElse { selectToken(status) } } else { selectToken(status) @@ -109,14 +108,25 @@ internal class OnrampOperationModel @Inject constructor( private fun selectToken(status: CryptoCurrencyStatus) { modelScope.launch { - val appCurrencyCode = getSelectedAppCurrencyUseCase.invokeSync().getOrElse { AppCurrency.Default }.code + when (params) { + is Params.Buy -> { + router.push( + AppRoute.Onramp( + userWalletId = selectedUserWallet.walletId, + currency = status.currency, + source = OnrampSource.ACTION_BUTTONS, + ), + ) + } + is Params.Sell -> { + val appCurrencyCode = getSelectedAppCurrencyUseCase.invokeSync() + .getOrElse { AppCurrency.Default }.code - reduxStateHolder.dispatch( - action = when (params) { - is Params.Buy -> getBuyAction(status, appCurrencyCode) - is Params.Sell -> TradeCryptoAction.Sell(status, appCurrencyCode) - }, - ) + reduxStateHolder.dispatch( + action = TradeCryptoAction.Sell(status, appCurrencyCode), + ) + } + } } } @@ -144,15 +154,6 @@ internal class OnrampOperationModel @Inject constructor( router.pop() } - private fun getBuyAction(status: CryptoCurrencyStatus, appCurrencyCode: String): TradeCryptoAction { - return TradeCryptoAction.Buy( - userWallet = selectedUserWallet, - cryptoCurrencyStatus = status, - source = OnrampSource.ACTION_BUTTONS, - appCurrencyCode = appCurrencyCode, - ) - } - private fun showErrorIfDemoModeOrElse(action: () -> Unit) { if (isDemoCardUseCase(cardId = selectedUserWallet.cardId)) { val alertUM = AlertDemoModeUM(onConfirmClick = {}) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/DefaultTokenDetailsComponent.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/DefaultTokenDetailsComponent.kt index 32de241dee..410b089abe 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/DefaultTokenDetailsComponent.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/DefaultTokenDetailsComponent.kt @@ -5,19 +5,14 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.arkivanov.essenty.lifecycle.subscribe -import com.tangem.common.routing.RoutingFeatureToggle import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.child import com.tangem.core.decompose.model.getOrCreateModel -import com.tangem.core.deeplink.DeepLinksRegistry -import com.tangem.core.deeplink.global.BuyCurrencyDeepLink -import com.tangem.core.deeplink.utils.registerDeepLinks import com.tangem.core.ui.components.NavigationBar3ButtonsScrim import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.feature.tokendetails.presentation.tokendetails.model.TokenDetailsModel import com.tangem.feature.tokendetails.presentation.tokendetails.ui.TokenDetailsScreen import com.tangem.features.markets.token.block.TokenMarketBlockComponent -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.features.tokendetails.TokenDetailsComponent import com.tangem.features.txhistory.component.TxHistoryComponent import dagger.assisted.Assisted @@ -30,9 +25,6 @@ internal class DefaultTokenDetailsComponent @AssistedInject constructor( @Assisted params: TokenDetailsComponent.Params, tokenMarketBlockComponentFactory: TokenMarketBlockComponent.Factory, txHistoryComponentFactory: TxHistoryComponent.Factory, - onrampFeatureToggles: OnrampFeatureToggles, - routingFeatureToggle: RoutingFeatureToggle, - deepLinksRegistry: DeepLinksRegistry, ) : TokenDetailsComponent, AppComponentContext by appComponentContext { private val model: TokenDetailsModel = getOrCreateModel(params) @@ -50,23 +42,6 @@ internal class DefaultTokenDetailsComponent @AssistedInject constructor( onPause = model::onPause, onResume = model::onResume, ) - - if (!routingFeatureToggle.isDeepLinkNavigationEnabled) { - val deeplinks = buildList { - if (!onrampFeatureToggles.isFeatureEnabled) { - add( - BuyCurrencyDeepLink( - onReceive = model::onBuyCurrencyDeepLink, - ), - ) - } - } - - registerDeepLinks( - registry = deepLinksRegistry, - deepLinks = deeplinks, - ) - } } private val tokenMarketBlockComponent = params.currency.toTokenMarketParam()?.let { tokenMarketParams -> 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 a8d9adb07e..e67344cdce 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 @@ -78,7 +78,6 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenBala import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsState import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.TokenDetailsStateFactory import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.express.ExpressStatusFactory -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.features.tokendetails.TokenDetailsComponent import com.tangem.features.tokendetails.impl.R import com.tangem.features.txhistory.entity.TxHistoryContentUpdateEmitter @@ -125,7 +124,6 @@ internal class TokenDetailsModel @Inject constructor( private val analyticsEventsHandler: AnalyticsEventHandler, private val vibratorHapticManager: VibratorHapticManager, private val clipboardManager: ClipboardManager, - private val onrampFeatureToggles: OnrampFeatureToggles, private val shareManager: ShareManager, @GlobalUiMessageSender private val uiMessageSender: UiMessageSender, private val txHistoryContentUpdateEmitter: TxHistoryContentUpdateEmitter, @@ -207,11 +205,6 @@ internal class TokenDetailsModel @Inject constructor( checkForActionUpdates() } - fun onBuyCurrencyDeepLink() { - val currency = cryptoCurrencyStatus?.currency ?: return - analyticsEventsHandler.send(TokenScreenAnalyticsEvent.Bought(currency.symbol)) - } - fun onPause() { expressTxStatusTaskScheduler.cancelTask() expressTxJobHolder.cancel() @@ -496,30 +489,14 @@ internal class TokenDetailsModel @Inject constructor( } val status = cryptoCurrencyStatus ?: return - if (onrampFeatureToggles.isFeatureEnabled) { - modelScope.launch(dispatchers.main) { - reduxStateHolder.dispatch( - TradeCryptoAction.Buy( - userWallet = userWallet, - source = OnrampSource.TOKEN_DETAILS, - cryptoCurrencyStatus = status, - appCurrencyCode = selectedAppCurrencyFlow.value.code, - ), - ) - } - } else { - showErrorIfDemoModeOrElse { - modelScope.launch(dispatchers.main) { - reduxStateHolder.dispatch( - TradeCryptoAction.Buy( - userWallet = userWallet, - source = OnrampSource.TOKEN_DETAILS, - cryptoCurrencyStatus = status, - appCurrencyCode = selectedAppCurrencyFlow.value.code, - ), - ) - } - } + modelScope.launch { + appRouter.push( + AppRoute.Onramp( + userWalletId = userWallet.walletId, + currency = status.currency, + source = OnrampSource.TOKEN_DETAILS, + ), + ) } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletClickIntents.kt index fb53073780..8502c266f8 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletClickIntents.kt @@ -24,7 +24,6 @@ import com.tangem.feature.wallet.presentation.wallet.state.WalletStateController import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.transformers.SetRefreshStateTransformer import com.tangem.feature.wallet.presentation.wallet.state.transformers.SetTokenListErrorTransformer -import com.tangem.features.onramp.OnrampFeatureToggles import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -52,7 +51,6 @@ internal class WalletClickIntents @Inject constructor( private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase, private val neverToShowWalletsScrollPreview: NeverToShowWalletsScrollPreview, private val rampStateManager: RampStateManager, - private val onrampFeatureToggles: OnrampFeatureToggles, private val fetchHotCryptoUseCase: FetchHotCryptoUseCase, private val onrampStatusFactory: OnrampStatusFactory, ) : BaseWalletClickIntents(), @@ -157,10 +155,6 @@ internal class WalletClickIntents @Inject constructor( } buildList { - if (!onrampFeatureToggles.isFeatureEnabled) { - async { rampStateManager.fetchBuyServiceData() }.let(::add) - } - async { rampStateManager.fetchSellServiceData() }.let(::add) async { fetchHotCryptoUseCase() }.let(::add) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt index 966927724f..c64b03829b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt @@ -61,7 +61,6 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletTokensListState import com.tangem.feature.wallet.presentation.wallet.state.transformers.CloseBottomSheetTransformer import com.tangem.feature.wallet.presentation.wallet.state.utils.WalletEventSender -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow @@ -129,7 +128,6 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( private val shareManager: ShareManager, private val appRouter: AppRouter, private val rampStateManager: RampStateManager, - private val onrampFeatureToggles: OnrampFeatureToggles, ) : BaseWalletClickIntents(), WalletCurrencyActionsClickIntents { override fun onSendClick( @@ -345,28 +343,13 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( if (handleUnavailabilityReason(unavailabilityReason)) return - if (onrampFeatureToggles.isFeatureEnabled) { - appRouter.push( - AppRoute.Onramp( - userWalletId = userWallet.walletId, - currency = cryptoCurrencyStatus.currency, - source = OnrampSource.TOKEN_LONG_TAP, - ), - ) - } else { - showErrorIfDemoModeOrElse { - modelScope.launch(dispatchers.main) { - reduxStateHolder.dispatch( - TradeCryptoAction.Buy( - userWallet = userWallet, - source = OnrampSource.TOKEN_LONG_TAP, - cryptoCurrencyStatus = cryptoCurrencyStatus, - appCurrencyCode = getSelectedAppCurrencyUseCase.unwrap().code, - ), - ) - } - } - } + appRouter.push( + AppRoute.Onramp( + userWalletId = userWallet.walletId, + currency = cryptoCurrencyStatus.currency, + source = OnrampSource.TOKEN_LONG_TAP, + ), + ) } override fun onSwapClick( @@ -482,11 +465,7 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( override fun onMultiWalletBuyClick(userWalletId: UserWalletId, screenType: String) { onMultiWalletActionClick( - statusFlow = if (onrampFeatureToggles.isFeatureEnabled) { - rampStateManager.getExpressInitializationStatus(userWalletId) - } else { - rampStateManager.getBuyInitializationStatus() - }, + statusFlow = rampStateManager.getExpressInitializationStatus(userWalletId), route = AppRoute.BuyCrypto(userWalletId = userWalletId), eventCreator = { MainScreenAnalyticsEvent.ButtonBuy(status = it, screenType = screenType) }, ) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt index f95e4c5404..987fcedb41 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/deeplink/WalletDeepLinksHandler.kt @@ -2,17 +2,12 @@ package com.tangem.feature.wallet.presentation.deeplink import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter -import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.deeplink.DeepLink import com.tangem.core.deeplink.DeepLinksRegistry -import com.tangem.core.deeplink.global.BuyCurrencyDeepLink import com.tangem.core.deeplink.global.SellCurrencyDeepLink import com.tangem.domain.tokens.GetCryptoCurrencyUseCase -import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.domain.wallets.models.isMultiCurrency -import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.utils.coroutines.launchOnCancellation import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -22,9 +17,7 @@ import javax.inject.Inject @Suppress("LongParameterList") internal class WalletDeepLinksHandler @Inject constructor( private val deepLinksRegistry: DeepLinksRegistry, - private val analyticsEventHandler: AnalyticsEventHandler, private val getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase, - private val onrampFeatureToggles: OnrampFeatureToggles, private val router: AppRouter, ) { @@ -55,15 +48,6 @@ internal class WalletDeepLinksHandler @Inject constructor( return buildList { add(sellCurrencyDeepLink) - if (!onrampFeatureToggles.isFeatureEnabled && !userWallet.isMultiCurrency) { - add( - BuyCurrencyDeepLink( - onReceive = { - scope.launch { onBuyCurrencyDeepLink(userWallet) } - }, - ), - ) - } } } @@ -86,9 +70,4 @@ internal class WalletDeepLinksHandler @Inject constructor( router.push(route) } - - private suspend fun onBuyCurrencyDeepLink(userWallet: UserWallet) { - val cryptoCurrency = getCryptoCurrencyUseCase(userWallet.walletId).getOrNull() ?: return - analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol)) - } } \ No newline at end of file