diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 9c29ff39c7..f892dddee4 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -28,6 +28,7 @@ import com.tangem.domain.apptheme.GetAppThemeModeUseCase import com.tangem.domain.apptheme.repository.AppThemeModeRepository import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository import com.tangem.domain.card.ScanCardProcessor +import com.tangem.domain.card.repository.DerivationsRepository import com.tangem.domain.common.LogConfig import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.NetworksRepository @@ -36,6 +37,7 @@ import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles import com.tangem.features.send.api.featuretoggles.SendFeatureToggles +import com.tangem.features.tester.api.TesterFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder import com.tangem.tap.common.analytics.handlers.BlockchainExceptionHandler @@ -151,6 +153,12 @@ internal class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var oneTimeEventFilter: OneTimeEventFilter + + @Inject + lateinit var derivationsRepository: DerivationsRepository + + @Inject + lateinit var testerFeatureToggles: TesterFeatureToggles // endregion Injected override fun onCreate() { @@ -211,7 +219,6 @@ internal class TapApplication : Application(), ImageLoaderFactory { middleware = AppState.getMiddleware(), state = AppState( daggerGraphState = DaggerGraphState( - assetReader = assetReader, networkConnectionManager = networkConnectionManager, customTokenFeatureToggles = customTokenFeatureToggles, walletConnectRepository = walletConnect2Repository, @@ -227,6 +234,8 @@ internal class TapApplication : Application(), ImageLoaderFactory { balanceHidingRepository = balanceHidingRepository, walletsRepository = walletsRepository, sendFeatureToggles = sendFeatureToggles, + derivationsRepository = derivationsRepository, + testerFeatureToggles = testerFeatureToggles, ), ), ) diff --git a/app/src/main/java/com/tangem/tap/di/data/CardDataModule.kt b/app/src/main/java/com/tangem/tap/di/data/CardDataModule.kt new file mode 100644 index 0000000000..0f7457c20f --- /dev/null +++ b/app/src/main/java/com/tangem/tap/di/data/CardDataModule.kt @@ -0,0 +1,27 @@ +package com.tangem.tap.di.data + +import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.card.repository.DerivationsRepository +import com.tangem.tap.domain.TangemSdkManager +import com.tangem.tap.domain.card.DefaultDerivationsRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +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 CardDataModule { + + @Singleton + @Provides + fun providesDerivationsRepository( + tangemSdkManager: TangemSdkManager, + userWalletsStore: UserWalletsStore, + dispatchers: CoroutineDispatcherProvider, + ): DerivationsRepository { + return DefaultDerivationsRepository(tangemSdkManager, userWalletsStore, dispatchers) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt index 3444333c34..0d32faca9a 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/CardDomainModule.kt @@ -1,17 +1,15 @@ package com.tangem.tap.di.domain -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.card.* import com.tangem.domain.card.repository.CardRepository import com.tangem.domain.card.repository.CardSdkConfigRepository +import com.tangem.domain.card.repository.DerivationsRepository import com.tangem.domain.demo.DemoConfig import com.tangem.domain.demo.IsDemoCardUseCase import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.domain.wallets.usecase.IsNeedToBackupUseCase import com.tangem.tap.domain.TangemSdkManager -import com.tangem.tap.domain.card.DefaultDerivationsRepository import com.tangem.tap.domain.card.DefaultDerivePublicKeysUseCase -import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -66,12 +64,11 @@ internal object CardDomainModule { @ViewModelScoped fun provideDerivePublicKeysUseCase( tangemSdkManager: TangemSdkManager, - userWalletsStore: UserWalletsStore, - dispatchers: CoroutineDispatcherProvider, + derivationsRepository: DerivationsRepository, ): DerivePublicKeysUseCase { return DefaultDerivePublicKeysUseCase( tangemSdkManager = tangemSdkManager, - derivationsRepository = DefaultDerivationsRepository(tangemSdkManager, userWalletsStore, dispatchers), + derivationsRepository = derivationsRepository, ) } diff --git a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt index bd0b2d6054..4b2f3852b6 100644 --- a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt @@ -27,6 +27,11 @@ internal class DefaultDerivationsRepository( override suspend fun derivePublicKeys(userWalletId: UserWalletId, currencies: List) { val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("User wallet not found") + if (!userWallet.scanResponse.card.settings.isHDWalletAllowed) { + Timber.d("Nothing to derive") + return + } + val derivations = MissedDerivationsFinder(scanResponse = userWallet.scanResponse) .find(currencies) .ifEmpty { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt index e2c41c8e88..eb39d0d64b 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt @@ -24,6 +24,7 @@ import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapError +import com.tangem.tap.domain.card.DefaultDerivePublicKeysUseCase import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store @@ -31,6 +32,7 @@ import com.tangem.tap.tangemSdkManager import com.tangem.tap.userWalletsListManager import kotlinx.coroutines.launch import org.rekotlin.Middleware +import timber.log.Timber @Suppress("LargeClass") object TokensMiddleware { @@ -82,22 +84,40 @@ object TokensMiddleware { val currencyList = blockchainsToAdd + tokensToAdd - if (scanResponse.supportsHdWallet()) { - deriveMissingCoins(scanResponse = scanResponse, currencyList = currencyList) { - submitAdd( - userWallet = action.userWallet, - updatedScanResponse = it, - currencyList = currencyList, - ) - } + val featureToggles = store.state.daggerGraphState.get(DaggerGraphState::testerFeatureToggles) + if (featureToggles.isDerivePublicKeysRefactoringEnabled) { + val derivePublicKeys = DefaultDerivePublicKeysUseCase( + tangemSdkManager = tangemSdkManager, + derivationsRepository = store.state.daggerGraphState.get(DaggerGraphState::derivationsRepository), + ) + + derivePublicKeys(userWalletId = action.userWallet.walletId, currencies = currencyList) + .onRight { + addCryptoCurrenciesUseCase( + userWalletId = action.userWallet.walletId, + currencies = currencyList, + ) + store.dispatchOnMain(NavigationAction.PopBackTo()) + } + .onLeft { Timber.e("Failed to derive public keys: $it") } } else { - submitAdd(action.userWallet, scanResponse, currencyList) + // TODO: delete [REDACTED_JIRA] + if (scanResponse.supportsHdWallet()) { + deriveMissingCoins(scanResponse = scanResponse, currencyList = currencyList) { + submitAdd( + userWallet = action.userWallet, + updatedScanResponse = it, + currencyList = currencyList, + ) + } + } else { + submitAdd(action.userWallet, scanResponse, currencyList) + } } } } @Deprecated(message = "Use DerivePublicKeysUseCase instead") - // FIXME: Migration [REDACTED_JIRA] private fun deriveMissingCoins( scanResponse: ScanResponse, currencyList: List, 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 0a28f3831c..540e3351e6 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 @@ -1,6 +1,5 @@ package com.tangem.tap.proxy.redux -import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.domain.appcurrency.repository.AppCurrencyRepository import com.tangem.domain.apptheme.repository.AppThemeModeRepository @@ -8,6 +7,7 @@ import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.card.ScanCardUseCase import com.tangem.domain.card.repository.CardSdkConfigRepository +import com.tangem.domain.card.repository.DerivationsRepository import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.NetworksRepository import com.tangem.domain.walletmanager.WalletManagersFacade @@ -16,6 +16,7 @@ import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggle import com.tangem.features.managetokens.navigation.ManageTokensRouter import com.tangem.features.send.api.featuretoggles.SendFeatureToggles import com.tangem.features.send.api.navigation.SendRouter +import com.tangem.features.tester.api.TesterFeatureToggles import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.navigation.WalletRouter @@ -27,7 +28,6 @@ import com.tangem.tap.proxy.AppStateHolder import org.rekotlin.StateType data class DaggerGraphState( - val assetReader: AssetReader? = null, val testerRouter: TesterRouter? = null, val networkConnectionManager: NetworkConnectionManager? = null, val customTokenFeatureToggles: CustomTokenFeatureToggles? = null, @@ -53,6 +53,8 @@ data class DaggerGraphState( // FIXME: It is used only for TokensList screen. Remove after refactoring of TokensList val currenciesRepository: CurrenciesRepository? = null, + val derivationsRepository: DerivationsRepository? = null, + val testerFeatureToggles: TesterFeatureToggles? = null, ) : StateType { inline fun get(getDependency: DaggerGraphState.() -> T?): T {