diff --git a/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt index d6e0a771ad..f1b9bdeabc 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt @@ -143,7 +143,6 @@ internal object TokensDomainModule { fun provideGetCurrencyWarningsUseCase( walletManagersFacade: WalletManagersFacade, currenciesRepository: CurrenciesRepository, - networksRepository: NetworksRepository, currencyChecksRepository: CurrencyChecksRepository, dispatchers: CoroutineDispatcherProvider, baseCurrencyStatusOperations: BaseCurrencyStatusOperations, @@ -151,9 +150,8 @@ internal object TokensDomainModule { return GetCurrencyWarningsUseCase( walletManagersFacade = walletManagersFacade, currenciesRepository = currenciesRepository, - networksRepository = networksRepository, - currencyChecksRepository = currencyChecksRepository, dispatchers = dispatchers, + currencyChecksRepository = currencyChecksRepository, currencyStatusOperations = baseCurrencyStatusOperations, ) } diff --git a/common/test/build.gradle.kts b/common/test/build.gradle.kts index 62d076fdff..3013d947d3 100644 --- a/common/test/build.gradle.kts +++ b/common/test/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { implementation(projects.domain.models) implementation(projects.domain.staking.models) implementation(projects.domain.tokens.models) + implementation(projects.domain.txhistory.models) implementation(projects.domain.wallets) implementation(projects.domain.wallets.models) diff --git a/common/test/src/main/java/com/tangem/common/test/domain/walletmanager/MockUpdateWalletManagerResultFactory.kt b/common/test/src/main/java/com/tangem/common/test/domain/walletmanager/MockUpdateWalletManagerResultFactory.kt new file mode 100644 index 0000000000..b7684db809 --- /dev/null +++ b/common/test/src/main/java/com/tangem/common/test/domain/walletmanager/MockUpdateWalletManagerResultFactory.kt @@ -0,0 +1,64 @@ +package com.tangem.common.test.domain.walletmanager + +import com.tangem.domain.txhistory.models.TxHistoryItem +import com.tangem.domain.walletmanager.model.Address +import com.tangem.domain.walletmanager.model.CryptoCurrencyAmount +import com.tangem.domain.walletmanager.model.CryptoCurrencyTransaction +import com.tangem.domain.walletmanager.model.UpdateWalletManagerResult +import java.math.BigDecimal + +/** +[REDACTED_AUTHOR] + */ +class MockUpdateWalletManagerResultFactory { + + fun createUnreachable(): UpdateWalletManagerResult { + return UpdateWalletManagerResult.Unreachable(selectedAddress = null, addresses = null) + } + + fun createUnreachableWithAddress(): UpdateWalletManagerResult { + return UpdateWalletManagerResult.Unreachable( + selectedAddress = "0x1", + addresses = setOf(Address(value = "0x1", type = Address.Type.Primary)), + ) + } + + fun createNoAccount(): UpdateWalletManagerResult { + return UpdateWalletManagerResult.NoAccount( + selectedAddress = "0x1", + addresses = setOf(Address(value = "0x1", type = Address.Type.Primary)), + amountToCreateAccount = BigDecimal.ZERO, + errorMessage = "", + ) + } + + fun createVerified(): UpdateWalletManagerResult { + return UpdateWalletManagerResult.Verified( + selectedAddress = "0x1", + addresses = setOf(Address(value = "0x1", type = Address.Type.Primary)), + currenciesAmounts = setOf( + CryptoCurrencyAmount.Coin(value = BigDecimal.ONE), + ), + currentTransactions = setOf( + CryptoCurrencyTransaction.Coin(txHistoryItem), + ), + ) + } + + private companion object { + + val txHistoryItem = TxHistoryItem( + txHash = "erroribus", + timestampInMillis = 2771, + isOutgoing = false, + destinationType = TxHistoryItem.DestinationType.Single( + addressType = TxHistoryItem.AddressType.User(address = "0x1"), + ), + sourceType = TxHistoryItem.SourceType.Single(address = "0x2"), + interactionAddressType = null, + status = TxHistoryItem.TransactionStatus.Confirmed, + type = TxHistoryItem.TransactionType.Transfer, + amount = BigDecimal.ONE, + ) + } +} \ No newline at end of file diff --git a/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt b/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt index 8e21f85ff3..531dbb5987 100644 --- a/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt +++ b/data/networks/src/test/java/com/tangem/data/networks/utils/NetworkStatusFactoryTest.kt @@ -3,12 +3,11 @@ package com.tangem.data.networks.utils import com.google.common.truth.Truth import com.tangem.blockchain.common.Blockchain import com.tangem.common.test.domain.token.MockCryptoCurrencyFactory +import com.tangem.common.test.domain.walletmanager.MockUpdateWalletManagerResultFactory import com.tangem.domain.models.StatusSource import com.tangem.domain.tokens.model.* import com.tangem.domain.txhistory.models.TxHistoryItem import com.tangem.domain.walletmanager.model.Address -import com.tangem.domain.walletmanager.model.CryptoCurrencyAmount -import com.tangem.domain.walletmanager.model.CryptoCurrencyTransaction import com.tangem.domain.walletmanager.model.UpdateWalletManagerResult import org.junit.Test import org.junit.runner.RunWith @@ -68,6 +67,8 @@ internal class NetworkStatusFactoryTest(private val model: Model) { amount = BigDecimal.ONE, ) + val updateWalletManagerResultFactory = MockUpdateWalletManagerResultFactory() + @JvmStatic @Parameterized.Parameters fun data(): Collection = listOf( @@ -80,7 +81,7 @@ internal class NetworkStatusFactoryTest(private val model: Model) { // region Unreachable createSuccess( - result = UpdateWalletManagerResult.Unreachable(selectedAddress = null, addresses = null), + result = updateWalletManagerResultFactory.createUnreachable(), status = NetworkStatus.Unreachable(address = null), ), createSuccess( @@ -98,10 +99,7 @@ internal class NetworkStatusFactoryTest(private val model: Model) { status = NetworkStatus.Unreachable(address = null), ), createSuccess( - result = UpdateWalletManagerResult.Unreachable( - selectedAddress = "0x1", - addresses = setOf(Address(value = "0x1", type = Address.Type.Primary)), - ), + result = updateWalletManagerResultFactory.createUnreachableWithAddress(), status = NetworkStatus.Unreachable( address = NetworkAddress.Single( defaultAddress = NetworkAddress.Address( @@ -149,12 +147,7 @@ internal class NetworkStatusFactoryTest(private val model: Model) { throwable = selectedAddressThrowable, ), createSuccess( - result = UpdateWalletManagerResult.NoAccount( - selectedAddress = "0x1", - addresses = setOf(Address(value = "0x1", type = Address.Type.Primary)), - amountToCreateAccount = BigDecimal.ZERO, - errorMessage = "", - ), + result = updateWalletManagerResultFactory.createNoAccount(), status = NetworkStatus.NoAccount( address = NetworkAddress.Single( defaultAddress = NetworkAddress.Address( @@ -207,16 +200,7 @@ internal class NetworkStatusFactoryTest(private val model: Model) { throwable = selectedAddressThrowable, ), createSuccess( - result = UpdateWalletManagerResult.Verified( - selectedAddress = "0x1", - addresses = setOf(Address(value = "0x1", type = Address.Type.Primary)), - currenciesAmounts = setOf( - CryptoCurrencyAmount.Coin(value = BigDecimal.ONE), - ), - currentTransactions = setOf( - CryptoCurrencyTransaction.Coin(txHistoryItem), - ), - ), + result = updateWalletManagerResultFactory.createVerified(), currencies = currencies, status = NetworkStatus.Verified( address = NetworkAddress.Single( diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt index 4426e81e54..46ee114672 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt @@ -1,9 +1,7 @@ package com.tangem.data.tokens.repository -import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.address.AddressType import com.tangem.blockchainsdk.utils.ExcludedBlockchains -import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.data.common.cache.CacheRegistry import com.tangem.data.common.currency.CardCryptoCurrencyFactory import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory @@ -75,11 +73,6 @@ internal class DefaultNetworksRepository( networksStatusesStore.getSyncOrNull(userWalletId).orEmpty() } - override fun isNeedToCreateAccountWithoutReserve(network: Network): Boolean { - val blockchain = Blockchain.fromNetworkId(network.id.value) - return REQUIRED_ACCOUNT_WITHOUT_RESERVE_BLOCKCHAINS.contains(blockchain) - } - override suspend fun getNetworkAddresses( userWalletId: UserWalletId, network: Network, @@ -264,9 +257,4 @@ internal class DefaultNetworksRepository( private fun getNetworksStatusesCacheKey(userWalletId: UserWalletId, network: Network): String { return "network_status_${userWalletId}_${network.id.value}_${network.derivationPath.value}" } - - private companion object { - - val REQUIRED_ACCOUNT_WITHOUT_RESERVE_BLOCKCHAINS = listOf(Blockchain.Aptos, Blockchain.Filecoin) - } } \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt index 00526a46a7..87c17435f0 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt @@ -1,5 +1,6 @@ package com.tangem.domain.tokens +import com.tangem.blockchainsdk.utils.isNeedToCreateAccountWithoutReserve import com.tangem.domain.models.StatusSource import com.tangem.domain.tokens.model.* import com.tangem.domain.tokens.model.warnings.CryptoCurrencyWarning @@ -8,7 +9,6 @@ import com.tangem.domain.tokens.model.warnings.KaspaWarnings import com.tangem.domain.tokens.operations.BaseCurrencyStatusOperations import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.CurrencyChecksRepository -import com.tangem.domain.tokens.repository.NetworksRepository import com.tangem.domain.transaction.models.AssetRequirementsCondition import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.models.UserWalletId @@ -21,7 +21,6 @@ import java.math.BigDecimal class GetCurrencyWarningsUseCase( private val walletManagersFacade: WalletManagersFacade, private val currenciesRepository: CurrenciesRepository, - private val networksRepository: NetworksRepository, private val dispatchers: CoroutineDispatcherProvider, private val currencyChecksRepository: CurrencyChecksRepository, private val currencyStatusOperations: BaseCurrencyStatusOperations, @@ -191,7 +190,7 @@ class GetCurrencyWarningsUseCase( private fun getNetworkNoAccountWarning(currencyStatus: CryptoCurrencyStatus): CryptoCurrencyWarning? { return (currencyStatus.value as? CryptoCurrencyStatus.NoAccount)?.let { - if (networksRepository.isNeedToCreateAccountWithoutReserve(network = currencyStatus.currency.network)) { + if (isNeedToCreateAccountWithoutReserve(networkId = currencyStatus.currency.network.id.value)) { CryptoCurrencyWarning.TopUpWithoutReserve } else { CryptoCurrencyWarning.SomeNetworksNoAccount( diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt index 1b66ccde06..47f82bff87 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt @@ -59,8 +59,6 @@ interface NetworksRepository { refresh: Boolean = false, ): Set - fun isNeedToCreateAccountWithoutReserve(network: Network): Boolean - /** * Returns list of addresses and crypto currency info of added currencies of [network] in selected wallet [userWalletId] */ diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockNetworksRepository.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockNetworksRepository.kt deleted file mode 100644 index c7866234bf..0000000000 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockNetworksRepository.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.tangem.domain.tokens.repository - -import arrow.core.Either -import arrow.core.getOrElse -import com.tangem.domain.core.error.DataError -import com.tangem.domain.tokens.model.CryptoCurrencyAddress -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.tokens.model.NetworkStatus -import com.tangem.domain.wallets.models.UserWalletId -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.map - -internal class MockNetworksRepository( - private val statuses: Flow>>, -) : NetworksRepository { - - override fun getNetworkStatusesUpdates( - userWalletId: UserWalletId, - networks: Set, - ): Flow> { - return statuses.map { it.getOrElse { e -> throw e } } - } - - override suspend fun fetchNetworkStatuses(userWalletId: UserWalletId, networks: Set, refresh: Boolean) { - /* no-op */ - } - - override suspend fun fetchNetworkPendingTransactions(userWalletId: UserWalletId, networks: Set) { - // no-op - } - - override suspend fun getNetworkStatusesSync( - userWalletId: UserWalletId, - networks: Set, - refresh: Boolean, - ): Set { - return statuses.map { it.getOrElse { e -> throw e } }.first() - } - - override fun isNeedToCreateAccountWithoutReserve(network: Network) = false - - override suspend fun getNetworkAddresses( - userWalletId: UserWalletId, - network: Network, - ): List { - return emptyList() - } -} \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt index 39409aaddb..c7512e7946 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt @@ -468,8 +468,17 @@ fun Blockchain.amountToCreateAccount(walletManager: WalletManager, token: Token? } } +/** Returns flag that determines whether account should be created without reserve by [networkId] */ +fun isNeedToCreateAccountWithoutReserve(networkId: String): Boolean { + val blockchain = Blockchain.fromNetworkId(networkId = networkId) + + return REQUIRED_ACCOUNT_WITHOUT_RESERVE_BLOCKCHAINS.contains(blockchain) +} + const val OLD_POLYGON_NAME = "matic-network" const val NEW_POLYGON_NAME = "polygon-ecosystem-token" private const val NODL = "NODL" -private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 \ No newline at end of file +private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 + +private val REQUIRED_ACCOUNT_WITHOUT_RESERVE_BLOCKCHAINS = listOf(Blockchain.Aptos, Blockchain.Filecoin) \ No newline at end of file