Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-03 15:23:34 +05:00
parent f9d98374b1
commit e0dd5081c2
5 changed files with 29 additions and 21 deletions

View file

@ -130,12 +130,10 @@ internal object WalletsDomainModule {
fun providesValidateWalletAddressUseCase(
walletAddressServiceRepository: WalletAddressServiceRepository,
walletManagersFacade: WalletManagersFacade,
dispatchers: CoroutineDispatcherProvider,
): ValidateWalletAddressUseCase {
return ValidateWalletAddressUseCase(
walletAddressServiceRepository = walletAddressServiceRepository,
walletManagersFacade = walletManagersFacade,
dispatchers = dispatchers,
)
}

View file

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

View file

@ -43,7 +43,11 @@ internal object TransactionDataModule {
@Singleton
fun providesWalletAddressServiceRepository(
walletManagersFacade: WalletManagersFacade,
coroutineDispatcherProvider: CoroutineDispatcherProvider,
): WalletAddressServiceRepository {
return DefaultWalletAddressServiceRepository(walletManagersFacade)
return DefaultWalletAddressServiceRepository(
walletManagersFacade = walletManagersFacade,
dispatchers = coroutineDispatcherProvider,
)
}
}

View file

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

View file

@ -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<NetworkAddress.Address>?,
): Either<ValidateAddressError, Unit> = withContext(dispatchers.io) {
): Either<ValidateAddressError, Unit> {
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()