Updated on 2026-08-14

This commit is contained in:
Tangem 2026-07-16 17:45:25 +04:00
parent 0b81b905c3
commit 50332186fa
47 changed files with 38 additions and 408 deletions

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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,
) )
} }

View file

@ -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
} }

View file

@ -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"

View file

@ -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",

View file

@ -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()
} }
} }

View file

@ -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>()

View file

@ -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)
}

View file

@ -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)

View file

@ -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

View file

@ -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(

View file

@ -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)

View file

@ -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(

View file

@ -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(

View file

@ -1,6 +0,0 @@
package com.tangem.domain.dynamicaddresses
interface DynamicAddressesFeatureToggles {
val isDynamicAddressesEnabled: Boolean
}

View file

@ -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

View file

@ -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")

View file

@ -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)

View file

@ -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() }

View file

@ -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
} }

View file

@ -1,5 +0,0 @@
package com.tangem.features.hotwallet
interface HotWalletFeatureToggles {
val isAssetsDiscoveryEnabled: Boolean
}

View file

@ -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)
}

View file

@ -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()

View file

@ -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)
} }
} }

View file

@ -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)
}
}

View file

@ -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 ->

View file

@ -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,
) )
} }

View file

@ -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(

View file

@ -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

View file

@ -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)
} }

View file

@ -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)
} }

View file

@ -7,7 +7,5 @@ package com.tangem.features.wallet.featuretoggles
*/ */
interface WalletFeatureToggles { interface WalletFeatureToggles {
val isAddFundsStage1Enabled: Boolean
val isManageFundsEnabled: Boolean val isManageFundsEnabled: Boolean
} }

View file

@ -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() {

View file

@ -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)
} }

View file

@ -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
} }

View file

@ -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)

View file

@ -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

View file

@ -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,
) )
} }

View file

@ -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 = {})

View file

@ -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,
) )
} }

View file

@ -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,
) )
} }

View file

@ -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,
) )
} }

View file

@ -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(

View file

@ -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,
) )
} }

View file

@ -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,
), ),