From 8163b80ad36c95ad4658130a16e2037257e3ea44 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Jul 2023 23:23:08 +0800 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 10 -- .../converters/ParamCardCurrencyConverter.kt | 6 +- .../converters/TopUpEventConverter.kt | 6 +- .../CardContextInterceptor.kt | 5 +- .../LinkedCardContextInterceptor.kt | 6 +- .../common/analytics/topup/TopUpController.kt | 12 +-- .../tangem/tap/common/extensions/Analytics.kt | 13 +-- .../java/com/tangem/tap/di/ActivityModule.kt | 9 +- .../com/tangem/tap/domain/TangemSdkManager.kt | 14 +-- .../com/tangem/tap/domain/TapWalletManager.kt | 15 ++- .../domain/extensions/WalletManagerFactory.kt | 49 +++++++-- .../model/builders/UserWalletBuilder.kt | 7 +- .../model/builders/WalletStoreBuilder.kt | 25 ++--- .../domain/scanCard/LegacyScanProcessor.kt | 31 ++---- .../domain/scanCard/UseCaseScanProcessor.kt | 7 +- .../domain/scanCard/chains/AnalyticsChain.kt | 7 +- .../chains/CheckForOnboardingChain.kt | 16 +-- .../tasks/product/CreateProductWalletTask.kt | 12 +-- .../di/WalletCurrenciesManagerProvider.kt | 5 - .../DefaultWalletCurrenciesManager.kt | 9 +- .../di/WalletsStoresManagerProvider.kt | 12 +-- .../DefaultWalletStoresManager.kt | 22 ++-- .../repository/di/RepositoryProvider.kt | 5 +- .../DefaultWalletManagersRepository.kt | 32 ++++-- .../demo/DemoOnboardingNoteMiddleware.kt | 14 +-- .../features/details/redux/DetailsAction.kt | 3 +- .../details/redux/DetailsMiddleware.kt | 20 ++-- .../features/details/redux/DetailsReducer.kt | 61 ++++++----- .../walletconnect/WalletConnectMiddleware.kt | 4 +- .../details/ui/details/DetailsViewModel.kt | 10 +- .../tap/features/home/redux/HomeMiddleware.kt | 14 +-- .../features/onboarding/OnboardingHelper.kt | 25 ++--- .../note/redux/OnboardingNoteMiddleware.kt | 14 +-- .../redux/OnboardingOtherCardsMiddleware.kt | 13 ++- .../twins/redux/TwinCardsMiddleware.kt | 6 +- .../products/twins/redux/TwinCardsReducer.kt | 6 +- .../redux/OnboardingWalletMiddleware.kt | 14 +-- .../saveWallet/redux/SaveWalletMiddleware.kt | 13 +-- .../tap/features/wallet/redux/WalletState.kt | 4 + .../middlewares/MultiWalletMiddleware.kt | 6 +- .../redux/middlewares/WarningsMiddleware.kt | 11 +- .../tap/features/wallet/ui/WalletViewModel.kt | 5 +- .../redux/WalletSelectorMiddleware.kt | 7 +- .../redux/WalletSelectorReducer.kt | 8 +- .../welcome/redux/WelcomeMiddleware.kt | 8 +- .../tap/legacy/card/LegacyCardTypeResolver.kt | 100 ------------------ .../tap/legacy/card/di/LegacyCardModule.kt | 34 ------ .../tangem/tap/proxy/DerivationManagerImpl.kt | 4 +- .../com/tangem/tap/proxy/di/ProxyModule.kt | 4 +- .../tap/proxy/redux/DaggerGraphState.kt | 2 - .../CardTypesResolver.kt} | 10 +- .../java/com/tangem/domain/common/Provider.kt | 10 -- .../domain/common/TangemCardTypesResolver.kt | 77 ++++++++++++++ .../tangem/domain/common/TapWorkarounds.kt | 28 ++++- .../common/util/ScanResponseExtensions.kt | 11 +- 55 files changed, 389 insertions(+), 492 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/legacy/card/LegacyCardTypeResolver.kt delete mode 100644 app/src/main/java/com/tangem/tap/legacy/card/di/LegacyCardModule.kt rename domain/legacy/src/main/java/com/tangem/domain/{card/CardTypeResolver.kt => common/CardTypesResolver.kt} (84%) delete mode 100644 domain/legacy/src/main/java/com/tangem/domain/common/Provider.kt create mode 100644 domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index f043370e21..114746ccdb 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -20,9 +20,7 @@ import com.tangem.datasource.config.FeaturesLocalLoader import com.tangem.datasource.config.models.Config import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.domain.DomainLayer -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.LogConfig -import com.tangem.domain.common.Provider import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory @@ -84,7 +82,6 @@ private val walletManagersRepository by lazy { ?.blockchainSdkConfig ?: BlockchainSdkConfig(), ), - cardTypeResolverProvider = Provider { store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) }, ) } private val walletAmountsRepository by lazy { @@ -99,7 +96,6 @@ val walletStoresManager by lazy { walletManagersRepository = walletManagersRepository, walletAmountsRepository = walletAmountsRepository, appCurrencyProvider = { store.state.globalState.appCurrency }, - cardTypeResolverProvider = Provider { store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) }, ) } val walletCurrenciesManager by lazy { @@ -109,7 +105,6 @@ val walletCurrenciesManager by lazy { walletManagersRepository = walletManagersRepository, walletAmountsRepository = walletAmountsRepository, appCurrencyProvider = { store.state.globalState.appCurrency }, - cardTypeResolverProvider = Provider { store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) }, ) } val totalFiatBalanceCalculator by lazy { @@ -152,9 +147,6 @@ class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var learn2earnInteractor: Learn2earnInteractor - @Inject - lateinit var cardTypeResolver: CardTypeResolver - override fun onCreate() { super.onCreate() @@ -171,7 +163,6 @@ class TapApplication : Application(), ImageLoaderFactory { walletFeatureToggles = walletFeatureToggles, walletConnectRepository = walletConnect2Repository, walletConnectSessionsRepository = walletConnectSessionsRepository, - cardTypeResolver = cardTypeResolver, ), ), ) @@ -228,7 +219,6 @@ class TapApplication : Application(), ImageLoaderFactory { }, walletStoresManagerProvider = { walletStoresManager }, topupWalletStorage = preferencesStorage.toppedUpWalletStorage, - cardTypeResolver = cardTypeResolver, ) store.dispatch(GlobalAction.SetTopUpController(topUpController)) } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt index 5b60885d4b..0a7928efd5 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/ParamCardCurrencyConverter.kt @@ -2,15 +2,15 @@ package com.tangem.tap.common.analytics.converters import com.tangem.blockchain.common.Blockchain import com.tangem.common.Converter -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.CardTypesResolver import com.tangem.tap.common.analytics.events.AnalyticsParam /** [REDACTED_AUTHOR] */ -class ParamCardCurrencyConverter : Converter { +class ParamCardCurrencyConverter : Converter { - override fun convert(value: CardTypeResolver): AnalyticsParam.CardCurrency? { + override fun convert(value: CardTypesResolver): AnalyticsParam.CardCurrency? { if (value.isMultiwalletAllowed()) return AnalyticsParam.CardCurrency.MultiCurrency val type = when { diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt index 29b374687f..429b2e5ebc 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/TopUpEventConverter.kt @@ -1,15 +1,15 @@ package com.tangem.tap.common.analytics.converters import com.tangem.common.Converter -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.CardTypesResolver import com.tangem.tap.common.analytics.events.Basic /** [REDACTED_AUTHOR] */ -class TopUpEventConverter : Converter { +class TopUpEventConverter : Converter { - override fun convert(value: CardTypeResolver): Basic.ToppedUp? { + override fun convert(value: CardTypesResolver): Basic.ToppedUp? { val paramCardCurrency = ParamCardCurrencyConverter().convert(value) ?: return null return Basic.ToppedUp(paramCardCurrency) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt index e35f0f1143..864c9dadbb 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/CardContextInterceptor.kt @@ -2,7 +2,7 @@ package com.tangem.tap.common.analytics.paramsInterceptor import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.ParamsInterceptor -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter @@ -16,7 +16,6 @@ import com.tangem.tap.features.demo.DemoHelper */ class CardContextInterceptor( private val scanResponse: ScanResponse?, - private val cardTypeResolver: CardTypeResolver, ) : ParamsInterceptor { override fun id(): String = CardContextInterceptor.id() @@ -36,7 +35,7 @@ class CardContextInterceptor( params[AnalyticsParam.PRODUCT_TYPE] = getProductType(scanResponse) params[AnalyticsParam.FIRMWARE] = card.firmwareVersion.stringValue - ParamCardCurrencyConverter().convert(cardTypeResolver)?.let { + ParamCardCurrencyConverter().convert(scanResponse.cardTypesResolver)?.let { params[AnalyticsParam.CURRENCY] = it.value } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt index 5cf8c767fb..94c006d699 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/paramsInterceptor/LinkedCardContextInterceptor.kt @@ -2,19 +2,17 @@ package com.tangem.tap.common.analytics.paramsInterceptor import com.tangem.core.analytics.AnalyticsEvent import com.tangem.core.analytics.api.ParamsInterceptor -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.models.scan.ScanResponse /** [REDACTED_AUTHOR] */ class LinkedCardContextInterceptor( - scanResponse: ScanResponse, - cardTypeResolver: CardTypeResolver, + private val scanResponse: ScanResponse, val parent: LinkedCardContextInterceptor? = null, ) : ParamsInterceptor { - private val contextInterceptor = CardContextInterceptor(scanResponse, cardTypeResolver) + private val contextInterceptor = CardContextInterceptor(scanResponse) override fun id(): String = LinkedCardContextInterceptor.id() diff --git a/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt b/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt index 27cea44be1..97edaae4c1 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/topup/TopUpController.kt @@ -5,8 +5,9 @@ import com.tangem.common.extensions.isZero import com.tangem.core.analytics.Analytics import com.tangem.data.source.preferences.model.DataSourceTopupInfo import com.tangem.data.source.preferences.storage.ToppedUpWalletStorage -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.common.util.UserWalletId +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.analytics.converters.TopUpEventConverter import com.tangem.tap.common.analytics.events.AnalyticsParam @@ -31,7 +32,6 @@ class TopUpController( var scanResponseProvider: (() -> ScanResponse?)? = null, var walletStoresManagerProvider: (() -> WalletStoresManager)? = null, private val topupWalletStorage: ToppedUpWalletStorage, - private val cardTypeResolver: CardTypeResolver, ) : WalletCurrenciesManager.Listener { private var hadMissedDerivations: Boolean = false @@ -100,7 +100,7 @@ class TopUpController( } val cardBalanceState = BalanceCalculator(walletDataModels).calculate().toCardBalanceState() - send(userWalletId, cardBalanceState, cardTypeResolver) + send(userWalletId, cardBalanceState, scanResponse.cardTypesResolver) } } @@ -120,14 +120,14 @@ class TopUpController( fun send(scanResponse: ScanResponse, cardBalanceState: AnalyticsParam.CardBalanceState) { UserWalletIdBuilder.scanResponse(scanResponse).build()?.let { - send(it, cardBalanceState, cardTypeResolver) + send(it, cardBalanceState, scanResponse.cardTypesResolver) } } fun send( userWalletId: UserWalletId, cardBalanceState: AnalyticsParam.CardBalanceState, - cardTypeResolver: CardTypeResolver, + cardTypesResolver: CardTypesResolver, ) { val topupInfo = topupWalletStorage.restore(userWalletId.stringValue).guard { val topupInfo = DataSourceTopupInfo( @@ -152,7 +152,7 @@ class TopUpController( if (cardBalanceState.isToppedUp()) { topupWalletStorage.save(topupInfo.copy(cardBalanceState = DataSourceTopupInfo.CardBalanceState.Full)) - TopUpEventConverter().convert(cardTypeResolver)?.let { + TopUpEventConverter().convert(cardTypesResolver)?.let { Analytics.send(it) } } diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt b/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt index 58c13e282c..8e79d07381 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Analytics.kt @@ -1,7 +1,6 @@ package com.tangem.tap.common.extensions import com.tangem.core.analytics.Analytics -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.analytics.paramsInterceptor.LinkedCardContextInterceptor @@ -12,8 +11,8 @@ import com.tangem.tap.common.analytics.paramsInterceptor.LinkedCardContextInterc /** * Sets the new context */ -fun Analytics.setContext(scanResponse: ScanResponse, cardTypeResolver: CardTypeResolver) { - addParamsInterceptor(LinkedCardContextInterceptor(scanResponse, cardTypeResolver)) +fun Analytics.setContext(scanResponse: ScanResponse) { + addParamsInterceptor(LinkedCardContextInterceptor(scanResponse)) } /** @@ -26,13 +25,9 @@ fun Analytics.eraseContext() { /** * Adds a new context and keeps a previous context as the parent of the new one */ -fun Analytics.addContext(scanResponse: ScanResponse, cardTypeResolver: CardTypeResolver) { +fun Analytics.addContext(scanResponse: ScanResponse) { val currentContext = removeParamsInterceptor(LinkedCardContextInterceptor.id()) as? LinkedCardContextInterceptor - val newContext = LinkedCardContextInterceptor( - scanResponse = scanResponse, - cardTypeResolver = cardTypeResolver, - parent = currentContext, - ) + val newContext = LinkedCardContextInterceptor(scanResponse, parent = currentContext) addParamsInterceptor(newContext) } 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 67ce9fa481..96639f64e4 100644 --- a/app/src/main/java/com/tangem/tap/di/ActivityModule.kt +++ b/app/src/main/java/com/tangem/tap/di/ActivityModule.kt @@ -3,7 +3,6 @@ package com.tangem.tap.di import android.content.Context import androidx.fragment.app.FragmentActivity import com.tangem.TangemSdk -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.card.ScanCardUseCase import com.tangem.sdk.extensions.initWithBiometrics import com.tangem.tap.domain.TangemSdkManager @@ -28,12 +27,8 @@ internal object ActivityModule { @Provides @ActivityScoped - fun provideTangemSdkManager( - @ActivityContext context: Context, - tangemSdk: TangemSdk, - cardTypeResolver: CardTypeResolver, - ): TangemSdkManager { - return TangemSdkManager(tangemSdk, context, cardTypeResolver) + fun provideTangemSdkManager(@ActivityContext context: Context, tangemSdk: TangemSdk): TangemSdkManager { + return TangemSdkManager(tangemSdk, context) } @Provides diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index 83ddb84e62..c395569c5c 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -14,7 +14,7 @@ import com.tangem.common.usersCode.UserCodeRepository import com.tangem.core.analytics.Analytics import com.tangem.crypto.bip39.DefaultMnemonic import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.operations.ScanTask @@ -38,11 +38,7 @@ import kotlinx.coroutines.withContext import kotlin.coroutines.resume @Suppress("TooManyFunctions") -class TangemSdkManager( - private val tangemSdk: TangemSdk, - private val context: Context, - private val cardTypeResolver: CardTypeResolver, -) { +class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Context) { private val userCodeRepository by lazy { UserCodeRepository( @@ -82,7 +78,7 @@ class TangemSdkManager( suspend fun createProductWallet(scanResponse: ScanResponse): CompletionResult { return runTaskAsync( - CreateProductWalletTask(cardTypeResolver), + CreateProductWalletTask(scanResponse.cardTypesResolver), scanResponse.card.cardId, Message(context.getString(R.string.initial_message_create_wallet_body)), ) @@ -94,7 +90,7 @@ class TangemSdkManager( ): CompletionResult { return when (val seedResult = DefaultMnemonic(mnemonic, tangemSdk.wordlist).generateSeed()) { is CompletionResult.Success -> runTaskAsync( - CreateProductWalletTask(cardTypeResolver, seedResult.data), + CreateProductWalletTask(scanResponse.cardTypesResolver, seedResult.data), scanResponse.card.cardId, Message(context.getString(R.string.initial_message_create_wallet_body)), ) @@ -232,7 +228,7 @@ class TangemSdkManager( fun changeDisplayedCardIdNumbersCount(scanResponse: ScanResponse?) { tangemSdk.config.cardIdDisplayFormat = when { scanResponse == null -> CardIdDisplayFormat.Full - cardTypeResolver.isTangemTwins() -> CardIdDisplayFormat.LastLuhn(4) + scanResponse.cardTypesResolver.isTangemTwins() -> CardIdDisplayFormat.LastLuhn(4) else -> CardIdDisplayFormat.Full } } diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt index ae8c0cc795..4e39b73bbe 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -9,6 +9,8 @@ import com.tangem.common.doOnSuccess import com.tangem.core.analytics.Analytics import com.tangem.datasource.config.ConfigManager import com.tangem.domain.common.extensions.withMainContext +import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.models.scan.ScanResponse import com.tangem.operations.attestation.Attestation import com.tangem.tap.* import com.tangem.tap.common.analytics.events.Basic @@ -23,7 +25,6 @@ import com.tangem.tap.features.disclaimer.createDisclaimer import com.tangem.tap.features.disclaimer.redux.DisclaimerAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.CoroutineScope @@ -57,10 +58,7 @@ class TapWalletManager( } private suspend fun loadUserWalletData(userWallet: UserWallet, refresh: Boolean, sendAnalyticsEvent: Boolean) { - Analytics.setContext( - scanResponse = userWallet.scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + Analytics.setContext(userWallet.scanResponse) if (sendAnalyticsEvent) { Analytics.send(Basic.WalletOpened()) } @@ -70,7 +68,7 @@ class TapWalletManager( tangemSdkManager.changeDisplayedCardIdNumbersCount(scanResponse) store.state.globalState.feedbackManager?.infoHolder?.setCardInfo(scanResponse) - updateConfigManager() + updateConfigManager(scanResponse) withMainContext { // Order is important store.dispatch(DisclaimerAction.SetDisclaimer(card.createDisclaimer())) @@ -137,11 +135,10 @@ class TapWalletManager( } } - fun updateConfigManager() { + fun updateConfigManager(data: ScanResponse) { val configManager = store.state.globalState.configManager - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - if (cardTypeResolver.isStart2Coin()) { + if (data.cardTypesResolver.isStart2Coin()) { configManager?.turnOff(ConfigManager.IS_TOP_UP_ENABLED) } else { configManager?.resetToDefault(ConfigManager.IS_TOP_UP_ENABLED) diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt index c2776941b7..a9de7cb47a 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/WalletManagerFactory.kt @@ -1,19 +1,24 @@ package com.tangem.tap.domain.extensions -import com.tangem.blockchain.common.* +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.DerivationParams +import com.tangem.blockchain.common.DerivationStyle +import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.common.WalletManagerFactory import com.tangem.common.card.EllipticCurve import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toMapKey import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse +import com.tangem.tap.domain.tokens.models.BlockchainNetwork +import com.tangem.tap.features.wallet.models.Currency fun WalletManagerFactory.makeWalletManagerForApp( scanResponse: ScanResponse, - cardTypeResolver: CardTypeResolver, blockchain: Blockchain, derivationParams: DerivationParams?, ): WalletManager? { @@ -29,7 +34,7 @@ fun WalletManagerFactory.makeWalletManagerForApp( val seedKey = wallet.extendedPublicKey return when { - cardTypeResolver.isTangemTwins() && scanResponse.secondTwinPublicKey != null -> { + scanResponse.cardTypesResolver.isTangemTwins() && scanResponse.secondTwinPublicKey != null -> { makeTwinWalletManager( walletPublicKey = wallet.publicKey, pairPublicKey = scanResponse.secondTwinPublicKey!!.hexToBytes(), @@ -63,6 +68,17 @@ fun WalletManagerFactory.makeWalletManagerForApp( } } +fun WalletManagerFactory.makeWalletManagerForApp( + scanResponse: ScanResponse, + blockchainNetwork: BlockchainNetwork, +): WalletManager? { + return makeWalletManagerForApp( + scanResponse, + blockchain = blockchainNetwork.blockchain, + derivationParams = getDerivationParams(blockchainNetwork.derivationPath, scanResponse.card), + ) +} + private fun getDerivationParams(derivationPath: String?, card: CardDTO): DerivationParams? { return derivationPath?.let { DerivationParams.Custom( @@ -77,19 +93,32 @@ private fun getDerivationParams(derivationPath: String?, card: CardDTO): Derivat } } -fun WalletManagerFactory.makePrimaryWalletManager( +fun WalletManagerFactory.makeWalletManagerForApp(scanResponse: ScanResponse, currency: Currency): WalletManager? { + return makeWalletManagerForApp( + scanResponse, + blockchain = currency.blockchain, + derivationParams = getDerivationParams(currency.derivationPath, scanResponse.card), + ) +} + +fun WalletManagerFactory.makeWalletManagersForApp( scanResponse: ScanResponse, - cardTypeResolver: CardTypeResolver, -): WalletManager? { + blockchains: List, +): List { + return blockchains + .filter { it.isBlockchain() } + .mapNotNull { this.makeWalletManagerForApp(scanResponse, it) } +} + +fun WalletManagerFactory.makePrimaryWalletManager(scanResponse: ScanResponse): WalletManager? { val blockchain = if (scanResponse.card.isTestCard) { - cardTypeResolver.getBlockchain().getTestnetVersion() ?: return null + scanResponse.cardTypesResolver.getBlockchain().getTestnetVersion() ?: return null } else { - cardTypeResolver.getBlockchain() + scanResponse.cardTypesResolver.getBlockchain() } val derivationParams = getDerivationParams(null, scanResponse.card) return makeWalletManagerForApp( scanResponse = scanResponse, - cardTypeResolver = cardTypeResolver, blockchain = blockchain, derivationParams = derivationParams, ) diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt index 6fc426781c..d4e6cbd1fc 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/UserWalletBuilder.kt @@ -1,16 +1,15 @@ package com.tangem.tap.domain.model.builders -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.common.TapWorkarounds.isStart2Coin +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.userWalletList.GetCardImageUseCase class UserWalletBuilder( private val scanResponse: ScanResponse, - private val cardTypeResolver: CardTypeResolver, private val getCardImageUseCase: GetCardImageUseCase = GetCardImageUseCase(), ) { private var backupCardsIds: Set = emptySet() @@ -47,7 +46,7 @@ class UserWalletBuilder( artworkUrl = getCardImageUseCase.invoke(card.cardId, card.cardPublicKey), cardsInWallet = backupCardsIds.plus(card.cardId), scanResponse = this, - isMultiCurrency = cardTypeResolver.isMultiwalletAllowed(), + isMultiCurrency = cardTypesResolver.isMultiwalletAllowed(), ) } } diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt index 57838dad8d..e7d01ecdb6 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt @@ -1,10 +1,14 @@ package com.tangem.tap.domain.model.builders import com.tangem.blockchain.blockchains.polkadot.ExistentialDepositProvider -import com.tangem.blockchain.common.* +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.DerivationStyle +import com.tangem.blockchain.common.Token +import com.tangem.blockchain.common.Wallet +import com.tangem.blockchain.common.WalletManager import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.TapWorkarounds.derivationStyle +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.model.WalletDataModel import com.tangem.tap.domain.model.WalletStoreModel @@ -25,25 +29,19 @@ interface WalletStoreBuilder { companion object { operator fun invoke( userWallet: UserWallet, - cardTypeResolver: CardTypeResolver, blockchainNetwork: BlockchainNetwork, ): BlockchainNetworkWalletStoreBuilder { - return BlockchainNetworkWalletStoreBuilderImpl(userWallet, cardTypeResolver, blockchainNetwork) + return BlockchainNetworkWalletStoreBuilderImpl(userWallet, blockchainNetwork) } - operator fun invoke( - userWallet: UserWallet, - cardTypeResolver: CardTypeResolver, - walletManager: WalletManager, - ): WalletMangerWalletStoreBuilder { - return WalletMangerWalletStoreBuilderImpl(userWallet, cardTypeResolver, walletManager) + operator fun invoke(userWallet: UserWallet, walletManager: WalletManager): WalletMangerWalletStoreBuilder { + return WalletMangerWalletStoreBuilderImpl(userWallet, walletManager) } } } private class BlockchainNetworkWalletStoreBuilderImpl( private val userWallet: UserWallet, - private val cardTypeResolver: CardTypeResolver, private val blockchainNetwork: BlockchainNetwork, ) : WalletStoreBuilder.BlockchainNetworkWalletStoreBuilder { private var walletManager: WalletManager? = null @@ -58,7 +56,7 @@ private class BlockchainNetworkWalletStoreBuilderImpl( val tokensWalletsData = blockchainNetwork.getTokensWalletsData( walletManager = walletManager, cardDerivationStyle = cardDerivationStyle, - primaryToken = cardTypeResolver.getPrimaryToken(), + primaryToken = userWallet.scanResponse.cardTypesResolver.getPrimaryToken(), ) return WalletStoreModel( @@ -75,7 +73,6 @@ private class BlockchainNetworkWalletStoreBuilderImpl( private class WalletMangerWalletStoreBuilderImpl( private val userWallet: UserWallet, - private val cardTypeResolver: CardTypeResolver, private val walletManager: WalletManager, ) : WalletStoreBuilder.WalletMangerWalletStoreBuilder { @@ -84,7 +81,7 @@ private class WalletMangerWalletStoreBuilderImpl( val blockchainWalletData = wallet.blockchain.toBlockchainWalletData(walletManager) val tokenWalletsData = wallet.getTokens().firstOrNull()?.toTokenWalletData( walletManager = walletManager, - primaryToken = cardTypeResolver.getPrimaryToken(), + primaryToken = userWallet.scanResponse.cardTypesResolver.getPrimaryToken(), ) return WalletStoreModel( diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt index 6009ec32df..f885b4fa13 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt @@ -7,7 +7,6 @@ import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.AnalyticsEvent -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.common.extensions.withMainContext import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ScanResponse @@ -23,7 +22,6 @@ import com.tangem.tap.features.disclaimer.redux.DisclaimerCallback import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep -import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -73,11 +71,7 @@ internal object LegacyScanProcessor { tangemSdkManager.changeDisplayedCardIdNumbersCount(scanResponse) onScanStateChange(false) - sendAnalytics( - analyticsEvent = analyticsEvent, - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + sendAnalytics(analyticsEvent, scanResponse) showDisclaimerIfNeed( scanResponse = scanResponse, @@ -95,14 +89,10 @@ internal object LegacyScanProcessor { } } - private fun sendAnalytics( - analyticsEvent: AnalyticsEvent?, - scanResponse: ScanResponse, - cardTypeResolver: CardTypeResolver, - ) { + private fun sendAnalytics(analyticsEvent: AnalyticsEvent?, scanResponse: ScanResponse) { analyticsEvent?.let { // this workaround needed to send CardWasScannedEvent without adding a context - val interceptor = CardContextInterceptor(scanResponse, cardTypeResolver) + val interceptor = CardContextInterceptor(scanResponse) val params = it.params.toMutableMap() interceptor.intercept(params) it.params = params.toMap() @@ -156,25 +146,18 @@ internal object LegacyScanProcessor { ) { val globalState = store.state.globalState val tapWalletManager = globalState.tapWalletManager - tapWalletManager.updateConfigManager() + tapWalletManager.updateConfigManager(scanResponse) store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(scanResponse)) - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - if (OnboardingHelper.isOnboardingCase(scanResponse, cardTypeResolver)) { - Analytics.addContext( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + if (OnboardingHelper.isOnboardingCase(scanResponse)) { + Analytics.addContext(scanResponse) onWalletNotCreated() store.dispatchOnMain(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = true)) val appScreen = OnboardingHelper.whereToNavigate(scanResponse) navigateTo(appScreen) { onProgressStateChange(it) } } else { - Analytics.setContext( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + Analytics.setContext(scanResponse) if (scanResponse.twinsIsTwinned() && !preferencesStorage.wasTwinsOnboardingShown()) { onWalletNotCreated() store.dispatchOnMain(TwinCardsAction.SetStepOfScreen(TwinCardsStep.WelcomeOnly(scanResponse))) diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt index 04249c892c..45a463343a 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt @@ -49,12 +49,7 @@ internal object UseCaseScanProcessor { val chains = buildList { add(ScanningFinishedChain { onScanStateChange(false) }) if (analyticsEvent != null) { - add( - AnalyticsChain( - event = analyticsEvent, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ), - ) + add(AnalyticsChain(analyticsEvent)) } add(DisclaimerChain(store, disclaimerWillShow)) add(CheckForOnboardingChain(store, store.state.globalState.tapWalletManager, preferencesStorage)) diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt index d065b20148..febc6a1525 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/AnalyticsChain.kt @@ -4,7 +4,6 @@ import arrow.core.Either import arrow.core.right import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.AnalyticsEvent -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.card.ScanCardException import com.tangem.domain.core.chain.Chain import com.tangem.domain.models.scan.ScanResponse @@ -20,16 +19,12 @@ import com.tangem.tap.common.analytics.paramsInterceptor.CardContextInterceptor */ class AnalyticsChain( private val event: AnalyticsEvent, - private val cardTypeResolver: CardTypeResolver, ) : Chain { override suspend fun invoke( previousChainResult: ScanResponse, ): Either { - val interceptor = CardContextInterceptor( - scanResponse = previousChainResult, - cardTypeResolver = cardTypeResolver, - ) + val interceptor = CardContextInterceptor(previousChainResult) val params = event.params.toMutableMap() interceptor.intercept(params) event.params = params.toMap() diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt index d17b6c84c3..ce46f2f527 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/chains/CheckForOnboardingChain.kt @@ -20,7 +20,6 @@ import com.tangem.tap.domain.TapWalletManager import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep -import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import org.rekotlin.Store @@ -45,25 +44,18 @@ class CheckForOnboardingChain( override suspend fun invoke( previousChainResult: ScanResponse, ): Either { - tapWalletManager.updateConfigManager() + tapWalletManager.updateConfigManager(previousChainResult) store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(previousChainResult)) - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) return when { - OnboardingHelper.isOnboardingCase(previousChainResult, cardTypeResolver) -> { - Analytics.addContext( - scanResponse = previousChainResult, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + OnboardingHelper.isOnboardingCase(previousChainResult) -> { + Analytics.addContext(previousChainResult) store.dispatchOnMain(GlobalAction.Onboarding.Start(previousChainResult, canSkipBackup = true)) val appScreen = OnboardingHelper.whereToNavigate(previousChainResult) ScanChainException.OnboardingNeeded(appScreen).left() } else -> { - Analytics.setContext( - scanResponse = previousChainResult, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + Analytics.setContext(previousChainResult) // If twins was twinned previously but twins welcome not shown if (previousChainResult.twinsIsTwinned() && !preferencesStore.wasTwinsOnboardingShown()) { store.dispatchOnMain( diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt index 23225a2a25..d23e9fde5c 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt @@ -12,7 +12,7 @@ import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.map import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.models.scan.CardDTO @@ -55,7 +55,7 @@ private data class CreateWalletResponse( } class CreateProductWalletTask( - private val cardTypeResolver: CardTypeResolver, + private val cardTypesResolver: CardTypesResolver, private val seed: ByteArray? = null, ) : CardSessionRunnable { @@ -72,8 +72,8 @@ class CreateProductWalletTask( val cardDto = CardDTO(card) val commandProcessor = when { - cardTypeResolver.isTangemNote() -> CreateWalletTangemNote(cardTypeResolver) - cardTypeResolver.isTangemTwins() -> + cardTypesResolver.isTangemNote() -> CreateWalletTangemNote(cardTypesResolver) + cardTypesResolver.isTangemTwins() -> throw UnsupportedOperationException("Use the TwinCardsManager to create a wallet") else -> CreateWalletTangemWallet(seed) @@ -97,7 +97,7 @@ class CreateProductWalletTask( } } -private class CreateWalletTangemNote(private val cardTypeResolver: CardTypeResolver) : +private class CreateWalletTangemNote(private val cardTypesResolver: CardTypesResolver) : ProductCommandProcessor { override fun proceed( card: CardDTO, @@ -109,7 +109,7 @@ private class CreateWalletTangemNote(private val cardTypeResolver: CardTypeResol return } - val curvesSupportedByBlockchain = cardTypeResolver.getBlockchain().getSupportedCurves().toSet() + val curvesSupportedByBlockchain = cardTypesResolver.getBlockchain().getSupportedCurves().toSet() if (curvesSupportedByBlockchain.isEmpty()) { callback(CompletionResult.Failure(TangemSdkError.CardError())) return diff --git a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt index d754f7ecd7..0c6bfccf02 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/di/WalletCurrenciesManagerProvider.kt @@ -1,7 +1,5 @@ package com.tangem.tap.domain.walletCurrencies.di -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.domain.tokens.UserTokensRepository import com.tangem.tap.domain.walletCurrencies.WalletCurrenciesManager @@ -10,14 +8,12 @@ import com.tangem.tap.domain.walletStores.repository.WalletAmountsRepository import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository -@Suppress("LongParameterList") fun WalletCurrenciesManager.Companion.provideDefaultImplementation( userTokensRepository: UserTokensRepository, walletStoresRepository: WalletStoresRepository, walletAmountsRepository: WalletAmountsRepository, walletManagersRepository: WalletManagersRepository, appCurrencyProvider: () -> FiatCurrency, - cardTypeResolverProvider: Provider, ): WalletCurrenciesManager { return DefaultWalletCurrenciesManager( userTokensRepository = userTokensRepository, @@ -25,6 +21,5 @@ fun WalletCurrenciesManager.Companion.provideDefaultImplementation( walletAmountsRepository = walletAmountsRepository, walletManagersRepository = walletManagersRepository, appCurrencyProvider = appCurrencyProvider, - cardTypeResolverProvider = cardTypeResolverProvider, ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt index 65103d09a2..0bbd76b7bc 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletCurrencies/implementation/DefaultWalletCurrenciesManager.kt @@ -2,8 +2,6 @@ package com.tangem.tap.domain.walletCurrencies.implementation import com.tangem.blockchain.common.DerivationStyle import com.tangem.common.* -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.util.UserWalletId import com.tangem.domain.models.scan.CardDTO @@ -28,7 +26,6 @@ internal class DefaultWalletCurrenciesManager( private val walletAmountsRepository: WalletAmountsRepository, private val walletManagersRepository: WalletManagersRepository, private val appCurrencyProvider: () -> FiatCurrency, - private val cardTypeResolverProvider: Provider, ) : WalletCurrenciesManager { private val listeners = mutableListOf() @@ -230,11 +227,7 @@ internal class DefaultWalletCurrenciesManager( .flatMap { walletManager -> walletStoresRepository.storeOrUpdate( userWalletId = userWallet.walletId, - walletStore = WalletStoreBuilder( - userWallet = userWallet, - cardTypeResolver = cardTypeResolverProvider.invoke(), - blockchainNetwork = blockchainNetwork, - ) + walletStore = WalletStoreBuilder(userWallet, blockchainNetwork) .walletManager(walletManager) .build(), ) diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt index ae1ac2bb4c..d2a4789fb0 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/di/WalletsStoresManagerProvider.kt @@ -1,23 +1,24 @@ package com.tangem.tap.domain.walletStores.di -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider +import com.tangem.tap.domain.walletStores.WalletStoresManager +import com.tangem.tap.domain.walletStores.implementation.DummyWalletStoresManager import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.domain.tokens.UserTokensRepository -import com.tangem.tap.domain.walletStores.WalletStoresManager import com.tangem.tap.domain.walletStores.implementation.DefaultWalletStoresManager import com.tangem.tap.domain.walletStores.repository.WalletAmountsRepository import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository -@Suppress("LongParameterList") +fun WalletStoresManager.Companion.provideDummyImplementation(): WalletStoresManager { + return DummyWalletStoresManager() +} + fun WalletStoresManager.Companion.provideDefaultImplementation( userTokensRepository: UserTokensRepository, walletStoresRepository: WalletStoresRepository, walletAmountsRepository: WalletAmountsRepository, walletManagersRepository: WalletManagersRepository, appCurrencyProvider: () -> FiatCurrency, - cardTypeResolverProvider: Provider, ): WalletStoresManager { return DefaultWalletStoresManager( userTokensRepository = userTokensRepository, @@ -25,6 +26,5 @@ fun WalletStoresManager.Companion.provideDefaultImplementation( walletAmountsRepository = walletAmountsRepository, walletManagersRepository = walletManagersRepository, appCurrencyProvider = appCurrencyProvider, - cardTypeResolverProvider = cardTypeResolverProvider, ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt index 476fa8300c..6081a25788 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/implementation/DefaultWalletStoresManager.kt @@ -2,9 +2,12 @@ package com.tangem.tap.domain.walletStores.implementation import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.AddressType -import com.tangem.common.* -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider +import com.tangem.common.CompletionResult +import com.tangem.common.doOnSuccess +import com.tangem.common.flatMap +import com.tangem.common.flatMapOnFailure +import com.tangem.common.fold +import com.tangem.common.map import com.tangem.domain.common.util.UserWalletId import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.domain.model.UserWallet @@ -32,7 +35,6 @@ internal class DefaultWalletStoresManager( private val walletAmountsRepository: WalletAmountsRepository, private val walletManagersRepository: WalletManagersRepository, private val appCurrencyProvider: () -> FiatCurrency, - private val cardTypeResolverProvider: Provider, ) : WalletStoresManager { private val state = MutableStateFlow(State()) @@ -149,11 +151,7 @@ internal class DefaultWalletStoresManager( { walletManager -> walletStoresRepository.storeOrUpdate( userWalletId = userWalletId, - walletStore = WalletStoreBuilder( - userWallet = userWallet, - cardTypeResolver = cardTypeResolverProvider.invoke(), - blockchainNetwork = blockchainNetwork, - ) + walletStore = WalletStoreBuilder(userWallet, blockchainNetwork) .walletManager(walletManager) .build(), ) @@ -187,11 +185,7 @@ internal class DefaultWalletStoresManager( val userWalletId = userWallet.walletId walletStoresRepository.storeOrUpdate( userWalletId = userWalletId, - walletStore = WalletStoreBuilder( - userWallet = userWallet, - cardTypeResolver = cardTypeResolverProvider.invoke(), - walletManager = walletManager, - ) + walletStore = WalletStoreBuilder(userWallet, walletManager) .build(), ) } diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt index 1f89cd4eda..d89d4ea6aa 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/di/RepositoryProvider.kt @@ -2,8 +2,6 @@ package com.tangem.tap.domain.walletStores.repository.di import com.tangem.blockchain.common.WalletManagerFactory import com.tangem.datasource.api.tangemTech.TangemTechService -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider import com.tangem.tap.domain.walletStores.repository.WalletAmountsRepository import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository @@ -18,9 +16,8 @@ fun WalletStoresRepository.Companion.provideDefaultImplementation(): WalletStore fun WalletManagersRepository.Companion.provideDefaultImplementation( walletManagerFactory: WalletManagerFactory, - cardTypeResolverProvider: Provider, ): WalletManagersRepository { - return DefaultWalletManagersRepository(walletManagerFactory, cardTypeResolverProvider) + return DefaultWalletManagersRepository(walletManagerFactory) } fun WalletAmountsRepository.Companion.provideDefaultImplementation( diff --git a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt index bf26df0009..b2d8167a7e 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletStores/repository/implementation/DefaultWalletManagersRepository.kt @@ -1,17 +1,22 @@ package com.tangem.tap.domain.walletStores.repository.implementation -import com.tangem.blockchain.common.* +import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.DerivationParams +import com.tangem.blockchain.common.DerivationStyle +import com.tangem.blockchain.common.WalletManager +import com.tangem.blockchain.common.WalletManagerFactory import com.tangem.common.CompletionResult import com.tangem.common.catching import com.tangem.common.doOnSuccess import com.tangem.common.mapFailure import com.tangem.crypto.hdWallet.DerivationPath -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.UserWalletId import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.domain.extensions.makeWalletManagerForApp import com.tangem.tap.domain.model.UserWallet import com.tangem.tap.domain.tokens.models.BlockchainNetwork @@ -25,7 +30,6 @@ import timber.log.Timber internal class DefaultWalletManagersRepository( private val walletManagerFactory: WalletManagerFactory, - private val cardTypeResolverProvider: Provider, ) : WalletManagersRepository { private val walletManagersStorage = WalletManagerStorage @@ -52,7 +56,10 @@ internal class DefaultWalletManagersRepository( derivationPath = blockchainNetwork?.derivationPath, ) - foundWalletManager?.updateTokens(blockchainNetwork = blockchainNetwork) + foundWalletManager?.updateTokens( + scanResponse = userWallet.scanResponse, + blockchainNetwork = blockchainNetwork, + ) ?: makeAndStore(userWallet, blockchainNetwork) } @@ -62,7 +69,7 @@ internal class DefaultWalletManagersRepository( ): CompletionResult { val scanResponse = userWallet.scanResponse val blockchain = blockchainNetwork?.blockchain - ?: cardTypeResolverProvider.invoke().getBlockchain().let { blockchain -> + ?: scanResponse.cardTypesResolver.getBlockchain().let { blockchain -> if (scanResponse.card.isTestCard) blockchain.getTestnetVersion() else blockchain } val derivationParams = getDerivationParams( @@ -73,7 +80,6 @@ internal class DefaultWalletManagersRepository( val walletManager = blockchain?.let { walletManagerFactory.makeWalletManagerForApp( scanResponse = userWallet.scanResponse, - cardTypeResolver = cardTypeResolverProvider.invoke(), blockchain = blockchain, derivationParams = derivationParams, ) @@ -92,7 +98,10 @@ internal class DefaultWalletManagersRepository( CompletionResult.Failure(error) } walletManager != null -> { - walletManager.updateTokens(blockchainNetwork = blockchainNetwork) + walletManager.updateTokens( + scanResponse = scanResponse, + blockchainNetwork = blockchainNetwork, + ) .doOnSuccess { store(userWallet.walletId, it) } } else -> { @@ -152,10 +161,13 @@ internal class DefaultWalletManagersRepository( } } - private fun WalletManager.updateTokens(blockchainNetwork: BlockchainNetwork?): CompletionResult { + private fun WalletManager.updateTokens( + scanResponse: ScanResponse, + blockchainNetwork: BlockchainNetwork?, + ): CompletionResult { val walletManager = this return catching { - val tokens = blockchainNetwork?.tokens ?: listOfNotNull(cardTypeResolverProvider.invoke().getPrimaryToken()) + val tokens = blockchainNetwork?.tokens ?: listOfNotNull(scanResponse.cardTypesResolver.getPrimaryToken()) if (tokens != walletManager.cardTokens) { // TODO: remove ability to manipulate with walletManager.cardTokens diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt index 89cdd44f5f..4624db8d34 100644 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/demo/DemoOnboardingNoteMiddleware.kt @@ -1,14 +1,13 @@ package com.tangem.tap.features.demo import com.tangem.common.extensions.guard +import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.common.demo.DemoConfig import com.tangem.domain.common.extensions.withMainContext -import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.domain.extensions.makePrimaryWalletManager import com.tangem.tap.features.onboarding.products.note.redux.OnboardingNoteAction import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store import kotlinx.coroutines.launch @@ -29,14 +28,9 @@ internal class DemoOnboardingNoteMiddleware : DemoMiddleware { noteState.walletManager } else { val wmFactory = globalState.tapWalletManager.walletManagerFactory - val walletManager = wmFactory - .makePrimaryWalletManager( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) - .guard { - return false - } + val walletManager = wmFactory.makePrimaryWalletManager(scanResponse).guard { + return false + } store.dispatch(OnboardingNoteAction.SetWalletManager(walletManager)) walletManager } diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt index ad390d5207..5782c7b0e2 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt @@ -2,6 +2,7 @@ package com.tangem.tap.features.details.redux import com.tangem.blockchain.common.Wallet import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.entities.FiatCurrency import org.rekotlin.Action @@ -25,7 +26,7 @@ sealed class DetailsAction : Action { object ScanCard : DetailsAction() - data class PrepareCardSettingsData(val card: CardDTO) : DetailsAction() + data class PrepareCardSettingsData(val card: CardDTO, val cardTypesResolver: CardTypesResolver) : DetailsAction() object ResetCardSettingsData : DetailsAction() sealed class AccessCodeRecovery : DetailsAction() { diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 8541cb7fb0..acc0130ea9 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -8,6 +8,7 @@ import com.tangem.common.extensions.guard import com.tangem.common.flatMap import com.tangem.core.analytics.Analytics import com.tangem.domain.common.TapWorkarounds.isTangemTwins +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam @@ -32,8 +33,13 @@ import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletMode import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.foregroundActivityObserver +import com.tangem.tap.preferencesStorage +import com.tangem.tap.scope +import com.tangem.tap.store import com.tangem.tap.tangemSdkManager +import com.tangem.tap.userWalletsListManager +import com.tangem.tap.walletStoresManager import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -86,7 +92,10 @@ class DetailsMiddleware { if (isSameWallet) { store.dispatchOnMain( - DetailsAction.PrepareCardSettingsData(card = scanResponse.card), + DetailsAction.PrepareCardSettingsData( + scanResponse.card, + scanResponse.cardTypesResolver, + ), ) } else { store.dispatchDialogShow( @@ -319,12 +328,7 @@ class DetailsMiddleware { enableAccessCodesSaving: Boolean, ): CompletionResult { val userWallet = userWalletsListManager.selectedUserWalletSync - ?: scanResponse?.let { - UserWalletBuilder( - scanResponse = it, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ).build() - } + ?: scanResponse?.let { UserWalletBuilder(it).build() } ?: return CompletionResult.Failure( error = TangemSdkError.ExceptionError(IllegalStateException("scanResponse is null")), ) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index 21bdcfdddc..e28b9cd398 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -1,15 +1,15 @@ package com.tangem.tap.features.details.redux -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.extensions.signedHashesCount import com.tangem.tap.preferencesStorage -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store import com.tangem.tap.tangemSdkManager import org.rekotlin.Action -import java.util.EnumSet +import java.util.* object DetailsReducer { fun reduce(action: Action, state: AppState): DetailsState = internalReduce(action, state) @@ -23,7 +23,11 @@ private fun internalReduce(action: Action, state: AppState): DetailsState { handlePrepareScreen(action) } is DetailsAction.PrepareCardSettingsData -> { - handlePrepareCardSettingsScreen(card = action.card, state = detailsState) + handlePrepareCardSettingsScreen( + card = action.card, + cardTypesResolver = action.cardTypesResolver, + state = detailsState, + ) } is DetailsAction.ResetCardSettingsData -> detailsState.copy(cardSettingsState = null) is DetailsAction.ResetToFactory -> { @@ -56,14 +60,17 @@ private fun handlePrepareScreen(action: DetailsAction.PrepareScreen): DetailsSta ) } -private fun handlePrepareCardSettingsScreen(card: CardDTO, state: DetailsState): DetailsState { - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) +private fun handlePrepareCardSettingsScreen( + card: CardDTO, + cardTypesResolver: CardTypesResolver, + state: DetailsState, +): DetailsState { val cardSettingsState = CardSettingsState( - cardInfo = card.toCardInfo(cardTypeResolver), - manageSecurityState = prepareSecurityOptions(card, cardTypeResolver), + cardInfo = card.toCardInfo(cardTypesResolver), + manageSecurityState = prepareSecurityOptions(card, cardTypesResolver), card = card, - resetCardAllowed = isResetToFactoryAllowedByCard(card, cardTypeResolver), - accessCodeRecovery = if (cardTypeResolver.isWallet2()) { + resetCardAllowed = isResetToFactoryAllowedByCard(card, cardTypesResolver), + accessCodeRecovery = if (cardTypesResolver.isWallet2()) { val enabled = card.userSettings?.isUserCodeRecoveryAllowed ?: false AccessCodeRecoveryState( enabledOnCard = enabled, @@ -76,7 +83,7 @@ private fun handlePrepareCardSettingsScreen(card: CardDTO, state: DetailsState): return state.copy(cardSettingsState = cardSettingsState) } -private fun prepareSecurityOptions(card: CardDTO, cardTypeResolver: CardTypeResolver): ManageSecurityState { +private fun prepareSecurityOptions(card: CardDTO, cardTypesResolver: CardTypesResolver): ManageSecurityState { val securityOption = when { card.isAccessCodeSet -> { SecurityOption.AccessCode @@ -91,15 +98,14 @@ private fun prepareSecurityOptions(card: CardDTO, cardTypeResolver: CardTypeReso } } val allowedSecurityOptions = when { - cardTypeResolver.isStart2Coin() || cardTypeResolver.isTangemNote() -> { + cardTypesResolver.isStart2Coin() || cardTypesResolver.isTangemNote() -> { EnumSet.of(SecurityOption.LongTap) } card.settings.isBackupAllowed -> { EnumSet.of(securityOption) } - else -> { - prepareAllowedSecurityOptions(cardTypeResolver = cardTypeResolver, currentSecurityOption = securityOption) - } + else -> + prepareAllowedSecurityOptions(cardTypesResolver = cardTypesResolver, currentSecurityOption = securityOption) } return ManageSecurityState( currentOption = securityOption, @@ -108,9 +114,9 @@ private fun prepareSecurityOptions(card: CardDTO, cardTypeResolver: CardTypeReso ) } -private fun isResetToFactoryAllowedByCard(card: CardDTO, cardTypeResolver: CardTypeResolver): Boolean { +private fun isResetToFactoryAllowedByCard(card: CardDTO, cardTypesResolver: CardTypesResolver): Boolean { val hasPermanentWallet = card.wallets.any { it.settings.isPermanent } - val isNotAllowed = hasPermanentWallet || cardTypeResolver.isStart2Coin() + val isNotAllowed = hasPermanentWallet || cardTypesResolver.isStart2Coin() return !isNotAllowed } @@ -134,10 +140,12 @@ private fun handleSecurityAction(action: DetailsAction.ManageSecurity, state: De // Setting options to show only LongTap from now on for non-twins val manageSecurityState = state.cardSettingsState?.manageSecurityState?.copy( currentOption = state.cardSettingsState.manageSecurityState.selectedOption, - allowedOptions = prepareAllowedSecurityOptions( - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - currentSecurityOption = state.cardSettingsState.manageSecurityState.selectedOption, - ), + allowedOptions = state.scanResponse?.cardTypesResolver?.let { + prepareAllowedSecurityOptions( + cardTypesResolver = it, + currentSecurityOption = state.cardSettingsState.manageSecurityState.selectedOption, + ) + } ?: EnumSet.of(SecurityOption.LongTap), ) state.copy( cardSettingsState = state.cardSettingsState?.copy( @@ -221,12 +229,12 @@ private fun handleAccessCodeRecoveryAction( } private fun prepareAllowedSecurityOptions( - cardTypeResolver: CardTypeResolver, + cardTypesResolver: CardTypesResolver, currentSecurityOption: SecurityOption?, ): EnumSet { val allowedSecurityOptions = EnumSet.of(SecurityOption.LongTap) - if (cardTypeResolver.isTangemTwins()) { + if (cardTypesResolver.isTangemTwins()) { allowedSecurityOptions.add(SecurityOption.PassCode) } if (currentSecurityOption == SecurityOption.AccessCode) { @@ -238,8 +246,9 @@ private fun prepareAllowedSecurityOptions( return allowedSecurityOptions } -private fun CardDTO.toCardInfo(cardTypeResolver: CardTypeResolver): CardInfo { - val cardId = this.cardId.chunked(size = 4).joinToString(separator = " ") +@Suppress("MagicNumber") +private fun CardDTO.toCardInfo(cardTypesResolver: CardTypesResolver): CardInfo { + val cardId = this.cardId.chunked(4).joinToString(separator = " ") val issuer = this.issuer.name val signedHashes = this.signedHashesCount() @@ -247,7 +256,7 @@ private fun CardDTO.toCardInfo(cardTypeResolver: CardTypeResolver): CardInfo { cardId = cardId, issuer = issuer, signedHashes = signedHashes, - isTwin = cardTypeResolver.isTangemTwins(), + isTwin = cardTypesResolver.isTangemTwins(), hasBackup = backupStatus?.isActive == true, ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index 47422b12e6..b69de63a66 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -8,6 +8,7 @@ import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.extensions.toNetworkId import com.tangem.domain.common.extensions.withMainContext +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.extensions.dispatchOnMain @@ -403,8 +404,7 @@ class WalletConnectMiddleware { private fun handleScanResponse(scanResponse: ScanResponse, session: WalletConnectSession, blockchain: Blockchain) { val card = scanResponse.card - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - if (!cardTypeResolver.isMultiwalletAllowed()) { + if (!scanResponse.cardTypesResolver.isMultiwalletAllowed()) { store.dispatchOnMain(WalletConnectAction.UnsupportedCard) return } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index 9256eda744..e9766c6147 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -3,6 +3,7 @@ package com.tangem.tap.features.details.ui.details import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import com.tangem.core.analytics.Analytics +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.feedback.FeedbackEmail import com.tangem.tap.common.feedback.SupportInfo @@ -15,7 +16,6 @@ import com.tangem.tap.features.disclaimer.redux.DisclaimerAction import com.tangem.tap.features.home.LocaleRegionProvider import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.wallet.BuildConfig import org.rekotlin.Store @@ -26,11 +26,11 @@ class DetailsViewModel(private val store: Store) { @Suppress("ComplexMethod") fun updateState(state: DetailsState): DetailsScreenState { - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) + val cardTypesResolver = state.scanResponse?.cardTypesResolver val settings = SettingsElement.values().mapNotNull { when (it) { SettingsElement.WalletConnect -> { - if (cardTypeResolver.isMultiwalletAllowed()) it else null + if (cardTypesResolver?.isMultiwalletAllowed() == true) it else null } SettingsElement.SendFeedback -> it SettingsElement.LinkMoreCards -> if (state.createBackupAllowed) it else null @@ -38,8 +38,8 @@ class DetailsViewModel(private val store: Store) { if (state.privacyPolicyUrl != null) it else null } SettingsElement.AppSettings -> if (state.appSettingsState.isBiometricsAvailable) it else null - SettingsElement.AppCurrency -> if (!cardTypeResolver.isMultiwalletAllowed()) it else null - SettingsElement.ReferralProgram -> if (cardTypeResolver.isTangemWallet()) it else null + SettingsElement.AppCurrency -> if (cardTypesResolver?.isMultiwalletAllowed() != true) it else null + SettingsElement.ReferralProgram -> if (cardTypesResolver?.isTangemWallet() == true) it else null SettingsElement.TesterMenu -> if (BuildConfig.TESTER_MENU_ENABLED) it else null else -> it } 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 5a3d6060f6..9d7d775e1d 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 @@ -27,7 +27,6 @@ import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.home.redux.HomeMiddleware.BUY_WALLET_URL import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.signin.redux.SignInAction -import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -102,15 +101,10 @@ private fun readCard(analyticsEvent: AnalyticsEvent?) = scope.launch { } private fun proceedWithScanResponse(scanResponse: ScanResponse) = scope.launch { - val userWallet = UserWalletBuilder( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) - .build() - .guard { - Timber.e("User wallet not created") - return@launch - } + val userWallet = UserWalletBuilder(scanResponse).build().guard { + Timber.e("User wallet not created") + return@launch + } userWalletsListManager.save(userWallet) .doOnFailure { error -> diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 2003719d77..6079110e39 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -4,11 +4,10 @@ import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics -import com.tangem.domain.card.CardTypeResolver +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.* import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.extensions.removeContext @@ -17,7 +16,11 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.features.saveWallet.redux.SaveWalletAction -import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.preferencesStorage +import com.tangem.tap.scope +import com.tangem.tap.store +import com.tangem.tap.tangemSdkManager +import com.tangem.tap.userWalletsListManager import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber @@ -26,11 +29,11 @@ import timber.log.Timber [REDACTED_AUTHOR] */ object OnboardingHelper { - fun isOnboardingCase(response: ScanResponse, cardTypeResolver: CardTypeResolver): Boolean { + fun isOnboardingCase(response: ScanResponse): Boolean { val cardInfoStorage = preferencesStorage.usedCardsPrefStorage val cardId = response.card.cardId return when { - cardTypeResolver.isTangemTwins() -> { + response.cardTypesResolver.isTangemTwins() -> { if (!response.twinsIsTwinned()) { true } else { @@ -38,7 +41,7 @@ object OnboardingHelper { } } - cardTypeResolver.isWallet2() -> { + response.cardTypesResolver.isWallet2() -> { val emptyWallets = response.card.wallets.isEmpty() val activationInProgress = cardInfoStorage.isActivationInProgress(cardId) val backupNotActive = response.card.backupStatus?.isActive != true @@ -70,10 +73,7 @@ object OnboardingHelper { accessCode: String? = null, backupCardsIds: List? = null, ) { - Analytics.setContext( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + Analytics.setContext(scanResponse) when { // When should save user wallets, then save card without navigate to save wallet screen preferencesStorage.shouldSaveUserWallets -> scope.launch { @@ -119,10 +119,7 @@ object OnboardingHelper { } private suspend fun proceedWithScanResponse(scanResponse: ScanResponse, backupCardsIds: List?) { - val userWallet = UserWalletBuilder( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + val userWallet = UserWalletBuilder(scanResponse) .backupCardsIds(backupCardsIds?.toSet()) .build() .guard { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt index 29877cbf50..fddc46b3a8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt @@ -7,7 +7,13 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding -import com.tangem.tap.common.extensions.* +import com.tangem.tap.common.extensions.dispatchDebugErrorNotification +import com.tangem.tap.common.extensions.dispatchDialogShow +import com.tangem.tap.common.extensions.dispatchErrorNotification +import com.tangem.tap.common.extensions.dispatchOnMain +import com.tangem.tap.common.extensions.dispatchOpenUrl +import com.tangem.tap.common.extensions.getAddressData +import com.tangem.tap.common.extensions.getTopUpUrl import com.tangem.tap.common.postUi import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState @@ -23,7 +29,6 @@ import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.models.WalletDialog -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager @@ -118,10 +123,7 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch noteState.walletManager } else { val wmFactory = globalState.tapWalletManager.walletManagerFactory - val walletManager = wmFactory.makePrimaryWalletManager( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ).guard { + val walletManager = wmFactory.makePrimaryWalletManager(scanResponse).guard { val message = "Loading cancelled. Cause: wallet manager didn't created" val customError = TapError.CustomError(message) store.dispatchErrorNotification(customError) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt index 044c9fd13f..ba7983eaa5 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/otherCards/redux/OnboardingOtherCardsMiddleware.kt @@ -3,8 +3,9 @@ package com.tangem.tap.features.onboarding.products.otherCards.redux import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.core.analytics.Analytics +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.extensions.withMainContext -import com.tangem.tap.* +import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.postUi import com.tangem.tap.common.redux.AppState @@ -12,7 +13,10 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.wallet.models.toCurrencies -import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.scope +import com.tangem.tap.store +import com.tangem.tap.tangemSdkManager +import com.tangem.tap.userTokensRepository import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -86,10 +90,9 @@ private fun handleOtherCardsAction(action: Action) { onboardingManager.activationStarted(updatedCard.cardId) store.state.globalState.topUpController?.registerEmptyWallet(updatedResponse) - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - val primaryBlockchain = cardTypeResolver.getBlockchain() + val primaryBlockchain = updatedResponse.cardTypesResolver.getBlockchain() val blockchainNetworks = if (primaryBlockchain != Blockchain.Unknown) { - val primaryToken = cardTypeResolver.getPrimaryToken() + val primaryToken = updatedResponse.cardTypesResolver.getPrimaryToken() val blockchainNetwork = BlockchainNetwork( blockchain = primaryBlockchain, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index 1fa0ce5b48..036482c623 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -29,7 +29,6 @@ import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.models.WalletDialog -import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action @@ -222,10 +221,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) { twinCardsState.walletManager } else { val wmFactory = globalState.tapWalletManager.walletManagerFactory - val walletManager = wmFactory.makePrimaryWalletManager( - scanResponse = getScanResponse(), - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ).guard { + val walletManager = wmFactory.makePrimaryWalletManager(getScanResponse()).guard { val message = "Loading cancelled. Cause: wallet manager didn't created" val customError = TapError.CustomError(message) store.dispatchErrorNotification(customError) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt index d393583ef3..9ba9492c54 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsReducer.kt @@ -1,9 +1,8 @@ package com.tangem.tap.features.onboarding.products.twins.redux +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.getTwinCardNumber import com.tangem.tap.common.redux.AppState -import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.tap.store import org.rekotlin.Action object TwinCardsReducer { @@ -18,8 +17,7 @@ private fun internalReduce(action: Action, state: AppState): TwinCardsState { when (action) { is TwinCardsAction.IfTwinsPrepareState -> { - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - state = if (cardTypeResolver.isTangemTwins()) { + state = if (action.scanResponse.cardTypesResolver.isTangemTwins()) { val cardNumber = action.scanResponse.card.getTwinCardNumber() ?: return state TwinCardsState( diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index dc2a82105e..2f4be5416d 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -7,6 +7,7 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.ifNotNull import com.tangem.core.analytics.Analytics import com.tangem.domain.common.extensions.withMainContext +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.feature.onboarding.data.model.CreateWalletResponse @@ -29,9 +30,9 @@ import com.tangem.tap.features.onboarding.OnboardingDialog import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.wallet.models.toCurrencies import com.tangem.tap.features.wallet.redux.Artwork -import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.launch import org.rekotlin.Action +import org.rekotlin.DispatchFunction import org.rekotlin.Middleware object OnboardingWalletMiddleware { @@ -42,8 +43,8 @@ private val onboardingWalletMiddleware: Middleware = { dispatch, state { next -> { action -> when (action) { - is OnboardingWallet2Action -> handleWallet2Action(action) - else -> handleWalletAction(action) + is OnboardingWallet2Action -> handleWallet2Action(action, state) + else -> handleWalletAction(action, state, dispatch) } next(action) } @@ -51,7 +52,7 @@ private val onboardingWalletMiddleware: Middleware = { dispatch, state } @Suppress("LongMethod", "ComplexMethod") -private fun handleWalletAction(action: Action) { +private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: DispatchFunction) { if (action !is OnboardingWalletAction) return val globalState = store.state.globalState @@ -177,7 +178,7 @@ private fun handleWalletAction(action: Action) { } @Suppress("LongMethod", "ComplexMethod") -private fun handleWallet2Action(action: OnboardingWallet2Action) { +private fun handleWallet2Action(action: OnboardingWallet2Action, state: () -> AppState?) { val globalState = store.state.globalState val onboardingManager = globalState.onboardingState.onboardingManager @@ -185,8 +186,7 @@ private fun handleWallet2Action(action: OnboardingWallet2Action) { when (action) { is OnboardingWallet2Action.Init -> { - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - if (cardTypeResolver.isWallet2()) { + if (scanResponse?.cardTypesResolver?.isWallet2() == true) { store.dispatch(OnboardingWallet2Action.SetDependencies(action.maxProgress)) } } diff --git a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt index 8866609bb7..ec2223b2bd 100644 --- a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt @@ -7,7 +7,6 @@ import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.common.flatMap import com.tangem.core.analytics.Analytics -import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Onboarding @@ -22,7 +21,12 @@ import com.tangem.tap.domain.userWalletList.UserWalletsListManager import com.tangem.tap.domain.userWalletList.di.provideBiometricImplementation import com.tangem.tap.domain.userWalletList.isLockable import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.foregroundActivityObserver +import com.tangem.tap.preferencesStorage +import com.tangem.tap.scope +import com.tangem.tap.store +import com.tangem.tap.tangemSdkManager +import com.tangem.tap.userWalletsListManager import kotlinx.coroutines.launch import org.rekotlin.Middleware import timber.log.Timber @@ -92,10 +96,7 @@ internal class SaveWalletMiddleware { scope.launch { val userWallet = userWalletsListManager.selectedUserWalletSync - ?: UserWalletBuilder( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + ?: UserWalletBuilder(scanResponse) .backupCardsIds(state.backupInfo?.backupCardsIds) .build() ?: return@launch diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index c6ee8940d4..9c1feed6b4 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -4,6 +4,7 @@ import android.graphics.Bitmap import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.WalletManager +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.common.entities.Button import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.common.toggleWidget.WidgetState @@ -49,6 +50,9 @@ data class WalletState( store.state.twinCardsState } + val isTangemTwins: Boolean + get() = store.state.globalState.scanResponse?.cardTypesResolver?.isTangemTwins() == true + val isExchangeServiceFeatureOn: Boolean get() = store.state.globalState.exchangeManager.featureIsSwitchedOn() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index de428f2421..d86a41c389 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -19,7 +19,6 @@ import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.models.WalletDialog -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.userWalletsListManager @@ -83,10 +82,7 @@ class MultiWalletMiddleware { return } val scanResponse = selectedUserWallet.scanResponse - Analytics.addContext( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) + Analytics.addContext(scanResponse) store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false)) store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt index 7b64bf710f..44a7dd5341 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WarningsMiddleware.kt @@ -5,6 +5,7 @@ import com.tangem.blockchain.common.SignatureCountValidator import com.tangem.blockchain.extensions.SimpleResult import com.tangem.common.card.FirmwareVersion import com.tangem.domain.common.TapWorkarounds.isTestCard +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.extensions.dispatchOnMain @@ -106,10 +107,9 @@ class WarningsMiddleware { } private fun checkIfWarningNeeded(scanResponse: ScanResponse): WarningMessage? { - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - if (cardTypeResolver.isTangemTwins() || scanResponse.isDemoCard()) return null + if (scanResponse.cardTypesResolver.isTangemTwins() || scanResponse.isDemoCard()) return null - if (cardTypeResolver.isMultiwalletAllowed()) { + if (scanResponse.cardTypesResolver.isMultiwalletAllowed()) { val isBackupForbidden = with(scanResponse.card.settings) { !(isBackupAllowed || isHDWalletAllowed) } return if (scanResponse.card.hasSignedHashes() && isBackupForbidden) { WarningMessagesManager.signedHashesMultiWalletWarning @@ -139,8 +139,9 @@ class WarningsMiddleware { val card = scanResponse?.card if (card == null || preferencesStorage.usedCardsPrefStorage.wasScanned(card.cardId)) return - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) - if (cardTypeResolver.isTangemTwins() || cardTypeResolver.isMultiwalletAllowed()) return + if (scanResponse.cardTypesResolver.isTangemTwins() || scanResponse.cardTypesResolver.isMultiwalletAllowed()) { + return + } val validator = store.state.walletState.walletManagers.firstOrNull() as? SignatureCountValidator diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt index d07d830d42..95f80ebca8 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter import com.tangem.tap.common.analytics.events.Basic import com.tangem.tap.common.analytics.events.MainScreen @@ -13,7 +14,6 @@ import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.userWalletList.UserWalletsListManager import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.ui.analytics.WalletAnalyticsEventsMapper -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store import com.tangem.tap.walletStoresManager import dagger.hilt.android.lifecycle.HiltViewModel @@ -54,9 +54,8 @@ internal class WalletViewModel @Inject constructor( override fun onCreate(owner: LifecycleOwner) { launch() val scanResponse = store.state.globalState.scanResponse - val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver) if (scanResponse != null) { - val currency = ParamCardCurrencyConverter().convert(cardTypeResolver) + val currency = ParamCardCurrencyConverter().convert(scanResponse.cardTypesResolver) val signInType = store.state.signInState.type if (currency != null && signInType != null) { analyticsEventHandler.send( diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index a53ee4fe57..3528a61c7a 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -22,7 +22,6 @@ import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.model.builders.UserWalletIdBuilder import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.userWalletList.unlockIfLockable -import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull @@ -163,11 +162,7 @@ internal class WalletSelectorMiddleware { } private suspend fun saveUserWalletAndPopBackToWalletScreen(scanResponse: ScanResponse): CompletionResult { - val userWallet = UserWalletBuilder( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) - .build() + val userWallet = UserWalletBuilder(scanResponse).build() ?: return CompletionResult.Failure(TangemSdkError.WalletIsNotCreated()) return userWalletsListManager.save(userWallet) diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt index e24f28d268..2a8ace7ad3 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt @@ -1,11 +1,10 @@ package com.tangem.tap.features.walletSelector.redux +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.CardDTO import com.tangem.tap.common.redux.AppState import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.model.UserWallet -import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.tap.store import org.rekotlin.Action internal object WalletSelectorReducer { @@ -100,10 +99,7 @@ internal object WalletSelectorReducer { ) } else { UserWalletModel.Type.SingleCurrency( - blockchainName = store.state.daggerGraphState - .get(DaggerGraphState::cardTypeResolver) - .getBlockchain() - .fullName, + blockchainName = scanResponse.cardTypesResolver.getBlockchain().fullName, ) } } diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt index 983f4bc963..005bcca0a4 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt @@ -20,7 +20,6 @@ import com.tangem.tap.domain.scanCard.ScanCardProcessor import com.tangem.tap.domain.userWalletList.unlockIfLockable import com.tangem.tap.features.intentHandler.handlers.WalletConnectLinkIntentHandler import com.tangem.tap.features.signin.redux.SignInAction -import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.launch import org.rekotlin.Middleware import timber.log.Timber @@ -80,12 +79,7 @@ internal class WelcomeMiddleware { private fun proceedWithCard(state: WelcomeState) = scope.launch { scanCardInternal { scanResponse -> - val userWallet = UserWalletBuilder( - scanResponse = scanResponse, - cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver), - ) - .build() - ?: return@scanCardInternal + val userWallet = UserWalletBuilder(scanResponse).build() ?: return@scanCardInternal userWalletsListManager.save(userWallet, canOverride = true) .doOnFailure { error -> diff --git a/app/src/main/java/com/tangem/tap/legacy/card/LegacyCardTypeResolver.kt b/app/src/main/java/com/tangem/tap/legacy/card/LegacyCardTypeResolver.kt deleted file mode 100644 index d44eda26cd..0000000000 --- a/app/src/main/java/com/tangem/tap/legacy/card/LegacyCardTypeResolver.kt +++ /dev/null @@ -1,100 +0,0 @@ -package com.tangem.tap.legacy.card - -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.Token -import com.tangem.common.card.EllipticCurve -import com.tangem.common.card.FirmwareVersion -import com.tangem.common.card.WalletData -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider -import com.tangem.domain.common.TapWorkarounds.isStart2Coin -import com.tangem.domain.common.TapWorkarounds.isTestCard -import com.tangem.domain.models.scan.CardDTO -import com.tangem.domain.models.scan.ProductType - -internal class LegacyCardTypeResolver( - private val cardProvider: Provider, - private val productTypeProvider: Provider, - private val walletDataProvider: Provider, -) : CardTypeResolver { - - private val card: CardDTO get() = cardProvider.invoke() - private val productType: ProductType get() = productTypeProvider.invoke() - private val walletData: WalletData? get() = walletDataProvider.invoke() - - override fun isTangemNote(): Boolean = productType == ProductType.Note - - override fun isTangemWallet(): Boolean { - return with(card.settings) { - isBackupAllowed && isHDWalletAllowed && card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable - } - } - - override fun isWallet2(): Boolean { - return with(card) { - firmwareVersion >= FirmwareVersion.KeysImportAvailable && settings.isKeysImportAllowed - } - } - - override fun isTangemTwins(): Boolean = productType == ProductType.Twins - - override fun isStart2Coin(): Boolean = card.isStart2Coin - - override fun isMultiwalletAllowed(): Boolean { - return (multiWalletAvailable() || card.wallets.firstOrNull()?.curve == EllipticCurve.Secp256k1) && - !isTangemTwins() && !card.isStart2Coin && !isTangemNote() - } - - private fun multiWalletAvailable() = card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable - - override fun getBlockchain(): Blockchain { - if (productType == ProductType.Start2Coin) { - return if (card.isTestCard) Blockchain.BitcoinTestnet else Blockchain.Bitcoin - } - - val blockchainName = walletData?.blockchain - ?: return if (productType == ProductType.Note) { - TANGEM_NOTE_BATCHES[card.batchId] ?: Blockchain.Unknown - } else { - Blockchain.Unknown - } - - return Blockchain.fromBlockchainName(blockchainName) - } - - override fun getPrimaryToken(): Token? { - val cardToken = walletData?.token ?: return null - return Token( - name = cardToken.name, - symbol = cardToken.symbol, - contractAddress = cardToken.contractAddress, - decimals = cardToken.decimals, - ) - } - - private fun Blockchain.Companion.fromBlockchainName(name: String): Blockchain { - // workaround for BSC (BNB) notes cards - return when (name) { - "BINANCE" -> Blockchain.BSC - "BINANCE/test" -> Blockchain.BSCTestnet - else -> Blockchain.fromId(name) - } - } - - private companion object { - val TANGEM_NOTE_BATCHES = mapOf( - "AB01" to Blockchain.Bitcoin, - "AB02" to Blockchain.Ethereum, - "AB03" to Blockchain.CardanoShelley, - "AB04" to Blockchain.Dogecoin, - "AB05" to Blockchain.BSC, - "AB06" to Blockchain.XRP, - "AB07" to Blockchain.Bitcoin, - "AB08" to Blockchain.Ethereum, - "AB09" to Blockchain.Bitcoin, // new batches for 3.34 - "AB10" to Blockchain.Ethereum, - "AB11" to Blockchain.Bitcoin, - "AB12" to Blockchain.Ethereum, - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/legacy/card/di/LegacyCardModule.kt b/app/src/main/java/com/tangem/tap/legacy/card/di/LegacyCardModule.kt deleted file mode 100644 index 032d545891..0000000000 --- a/app/src/main/java/com/tangem/tap/legacy/card/di/LegacyCardModule.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.tangem.tap.legacy.card.di - -import com.tangem.domain.card.CardTypeResolver -import com.tangem.domain.common.Provider -import com.tangem.tap.legacy.card.LegacyCardTypeResolver -import com.tangem.tap.proxy.AppStateHolder -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 LegacyCardModule { - - @Provides - @Singleton - fun providesCardTypeResolver(reduxStateHolder: AppStateHolder): CardTypeResolver { - return LegacyCardTypeResolver( - cardProvider = Provider { - requireNotNull(reduxStateHolder.userWalletsListManager?.selectedUserWalletSync?.scanResponse?.card) - }, - productTypeProvider = Provider { - requireNotNull( - value = reduxStateHolder.userWalletsListManager?.selectedUserWalletSync?.scanResponse?.productType, - ) - }, - walletDataProvider = Provider { - requireNotNull(reduxStateHolder.userWalletsListManager?.selectedUserWalletSync?.scanResponse).walletData - }, - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt index ba301a2fc1..c673ac8577 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -29,7 +29,9 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlin.coroutines.suspendCoroutine -class DerivationManagerImpl(private val appStateHolder: AppStateHolder) : DerivationManager { +class DerivationManagerImpl( + private val appStateHolder: AppStateHolder, +) : DerivationManager { override suspend fun deriveMissingBlockchains(currency: Currency) = suspendCoroutine { continuation -> val blockchain = Blockchain.fromNetworkId(currency.networkId) diff --git a/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt b/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt index 0f33e210b7..371f1e21bf 100644 --- a/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt +++ b/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt @@ -46,7 +46,9 @@ class ProxyModule { @Provides @Singleton fun provideDerivationManager(appStateHolder: AppStateHolder): DerivationManager { - return DerivationManagerImpl(appStateHolder = appStateHolder) + return DerivationManagerImpl( + appStateHolder = appStateHolder, + ) } // regions FeatureConsumers 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 a4ca39f942..a741e4dfd4 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 @@ -2,7 +2,6 @@ package com.tangem.tap.proxy.redux import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.connection.NetworkConnectionManager -import com.tangem.domain.card.CardTypeResolver import com.tangem.domain.card.ScanCardUseCase import com.tangem.features.tester.api.TesterRouter import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles @@ -24,7 +23,6 @@ data class DaggerGraphState( val walletConnectRepository: WalletConnectRepository? = null, val walletConnectSessionsRepository: WalletConnectSessionsRepository? = null, val walletConnectInteractor: WalletConnectInteractor? = null, - val cardTypeResolver: CardTypeResolver? = null, ) : StateType { inline fun get(getDependency: DaggerGraphState.() -> T?): T { diff --git a/domain/legacy/src/main/java/com/tangem/domain/card/CardTypeResolver.kt b/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt similarity index 84% rename from domain/legacy/src/main/java/com/tangem/domain/card/CardTypeResolver.kt rename to domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt index 97012f4efd..72e1bfb243 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/card/CardTypeResolver.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/CardTypesResolver.kt @@ -1,23 +1,17 @@ -package com.tangem.domain.card +package com.tangem.domain.common import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token -interface CardTypeResolver { - +interface CardTypesResolver { fun isTangemNote(): Boolean - fun isTangemWallet(): Boolean - fun isWallet2(): Boolean - fun isTangemTwins(): Boolean - fun isStart2Coin(): Boolean fun isMultiwalletAllowed(): Boolean fun getBlockchain(): Blockchain - fun getPrimaryToken(): Token? } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/Provider.kt b/domain/legacy/src/main/java/com/tangem/domain/common/Provider.kt deleted file mode 100644 index c77b356dfc..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/common/Provider.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.tangem.domain.common - -/** - * Provider for lazy initialization - * - * @param action initialization action - * -[REDACTED_AUTHOR] - */ -class Provider(action: () -> T) : () -> T by action \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt b/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt new file mode 100644 index 0000000000..79f908088a --- /dev/null +++ b/domain/legacy/src/main/java/com/tangem/domain/common/TangemCardTypesResolver.kt @@ -0,0 +1,77 @@ +package com.tangem.domain.common + +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Token +import com.tangem.common.card.EllipticCurve +import com.tangem.common.card.FirmwareVersion +import com.tangem.common.card.WalletData +import com.tangem.domain.common.TapWorkarounds.getTangemNoteBlockchain +import com.tangem.domain.common.TapWorkarounds.isStart2Coin +import com.tangem.domain.common.TapWorkarounds.isTestCard +import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.models.scan.ProductType + +class TangemCardTypesResolver( + private val card: CardDTO, + private val productType: ProductType, + private val walletData: WalletData?, +) : CardTypesResolver { + + override fun isTangemNote(): Boolean = productType == ProductType.Note + override fun isTangemWallet(): Boolean = card.settings.isBackupAllowed && + card.settings.isHDWalletAllowed && + card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable + + override fun isWallet2(): Boolean = + card.firmwareVersion >= FirmwareVersion.KeysImportAvailable && card.settings.isKeysImportAllowed + + override fun isTangemTwins(): Boolean = productType == ProductType.Twins + override fun isStart2Coin(): Boolean = card.isStart2Coin + + override fun isMultiwalletAllowed(): Boolean = !isTangemTwins() && + !card.isStart2Coin && + !isTangemNote() && + (multiWalletAvailable() || card.wallets.firstOrNull()?.curve == EllipticCurve.Secp256k1) + + private fun multiWalletAvailable() = card.firmwareVersion >= FirmwareVersion.MultiWalletAvailable + + override fun getBlockchain(): Blockchain { + return when (productType) { + ProductType.Start2Coin -> if (card.isTestCard) Blockchain.BitcoinTestnet else Blockchain.Bitcoin + else -> { + val blockchainName: String = walletData?.blockchain + ?: if (productType == ProductType.Note) { + return card.getTangemNoteBlockchain() ?: Blockchain.Unknown + } else { + return Blockchain.Unknown + } + Blockchain.fromBlockchainName(blockchainName) + } + } + } + + override fun getPrimaryToken(): Token? { + val cardToken = walletData?.token ?: return null + return Token( + cardToken.name, + cardToken.symbol, + cardToken.contractAddress, + cardToken.decimals, + ) + } +} + +private fun Blockchain.Companion.fromBlockchainName(blockchainName: String): Blockchain { + // workaround for BSC (BNB) notes cards + return when (blockchainName) { + "BINANCE" -> { + Blockchain.BSC + } + "BINANCE/test" -> { + Blockchain.BSCTestnet + } + else -> { + Blockchain.fromId(blockchainName) + } + } +} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt b/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt index 144e55921c..5d25521277 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/TapWorkarounds.kt @@ -1,13 +1,14 @@ package com.tangem.domain.common +import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.DerivationStyle +import com.tangem.common.card.Card import com.tangem.domain.models.scan.CardDTO -import java.util.Locale +import java.util.* /** [REDACTED_AUTHOR] */ -@Deprecated(message = "Use CardTypeResolver. [REDACTED_JIRA]") object TapWorkarounds { private const val START_2_COIN_ISSUER = "start2coin" private const val TEST_CARD_BATCH = "99FF" @@ -43,11 +44,34 @@ object TapWorkarounds { val CardDTO.isNotSupportedInThatRelease: Boolean get() = false + private val tangemNoteBatches = mapOf( + "AB01" to Blockchain.Bitcoin, + "AB02" to Blockchain.Ethereum, + "AB03" to Blockchain.CardanoShelley, + "AB04" to Blockchain.Dogecoin, + "AB05" to Blockchain.BSC, + "AB06" to Blockchain.XRP, + "AB07" to Blockchain.Bitcoin, + "AB08" to Blockchain.Ethereum, + "AB09" to Blockchain.Bitcoin, // new batches for 3.34 + "AB10" to Blockchain.Ethereum, + "AB11" to Blockchain.Bitcoin, + "AB12" to Blockchain.Ethereum, + ) + private val excludedBatches = listOf("0027", "0030", "0031", "0035") private val excludedIssuers = listOf("TTM BANK") + @Deprecated( + "Now blockchain is read form files (CardTypesResolver.getBlockchain), " + + "but for previously saved cards this method is still used", + ) + fun CardDTO.getTangemNoteBlockchain(): Blockchain? = tangemNoteBatches[batchId] + fun isStart2CoinIssuer(cardIssuer: String?): Boolean { return cardIssuer?.lowercase(Locale.US) == START_2_COIN_ISSUER } + + fun Card.getTangemNoteBlockchain(): Blockchain? = tangemNoteBatches[batchId] ?: null } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt b/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt index 8e7b1a2099..8438a87f14 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/util/ScanResponseExtensions.kt @@ -4,13 +4,22 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve import com.tangem.common.extensions.toMapKey import com.tangem.crypto.hdWallet.DerivationPath +import com.tangem.domain.common.CardTypesResolver +import com.tangem.domain.common.TangemCardTypesResolver import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.models.scan.ScanResponse -fun ScanResponse.twinsIsTwinned(): Boolean = card.isTangemTwins && walletData != null && secondTwinPublicKey != null +val ScanResponse.cardTypesResolver: CardTypesResolver + get() = TangemCardTypesResolver( + card = card, + productType = productType, + walletData = walletData, + ) +fun ScanResponse.twinsIsTwinned(): Boolean = card.isTangemTwins && walletData != null && secondTwinPublicKey != null fun ScanResponse.supportsHdWallet(): Boolean = card.settings.isHDWalletAllowed +fun ScanResponse.supportsBackup(): Boolean = card.settings.isBackupAllowed fun ScanResponse.hasDerivation(blockchain: Blockchain, rawDerivationPath: String): Boolean { return hasDerivation(blockchain, DerivationPath(rawDerivationPath))