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 c539df5afc..3dfc085c10 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 @@ -130,12 +130,10 @@ internal object WalletsDomainModule { fun providesValidateWalletAddressUseCase( walletAddressServiceRepository: WalletAddressServiceRepository, walletManagersFacade: WalletManagersFacade, - dispatchers: CoroutineDispatcherProvider, ): ValidateWalletAddressUseCase { return ValidateWalletAddressUseCase( walletAddressServiceRepository = walletAddressServiceRepository, walletManagersFacade = walletManagersFacade, - dispatchers = dispatchers, ) } diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt index 00dc557554..4d0bd6ac5e 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultWalletAddressServiceRepository.kt @@ -10,26 +10,30 @@ 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.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.withContext import java.math.BigInteger class DefaultWalletAddressServiceRepository( private val walletManagersFacade: WalletManagersFacade, + private val dispatchers: CoroutineDispatcherProvider, ) : WalletAddressServiceRepository { - override suspend fun validateAddress(userWalletId: UserWalletId, network: Network, address: String): Boolean { - val blockchain = Blockchain.fromId(network.id.value) + override suspend fun validateAddress(userWalletId: UserWalletId, network: Network, address: String): Boolean = + withContext(dispatchers.io) { + val blockchain = Blockchain.fromId(network.id.value) - return if (blockchain.isNear()) { - val walletManager = walletManagersFacade.getOrCreateWalletManager( - userWalletId = userWalletId, - blockchain = blockchain, - derivationPath = network.derivationPath.value, - ) ?: return false - (walletManager as? NearWalletManager)?.validateAddress(address) ?: false - } else { - blockchain.validateAddress(address) + if (blockchain.isNear()) { + val walletManager = walletManagersFacade.getOrCreateWalletManager( + userWalletId = userWalletId, + blockchain = blockchain, + derivationPath = network.derivationPath.value, + ) ?: return@withContext false + (walletManager as? NearWalletManager)?.validateAddress(address) ?: false + } else { + blockchain.validateAddress(address) + } } - } override fun validateMemo(network: Network, memo: String): Boolean { if (memo.isEmpty()) return true diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/di/TransactionDataModule.kt b/data/transaction/src/main/java/com/tangem/data/transaction/di/TransactionDataModule.kt index 7a1b7db59c..d5fffe95ed 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/di/TransactionDataModule.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/di/TransactionDataModule.kt @@ -43,7 +43,11 @@ internal object TransactionDataModule { @Singleton fun providesWalletAddressServiceRepository( walletManagersFacade: WalletManagersFacade, + coroutineDispatcherProvider: CoroutineDispatcherProvider, ): WalletAddressServiceRepository { - return DefaultWalletAddressServiceRepository(walletManagersFacade) + return DefaultWalletAddressServiceRepository( + walletManagersFacade = walletManagersFacade, + dispatchers = coroutineDispatcherProvider, + ) } } \ No newline at end of file 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 14f5fa53fa..9e1c59ea3d 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 @@ -254,6 +254,11 @@ interface WalletManagersFacade { signer: CommonSigner, ): SimpleResult - /** Indicates UTXO consolidation availability */ + /** + * Indicates UTXO consolidation availability + * + * @param userWalletId selected user wallet + * @param network availability for network + */ suspend fun checkUtxoConsolidationAvailability(userWalletId: UserWalletId, network: Network): Boolean } \ No newline at end of file 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 index 9d9de200e8..7db3a825f7 100644 --- 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 @@ -9,8 +9,6 @@ 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. @@ -18,7 +16,6 @@ import kotlinx.coroutines.withContext class ValidateWalletAddressUseCase( private val walletAddressServiceRepository: WalletAddressServiceRepository, private val walletManagersFacade: WalletManagersFacade, - private val dispatchers: CoroutineDispatcherProvider, ) { suspend operator fun invoke( @@ -26,7 +23,7 @@ class ValidateWalletAddressUseCase( network: Network, address: String, currencyAddress: Set?, - ): Either = withContext(dispatchers.io) { + ): Either { val isUtxoConsolidationAvailable = walletManagersFacade.checkUtxoConsolidationAvailability(userWalletId, network) val isCurrentAddress = currencyAddress?.any { it.value == address } ?: true @@ -34,7 +31,7 @@ class ValidateWalletAddressUseCase( val isForbidSelfSend = isCurrentAddress && !isUtxoConsolidationAvailable val isValidAddress = walletAddressServiceRepository.validateAddress(userWalletId, network, address) - when { + return when { !isValidAddress -> ValidateAddressError.InvalidAddress.left() isForbidSelfSend -> ValidateAddressError.AddressInWallet.left() else -> Unit.right()