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

@ -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.
* Policy check only hardware XPUB capability is verified by [IsXpubSupportedUseCase].
*/
class IsDynamicAddressesAvailableUseCase(
private val featureToggles: DynamicAddressesFeatureToggles,
) {
class IsDynamicAddressesAvailableUseCase {
operator fun invoke(userWallet: UserWallet, cryptoCurrency: CryptoCurrency): Boolean {
if (!featureToggles.isDynamicAddressesEnabled) return false
if (cryptoCurrency !is CryptoCurrency.Coin) return false
val network = cryptoCurrency.network

View file

@ -21,13 +21,11 @@ import org.junit.jupiter.api.TestInstance
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class IsDynamicAddressesAvailableUseCaseTest {
private val featureToggles: DynamicAddressesFeatureToggles = mockk()
private val useCase = IsDynamicAddressesAvailableUseCase(featureToggles)
private val useCase = IsDynamicAddressesAvailableUseCase()
@BeforeAll
fun setup() {
mockkStatic("com.tangem.domain.wallets.derivations.DerivationStyleProviderExtKt")
every { featureToggles.isDynamicAddressesEnabled } returns true
}
@AfterAll
@ -37,17 +35,6 @@ class IsDynamicAddressesAvailableUseCaseTest {
// 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
fun `token currency returns false`() {
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.getSyncOrNull
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
import com.tangem.domain.dynamicaddresses.model.DynamicAddressesStatus
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
@ -27,7 +26,6 @@ class ReceiveAddressesFactory(
private val getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase,
private val getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase,
private val dynamicAddressesRepository: DynamicAddressesRepository,
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles,
private val userWalletsListRepository: UserWalletsListRepository,
) {
@ -68,7 +66,6 @@ class ReceiveAddressesFactory(
userWalletId: UserWalletId,
cryptoCurrency: CryptoCurrency,
): String? {
if (!dynamicAddressesFeatureToggles.isDynamicAddressesEnabled) return null
if (cryptoCurrency !is CryptoCurrency.Coin) return null
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.wallet.MockUserWalletFactory
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.dynamicaddresses.DynamicAddressesFeatureToggles
import com.tangem.domain.dynamicaddresses.GetDynamicReceiveAddressUseCase
import com.tangem.domain.dynamicaddresses.repository.DynamicAddressesRepository
import com.tangem.domain.models.currency.CryptoCurrencyStatus
@ -28,7 +27,6 @@ internal class ReceiveAddressesFactoryTest {
private val getViewedTokenReceiveWarningUseCase: GetViewedTokenReceiveWarningUseCase = mockk()
private val getDynamicReceiveAddressUseCase: GetDynamicReceiveAddressUseCase = mockk()
private val dynamicAddressesRepository: DynamicAddressesRepository = mockk()
private val dynamicAddressesFeatureToggles: DynamicAddressesFeatureToggles = mockk()
private val userWalletsListRepository: UserWalletsListRepository = mockk()
private val factory = ReceiveAddressesFactory(
@ -36,7 +34,6 @@ internal class ReceiveAddressesFactoryTest {
getViewedTokenReceiveWarningUseCase = getViewedTokenReceiveWarningUseCase,
getDynamicReceiveAddressUseCase = getDynamicReceiveAddressUseCase,
dynamicAddressesRepository = dynamicAddressesRepository,
dynamicAddressesFeatureToggles = dynamicAddressesFeatureToggles,
userWalletsListRepository = userWalletsListRepository,
)
@ -54,7 +51,6 @@ internal class ReceiveAddressesFactoryTest {
)
}
every { dynamicAddressesFeatureToggles.isDynamicAddressesEnabled } returns true
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])
every { dynamicAddressesRepository.getStatus(any(), any()) } returns flow { awaitCancellation() }

View file

@ -1,6 +1,5 @@
package com.tangem.domain.txhistory
interface TxHistoryFeatureToggles {
val isSolanaTxHistoryEnabled: Boolean
val isNewTxHistoryEnabled: Boolean
}