Updated on 2026-08-14
This commit is contained in:
parent
0b81b905c3
commit
50332186fa
47 changed files with 38 additions and 408 deletions
|
|
@ -194,21 +194,10 @@ abstract class BaseTestCase : TestCase(
|
||||||
"SWAP_REDESIGN_ENABLED" to false,
|
"SWAP_REDESIGN_ENABLED" to false,
|
||||||
"ACCOUNTS_FEATURE_ENABLED" to true,
|
"ACCOUNTS_FEATURE_ENABLED" to true,
|
||||||
"MAIN_SCREEN_QR_SCANNING_ENABLED" to true,
|
"MAIN_SCREEN_QR_SCANNING_ENABLED" to true,
|
||||||
"ASSETS_DISCOVERY_ENABLED" to true,
|
|
||||||
"VISA_ONBOARDING_ENABLED" to true,
|
"VISA_ONBOARDING_ENABLED" to true,
|
||||||
// Version-gated toggles released in versions <= 6.0 — forced on so tests run against the actual
|
// Version-gated toggles released in versions <= 6.0 — forced on so tests run against the actual
|
||||||
// build even when the app version resolves to 1.0.0-SNAPSHOT on CI (then 1.0.0 < x.xx would
|
// build even when the app version resolves to 1.0.0-SNAPSHOT on CI (then 1.0.0 < x.xx would
|
||||||
// disable them). On the releases/6.0 branch every toggle with version <= 6.0 ships enabled.
|
// disable them). On the releases/6.0 branch every toggle with version <= 6.0 ships enabled.
|
||||||
// 5.37
|
|
||||||
"HEDERA_ERC20_ENABLED" to true,
|
|
||||||
// 5.39
|
|
||||||
"DYNAMIC_ADDRESSES_ENABLED" to true,
|
|
||||||
"SOLANA_TX_HISTORY_ENABLED" to true,
|
|
||||||
"SOLANA_SCALED_UI_AMOUNT_ENABLED" to true,
|
|
||||||
"AND_15310_ADD_FUNDS_STAGE1" to true,
|
|
||||||
"AND_15101_TANGEM_PAY_HOT_WALLET_ONBOARDING" to true,
|
|
||||||
"AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED" to true,
|
|
||||||
"TWI_1512_HIDE_STORIES_FOR_REFERRAL_ENABLED" to true,
|
|
||||||
// 5.40
|
// 5.40
|
||||||
"TWI_1377_MANAGE_FUNDS" to true,
|
"TWI_1377_MANAGE_FUNDS" to true,
|
||||||
// 6.0
|
// 6.0
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package com.tangem.tap.common.analytics.appsflyer
|
||||||
|
|
||||||
import com.tangem.common.routing.AppRoute
|
import com.tangem.common.routing.AppRoute
|
||||||
import com.tangem.common.routing.AppRouter
|
import com.tangem.common.routing.AppRouter
|
||||||
import com.tangem.core.configtoggle.FeatureToggles
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||||
import com.tangem.domain.appsflyer.AppsFlyerDeeplink
|
import com.tangem.domain.appsflyer.AppsFlyerDeeplink
|
||||||
import com.tangem.domain.appsflyer.usecase.ClearAppsFlyerDeeplinkUseCase
|
import com.tangem.domain.appsflyer.usecase.ClearAppsFlyerDeeplinkUseCase
|
||||||
|
|
@ -29,7 +27,6 @@ class AppsFlyerDeeplinkRouter @Inject constructor(
|
||||||
private val appsFlyerStore: AppsFlyerStore,
|
private val appsFlyerStore: AppsFlyerStore,
|
||||||
private val userWalletsListRepository: UserWalletsListRepository,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val clearAppsFlyerDeeplinkUseCase: ClearAppsFlyerDeeplinkUseCase,
|
private val clearAppsFlyerDeeplinkUseCase: ClearAppsFlyerDeeplinkUseCase,
|
||||||
private val featureTogglesManager: FeatureTogglesManager,
|
|
||||||
private val appRouter: AppRouter,
|
private val appRouter: AppRouter,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
@ -54,11 +51,6 @@ class AppsFlyerDeeplinkRouter @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun routeTangemPayOnboarding(currentRoute: AppRoute) {
|
private suspend fun routeTangemPayOnboarding(currentRoute: AppRoute) {
|
||||||
val isEnabled = featureTogglesManager.isFeatureEnabled(
|
|
||||||
FeatureToggles.AND_15101_TANGEM_PAY_HOT_WALLET_ONBOARDING,
|
|
||||||
)
|
|
||||||
if (!isEnabled) return
|
|
||||||
|
|
||||||
// Not on an idle entry screen yet: keep the deep link pending, re-evaluate on next route change.
|
// Not on an idle entry screen yet: keep the deep link pending, re-evaluate on next route change.
|
||||||
if (!isIdleEntryPoint(currentRoute)) return
|
if (!isIdleEntryPoint(currentRoute)) return
|
||||||
|
|
||||||
|
|
@ -76,11 +68,6 @@ class AppsFlyerDeeplinkRouter @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun routeReferral(currentRoute: AppRoute) {
|
private suspend fun routeReferral(currentRoute: AppRoute) {
|
||||||
val isEnabled = featureTogglesManager.isFeatureEnabled(
|
|
||||||
FeatureToggles.TWI_1512_HIDE_STORIES_FOR_REFERRAL_ENABLED,
|
|
||||||
)
|
|
||||||
if (!isEnabled) return
|
|
||||||
|
|
||||||
// Referral targets fresh installs: from an idle entry screen, go straight to hot wallet creation
|
// Referral targets fresh installs: from an idle entry screen, go straight to hot wallet creation
|
||||||
// (skips stories). The deep link is NOT cleared here — it stays as referral attribution (read by
|
// (skips stories). The deep link is NOT cleared here — it stays as referral attribution (read by
|
||||||
// IsReferralInstallUseCase, cleared on wallet creation); replaceAll keeps it off the back stack.
|
// IsReferralInstallUseCase, cleared on wallet creation); replaceAll keeps it off the back stack.
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.tangem.tap.di.domain
|
package com.tangem.tap.di.domain
|
||||||
|
|
||||||
import com.tangem.domain.dynamicaddresses.CreateConsolidationTransactionUseCase
|
import com.tangem.domain.dynamicaddresses.CreateConsolidationTransactionUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.EnableDynamicAddressesUseCase
|
import com.tangem.domain.dynamicaddresses.EnableDynamicAddressesUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.GetDynamicAddressesStatusUseCase
|
import com.tangem.domain.dynamicaddresses.GetDynamicAddressesStatusUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
||||||
|
|
@ -71,10 +70,8 @@ internal object DynamicAddressesDomainModule {
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideIsDynamicAddressesAvailableUseCase(
|
fun provideIsDynamicAddressesAvailableUseCase(): IsDynamicAddressesAvailableUseCase {
|
||||||
featureToggles: DynamicAddressesFeatureToggles,
|
return IsDynamicAddressesAvailableUseCase()
|
||||||
): IsDynamicAddressesAvailableUseCase {
|
|
||||||
return IsDynamicAddressesAvailableUseCase(featureToggles)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.core.configtoggle.FeatureToggles
|
import com.tangem.core.configtoggle.FeatureToggles
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
||||||
import com.tangem.domain.transaction.GaslessYieldRepository
|
import com.tangem.domain.transaction.GaslessYieldRepository
|
||||||
|
|
@ -287,7 +286,6 @@ internal object TransactionDomainModule {
|
||||||
getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase,
|
getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase,
|
||||||
getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase,
|
getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase,
|
||||||
dynamicAddressesRepository: DynamicAddressesRepository,
|
dynamicAddressesRepository: DynamicAddressesRepository,
|
||||||
dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
userWalletsListRepository: UserWalletsListRepository,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
): ReceiveAddressesFactory {
|
): ReceiveAddressesFactory {
|
||||||
return ReceiveAddressesFactory(
|
return ReceiveAddressesFactory(
|
||||||
|
|
@ -295,7 +293,6 @@ internal object TransactionDomainModule {
|
||||||
getViewedTokenReceiveWarningUseCase = getViewedTokenReceiveWarningUseCase,
|
getViewedTokenReceiveWarningUseCase = getViewedTokenReceiveWarningUseCase,
|
||||||
getDynamicReceiveAddressUseCase = getDynamicReceiveAddressUseCase,
|
getDynamicReceiveAddressUseCase = getDynamicReceiveAddressUseCase,
|
||||||
dynamicAddressesRepository = dynamicAddressesRepository,
|
dynamicAddressesRepository = dynamicAddressesRepository,
|
||||||
dynamicAddressesFeatureToggles = dynamicAddressesFeatureToggles,
|
|
||||||
userWalletsListRepository = userWalletsListRepository,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package com.tangem.tap.common.analytics.appsflyer
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import com.tangem.common.routing.AppRoute
|
import com.tangem.common.routing.AppRoute
|
||||||
import com.tangem.common.routing.AppRouter
|
import com.tangem.common.routing.AppRouter
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||||
import com.tangem.domain.appsflyer.usecase.ClearAppsFlyerDeeplinkUseCase
|
import com.tangem.domain.appsflyer.usecase.ClearAppsFlyerDeeplinkUseCase
|
||||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
|
|
@ -33,14 +32,12 @@ internal class AppsFlyerDeeplinkRouterTest {
|
||||||
private val appsFlyerStore: AppsFlyerStore = mockk()
|
private val appsFlyerStore: AppsFlyerStore = mockk()
|
||||||
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
||||||
private val clearAppsFlyerDeeplinkUseCase: ClearAppsFlyerDeeplinkUseCase = mockk(relaxed = true)
|
private val clearAppsFlyerDeeplinkUseCase: ClearAppsFlyerDeeplinkUseCase = mockk(relaxed = true)
|
||||||
private val featureTogglesManager: FeatureTogglesManager = mockk()
|
|
||||||
private val appRouter: AppRouter = mockk(relaxed = true)
|
private val appRouter: AppRouter = mockk(relaxed = true)
|
||||||
|
|
||||||
private val router = AppsFlyerDeeplinkRouter(
|
private val router = AppsFlyerDeeplinkRouter(
|
||||||
appsFlyerStore = appsFlyerStore,
|
appsFlyerStore = appsFlyerStore,
|
||||||
userWalletsListRepository = userWalletsListRepository,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
clearAppsFlyerDeeplinkUseCase = clearAppsFlyerDeeplinkUseCase,
|
clearAppsFlyerDeeplinkUseCase = clearAppsFlyerDeeplinkUseCase,
|
||||||
featureTogglesManager = featureTogglesManager,
|
|
||||||
appRouter = appRouter,
|
appRouter = appRouter,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -50,11 +47,9 @@ internal class AppsFlyerDeeplinkRouterTest {
|
||||||
appsFlyerStore,
|
appsFlyerStore,
|
||||||
userWalletsListRepository,
|
userWalletsListRepository,
|
||||||
clearAppsFlyerDeeplinkUseCase,
|
clearAppsFlyerDeeplinkUseCase,
|
||||||
featureTogglesManager,
|
|
||||||
appRouter,
|
appRouter,
|
||||||
)
|
)
|
||||||
// Happy baseline: feature on, deep link pending, authorized.
|
// Happy baseline: deep link pending, authorized.
|
||||||
every { featureTogglesManager.isFeatureEnabled(any()) } returns true
|
|
||||||
every { appsFlyerStore.observeNavigationDeeplink() } returns flowOf("tpay_mobileonboard")
|
every { appsFlyerStore.observeNavigationDeeplink() } returns flowOf("tpay_mobileonboard")
|
||||||
coEvery { userWalletsListRepository.userWalletsSync() } returns listOf(mockk<UserWallet>())
|
coEvery { userWalletsListRepository.userWalletsSync() } returns listOf(mockk<UserWallet>())
|
||||||
}
|
}
|
||||||
|
|
@ -161,20 +156,5 @@ internal class AppsFlyerDeeplinkRouterTest {
|
||||||
verify(exactly = 0) { appRouter.push(any(), any()) }
|
verify(exactly = 0) { appRouter.push(any(), any()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN feature disabled WHEN observe THEN does not navigate`() = runTest(UnconfinedTestDispatcher()) {
|
|
||||||
// Arrange
|
|
||||||
every { featureTogglesManager.isFeatureEnabled(any()) } returns false
|
|
||||||
val currentRoute = MutableStateFlow<AppRoute?>(AppRoute.Wallet)
|
|
||||||
|
|
||||||
// Act
|
|
||||||
router.observe(backgroundScope, currentRoute)
|
|
||||||
advanceUntilIdle()
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
coVerify(exactly = 0) { userWalletsListRepository.userWalletsSync() }
|
|
||||||
verify(exactly = 0) { appRouter.push(any(), any()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
}
|
}
|
||||||
|
|
@ -23,30 +23,10 @@
|
||||||
"name": "APP_REDESIGN_ENABLED",
|
"name": "APP_REDESIGN_ENABLED",
|
||||||
"version": "6.0"
|
"version": "6.0"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "DYNAMIC_ADDRESSES_ENABLED",
|
|
||||||
"version": "5.39"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "VIRTUAL_ACCOUNTS_ENABLED",
|
"name": "VIRTUAL_ACCOUNTS_ENABLED",
|
||||||
"version": "undefined"
|
"version": "undefined"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "ASSETS_DISCOVERY_ENABLED",
|
|
||||||
"version": "5.38"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "SOLANA_TX_HISTORY_ENABLED",
|
|
||||||
"version": "5.39"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "SOLANA_SCALED_UI_AMOUNT_ENABLED",
|
|
||||||
"version": "5.39"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "HEDERA_ERC20_ENABLED",
|
|
||||||
"version": "5.37"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "WALLET_CONNECT_BITCOIN_ENABLED",
|
"name": "WALLET_CONNECT_BITCOIN_ENABLED",
|
||||||
"version": "undefined"
|
"version": "undefined"
|
||||||
|
|
@ -75,26 +55,10 @@
|
||||||
"name": "AND_15596_ONBOARDING_PUSH_NOTIFICATION_DOUBLE_ASK_AB_ENABLED",
|
"name": "AND_15596_ONBOARDING_PUSH_NOTIFICATION_DOUBLE_ASK_AB_ENABLED",
|
||||||
"version": "6.0"
|
"version": "6.0"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "AND_15310_ADD_FUNDS_STAGE1",
|
|
||||||
"version": "5.39"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "TWI_1377_MANAGE_FUNDS",
|
"name": "TWI_1377_MANAGE_FUNDS",
|
||||||
"version": "6.0"
|
"version": "6.0"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "AND_15101_TANGEM_PAY_HOT_WALLET_ONBOARDING",
|
|
||||||
"version": "5.39"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED",
|
|
||||||
"version": "5.39"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "TWI_1512_HIDE_STORIES_FOR_REFERRAL_ENABLED",
|
|
||||||
"version": "5.39"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "AND_15438_BACKEND_AUTHENTICATION_ENABLED",
|
"name": "AND_15438_BACKEND_AUTHENTICATION_ENABLED",
|
||||||
"version": "undefined"
|
"version": "undefined"
|
||||||
|
|
|
||||||
|
|
@ -40,12 +40,7 @@ internal class FeatureTogglesNamingConventionTest {
|
||||||
val EXCLUDED_TOGGLES_LIST = setOf(
|
val EXCLUDED_TOGGLES_LIST = setOf(
|
||||||
"ADDRESS_SYNC_ENABLED",
|
"ADDRESS_SYNC_ENABLED",
|
||||||
"APP_REDESIGN_ENABLED",
|
"APP_REDESIGN_ENABLED",
|
||||||
"ASSETS_DISCOVERY_ENABLED",
|
|
||||||
"DYNAMIC_ADDRESSES_ENABLED",
|
|
||||||
"HEDERA_ERC20_ENABLED",
|
|
||||||
"NEW_CARD_SCANNING_ENABLED",
|
"NEW_CARD_SCANNING_ENABLED",
|
||||||
"SOLANA_SCALED_UI_AMOUNT_ENABLED",
|
|
||||||
"SOLANA_TX_HISTORY_ENABLED",
|
|
||||||
"VIRTUAL_ACCOUNTS_ENABLED",
|
"VIRTUAL_ACCOUNTS_ENABLED",
|
||||||
"VISA_ONBOARDING_ENABLED",
|
"VISA_ONBOARDING_ENABLED",
|
||||||
"WALLET_CONNECT_BITCOIN_ENABLED",
|
"WALLET_CONNECT_BITCOIN_ENABLED",
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
package com.tangem.data.account.utils
|
package com.tangem.data.account.utils
|
||||||
|
|
||||||
import com.tangem.blockchain.common.Blockchain
|
import com.tangem.blockchain.common.Blockchain
|
||||||
import com.tangem.core.configtoggle.FeatureToggles
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.data.account.converter.CryptoPortfolioConverter
|
import com.tangem.data.account.converter.CryptoPortfolioConverter
|
||||||
import com.tangem.data.common.currency.UserTokensResponseFactory
|
import com.tangem.data.common.currency.UserTokensResponseFactory
|
||||||
import com.tangem.data.common.network.NetworkFactory
|
import com.tangem.data.common.network.NetworkFactory
|
||||||
|
|
@ -34,7 +32,6 @@ internal class DefaultWalletAccountsResponseFactory @Inject constructor(
|
||||||
private val cryptoPortfolioCF: CryptoPortfolioConverter.Factory,
|
private val cryptoPortfolioCF: CryptoPortfolioConverter.Factory,
|
||||||
private val userTokensResponseFactory: UserTokensResponseFactory,
|
private val userTokensResponseFactory: UserTokensResponseFactory,
|
||||||
private val networkFactory: NetworkFactory,
|
private val networkFactory: NetworkFactory,
|
||||||
private val featureTogglesManager: FeatureTogglesManager,
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun create(userWalletId: UserWalletId, userTokensResponse: UserTokensResponse?): GetWalletAccountsResponse {
|
fun create(userWalletId: UserWalletId, userTokensResponse: UserTokensResponse?): GetWalletAccountsResponse {
|
||||||
|
|
@ -79,11 +76,10 @@ internal class DefaultWalletAccountsResponseFactory @Inject constructor(
|
||||||
|
|
||||||
private fun UserWallet.extraDefaultBlockchains(): List<Blockchain> {
|
private fun UserWallet.extraDefaultBlockchains(): List<Blockchain> {
|
||||||
val batchId = (this as? UserWallet.Cold)?.scanResponse?.card?.batchId ?: return emptyList()
|
val batchId = (this as? UserWallet.Cold)?.scanResponse?.card?.batchId ?: return emptyList()
|
||||||
return when {
|
return if (batchId == ADI_PROMO_BATCH_ID) {
|
||||||
batchId == ADI_PROMO_BATCH_ID &&
|
listOf(Blockchain.Adi)
|
||||||
featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED) ->
|
} else {
|
||||||
listOf(Blockchain.Adi)
|
emptyList()
|
||||||
else -> emptyList()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package com.tangem.data.account.utils
|
||||||
|
|
||||||
import com.google.common.truth.Truth
|
import com.google.common.truth.Truth
|
||||||
import com.tangem.blockchain.common.Blockchain
|
import com.tangem.blockchain.common.Blockchain
|
||||||
import com.tangem.core.configtoggle.FeatureToggles
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.data.account.converter.CryptoPortfolioConverter
|
import com.tangem.data.account.converter.CryptoPortfolioConverter
|
||||||
import com.tangem.data.account.converter.createWalletAccountDTO
|
import com.tangem.data.account.converter.createWalletAccountDTO
|
||||||
import com.tangem.data.account.utils.GetWalletAccountsResponseExtTest.Companion.createUserToken
|
import com.tangem.data.account.utils.GetWalletAccountsResponseExtTest.Companion.createUserToken
|
||||||
|
|
@ -35,14 +33,12 @@ class DefaultWalletAccountsResponseFactoryTest {
|
||||||
private val cryptoPortfolioConverter = mockk<CryptoPortfolioConverter>()
|
private val cryptoPortfolioConverter = mockk<CryptoPortfolioConverter>()
|
||||||
private val userTokensResponseFactory = mockk<UserTokensResponseFactory>()
|
private val userTokensResponseFactory = mockk<UserTokensResponseFactory>()
|
||||||
private val networkFactory = mockk<NetworkFactory>()
|
private val networkFactory = mockk<NetworkFactory>()
|
||||||
private val featureTogglesManager = mockk<FeatureTogglesManager>()
|
|
||||||
|
|
||||||
private val factory = DefaultWalletAccountsResponseFactory(
|
private val factory = DefaultWalletAccountsResponseFactory(
|
||||||
userWalletsListRepository = userWalletsListRepository,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
cryptoPortfolioCF = cryptoPortfolioCF,
|
cryptoPortfolioCF = cryptoPortfolioCF,
|
||||||
userTokensResponseFactory = userTokensResponseFactory,
|
userTokensResponseFactory = userTokensResponseFactory,
|
||||||
networkFactory = networkFactory,
|
networkFactory = networkFactory,
|
||||||
featureTogglesManager = featureTogglesManager,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
private val userWalletId = UserWalletId("011")
|
private val userWalletId = UserWalletId("011")
|
||||||
|
|
@ -221,7 +217,7 @@ class DefaultWalletAccountsResponseFactoryTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `create passes ADI as extra blockchain when batch is BB000053 and toggle is on`() = runTest {
|
fun `create passes ADI as extra blockchain when batch is BB000053`() = runTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val userWallet = mockk<UserWallet.Cold>(relaxed = true) {
|
val userWallet = mockk<UserWallet.Cold>(relaxed = true) {
|
||||||
every { walletId } returns userWalletId
|
every { walletId } returns userWalletId
|
||||||
|
|
@ -229,9 +225,6 @@ class DefaultWalletAccountsResponseFactoryTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
every { userWalletsListRepository.userWallets } returns MutableStateFlow(listOf(userWallet))
|
every { userWalletsListRepository.userWallets } returns MutableStateFlow(listOf(userWallet))
|
||||||
every {
|
|
||||||
featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED)
|
|
||||||
} returns true
|
|
||||||
|
|
||||||
val accounts = AccountList.empty(userWallet.walletId).accounts
|
val accounts = AccountList.empty(userWallet.walletId).accounts
|
||||||
.filterIsInstance<Account.CryptoPortfolio>()
|
.filterIsInstance<Account.CryptoPortfolio>()
|
||||||
|
|
@ -265,51 +258,7 @@ class DefaultWalletAccountsResponseFactoryTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `create passes no extra blockchains when batch is BB000053 but toggle is off`() = runTest {
|
fun `create passes no extra blockchains when batch is not BB000053`() = runTest {
|
||||||
// Arrange
|
|
||||||
val userWallet = mockk<UserWallet.Cold>(relaxed = true) {
|
|
||||||
every { walletId } returns userWalletId
|
|
||||||
every { scanResponse.card.batchId } returns "BB000053"
|
|
||||||
}
|
|
||||||
|
|
||||||
every { userWalletsListRepository.userWallets } returns MutableStateFlow(listOf(userWallet))
|
|
||||||
every {
|
|
||||||
featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED)
|
|
||||||
} returns false
|
|
||||||
|
|
||||||
val accounts = AccountList.empty(userWallet.walletId).accounts
|
|
||||||
.filterIsInstance<Account.CryptoPortfolio>()
|
|
||||||
val defaultResponse = UserTokensResponse(
|
|
||||||
group = UserTokensResponse.GroupType.NETWORK,
|
|
||||||
sort = UserTokensResponse.SortType.BALANCE,
|
|
||||||
tokens = emptyList(),
|
|
||||||
)
|
|
||||||
every {
|
|
||||||
userTokensResponseFactory.createDefaultResponse(
|
|
||||||
userWallet = userWallet,
|
|
||||||
networkFactory = networkFactory,
|
|
||||||
accountId = accounts.first().accountId,
|
|
||||||
extraBlockchains = emptyList(),
|
|
||||||
)
|
|
||||||
} returns defaultResponse
|
|
||||||
every { cryptoPortfolioConverter.convertListBack(accounts) } returns emptyList()
|
|
||||||
|
|
||||||
// Act
|
|
||||||
factory.create(userWalletId, null)
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
coVerifyOrder {
|
|
||||||
userTokensResponseFactory.createDefaultResponse(
|
|
||||||
userWallet = userWallet,
|
|
||||||
networkFactory = networkFactory,
|
|
||||||
accountId = accounts.first().accountId,
|
|
||||||
extraBlockchains = emptyList(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `create passes no extra blockchains when batch is not BB000053 even if toggle is on`() = runTest {
|
|
||||||
// Arrange
|
// Arrange
|
||||||
val userWallet = mockk<UserWallet.Cold>(relaxed = true) {
|
val userWallet = mockk<UserWallet.Cold>(relaxed = true) {
|
||||||
every { walletId } returns userWalletId
|
every { walletId } returns userWalletId
|
||||||
|
|
@ -317,9 +266,6 @@ class DefaultWalletAccountsResponseFactoryTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
every { userWalletsListRepository.userWallets } returns MutableStateFlow(listOf(userWallet))
|
every { userWalletsListRepository.userWallets } returns MutableStateFlow(listOf(userWallet))
|
||||||
every {
|
|
||||||
featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15402_ADI_MAIN_SCREEN_DEFAULT_ENABLED)
|
|
||||||
} returns true
|
|
||||||
|
|
||||||
val accounts = AccountList.empty(userWallet.walletId).accounts
|
val accounts = AccountList.empty(userWallet.walletId).accounts
|
||||||
.filterIsInstance<Account.CryptoPortfolio>()
|
.filterIsInstance<Account.CryptoPortfolio>()
|
||||||
|
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
package com.tangem.data.dynamicaddresses
|
|
||||||
|
|
||||||
import com.tangem.core.configtoggle.FeatureToggles
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
|
|
||||||
internal class DefaultDynamicAddressesFeatureToggles(
|
|
||||||
private val featureTogglesManager: FeatureTogglesManager,
|
|
||||||
) : DynamicAddressesFeatureToggles {
|
|
||||||
|
|
||||||
override val isDynamicAddressesEnabled: Boolean
|
|
||||||
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.DYNAMIC_ADDRESSES_ENABLED)
|
|
||||||
}
|
|
||||||
|
|
@ -6,7 +6,6 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
||||||
import com.tangem.domain.account.repository.AccountsCRUDRepository
|
import com.tangem.domain.account.repository.AccountsCRUDRepository
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesDerivationChecker
|
import com.tangem.domain.dynamicaddresses.DynamicAddressesDerivationChecker
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesSupportedBlockchains
|
import com.tangem.domain.dynamicaddresses.DynamicAddressesSupportedBlockchains
|
||||||
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
|
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
|
||||||
|
|
@ -35,7 +34,6 @@ internal class DefaultDynamicAddressesRepository(
|
||||||
private val walletAccountsSaver: WalletAccountsSaver,
|
private val walletAccountsSaver: WalletAccountsSaver,
|
||||||
private val accountsCRUDRepository: AccountsCRUDRepository,
|
private val accountsCRUDRepository: AccountsCRUDRepository,
|
||||||
private val walletManagersFacade: WalletManagersFacade,
|
private val walletManagersFacade: WalletManagersFacade,
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
private val getDerivedXpubUseCase: GetDerivedXpubUseCase,
|
private val getDerivedXpubUseCase: GetDerivedXpubUseCase,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
) : DynamicAddressesRepository {
|
) : DynamicAddressesRepository {
|
||||||
|
|
@ -107,7 +105,6 @@ internal class DefaultDynamicAddressesRepository(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hasFundsOnAdditionalAddresses(userWalletId: UserWalletId, network: Network): Flow<Boolean> {
|
override fun hasFundsOnAdditionalAddresses(userWalletId: UserWalletId, network: Network): Flow<Boolean> {
|
||||||
if (!dynamicAddressesFeatureToggles.isDynamicAddressesEnabled) return flowOf(false)
|
|
||||||
if (!DynamicAddressesSupportedBlockchains.isSupportedByNetworkId(network.id.rawId.value)) return flowOf(false)
|
if (!DynamicAddressesSupportedBlockchains.isSupportedByNetworkId(network.id.rawId.value)) return flowOf(false)
|
||||||
|
|
||||||
return getStatus(userWalletId, network)
|
return getStatus(userWalletId, network)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package com.tangem.data.dynamicaddresses
|
||||||
|
|
||||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.common.wallets.getSyncOrNull
|
import com.tangem.domain.common.wallets.getSyncOrNull
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesSupportedBlockchains
|
import com.tangem.domain.dynamicaddresses.DynamicAddressesSupportedBlockchains
|
||||||
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
|
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
|
||||||
|
|
@ -22,14 +21,11 @@ import javax.inject.Singleton
|
||||||
@Singleton
|
@Singleton
|
||||||
class DynamicAddressesInitializer @Inject constructor(
|
class DynamicAddressesInitializer @Inject constructor(
|
||||||
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
private val getDerivedXpubUseCase: GetDerivedXpubUseCase,
|
private val getDerivedXpubUseCase: GetDerivedXpubUseCase,
|
||||||
private val userWalletsListRepository: UserWalletsListRepository,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
suspend fun getXpubs(userWalletId: UserWalletId, networks: Set<Network>): Map<Network, String> {
|
suspend fun getXpubs(userWalletId: UserWalletId, networks: Set<Network>): Map<Network, String> {
|
||||||
if (!dynamicAddressesFeatureToggles.isDynamicAddressesEnabled) return emptyMap()
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dynamic addresses rely on the server-side wallet accounts list, which is populated only for
|
* Dynamic addresses rely on the server-side wallet accounts list, which is populated only for
|
||||||
* multi-currency wallets. Single-currency wallets (Note, s2c, etc.) never populate it, so
|
* multi-currency wallets. Single-currency wallets (Note, s2c, etc.) never populate it, so
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,10 @@
|
||||||
package com.tangem.data.dynamicaddresses.di
|
package com.tangem.data.dynamicaddresses.di
|
||||||
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.data.common.account.WalletAccountsFetcher
|
import com.tangem.data.common.account.WalletAccountsFetcher
|
||||||
import com.tangem.data.common.account.WalletAccountsSaver
|
import com.tangem.data.common.account.WalletAccountsSaver
|
||||||
import com.tangem.data.dynamicaddresses.DefaultConsolidationRepository
|
import com.tangem.data.dynamicaddresses.DefaultConsolidationRepository
|
||||||
import com.tangem.domain.account.repository.AccountsCRUDRepository
|
import com.tangem.domain.account.repository.AccountsCRUDRepository
|
||||||
import com.tangem.data.dynamicaddresses.DefaultDynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.data.dynamicaddresses.DefaultDynamicAddressesRepository
|
import com.tangem.data.dynamicaddresses.DefaultDynamicAddressesRepository
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.repository.ConsolidationRepository
|
import com.tangem.domain.dynamicaddresses.repository.ConsolidationRepository
|
||||||
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
||||||
|
|
@ -30,7 +27,6 @@ internal object DynamicAddressesDataModule {
|
||||||
walletAccountsSaver: WalletAccountsSaver,
|
walletAccountsSaver: WalletAccountsSaver,
|
||||||
accountsCRUDRepository: AccountsCRUDRepository,
|
accountsCRUDRepository: AccountsCRUDRepository,
|
||||||
walletManagersFacade: WalletManagersFacade,
|
walletManagersFacade: WalletManagersFacade,
|
||||||
dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
getDerivedXpubUseCase: GetDerivedXpubUseCase,
|
getDerivedXpubUseCase: GetDerivedXpubUseCase,
|
||||||
dispatchers: CoroutineDispatcherProvider,
|
dispatchers: CoroutineDispatcherProvider,
|
||||||
): DynamicAddressesRepository {
|
): DynamicAddressesRepository {
|
||||||
|
|
@ -39,20 +35,11 @@ internal object DynamicAddressesDataModule {
|
||||||
walletAccountsSaver = walletAccountsSaver,
|
walletAccountsSaver = walletAccountsSaver,
|
||||||
accountsCRUDRepository = accountsCRUDRepository,
|
accountsCRUDRepository = accountsCRUDRepository,
|
||||||
walletManagersFacade = walletManagersFacade,
|
walletManagersFacade = walletManagersFacade,
|
||||||
dynamicAddressesFeatureToggles = dynamicAddressesFeatureToggles,
|
|
||||||
getDerivedXpubUseCase = getDerivedXpubUseCase,
|
getDerivedXpubUseCase = getDerivedXpubUseCase,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideDynamicAddressesFeatureToggles(
|
|
||||||
featureTogglesManager: FeatureTogglesManager,
|
|
||||||
): DynamicAddressesFeatureToggles {
|
|
||||||
return DefaultDynamicAddressesFeatureToggles(featureTogglesManager = featureTogglesManager)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideConsolidationRepository(
|
fun provideConsolidationRepository(
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import com.tangem.data.common.account.WalletAccountsFetcher
|
||||||
import com.tangem.data.common.account.WalletAccountsSaver
|
import com.tangem.data.common.account.WalletAccountsSaver
|
||||||
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
||||||
import com.tangem.domain.account.repository.AccountsCRUDRepository
|
import com.tangem.domain.account.repository.AccountsCRUDRepository
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
import com.tangem.domain.dynamicaddresses.GetDerivedXpubUseCase
|
||||||
import com.tangem.domain.models.network.Network
|
import com.tangem.domain.models.network.Network
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
|
|
@ -32,7 +31,6 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
private val walletAccountsSaver: WalletAccountsSaver = mockk(relaxed = true)
|
private val walletAccountsSaver: WalletAccountsSaver = mockk(relaxed = true)
|
||||||
private val accountsCRUDRepository: AccountsCRUDRepository = mockk(relaxed = true)
|
private val accountsCRUDRepository: AccountsCRUDRepository = mockk(relaxed = true)
|
||||||
private val walletManagersFacade: WalletManagersFacade = mockk(relaxed = true)
|
private val walletManagersFacade: WalletManagersFacade = mockk(relaxed = true)
|
||||||
private val featureToggles: DynamicAddressesFeatureToggles = mockk(relaxed = true)
|
|
||||||
private val getDerivedXpubUseCase: GetDerivedXpubUseCase = mockk(relaxed = true)
|
private val getDerivedXpubUseCase: GetDerivedXpubUseCase = mockk(relaxed = true)
|
||||||
|
|
||||||
private val userWalletId: UserWalletId = mockk(relaxed = true)
|
private val userWalletId: UserWalletId = mockk(relaxed = true)
|
||||||
|
|
@ -49,7 +47,7 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
clearMocks(walletManagersFacade, featureToggles, getDerivedXpubUseCase, answers = false)
|
clearMocks(walletManagersFacade, getDerivedXpubUseCase, answers = false)
|
||||||
// Empty response → findToken returns null → getStatus emits DISABLED.
|
// Empty response → findToken returns null → getStatus emits DISABLED.
|
||||||
val emptyResponse = mockk<GetWalletAccountsResponse>(relaxed = true) {
|
val emptyResponse = mockk<GetWalletAccountsResponse>(relaxed = true) {
|
||||||
every { accounts } returns emptyList()
|
every { accounts } returns emptyList()
|
||||||
|
|
@ -63,31 +61,14 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
walletAccountsSaver = walletAccountsSaver,
|
walletAccountsSaver = walletAccountsSaver,
|
||||||
accountsCRUDRepository = accountsCRUDRepository,
|
accountsCRUDRepository = accountsCRUDRepository,
|
||||||
walletManagersFacade = walletManagersFacade,
|
walletManagersFacade = walletManagersFacade,
|
||||||
dynamicAddressesFeatureToggles = featureToggles,
|
|
||||||
getDerivedXpubUseCase = getDerivedXpubUseCase,
|
getDerivedXpubUseCase = getDerivedXpubUseCase,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `GIVEN feature toggle off WHEN collect THEN probe is never called and flow emits false`() = runTest {
|
fun `GIVEN xpub is null WHEN collect THEN probe is not called AND cache is empty`() = runTest {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns false
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val values = repository.hasFundsOnAdditionalAddresses(userWalletId, network).toList()
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(values).doesNotContain(true)
|
|
||||||
coVerify(exactly = 0) {
|
|
||||||
walletManagersFacade.probeHasFundsOnAdditionalAddresses(any(), any(), any())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN toggle on AND xpub is null WHEN collect THEN probe is not called AND cache is empty`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns null
|
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns null
|
||||||
|
|
||||||
// WHEN
|
// WHEN
|
||||||
|
|
@ -105,7 +86,6 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
@Test
|
@Test
|
||||||
fun `GIVEN probe returns true WHEN collect THEN result is cached AND next collect skips probe`() = runTest {
|
fun `GIVEN probe returns true WHEN collect THEN result is cached AND next collect skips probe`() = runTest {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
||||||
coEvery {
|
coEvery {
|
||||||
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
||||||
|
|
@ -126,7 +106,6 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
@Test
|
@Test
|
||||||
fun `GIVEN probe returns false WHEN collect twice THEN probe runs each time`() = runTest {
|
fun `GIVEN probe returns false WHEN collect twice THEN probe runs each time`() = runTest {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
||||||
coEvery {
|
coEvery {
|
||||||
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
||||||
|
|
@ -145,7 +124,6 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
@Test
|
@Test
|
||||||
fun `GIVEN cached true WHEN enable succeeds THEN cache is invalidated and next probe runs again`() = runTest {
|
fun `GIVEN cached true WHEN enable succeeds THEN cache is invalidated and next probe runs again`() = runTest {
|
||||||
// GIVEN — populate cache with a positive probe
|
// GIVEN — populate cache with a positive probe
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
||||||
coEvery {
|
coEvery {
|
||||||
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
||||||
|
|
@ -165,7 +143,6 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
@Test
|
@Test
|
||||||
fun `GIVEN cached true WHEN disable succeeds THEN cache is invalidated and next probe runs again`() = runTest {
|
fun `GIVEN cached true WHEN disable succeeds THEN cache is invalidated and next probe runs again`() = runTest {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
||||||
coEvery {
|
coEvery {
|
||||||
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
||||||
|
|
@ -185,7 +162,6 @@ class DefaultDynamicAddressesRepositoryTest {
|
||||||
@Test
|
@Test
|
||||||
fun `GIVEN cache entry for one network WHEN invalidate other network THEN first entry is preserved`() = runTest {
|
fun `GIVEN cache entry for one network WHEN invalidate other network THEN first entry is preserved`() = runTest {
|
||||||
// GIVEN — cache populated for `network`
|
// GIVEN — cache populated for `network`
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
coEvery { getDerivedXpubUseCase(userWalletId, network) } returns XPUB
|
||||||
coEvery {
|
coEvery {
|
||||||
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
walletManagersFacade.probeHasFundsOnAdditionalAddresses(userWalletId, network, XPUB)
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import com.tangem.crypto.hdWallet.DerivationPath
|
||||||
import com.tangem.data.common.network.NetworkFactory
|
import com.tangem.data.common.network.NetworkFactory
|
||||||
import com.tangem.data.wallets.derivations.Derivations
|
import com.tangem.data.wallets.derivations.Derivations
|
||||||
import com.tangem.data.wallets.derivations.MissedDerivationsFinder
|
import com.tangem.data.wallets.derivations.MissedDerivationsFinder
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
import com.tangem.domain.models.network.Network
|
import com.tangem.domain.models.network.Network
|
||||||
import com.tangem.domain.models.scan.ScanResponse
|
import com.tangem.domain.models.scan.ScanResponse
|
||||||
|
|
@ -31,7 +30,6 @@ internal class DefaultColdMapDerivationsRepository @Inject constructor(
|
||||||
private val tangemSdkManager: TangemSdkManager,
|
private val tangemSdkManager: TangemSdkManager,
|
||||||
private val networkFactory: NetworkFactory,
|
private val networkFactory: NetworkFactory,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
) : ColdMapDerivationsRepository {
|
) : ColdMapDerivationsRepository {
|
||||||
|
|
||||||
override suspend fun derivePublicKeys(
|
override suspend fun derivePublicKeys(
|
||||||
|
|
@ -66,7 +64,7 @@ internal class DefaultColdMapDerivationsRepository @Inject constructor(
|
||||||
return@withContext userWallet
|
return@withContext userWallet
|
||||||
}
|
}
|
||||||
|
|
||||||
val derivations = MissedDerivationsFinder(userWallet, dynamicAddressesFeatureToggles.isDynamicAddressesEnabled)
|
val derivations = MissedDerivationsFinder(userWallet, isDynamicAddressesEnabled = true)
|
||||||
.findByNetworks(networks)
|
.findByNetworks(networks)
|
||||||
.ifEmpty {
|
.ifEmpty {
|
||||||
TangemLogger.d("Nothing to derive")
|
TangemLogger.d("Nothing to derive")
|
||||||
|
|
@ -110,7 +108,7 @@ internal class DefaultColdMapDerivationsRepository @Inject constructor(
|
||||||
networksWithDerivationPath: Map<BackendId, String?>,
|
networksWithDerivationPath: Map<BackendId, String?>,
|
||||||
): Boolean = withContext(dispatchers.io) {
|
): Boolean = withContext(dispatchers.io) {
|
||||||
val derivations =
|
val derivations =
|
||||||
MissedDerivationsFinder(userWallet, dynamicAddressesFeatureToggles.isDynamicAddressesEnabled)
|
MissedDerivationsFinder(userWallet, isDynamicAddressesEnabled = true)
|
||||||
.findByNetworks(
|
.findByNetworks(
|
||||||
networksWithDerivationPath.mapNotNull { (backendId, extraDerivationPath) ->
|
networksWithDerivationPath.mapNotNull { (backendId, extraDerivationPath) ->
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import com.tangem.crypto.hdWallet.DerivationPath
|
||||||
import com.tangem.data.common.network.NetworkFactory
|
import com.tangem.data.common.network.NetworkFactory
|
||||||
import com.tangem.data.wallets.derivations.MissedDerivationsFinder
|
import com.tangem.data.wallets.derivations.MissedDerivationsFinder
|
||||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.common.wallets.getSyncStrict
|
import com.tangem.domain.common.wallets.getSyncStrict
|
||||||
import com.tangem.domain.models.account.DerivationIndex
|
import com.tangem.domain.models.account.DerivationIndex
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
|
|
@ -29,7 +28,6 @@ internal class DefaultHotMapDerivationsRepository @Inject constructor(
|
||||||
private val networkFactory: NetworkFactory,
|
private val networkFactory: NetworkFactory,
|
||||||
private val hotWalletAccessor: HotWalletAccessor,
|
private val hotWalletAccessor: HotWalletAccessor,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
) : HotMapDerivationsRepository {
|
) : HotMapDerivationsRepository {
|
||||||
|
|
||||||
override suspend fun derivePublicKeys(
|
override suspend fun derivePublicKeys(
|
||||||
|
|
@ -61,7 +59,7 @@ internal class DefaultHotMapDerivationsRepository @Inject constructor(
|
||||||
userWallet: UserWallet.Hot,
|
userWallet: UserWallet.Hot,
|
||||||
networks: List<Network>,
|
networks: List<Network>,
|
||||||
): UserWallet.Hot = withContext(dispatchers.default) {
|
): UserWallet.Hot = withContext(dispatchers.default) {
|
||||||
val derivations = MissedDerivationsFinder(userWallet, dynamicAddressesFeatureToggles.isDynamicAddressesEnabled)
|
val derivations = MissedDerivationsFinder(userWallet, isDynamicAddressesEnabled = true)
|
||||||
.findByNetworks(networks)
|
.findByNetworks(networks)
|
||||||
.ifEmpty {
|
.ifEmpty {
|
||||||
TangemLogger.d("Nothing to derive")
|
TangemLogger.d("Nothing to derive")
|
||||||
|
|
@ -110,7 +108,7 @@ internal class DefaultHotMapDerivationsRepository @Inject constructor(
|
||||||
userWallet: UserWallet.Hot,
|
userWallet: UserWallet.Hot,
|
||||||
networksWithDerivationPath: Map<BackendId, String?>,
|
networksWithDerivationPath: Map<BackendId, String?>,
|
||||||
): Boolean = withContext(dispatchers.default) {
|
): Boolean = withContext(dispatchers.default) {
|
||||||
val derivations = MissedDerivationsFinder(userWallet, dynamicAddressesFeatureToggles.isDynamicAddressesEnabled)
|
val derivations = MissedDerivationsFinder(userWallet, isDynamicAddressesEnabled = true)
|
||||||
.findByNetworks(
|
.findByNetworks(
|
||||||
networksWithDerivationPath.mapNotNull { (backendId, extraDerivationPath) ->
|
networksWithDerivationPath.mapNotNull { (backendId, extraDerivationPath) ->
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
|
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
package com.tangem.domain.dynamicaddresses
|
|
||||||
|
|
||||||
interface DynamicAddressesFeatureToggles {
|
|
||||||
|
|
||||||
val isDynamicAddressesEnabled: Boolean
|
|
||||||
}
|
|
||||||
|
|
@ -11,12 +11,9 @@ import com.tangem.domain.wallets.derivations.derivationStyleProvider
|
||||||
* Whether the Dynamic Addresses menu entry should be shown for a given (wallet, currency) pair.
|
* Whether the Dynamic Addresses menu entry should be shown for a given (wallet, currency) pair.
|
||||||
* Policy check only — hardware XPUB capability is verified by [IsXpubSupportedUseCase].
|
* Policy check only — hardware XPUB capability is verified by [IsXpubSupportedUseCase].
|
||||||
*/
|
*/
|
||||||
class IsDynamicAddressesAvailableUseCase(
|
class IsDynamicAddressesAvailableUseCase {
|
||||||
private val featureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
) {
|
|
||||||
|
|
||||||
operator fun invoke(userWallet: UserWallet, cryptoCurrency: CryptoCurrency): Boolean {
|
operator fun invoke(userWallet: UserWallet, cryptoCurrency: CryptoCurrency): Boolean {
|
||||||
if (!featureToggles.isDynamicAddressesEnabled) return false
|
|
||||||
if (cryptoCurrency !is CryptoCurrency.Coin) return false
|
if (cryptoCurrency !is CryptoCurrency.Coin) return false
|
||||||
|
|
||||||
val network = cryptoCurrency.network
|
val network = cryptoCurrency.network
|
||||||
|
|
|
||||||
|
|
@ -21,13 +21,11 @@ import org.junit.jupiter.api.TestInstance
|
||||||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||||
class IsDynamicAddressesAvailableUseCaseTest {
|
class IsDynamicAddressesAvailableUseCaseTest {
|
||||||
|
|
||||||
private val featureToggles: DynamicAddressesFeatureToggles = mockk()
|
private val useCase = IsDynamicAddressesAvailableUseCase()
|
||||||
private val useCase = IsDynamicAddressesAvailableUseCase(featureToggles)
|
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
fun setup() {
|
fun setup() {
|
||||||
mockkStatic("com.tangem.domain.wallets.derivations.DerivationStyleProviderExtKt")
|
mockkStatic("com.tangem.domain.wallets.derivations.DerivationStyleProviderExtKt")
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterAll
|
@AfterAll
|
||||||
|
|
@ -37,17 +35,6 @@ class IsDynamicAddressesAvailableUseCaseTest {
|
||||||
|
|
||||||
// region Gating
|
// region Gating
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `feature toggle off returns false`() {
|
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns false
|
|
||||||
|
|
||||||
val coin = coin(Blockchain.Bitcoin, "m/84'/0'/0'/0/0")
|
|
||||||
val result = useCase(walletWithStyle(DerivationStyle.V3), coin)
|
|
||||||
|
|
||||||
assertThat(result).isFalse()
|
|
||||||
every { featureToggles.isDynamicAddressesEnabled } returns true // restore
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `token currency returns false`() {
|
fun `token currency returns false`() {
|
||||||
val token = token(Blockchain.Ethereum, "m/44'/60'/0'/0/0")
|
val token = token(Blockchain.Ethereum, "m/44'/60'/0'/0/0")
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package com.tangem.domain.transaction.usecase
|
||||||
|
|
||||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.common.wallets.getSyncOrNull
|
import com.tangem.domain.common.wallets.getSyncOrNull
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
|
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
|
||||||
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
||||||
|
|
@ -27,7 +26,6 @@ class ReceiveAddressesFactory(
|
||||||
private val getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase,
|
private val getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase,
|
||||||
private val getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase,
|
private val getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase,
|
||||||
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
private val userWalletsListRepository: UserWalletsListRepository,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
@ -68,7 +66,6 @@ class ReceiveAddressesFactory(
|
||||||
userWalletId: UserWalletId,
|
userWalletId: UserWalletId,
|
||||||
cryptoCurrency: CryptoCurrency,
|
cryptoCurrency: CryptoCurrency,
|
||||||
): String? {
|
): String? {
|
||||||
if (!dynamicAddressesFeatureToggles.isDynamicAddressesEnabled) return null
|
|
||||||
if (cryptoCurrency !is CryptoCurrency.Coin) return null
|
if (cryptoCurrency !is CryptoCurrency.Coin) return null
|
||||||
|
|
||||||
val userWallet = userWalletsListRepository.getSyncOrNull(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import com.tangem.blockchain.common.Blockchain
|
||||||
import com.tangem.common.test.domain.token.MockCryptoCurrencyFactory
|
import com.tangem.common.test.domain.token.MockCryptoCurrencyFactory
|
||||||
import com.tangem.common.test.domain.wallet.MockUserWalletFactory
|
import com.tangem.common.test.domain.wallet.MockUserWalletFactory
|
||||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
|
||||||
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
||||||
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
||||||
|
|
@ -28,7 +27,6 @@ internal class ReceiveAddressesFactoryTest {
|
||||||
private val getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase = mockk()
|
private val getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase = mockk()
|
||||||
private val getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase = mockk()
|
private val getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase = mockk()
|
||||||
private val dynamicAddressesRepository: DynamicAddressesRepository = mockk()
|
private val dynamicAddressesRepository: DynamicAddressesRepository = mockk()
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles = mockk()
|
|
||||||
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
||||||
|
|
||||||
private val factory = ReceiveAddressesFactory(
|
private val factory = ReceiveAddressesFactory(
|
||||||
|
|
@ -36,7 +34,6 @@ internal class ReceiveAddressesFactoryTest {
|
||||||
getViewedTokenReceiveWarningUseCase = getViewedTokenReceiveWarningUseCase,
|
getViewedTokenReceiveWarningUseCase = getViewedTokenReceiveWarningUseCase,
|
||||||
getDynamicReceiveAddressUseCase = getDynamicReceiveAddressUseCase,
|
getDynamicReceiveAddressUseCase = getDynamicReceiveAddressUseCase,
|
||||||
dynamicAddressesRepository = dynamicAddressesRepository,
|
dynamicAddressesRepository = dynamicAddressesRepository,
|
||||||
dynamicAddressesFeatureToggles = dynamicAddressesFeatureToggles,
|
|
||||||
userWalletsListRepository = userWalletsListRepository,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -54,7 +51,6 @@ internal class ReceiveAddressesFactoryTest {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
every { dynamicAddressesFeatureToggles.isDynamicAddressesEnabled } returns true
|
|
||||||
every { userWalletsListRepository.userWallets } returns MutableStateFlow<List<UserWallet>?>(listOf(userWallet))
|
every { userWalletsListRepository.userWallets } returns MutableStateFlow<List<UserWallet>?>(listOf(userWallet))
|
||||||
// Single-currency wallets never populate the accounts store, so the status flow never emits ([REDACTED_TASK_KEY])
|
// Single-currency wallets never populate the accounts store, so the status flow never emits ([REDACTED_TASK_KEY])
|
||||||
every { dynamicAddressesRepository.getStatus(any(), any()) } returns flow { awaitCancellation() }
|
every { dynamicAddressesRepository.getStatus(any(), any()) } returns flow { awaitCancellation() }
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package com.tangem.domain.txhistory
|
package com.tangem.domain.txhistory
|
||||||
|
|
||||||
interface TxHistoryFeatureToggles {
|
interface TxHistoryFeatureToggles {
|
||||||
val isSolanaTxHistoryEnabled: Boolean
|
|
||||||
val isNewTxHistoryEnabled: Boolean
|
val isNewTxHistoryEnabled: Boolean
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
package com.tangem.features.hotwallet
|
|
||||||
|
|
||||||
interface HotWalletFeatureToggles {
|
|
||||||
val isAssetsDiscoveryEnabled: Boolean
|
|
||||||
}
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
package com.tangem.features.hotwallet
|
|
||||||
|
|
||||||
import com.tangem.core.configtoggle.FeatureToggles
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
|
|
||||||
internal class DefaultHotWalletFeatureToggles(
|
|
||||||
private val featureTogglesManager: FeatureTogglesManager,
|
|
||||||
) : HotWalletFeatureToggles {
|
|
||||||
|
|
||||||
override val isAssetsDiscoveryEnabled: Boolean
|
|
||||||
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.ASSETS_DISCOVERY_ENABLED)
|
|
||||||
}
|
|
||||||
|
|
@ -17,7 +17,6 @@ import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository.Attem
|
||||||
import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository.Companion.MAX_FAST_FORWARD_ATTEMPTS
|
import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository.Companion.MAX_FAST_FORWARD_ATTEMPTS
|
||||||
import com.tangem.domain.wallets.hot.HotWalletPasswordRequester
|
import com.tangem.domain.wallets.hot.HotWalletPasswordRequester
|
||||||
import com.tangem.domain.wallets.usecase.DeleteWalletUseCase
|
import com.tangem.domain.wallets.usecase.DeleteWalletUseCase
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.features.hotwallet.accesscode.ACCESS_CODE_LENGTH
|
import com.tangem.features.hotwallet.accesscode.ACCESS_CODE_LENGTH
|
||||||
import com.tangem.features.hotwallet.accesscoderequest.entity.HotAccessCodeRequestUM
|
import com.tangem.features.hotwallet.accesscoderequest.entity.HotAccessCodeRequestUM
|
||||||
import com.tangem.features.hotwallet.impl.R
|
import com.tangem.features.hotwallet.impl.R
|
||||||
|
|
@ -42,7 +41,6 @@ internal class HotAccessCodeRequestModel @Inject constructor(
|
||||||
private val canUseBiometryUseCase: CanUseBiometryUseCase,
|
private val canUseBiometryUseCase: CanUseBiometryUseCase,
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||||
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
) : Model() {
|
) : Model() {
|
||||||
|
|
||||||
private val result = MutableStateFlow<HotWalletPasswordRequester.Result?>(null)
|
private val result = MutableStateFlow<HotWalletPasswordRequester.Result?>(null)
|
||||||
|
|
@ -231,9 +229,7 @@ internal class HotAccessCodeRequestModel @Inject constructor(
|
||||||
val userWallet = userWalletsListRepository.userWalletsSync()
|
val userWallet = userWalletsListRepository.userWalletsSync()
|
||||||
.firstOrNull { it is UserWallet.Hot && it.hotWalletId == currentRequest.hotWalletId } ?: return
|
.firstOrNull { it is UserWallet.Hot && it.hotWalletId == currentRequest.hotWalletId } ?: return
|
||||||
|
|
||||||
if (hotWalletFeatureToggles.isAssetsDiscoveryEnabled) {
|
startAssetsDiscoveryUseCase.cancel(userWallet.walletId)
|
||||||
startAssetsDiscoveryUseCase.cancel(userWallet.walletId)
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteWalletUseCase(userWallet.walletId)
|
deleteWalletUseCase(userWallet.walletId)
|
||||||
dismiss()
|
dismiss()
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.tangem.domain.wallets.builder.HotUserWalletBuilder
|
||||||
import com.tangem.domain.wallets.models.WalletSyncResult
|
import com.tangem.domain.wallets.models.WalletSyncResult
|
||||||
import com.tangem.domain.wallets.usecase.SaveWalletUseCase
|
import com.tangem.domain.wallets.usecase.SaveWalletUseCase
|
||||||
import com.tangem.domain.wallets.usecase.SyncWalletWithRemoteUseCase
|
import com.tangem.domain.wallets.usecase.SyncWalletWithRemoteUseCase
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.features.hotwallet.MnemonicRepository
|
import com.tangem.features.hotwallet.MnemonicRepository
|
||||||
import com.tangem.features.hotwallet.addexistingwallet.im.port.AddExistingWalletImportComponent
|
import com.tangem.features.hotwallet.addexistingwallet.im.port.AddExistingWalletImportComponent
|
||||||
import com.tangem.features.hotwallet.addexistingwallet.im.port.entity.AddExistingWalletImportUM
|
import com.tangem.features.hotwallet.addexistingwallet.im.port.entity.AddExistingWalletImportUM
|
||||||
|
|
@ -47,7 +46,6 @@ internal class AddExistingWalletImportModel @Inject constructor(
|
||||||
private val saveUserWalletUseCase: SaveWalletUseCase,
|
private val saveUserWalletUseCase: SaveWalletUseCase,
|
||||||
private val syncWalletWithRemoteUseCase: SyncWalletWithRemoteUseCase,
|
private val syncWalletWithRemoteUseCase: SyncWalletWithRemoteUseCase,
|
||||||
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
|
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||||
private val appsFlyerStore: AppsFlyerStore,
|
private val appsFlyerStore: AppsFlyerStore,
|
||||||
|
|
@ -120,9 +118,7 @@ internal class AddExistingWalletImportModel @Inject constructor(
|
||||||
|
|
||||||
launch(dispatchers.main + NonCancellable) {
|
launch(dispatchers.main + NonCancellable) {
|
||||||
val syncResult = syncWalletWithRemoteUseCase(userWallet.walletId)
|
val syncResult = syncWalletWithRemoteUseCase(userWallet.walletId)
|
||||||
if (hotWalletFeatureToggles.isAssetsDiscoveryEnabled &&
|
if (syncResult == WalletSyncResult.Created) {
|
||||||
syncResult == WalletSyncResult.Created
|
|
||||||
) {
|
|
||||||
startAssetsDiscoveryUseCase(userWallet.walletId)
|
startAssetsDiscoveryUseCase(userWallet.walletId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
package com.tangem.features.hotwallet.di
|
|
||||||
|
|
||||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
|
||||||
import com.tangem.features.hotwallet.DefaultHotWalletFeatureToggles
|
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
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 HotWalletFeatureModule {
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideHotWalletFeatureToggles(featureTogglesManager: FeatureTogglesManager): HotWalletFeatureToggles {
|
|
||||||
return DefaultHotWalletFeatureToggles(featureTogglesManager)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -15,7 +15,6 @@ import com.tangem.core.ui.message.SnackbarMessage
|
||||||
import com.tangem.domain.assetsdiscovery.usecase.StartAssetsDiscoveryUseCase
|
import com.tangem.domain.assetsdiscovery.usecase.StartAssetsDiscoveryUseCase
|
||||||
import com.tangem.domain.wallets.usecase.DeleteWalletUseCase
|
import com.tangem.domain.wallets.usecase.DeleteWalletUseCase
|
||||||
import com.tangem.features.hotwallet.ForgetWalletComponent
|
import com.tangem.features.hotwallet.ForgetWalletComponent
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.features.hotwallet.forgetwallet.entity.ForgetWalletUM
|
import com.tangem.features.hotwallet.forgetwallet.entity.ForgetWalletUM
|
||||||
import com.tangem.features.hotwallet.impl.R
|
import com.tangem.features.hotwallet.impl.R
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
|
|
@ -34,7 +33,6 @@ internal class ForgetWalletModel @Inject constructor(
|
||||||
private val deleteWalletUseCase: DeleteWalletUseCase,
|
private val deleteWalletUseCase: DeleteWalletUseCase,
|
||||||
private val uiMessageSender: UiMessageSender,
|
private val uiMessageSender: UiMessageSender,
|
||||||
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
) : Model() {
|
) : Model() {
|
||||||
|
|
||||||
private val params = paramsContainer.require<ForgetWalletComponent.Params>()
|
private val params = paramsContainer.require<ForgetWalletComponent.Params>()
|
||||||
|
|
@ -84,9 +82,7 @@ internal class ForgetWalletModel @Inject constructor(
|
||||||
|
|
||||||
private fun forgetWallet() {
|
private fun forgetWallet() {
|
||||||
modelScope.launch {
|
modelScope.launch {
|
||||||
if (hotWalletFeatureToggles.isAssetsDiscoveryEnabled) {
|
startAssetsDiscoveryUseCase.cancel(params.userWalletId)
|
||||||
startAssetsDiscoveryUseCase.cancel(params.userWalletId)
|
|
||||||
}
|
|
||||||
|
|
||||||
val hasUserWallets = deleteWalletUseCase(params.userWalletId)
|
val hasUserWallets = deleteWalletUseCase(params.userWalletId)
|
||||||
.getOrElse { error ->
|
.getOrElse { error ->
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository.Attem
|
||||||
import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository.Attempts
|
import com.tangem.domain.wallets.hot.HotWalletAccessCodeAttemptsRepository.Attempts
|
||||||
import com.tangem.domain.wallets.hot.HotWalletPasswordRequester.AttemptRequest
|
import com.tangem.domain.wallets.hot.HotWalletPasswordRequester.AttemptRequest
|
||||||
import com.tangem.domain.wallets.usecase.DeleteWalletUseCase
|
import com.tangem.domain.wallets.usecase.DeleteWalletUseCase
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.hot.sdk.model.HotWalletId
|
import com.tangem.hot.sdk.model.HotWalletId
|
||||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||||
import io.mockk.clearMocks
|
import io.mockk.clearMocks
|
||||||
|
|
@ -38,9 +37,6 @@ internal class HotAccessCodeRequestModelTest {
|
||||||
private val canUseBiometryUseCase: CanUseBiometryUseCase = mockk(relaxed = true)
|
private val canUseBiometryUseCase: CanUseBiometryUseCase = mockk(relaxed = true)
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler = mockk(relaxUnitFun = true)
|
private val analyticsEventHandler: AnalyticsEventHandler = mockk(relaxUnitFun = true)
|
||||||
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase = mockk(relaxed = true)
|
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase = mockk(relaxed = true)
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles = mockk {
|
|
||||||
every { isAssetsDiscoveryEnabled } returns false
|
|
||||||
}
|
|
||||||
|
|
||||||
private val hotWalletIdA: HotWalletId = mockk()
|
private val hotWalletIdA: HotWalletId = mockk()
|
||||||
private val hotWalletIdB: HotWalletId = mockk()
|
private val hotWalletIdB: HotWalletId = mockk()
|
||||||
|
|
@ -152,7 +148,6 @@ internal class HotAccessCodeRequestModelTest {
|
||||||
canUseBiometryUseCase = canUseBiometryUseCase,
|
canUseBiometryUseCase = canUseBiometryUseCase,
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
analyticsEventHandler = analyticsEventHandler,
|
||||||
startAssetsDiscoveryUseCase = startAssetsDiscoveryUseCase,
|
startAssetsDiscoveryUseCase = startAssetsDiscoveryUseCase,
|
||||||
hotWalletFeatureToggles = hotWalletFeatureToggles,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import arrow.core.getOrElse
|
import arrow.core.getOrElse
|
||||||
import com.tangem.core.decompose.context.AppComponentContext
|
import com.tangem.core.decompose.context.AppComponentContext
|
||||||
import com.tangem.core.ui.extensions.resourceReference
|
import com.tangem.core.ui.extensions.resourceReference
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
||||||
import com.tangem.domain.managetokens.ValidateDerivationPathUseCase
|
import com.tangem.domain.managetokens.ValidateDerivationPathUseCase
|
||||||
import com.tangem.domain.managetokens.model.exceptoin.DerivationPathValidationException
|
import com.tangem.domain.managetokens.model.exceptoin.DerivationPathValidationException
|
||||||
|
|
@ -31,13 +30,11 @@ internal class DefaultCustomTokenDerivationInputComponent @AssistedInject constr
|
||||||
@Assisted private val params: CustomTokenDerivationInputComponent.Params,
|
@Assisted private val params: CustomTokenDerivationInputComponent.Params,
|
||||||
private val validateDerivationPathUseCase: ValidateDerivationPathUseCase,
|
private val validateDerivationPathUseCase: ValidateDerivationPathUseCase,
|
||||||
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
) : CustomTokenDerivationInputComponent, AppComponentContext by context {
|
) : CustomTokenDerivationInputComponent, AppComponentContext by context {
|
||||||
|
|
||||||
private val cardanoDerivationPathValidator = CardanoDerivationPathValidator()
|
private val cardanoDerivationPathValidator = CardanoDerivationPathValidator()
|
||||||
private val dynamicAddressesDerivationValidator = DynamicAddressesDerivationValidator(
|
private val dynamicAddressesDerivationValidator = DynamicAddressesDerivationValidator(
|
||||||
dynamicAddressesRepository = dynamicAddressesRepository,
|
dynamicAddressesRepository = dynamicAddressesRepository,
|
||||||
dynamicAddressesFeatureToggles = dynamicAddressesFeatureToggles,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
private val state: MutableStateFlow<CustomDerivationInputUM> = MutableStateFlow(
|
private val state: MutableStateFlow<CustomDerivationInputUM> = MutableStateFlow(
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package com.tangem.features.managetokens.utils
|
||||||
|
|
||||||
import com.tangem.blockchainsdk.utils.toBlockchain
|
import com.tangem.blockchainsdk.utils.toBlockchain
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesDerivationChecker
|
import com.tangem.domain.dynamicaddresses.DynamicAddressesDerivationChecker
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
|
|
||||||
import com.tangem.domain.dynamicaddresses.DynamicAddressesSupportedBlockchains
|
import com.tangem.domain.dynamicaddresses.DynamicAddressesSupportedBlockchains
|
||||||
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
|
||||||
import com.tangem.domain.models.network.Network
|
import com.tangem.domain.models.network.Network
|
||||||
|
|
@ -18,7 +17,6 @@ import kotlinx.coroutines.flow.firstOrNull
|
||||||
*/
|
*/
|
||||||
internal class DynamicAddressesDerivationValidator(
|
internal class DynamicAddressesDerivationValidator(
|
||||||
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
private val dynamicAddressesRepository: DynamicAddressesRepository,
|
||||||
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -29,7 +27,6 @@ internal class DynamicAddressesDerivationValidator(
|
||||||
networkId: Network.ID,
|
networkId: Network.ID,
|
||||||
path: String?,
|
path: String?,
|
||||||
): Boolean {
|
): Boolean {
|
||||||
if (!dynamicAddressesFeatureToggles.isDynamicAddressesEnabled) return false
|
|
||||||
if (path == null) return false
|
if (path == null) return false
|
||||||
if (!isSupportedBlockchain(networkId)) return false
|
if (!isSupportedBlockchain(networkId)) return false
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,6 @@ internal class DefaultTxHistoryFeatureToggles @Inject constructor(
|
||||||
private val featureTogglesManager: FeatureTogglesManager,
|
private val featureTogglesManager: FeatureTogglesManager,
|
||||||
) : TxHistoryFeatureToggles {
|
) : TxHistoryFeatureToggles {
|
||||||
|
|
||||||
override val isSolanaTxHistoryEnabled: Boolean
|
|
||||||
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.SOLANA_TX_HISTORY_ENABLED)
|
|
||||||
|
|
||||||
override val isNewTxHistoryEnabled: Boolean
|
override val isNewTxHistoryEnabled: Boolean
|
||||||
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15767_NEW_TX_HISTORY_ENABLED)
|
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15767_NEW_TX_HISTORY_ENABLED)
|
||||||
}
|
}
|
||||||
|
|
@ -49,7 +49,6 @@ import com.tangem.feature.walletsettings.utils.AccountItemsDelegate
|
||||||
import com.tangem.feature.walletsettings.utils.AccountListSortingSaver
|
import com.tangem.feature.walletsettings.utils.AccountListSortingSaver
|
||||||
import com.tangem.feature.walletsettings.utils.ItemsBuilder
|
import com.tangem.feature.walletsettings.utils.ItemsBuilder
|
||||||
import com.tangem.feature.walletsettings.utils.WalletCardItemDelegate
|
import com.tangem.feature.walletsettings.utils.WalletCardItemDelegate
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.features.pushnotifications.api.analytics.PushNotificationAnalyticEvents
|
import com.tangem.features.pushnotifications.api.analytics.PushNotificationAnalyticEvents
|
||||||
import com.tangem.features.pushnotificationsettings.PushNotificationSettingsFeatureToggles
|
import com.tangem.features.pushnotificationsettings.PushNotificationSettingsFeatureToggles
|
||||||
import com.tangem.hot.sdk.model.HotWalletId
|
import com.tangem.hot.sdk.model.HotWalletId
|
||||||
|
|
@ -92,7 +91,6 @@ internal class WalletSettingsModel @Inject constructor(
|
||||||
private val singleAccountListSupplier: SingleAccountListSupplier,
|
private val singleAccountListSupplier: SingleAccountListSupplier,
|
||||||
private val accountListSortingSaver: AccountListSortingSaver,
|
private val accountListSortingSaver: AccountListSortingSaver,
|
||||||
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
private val startAssetsDiscoveryUseCase: StartAssetsDiscoveryUseCase,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
private val pushNotificationSettingsFeatureToggles: PushNotificationSettingsFeatureToggles,
|
private val pushNotificationSettingsFeatureToggles: PushNotificationSettingsFeatureToggles,
|
||||||
) : Model() {
|
) : Model() {
|
||||||
|
|
||||||
|
|
@ -266,7 +264,7 @@ internal class WalletSettingsModel @Inject constructor(
|
||||||
val userWallet = getUserWalletUseCase(params.userWalletId)
|
val userWallet = getUserWalletUseCase(params.userWalletId)
|
||||||
.getOrNull()
|
.getOrNull()
|
||||||
|
|
||||||
if (userWallet is UserWallet.Hot && hotWalletFeatureToggles.isAssetsDiscoveryEnabled) {
|
if (userWallet is UserWallet.Hot) {
|
||||||
startAssetsDiscoveryUseCase.cancel(params.userWalletId)
|
startAssetsDiscoveryUseCase.cancel(params.userWalletId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,5 @@ package com.tangem.features.wallet.featuretoggles
|
||||||
*/
|
*/
|
||||||
interface WalletFeatureToggles {
|
interface WalletFeatureToggles {
|
||||||
|
|
||||||
val isAddFundsStage1Enabled: Boolean
|
|
||||||
|
|
||||||
val isManageFundsEnabled: Boolean
|
val isManageFundsEnabled: Boolean
|
||||||
}
|
}
|
||||||
|
|
@ -64,7 +64,6 @@ import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.KycRejec
|
||||||
import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider
|
import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider
|
||||||
import com.tangem.features.addressbook.AddressBookFeatureToggles
|
import com.tangem.features.addressbook.AddressBookFeatureToggles
|
||||||
import com.tangem.features.biometry.AskBiometryComponent
|
import com.tangem.features.biometry.AskBiometryComponent
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.features.pushnotifications.api.PushNotificationsModelCallbacks
|
import com.tangem.features.pushnotifications.api.PushNotificationsModelCallbacks
|
||||||
import com.tangem.features.pushnotificationsettings.PushNotificationSettingsFeatureToggles
|
import com.tangem.features.pushnotificationsettings.PushNotificationSettingsFeatureToggles
|
||||||
import com.tangem.features.wallet.deeplink.WalletDeepLinkActionListener
|
import com.tangem.features.wallet.deeplink.WalletDeepLinkActionListener
|
||||||
|
|
@ -126,7 +125,6 @@ internal class WalletModel @Inject constructor(
|
||||||
private val resolveQrSendTargetsUseCase: ResolveQrSendTargetsUseCase,
|
private val resolveQrSendTargetsUseCase: ResolveQrSendTargetsUseCase,
|
||||||
private val paymentAccountStatusFetcher: PaymentAccountStatusFetcher,
|
private val paymentAccountStatusFetcher: PaymentAccountStatusFetcher,
|
||||||
private val uiMessageSender: UiMessageSender,
|
private val uiMessageSender: UiMessageSender,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
private val walletFeatureToggles: WalletFeatureToggles,
|
private val walletFeatureToggles: WalletFeatureToggles,
|
||||||
private val pushNotificationSettingsFeatureToggles: PushNotificationSettingsFeatureToggles,
|
private val pushNotificationSettingsFeatureToggles: PushNotificationSettingsFeatureToggles,
|
||||||
private val addressBookFeatureToggles: AddressBookFeatureToggles,
|
private val addressBookFeatureToggles: AddressBookFeatureToggles,
|
||||||
|
|
@ -579,7 +577,6 @@ internal class WalletModel @Inject constructor(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = walletFeatureToggles.isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -627,7 +624,6 @@ internal class WalletModel @Inject constructor(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = walletFeatureToggles.isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -650,7 +646,6 @@ internal class WalletModel @Inject constructor(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = walletFeatureToggles.isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -668,7 +663,6 @@ internal class WalletModel @Inject constructor(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = walletFeatureToggles.isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -731,7 +725,6 @@ internal class WalletModel @Inject constructor(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = walletFeatureToggles.isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
isManageFundsEnabled = walletFeatureToggles.isManageFundsEnabled,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -888,9 +881,7 @@ internal class WalletModel @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun applyPendingAssetsDiscovery() {
|
private fun applyPendingAssetsDiscovery() {
|
||||||
if (hotWalletFeatureToggles.isAssetsDiscoveryEnabled) {
|
startAssetsDiscoveryUseCase.applyPendingAssetsDiscovery()
|
||||||
startAssetsDiscoveryUseCase.applyPendingAssetsDiscovery()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun syncAddressBooksIfNeeded() {
|
private fun syncAddressBooksIfNeeded() {
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,6 @@ internal class DefaultWalletFeatureToggles @Inject constructor(
|
||||||
private val featureToggles: FeatureTogglesManager,
|
private val featureToggles: FeatureTogglesManager,
|
||||||
) : WalletFeatureToggles {
|
) : WalletFeatureToggles {
|
||||||
|
|
||||||
override val isAddFundsStage1Enabled: Boolean
|
|
||||||
get() = featureToggles.isFeatureEnabled(FeatureToggles.AND_15310_ADD_FUNDS_STAGE1)
|
|
||||||
|
|
||||||
override val isManageFundsEnabled: Boolean
|
override val isManageFundsEnabled: Boolean
|
||||||
get() = featureToggles.isFeatureEnabled(FeatureToggles.TWI_1377_MANAGE_FUNDS)
|
get() = featureToggles.isFeatureEnabled(FeatureToggles.TWI_1377_MANAGE_FUNDS)
|
||||||
}
|
}
|
||||||
|
|
@ -37,8 +37,6 @@ import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents
|
||||||
import com.tangem.feature.wallet.impl.R
|
import com.tangem.feature.wallet.impl.R
|
||||||
import com.tangem.feature.wallet.presentation.account.AccountDependencies
|
import com.tangem.feature.wallet.presentation.account.AccountDependencies
|
||||||
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification
|
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles
|
|
||||||
import com.tangem.hot.sdk.model.HotWalletId
|
import com.tangem.hot.sdk.model.HotWalletId
|
||||||
import com.tangem.lib.crypto.BlockchainUtils
|
import com.tangem.lib.crypto.BlockchainUtils
|
||||||
import com.tangem.utils.annotations.RemoveWithToggle
|
import com.tangem.utils.annotations.RemoveWithToggle
|
||||||
|
|
@ -66,11 +64,9 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
|
||||||
private val getUpgradeBannerClosureTimestampUseCase: GetUpgradeBannerClosureTimestampUseCase,
|
private val getUpgradeBannerClosureTimestampUseCase: GetUpgradeBannerClosureTimestampUseCase,
|
||||||
private val checkHotWalletUpgradeBannerUseCase: CheckHotWalletUpgradeBannerUseCase,
|
private val checkHotWalletUpgradeBannerUseCase: CheckHotWalletUpgradeBannerUseCase,
|
||||||
private val observeAssetsDiscoveryUseCase: ObserveAssetsDiscoveryUseCase,
|
private val observeAssetsDiscoveryUseCase: ObserveAssetsDiscoveryUseCase,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
private val shouldShowYieldBoostMainBannerUseCase: ShouldShowYieldBoostMainBannerUseCase,
|
private val shouldShowYieldBoostMainBannerUseCase: ShouldShowYieldBoostMainBannerUseCase,
|
||||||
private val yieldSupplyGetShouldShowMainPromoUseCase: YieldSupplyGetShouldShowMainPromoUseCase,
|
private val yieldSupplyGetShouldShowMainPromoUseCase: YieldSupplyGetShouldShowMainPromoUseCase,
|
||||||
private val designFeatureToggles: DesignFeatureToggles,
|
private val designFeatureToggles: DesignFeatureToggles,
|
||||||
private val walletFeatureToggles: WalletFeatureToggles,
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST", "MagicNumber", "LongMethod", "CastNullableToNonNullableType")
|
@Suppress("UNCHECKED_CAST", "MagicNumber", "LongMethod", "CastNullableToNonNullableType")
|
||||||
|
|
@ -80,7 +76,7 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
|
||||||
val accountStatusListFlow = accountDependencies.singleAccountStatusListSupplier(params)
|
val accountStatusListFlow = accountDependencies.singleAccountStatusListSupplier(params)
|
||||||
|
|
||||||
val assetsDiscoveryProgressFlow =
|
val assetsDiscoveryProgressFlow =
|
||||||
if (hotWalletFeatureToggles.isAssetsDiscoveryEnabled && userWallet is UserWallet.Hot) {
|
if (userWallet is UserWallet.Hot) {
|
||||||
observeAssetsDiscoveryUseCase(userWallet.walletId).distinctUntilChanged()
|
observeAssetsDiscoveryUseCase(userWallet.walletId).distinctUntilChanged()
|
||||||
} else {
|
} else {
|
||||||
flowOf(AssetsDiscoveryProgress.Idle)
|
flowOf(AssetsDiscoveryProgress.Idle)
|
||||||
|
|
@ -256,7 +252,6 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isAddFundsBannerVisible(totalFiatBalance: TotalFiatBalance): Boolean {
|
private fun isAddFundsBannerVisible(totalFiatBalance: TotalFiatBalance): Boolean {
|
||||||
if (!walletFeatureToggles.isAddFundsStage1Enabled) return false
|
|
||||||
val loaded = totalFiatBalance as? TotalFiatBalance.Loaded ?: return false
|
val loaded = totalFiatBalance as? TotalFiatBalance.Loaded ?: return false
|
||||||
return loaded.amount.orZero().signum() == 0
|
return loaded.amount.orZero().signum() == 0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents
|
||||||
import com.tangem.feature.wallet.impl.R
|
import com.tangem.feature.wallet.impl.R
|
||||||
import com.tangem.feature.wallet.presentation.account.AccountDependencies
|
import com.tangem.feature.wallet.presentation.account.AccountDependencies
|
||||||
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotificationUM
|
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotificationUM
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import com.tangem.hot.sdk.model.HotWalletId
|
import com.tangem.hot.sdk.model.HotWalletId
|
||||||
import com.tangem.lib.crypto.BlockchainUtils
|
import com.tangem.lib.crypto.BlockchainUtils
|
||||||
import com.tangem.utils.extensions.addIf
|
import com.tangem.utils.extensions.addIf
|
||||||
|
|
@ -50,7 +49,6 @@ internal class GetWalletNotificationsFactory @Inject constructor(
|
||||||
private val getAccessCodeSkippedUseCase: GetAccessCodeSkippedUseCase,
|
private val getAccessCodeSkippedUseCase: GetAccessCodeSkippedUseCase,
|
||||||
private val hasSingleWalletSignedHashesUseCase: HasSingleWalletSignedHashesUseCase,
|
private val hasSingleWalletSignedHashesUseCase: HasSingleWalletSignedHashesUseCase,
|
||||||
private val observeAssetsDiscoveryUseCase: ObserveAssetsDiscoveryUseCase,
|
private val observeAssetsDiscoveryUseCase: ObserveAssetsDiscoveryUseCase,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
) {
|
) {
|
||||||
fun create(userWallet: UserWallet, clickIntents: WalletClickIntents): Flow<ImmutableList<WalletNotificationUM>> {
|
fun create(userWallet: UserWallet, clickIntents: WalletClickIntents): Flow<ImmutableList<WalletNotificationUM>> {
|
||||||
val cardTypesResolver = (userWallet as? UserWallet.Cold)?.scanResponse?.cardTypesResolver
|
val cardTypesResolver = (userWallet as? UserWallet.Cold)?.scanResponse?.cardTypesResolver
|
||||||
|
|
@ -59,7 +57,7 @@ internal class GetWalletNotificationsFactory @Inject constructor(
|
||||||
val accountStatusListFlow = accountDependencies.singleAccountStatusListSupplier(params)
|
val accountStatusListFlow = accountDependencies.singleAccountStatusListSupplier(params)
|
||||||
|
|
||||||
val assetsDiscoveryProgressFlow =
|
val assetsDiscoveryProgressFlow =
|
||||||
if (hotWalletFeatureToggles.isAssetsDiscoveryEnabled && userWallet is UserWallet.Hot) {
|
if (userWallet is UserWallet.Hot) {
|
||||||
observeAssetsDiscoveryUseCase(userWallet.walletId).distinctUntilChanged()
|
observeAssetsDiscoveryUseCase(userWallet.walletId).distinctUntilChanged()
|
||||||
} else {
|
} else {
|
||||||
flowOf(AssetsDiscoveryProgress.Idle)
|
flowOf(AssetsDiscoveryProgress.Idle)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package com.tangem.feature.wallet.presentation.wallet.loaders.implementors
|
||||||
import com.tangem.core.ui.DesignFeatureToggles
|
import com.tangem.core.ui.DesignFeatureToggles
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.feature.wallet.presentation.wallet.subscribers.*
|
import com.tangem.feature.wallet.presentation.wallet.subscribers.*
|
||||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
|
|
@ -21,7 +20,6 @@ internal class MultiWalletContentLoader @AssistedInject constructor(
|
||||||
private val assetsDiscoverySubscriberFactory: AssetsDiscoverySubscriber.Factory,
|
private val assetsDiscoverySubscriberFactory: AssetsDiscoverySubscriber.Factory,
|
||||||
private val tokenListAnalyticsSubscriberFactory: TokenListAnalyticsSubscriber.Factory,
|
private val tokenListAnalyticsSubscriberFactory: TokenListAnalyticsSubscriber.Factory,
|
||||||
private val designFeatureToggles: DesignFeatureToggles,
|
private val designFeatureToggles: DesignFeatureToggles,
|
||||||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
|
||||||
) : WalletContentLoader(id = userWallet.walletId) {
|
) : WalletContentLoader(id = userWallet.walletId) {
|
||||||
|
|
||||||
override fun create(): List<WalletSubscriber> = listOfNotNull(
|
override fun create(): List<WalletSubscriber> = listOfNotNull(
|
||||||
|
|
@ -36,7 +34,7 @@ internal class MultiWalletContentLoader @AssistedInject constructor(
|
||||||
multiWalletActionButtonsSubscriberFactory.create(userWallet),
|
multiWalletActionButtonsSubscriberFactory.create(userWallet),
|
||||||
tangemPayMainSubscriberFactory.create(userWallet),
|
tangemPayMainSubscriberFactory.create(userWallet),
|
||||||
tokenListAnalyticsSubscriberFactory.create(userWallet),
|
tokenListAnalyticsSubscriberFactory.create(userWallet),
|
||||||
if (hotWalletFeatureToggles.isAssetsDiscoveryEnabled && userWallet is UserWallet.Hot) {
|
if (userWallet is UserWallet.Hot) {
|
||||||
assetsDiscoverySubscriberFactory.create(userWallet)
|
assetsDiscoverySubscriberFactory.create(userWallet)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ internal class AddWalletTransformer(
|
||||||
private val clickIntents: WalletClickIntents,
|
private val clickIntents: WalletClickIntents,
|
||||||
private val walletImageResolver: WalletImageResolver,
|
private val walletImageResolver: WalletImageResolver,
|
||||||
private val getWalletIconUseCase: GetWalletIconUseCase,
|
private val getWalletIconUseCase: GetWalletIconUseCase,
|
||||||
private val isAddFundsStage1Enabled: Boolean,
|
|
||||||
private val isManageFundsEnabled: Boolean,
|
private val isManageFundsEnabled: Boolean,
|
||||||
) : WalletScreenStateTransformer {
|
) : WalletScreenStateTransformer {
|
||||||
|
|
||||||
|
|
@ -22,7 +21,6 @@ internal class AddWalletTransformer(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = isManageFundsEnabled,
|
isManageFundsEnabled = isManageFundsEnabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ internal class InitializeWalletsTransformer(
|
||||||
private val clickIntents: WalletClickIntents,
|
private val clickIntents: WalletClickIntents,
|
||||||
private val walletImageResolver: WalletImageResolver,
|
private val walletImageResolver: WalletImageResolver,
|
||||||
private val getWalletIconUseCase: GetWalletIconUseCase,
|
private val getWalletIconUseCase: GetWalletIconUseCase,
|
||||||
private val isAddFundsStage1Enabled: Boolean,
|
|
||||||
private val isManageFundsEnabled: Boolean,
|
private val isManageFundsEnabled: Boolean,
|
||||||
) : WalletScreenStateTransformer {
|
) : WalletScreenStateTransformer {
|
||||||
|
|
||||||
|
|
@ -37,7 +36,6 @@ internal class InitializeWalletsTransformer(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = isManageFundsEnabled,
|
isManageFundsEnabled = isManageFundsEnabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -152,15 +150,11 @@ internal class InitializeWalletsTransformer(
|
||||||
userWallet.scanResponse.cardTypesResolver.isSingleWalletWithToken()
|
userWallet.scanResponse.cardTypesResolver.isSingleWalletWithToken()
|
||||||
if (isSingleWalletWithToken) return persistentListOf()
|
if (isSingleWalletWithToken) return persistentListOf()
|
||||||
|
|
||||||
val firstButton = if (isAddFundsStage1Enabled) {
|
val firstButton = WalletManageButton.AddFunds(
|
||||||
WalletManageButton.AddFunds(
|
enabled = false,
|
||||||
enabled = false,
|
dimContent = false,
|
||||||
dimContent = false,
|
onClick = {},
|
||||||
onClick = {},
|
)
|
||||||
)
|
|
||||||
} else {
|
|
||||||
WalletManageButton.Buy(enabled = false, dimContent = false, onClick = {})
|
|
||||||
}
|
|
||||||
|
|
||||||
val lastButton = if (isManageFundsEnabled) {
|
val lastButton = if (isManageFundsEnabled) {
|
||||||
WalletManageButton.Transfer(enabled = false, dimContent = false, onClick = {})
|
WalletManageButton.Transfer(enabled = false, dimContent = false, onClick = {})
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ internal class ReinitializeNewWalletTransformer(
|
||||||
private val clickIntents: WalletClickIntents,
|
private val clickIntents: WalletClickIntents,
|
||||||
private val walletImageResolver: WalletImageResolver,
|
private val walletImageResolver: WalletImageResolver,
|
||||||
private val getWalletIconUseCase: GetWalletIconUseCase,
|
private val getWalletIconUseCase: GetWalletIconUseCase,
|
||||||
private val isAddFundsStage1Enabled: Boolean,
|
|
||||||
private val isManageFundsEnabled: Boolean,
|
private val isManageFundsEnabled: Boolean,
|
||||||
) : WalletScreenStateTransformer {
|
) : WalletScreenStateTransformer {
|
||||||
|
|
||||||
|
|
@ -34,7 +33,6 @@ internal class ReinitializeNewWalletTransformer(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = isManageFundsEnabled,
|
isManageFundsEnabled = isManageFundsEnabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ internal class ReinitializeWalletTransformer(
|
||||||
private val clickIntents: WalletClickIntents,
|
private val clickIntents: WalletClickIntents,
|
||||||
private val walletImageResolver: WalletImageResolver,
|
private val walletImageResolver: WalletImageResolver,
|
||||||
private val getWalletIconUseCase: GetWalletIconUseCase,
|
private val getWalletIconUseCase: GetWalletIconUseCase,
|
||||||
private val isAddFundsStage1Enabled: Boolean,
|
|
||||||
private val isManageFundsEnabled: Boolean,
|
private val isManageFundsEnabled: Boolean,
|
||||||
) : WalletStateTransformer(userWalletId = userWallet.walletId) {
|
) : WalletStateTransformer(userWalletId = userWallet.walletId) {
|
||||||
|
|
||||||
|
|
@ -29,7 +28,6 @@ internal class ReinitializeWalletTransformer(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = isManageFundsEnabled,
|
isManageFundsEnabled = isManageFundsEnabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ internal class UnlockWalletTransformer(
|
||||||
private val clickIntents: WalletClickIntents,
|
private val clickIntents: WalletClickIntents,
|
||||||
private val walletImageResolver: WalletImageResolver,
|
private val walletImageResolver: WalletImageResolver,
|
||||||
private val getWalletIconUseCase: GetWalletIconUseCase,
|
private val getWalletIconUseCase: GetWalletIconUseCase,
|
||||||
private val isAddFundsStage1Enabled: Boolean,
|
|
||||||
private val isManageFundsEnabled: Boolean,
|
private val isManageFundsEnabled: Boolean,
|
||||||
) : WalletScreenStateTransformer {
|
) : WalletScreenStateTransformer {
|
||||||
|
|
||||||
|
|
@ -27,7 +26,6 @@ internal class UnlockWalletTransformer(
|
||||||
clickIntents = clickIntents,
|
clickIntents = clickIntents,
|
||||||
walletImageResolver = walletImageResolver,
|
walletImageResolver = walletImageResolver,
|
||||||
getWalletIconUseCase = getWalletIconUseCase,
|
getWalletIconUseCase = getWalletIconUseCase,
|
||||||
isAddFundsStage1Enabled = isAddFundsStage1Enabled,
|
|
||||||
isManageFundsEnabled = isManageFundsEnabled,
|
isManageFundsEnabled = isManageFundsEnabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.tangem.feature.wallet.presentation.wallet.state.utils
|
package com.tangem.feature.wallet.presentation.wallet.state.utils
|
||||||
|
|
||||||
import com.tangem.common.ui.userwallet.converter.WalletIconUMConverter
|
import com.tangem.common.ui.userwallet.converter.WalletIconUMConverter
|
||||||
import com.tangem.core.analytics.models.event.MainScreenAnalyticsEvent.Companion.WALLET_TYPE
|
|
||||||
import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig
|
import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig
|
||||||
import com.tangem.core.ui.components.marketprice.MarketPriceBlockState
|
import com.tangem.core.ui.components.marketprice.MarketPriceBlockState
|
||||||
import com.tangem.core.ui.components.transactions.state.TxHistoryState
|
import com.tangem.core.ui.components.transactions.state.TxHistoryState
|
||||||
|
|
@ -35,7 +34,6 @@ internal class WalletLoadingStateFactory(
|
||||||
private val clickIntents: WalletClickIntents,
|
private val clickIntents: WalletClickIntents,
|
||||||
private val walletImageResolver: WalletImageResolver,
|
private val walletImageResolver: WalletImageResolver,
|
||||||
private val getWalletIconUseCase: GetWalletIconUseCase,
|
private val getWalletIconUseCase: GetWalletIconUseCase,
|
||||||
private val isAddFundsStage1Enabled: Boolean,
|
|
||||||
private val isManageFundsEnabled: Boolean,
|
private val isManageFundsEnabled: Boolean,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
@ -153,24 +151,11 @@ internal class WalletLoadingStateFactory(
|
||||||
userWallet is UserWallet.Cold && userWallet.scanResponse.cardTypesResolver.isSingleWalletWithToken()
|
userWallet is UserWallet.Cold && userWallet.scanResponse.cardTypesResolver.isSingleWalletWithToken()
|
||||||
if (isSingleWalletWithToken) return persistentListOf()
|
if (isSingleWalletWithToken) return persistentListOf()
|
||||||
|
|
||||||
val firstButton = if (isAddFundsStage1Enabled) {
|
val firstButton = WalletManageButton.AddFunds(
|
||||||
WalletManageButton.AddFunds(
|
enabled = true,
|
||||||
enabled = true,
|
dimContent = false,
|
||||||
dimContent = false,
|
onClick = { clickIntents.onAddFundsClick(userWallet.walletId) },
|
||||||
onClick = { clickIntents.onAddFundsClick(userWallet.walletId) },
|
)
|
||||||
)
|
|
||||||
} else {
|
|
||||||
WalletManageButton.Buy(
|
|
||||||
enabled = true,
|
|
||||||
dimContent = false,
|
|
||||||
onClick = {
|
|
||||||
clickIntents.onMultiWalletBuyClick(
|
|
||||||
userWalletId = userWallet.walletId,
|
|
||||||
WALLET_TYPE,
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val lastButton = if (isManageFundsEnabled) {
|
val lastButton = if (isManageFundsEnabled) {
|
||||||
WalletManageButton.Transfer(
|
WalletManageButton.Transfer(
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,9 @@ internal class WalletManagerFactoryCreator @Inject constructor(
|
||||||
isYieldSupplyEnabled = true,
|
isYieldSupplyEnabled = true,
|
||||||
isYieldModeSwapEnabled = featureToggleValues.isYieldModeSwapEnabled,
|
isYieldModeSwapEnabled = featureToggleValues.isYieldModeSwapEnabled,
|
||||||
isPendingTransactionsEnabled = true,
|
isPendingTransactionsEnabled = true,
|
||||||
isSolanaTxHistoryEnabled = featureToggleValues.isSolanaTxHistoryEnabled,
|
isSolanaTxHistoryEnabled = true,
|
||||||
isSolanaScaledUiAmountEnabled = featureToggleValues.isSolanaScaledUiAmountEnabled,
|
isSolanaScaledUiAmountEnabled = true,
|
||||||
isHederaErc20Enabled = featureToggleValues.isHederaErc20Enabled,
|
isHederaErc20Enabled = true,
|
||||||
isStateOverrideGasEstimateEnabled = featureToggleValues.isStateOverrideGasEstimateEnabled,
|
isStateOverrideGasEstimateEnabled = featureToggleValues.isStateOverrideGasEstimateEnabled,
|
||||||
),
|
),
|
||||||
blockchainDataStorage = blockchainDataStorage,
|
blockchainDataStorage = blockchainDataStorage,
|
||||||
|
|
@ -50,10 +50,7 @@ internal class WalletManagerFactoryCreator @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
data class FeatureToggleValues(
|
data class FeatureToggleValues(
|
||||||
val isSolanaTxHistoryEnabled: Boolean,
|
|
||||||
val isSolanaScaledUiAmountEnabled: Boolean,
|
|
||||||
val isYieldModeSwapEnabled: Boolean,
|
val isYieldModeSwapEnabled: Boolean,
|
||||||
val isHederaErc20Enabled: Boolean,
|
|
||||||
val isStateOverrideGasEstimateEnabled: Boolean,
|
val isStateOverrideGasEstimateEnabled: Boolean,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -98,18 +98,9 @@ internal object BlockchainSDKFactoryModule {
|
||||||
blockchainDataStorage = DefaultBlockchainDataStorage(appPreferencesStore),
|
blockchainDataStorage = DefaultBlockchainDataStorage(appPreferencesStore),
|
||||||
blockchainSDKLogger = blockchainSDKLogger,
|
blockchainSDKLogger = blockchainSDKLogger,
|
||||||
featureToggleValues = WalletManagerFactoryCreator.FeatureToggleValues(
|
featureToggleValues = WalletManagerFactoryCreator.FeatureToggleValues(
|
||||||
isSolanaTxHistoryEnabled = featureTogglesManager.isFeatureEnabled(
|
|
||||||
FeatureToggles.SOLANA_TX_HISTORY_ENABLED,
|
|
||||||
),
|
|
||||||
isSolanaScaledUiAmountEnabled = featureTogglesManager.isFeatureEnabled(
|
|
||||||
FeatureToggles.SOLANA_SCALED_UI_AMOUNT_ENABLED,
|
|
||||||
),
|
|
||||||
isYieldModeSwapEnabled = featureTogglesManager.isFeatureEnabled(
|
isYieldModeSwapEnabled = featureTogglesManager.isFeatureEnabled(
|
||||||
FeatureToggles.TWI_1326_YIELD_MODE_SWAP_ENABLED,
|
FeatureToggles.TWI_1326_YIELD_MODE_SWAP_ENABLED,
|
||||||
),
|
),
|
||||||
isHederaErc20Enabled = featureTogglesManager.isFeatureEnabled(
|
|
||||||
FeatureToggles.HEDERA_ERC20_ENABLED,
|
|
||||||
),
|
|
||||||
isStateOverrideGasEstimateEnabled = featureTogglesManager.isFeatureEnabled(
|
isStateOverrideGasEstimateEnabled = featureTogglesManager.isFeatureEnabled(
|
||||||
FeatureToggles.AND_15120_SWAP_INTEGRATED_APPROVE,
|
FeatureToggles.AND_15120_SWAP_INTEGRATED_APPROVE,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue