diff --git a/app/src/main/java/com/tangem/tap/di/domain/WalletsDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/WalletsDomainModule.kt index 2f5322f914..c539df5afc 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/WalletsDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/WalletsDomainModule.kt @@ -3,7 +3,10 @@ package com.tangem.tap.di.domain import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.UserWalletsListManager -import com.tangem.domain.wallets.repository.WalletAddressServiceRepository +import com.tangem.domain.transaction.WalletAddressServiceRepository +import com.tangem.domain.transaction.usecase.ParseSharedAddressUseCase +import com.tangem.domain.transaction.usecase.ValidateWalletAddressUseCase +import com.tangem.domain.transaction.usecase.ValidateWalletMemoUseCase import com.tangem.domain.wallets.repository.WalletNamesMigrationRepository import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.domain.wallets.usecase.* @@ -126,10 +129,12 @@ internal object WalletsDomainModule { @Singleton fun providesValidateWalletAddressUseCase( walletAddressServiceRepository: WalletAddressServiceRepository, + walletManagersFacade: WalletManagersFacade, dispatchers: CoroutineDispatcherProvider, ): ValidateWalletAddressUseCase { return ValidateWalletAddressUseCase( walletAddressServiceRepository = walletAddressServiceRepository, + walletManagersFacade = walletManagersFacade, dispatchers = dispatchers, ) } diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletAddressServiceRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt similarity index 97% rename from data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletAddressServiceRepository.kt rename to data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt index 6831cc8ae4..00dc557554 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletAddressServiceRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt @@ -1,15 +1,15 @@ -package com.tangem.data.wallets +package com.tangem.data.transaction import android.net.Uri import androidx.core.text.isDigitsOnly import com.tangem.blockchain.blockchains.near.NearWalletManager import com.tangem.blockchain.common.Blockchain import com.tangem.domain.tokens.model.Network +import com.tangem.domain.transaction.WalletAddressServiceRepository import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.models.ParsedQrCode import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.errors.ParsedQrCodeErrors -import com.tangem.domain.wallets.repository.WalletAddressServiceRepository import java.math.BigInteger class DefaultWalletAddressServiceRepository( diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/di/WalletsDataModule.kt b/data/wallets/src/main/java/com/tangem/data/wallets/di/WalletsDataModule.kt index 9748691618..c41bb99652 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/di/WalletsDataModule.kt +++ b/data/wallets/src/main/java/com/tangem/data/wallets/di/WalletsDataModule.kt @@ -1,12 +1,9 @@ package com.tangem.data.wallets.di import com.tangem.data.wallets.DefaultWalletNamesMigrationRepository -import com.tangem.data.wallets.DefaultWalletAddressServiceRepository import com.tangem.data.wallets.DefaultWalletsRepository import com.tangem.datasource.local.preferences.AppPreferencesStore -import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.repository.WalletNamesMigrationRepository -import com.tangem.domain.wallets.repository.WalletAddressServiceRepository import com.tangem.domain.wallets.repository.WalletsRepository import dagger.Module import dagger.Provides @@ -24,14 +21,6 @@ internal object WalletsDataModule { return DefaultWalletsRepository(appPreferencesStore = appPreferencesStore) } - @Provides - @Singleton - fun providesWalletAddressServiceRepository( - walletManagersFacade: WalletManagersFacade, - ): WalletAddressServiceRepository { - return DefaultWalletAddressServiceRepository(walletManagersFacade) - } - @Provides @Singleton fun provideMigrateNamesRepository(appPreferencesStore: AppPreferencesStore): WalletNamesMigrationRepository { diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt index c15246cb89..205ea91ce0 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt @@ -611,6 +611,17 @@ class DefaultWalletManagersFacade( return walletManager.fulfillRequirements(currencyType, signer) } + override suspend fun checkUtxoConsolidationAvailability(userWalletId: UserWalletId, network: Network): Boolean { + val blockchain = Blockchain.fromId(network.id.value) + val walletManager = getOrCreateWalletManager( + userWalletId = userWalletId, + blockchain = blockchain, + derivationPath = network.derivationPath.value, + ) ?: return false + + return walletManager.allowUtxoConsolidation + } + private fun updateWalletManagerTokensIfNeeded(walletManager: WalletManager, tokens: Set) { if (tokens.isEmpty()) return diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt index 5c80c0db3d..14f5fa53fa 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt @@ -253,4 +253,7 @@ interface WalletManagersFacade { currency: CryptoCurrency, signer: CommonSigner, ): SimpleResult + + /** Indicates UTXO consolidation availability */ + suspend fun checkUtxoConsolidationAvailability(userWalletId: UserWalletId, network: Network): Boolean } \ No newline at end of file diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/repository/WalletAddressServiceRepository.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/WalletAddressServiceRepository.kt similarity index 91% rename from domain/wallets/src/main/java/com/tangem/domain/wallets/repository/WalletAddressServiceRepository.kt rename to domain/transaction/src/main/java/com/tangem/domain/transaction/WalletAddressServiceRepository.kt index 624ad44419..8d09e3b248 100644 --- a/domain/wallets/src/main/java/com/tangem/domain/wallets/repository/WalletAddressServiceRepository.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/WalletAddressServiceRepository.kt @@ -1,4 +1,4 @@ -package com.tangem.domain.wallets.repository +package com.tangem.domain.transaction import com.tangem.domain.tokens.model.Network import com.tangem.domain.wallets.models.ParsedQrCode diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/error/ValidateAddressError.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/error/ValidateAddressError.kt new file mode 100644 index 0000000000..75262c24e2 --- /dev/null +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/error/ValidateAddressError.kt @@ -0,0 +1,7 @@ +package com.tangem.domain.transaction.error + +sealed class ValidateAddressError { + data object AddressInWallet : ValidateAddressError() + data object InvalidAddress : ValidateAddressError() + data class DataError(val throwable: Throwable) : ValidateAddressError() +} \ No newline at end of file diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ParseSharedAddressUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ParseSharedAddressUseCase.kt similarity index 85% rename from domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ParseSharedAddressUseCase.kt rename to domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ParseSharedAddressUseCase.kt index 8d03b6ab6d..eb5f1e1c89 100644 --- a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ParseSharedAddressUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ParseSharedAddressUseCase.kt @@ -1,9 +1,9 @@ -package com.tangem.domain.wallets.usecase +package com.tangem.domain.transaction.usecase import arrow.core.Either import com.tangem.domain.tokens.model.Network +import com.tangem.domain.transaction.WalletAddressServiceRepository import com.tangem.domain.wallets.models.ParsedQrCode -import com.tangem.domain.wallets.repository.WalletAddressServiceRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletAddressUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletAddressUseCase.kt new file mode 100644 index 0000000000..9d9de200e8 --- /dev/null +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletAddressUseCase.kt @@ -0,0 +1,43 @@ +package com.tangem.domain.transaction.usecase + +import arrow.core.Either +import arrow.core.left +import arrow.core.right +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkAddress +import com.tangem.domain.transaction.WalletAddressServiceRepository +import com.tangem.domain.transaction.error.ValidateAddressError +import com.tangem.domain.walletmanager.WalletManagersFacade +import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.withContext + +/** + * Use case for validating wallet address. + */ +class ValidateWalletAddressUseCase( + private val walletAddressServiceRepository: WalletAddressServiceRepository, + private val walletManagersFacade: WalletManagersFacade, + private val dispatchers: CoroutineDispatcherProvider, +) { + + suspend operator fun invoke( + userWalletId: UserWalletId, + network: Network, + address: String, + currencyAddress: Set?, + ): Either = withContext(dispatchers.io) { + val isUtxoConsolidationAvailable = + walletManagersFacade.checkUtxoConsolidationAvailability(userWalletId, network) + val isCurrentAddress = currencyAddress?.any { it.value == address } ?: true + + val isForbidSelfSend = isCurrentAddress && !isUtxoConsolidationAvailable + val isValidAddress = walletAddressServiceRepository.validateAddress(userWalletId, network, address) + + when { + !isValidAddress -> ValidateAddressError.InvalidAddress.left() + isForbidSelfSend -> ValidateAddressError.AddressInWallet.left() + else -> Unit.right() + } + } +} \ No newline at end of file diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ValidateWalletMemoUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletMemoUseCase.kt similarity index 77% rename from domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ValidateWalletMemoUseCase.kt rename to domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletMemoUseCase.kt index 754819852b..d4d5ab22e8 100644 --- a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ValidateWalletMemoUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletMemoUseCase.kt @@ -1,8 +1,8 @@ -package com.tangem.domain.wallets.usecase +package com.tangem.domain.transaction.usecase import arrow.core.Either import com.tangem.domain.tokens.model.Network -import com.tangem.domain.wallets.repository.WalletAddressServiceRepository +import com.tangem.domain.transaction.WalletAddressServiceRepository /** * Use case for validating wallet memo. diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ValidateWalletAddressUseCase.kt b/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ValidateWalletAddressUseCase.kt deleted file mode 100644 index 149b12030d..0000000000 --- a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/ValidateWalletAddressUseCase.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.tangem.domain.wallets.usecase - -import arrow.core.Either -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.domain.wallets.repository.WalletAddressServiceRepository -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.coroutines.withContext - -/** - * Use case for validating wallet address. - */ -class ValidateWalletAddressUseCase( - private val walletAddressServiceRepository: WalletAddressServiceRepository, - private val dispatchers: CoroutineDispatcherProvider, -) { - - suspend operator fun invoke( - userWalletId: UserWalletId, - network: Network, - address: String, - ): Either = withContext(dispatchers.io) { - Either.catch { - walletAddressServiceRepository.validateAddress(userWalletId, network, address) - } - } -} \ No newline at end of file