diff --git a/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt index e50891f228..73c0236567 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt @@ -42,21 +42,6 @@ internal object TransactionDomainModule { ) } - @Provides - @Singleton - fun provideSendMultipleTransactionUseCase( - cardSdkConfigRepository: CardSdkConfigRepository, - transactionRepository: TransactionRepository, - walletManagersFacade: WalletManagersFacade, - ): SendMultipleTransactionUseCase { - return SendMultipleTransactionUseCase( - demoConfig = DemoConfig(), - cardSdkConfigRepository = cardSdkConfigRepository, - transactionRepository = transactionRepository, - walletManagersFacade = walletManagersFacade, - ) - } - @Provides @Singleton fun provideAssociateAssetUseCase( diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendMultipleTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendMultipleTransactionUseCase.kt deleted file mode 100644 index c7fce8b278..0000000000 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendMultipleTransactionUseCase.kt +++ /dev/null @@ -1,147 +0,0 @@ -package com.tangem.domain.transaction.usecase - -import arrow.core.Either -import arrow.core.left -import arrow.core.right -import com.tangem.blockchain.common.BlockchainSdkError -import com.tangem.blockchain.common.TransactionData -import com.tangem.blockchain.common.TransactionSigner -import com.tangem.blockchain.common.transaction.TransactionsSendResult -import com.tangem.blockchain.extensions.Result -import com.tangem.blockchain.network.ResultChecker -import com.tangem.common.core.TangemSdkError -import com.tangem.core.ui.extensions.wrappedList -import com.tangem.domain.card.repository.CardSdkConfigRepository -import com.tangem.domain.common.TapWorkarounds.isStart2Coin -import com.tangem.domain.common.TapWorkarounds.isTangemTwins -import com.tangem.domain.demo.DemoConfig -import com.tangem.domain.demo.DemoTransactionSender -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.transaction.R -import com.tangem.domain.transaction.TransactionRepository -import com.tangem.domain.transaction.error.SendTransactionError -import com.tangem.domain.transaction.error.SendTransactionError.Companion.USER_CANCELLED_ERROR_CODE -import com.tangem.domain.walletmanager.WalletManagersFacade -import com.tangem.domain.wallets.models.UserWallet -import com.tangem.sdk.extensions.localizedDescriptionRes -import com.tangem.utils.toFormattedString - -// TODO [REDACTED_TASK_KEY] merge with SendTransactionUseCase -class SendMultipleTransactionUseCase( - private val demoConfig: DemoConfig, - private val cardSdkConfigRepository: CardSdkConfigRepository, - private val transactionRepository: TransactionRepository, - private val walletManagersFacade: WalletManagersFacade, -) { - suspend operator fun invoke( - txsData: List, - userWallet: UserWallet, - network: Network, - ): Either> { - val card = userWallet.scanResponse.card - val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins - - val signer = cardSdkConfigRepository.getCommonSigner(cardId = card.cardId.takeIf { isCardNotBackedUp }) - - val linkedTerminal = cardSdkConfigRepository.isLinkedTerminal() - if (userWallet.scanResponse.card.isStart2Coin) { - cardSdkConfigRepository.setLinkedTerminal(false) - } - val sendResult = try { - if (demoConfig.isDemoCardId(cardId = userWallet.cardId)) { - sendDemo( - userWallet = userWallet, - network = network, - transactionsData = txsData, - signer = signer, - ) - } else { - val sendResult = transactionRepository.sendMultipleTransactions( - txsData = txsData, - signer = signer, - userWalletId = userWallet.walletId, - network = network, - ) - when (sendResult) { - is Result.Failure -> handleError(sendResult).left() - is Result.Success -> sendResult.data.right() - } - } - } catch (ex: Exception) { - cardSdkConfigRepository.setLinkedTerminal(linkedTerminal) - SendTransactionError.DataError(ex.message).left() - } - - cardSdkConfigRepository.setLinkedTerminal(linkedTerminal) - return sendResult.fold( - ifRight = { result -> result.hashes.right() }, - ifLeft = { it.left() }, - ) - } - - private suspend fun sendDemo( - userWallet: UserWallet, - network: Network, - transactionsData: List, - signer: TransactionSigner, - ): Either { - val demoTransactionSender = DemoTransactionSender( - walletManagersFacade - .getOrCreateWalletManager(userWallet.walletId, network) - ?: error("WalletManager is null"), - ) - - val result = demoTransactionSender.sendMultiple(transactionDataList = transactionsData, signer = signer) - - return if (result is Result.Failure && result.error.customMessage.contains(DemoTransactionSender.ID)) { - SendTransactionError.DemoCardError.left() - } else { - TransactionsSendResult(listOf("hash")).right() - } - } - - private fun handleError(result: Result.Failure): SendTransactionError { - if (ResultChecker.isNetworkError(result)) { - return SendTransactionError.NetworkError( - code = result.error.message, - message = result.error.customMessage, - ) - } - val error = result.error as? BlockchainSdkError ?: return SendTransactionError.UnknownError() - return when (error) { - is BlockchainSdkError.WrappedTangemError -> parseWrappedError(error) - is BlockchainSdkError.CreateAccountUnderfunded -> { - val minAmount = error.minReserve - val minValue = minAmount.value?.toFormattedString(minAmount.decimals).orEmpty() - SendTransactionError.CreateAccountUnderfunded(minValue) - } - else -> { - SendTransactionError.BlockchainSdkError( - code = error.code, - message = error.customMessage, - ) - } - } - } - - private fun parseWrappedError(error: BlockchainSdkError.WrappedTangemError): SendTransactionError { - return if (error.code == USER_CANCELLED_ERROR_CODE) { - SendTransactionError.UserCancelledError - } else { - when (val tangemError = error.tangemError) { - is TangemSdkError -> { - val resource = tangemError.localizedDescriptionRes() - val resId = resource.resId ?: R.string.common_unknown_error - val resArgs = resource.args.map { it.value } - SendTransactionError.TangemSdkError(tangemError.code, resId, wrappedList(resArgs)) - } - is BlockchainSdkError.WrappedTangemError -> { - parseWrappedError(tangemError) // todo remove when sdk errors are revised - } - else -> { - SendTransactionError.BlockchainSdkError(error.code, tangemError.customMessage) - } - } - } - } -} \ No newline at end of file diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt index be3afe3cd4..3fb6ba5bc1 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt @@ -6,7 +6,7 @@ import arrow.core.right import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.common.TransactionSigner -import com.tangem.blockchain.common.transaction.TransactionSendResult +import com.tangem.blockchain.common.transaction.TransactionsSendResult import com.tangem.blockchain.extensions.Result import com.tangem.blockchain.network.ResultChecker import com.tangem.common.core.TangemSdkError @@ -33,10 +33,10 @@ class SendTransactionUseCase( private val walletManagersFacade: WalletManagersFacade, ) { suspend operator fun invoke( - txData: TransactionData, + txsData: List, userWallet: UserWallet, network: Network, - ): Either { + ): Either> { val card = userWallet.scanResponse.card val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins @@ -51,12 +51,12 @@ class SendTransactionUseCase( sendDemo( userWallet = userWallet, network = network, - transactionData = txData, + transactionsData = txsData, signer = signer, ) } else { - val sendResult = transactionRepository.sendTransaction( - txData = txData, + val sendResult = transactionRepository.sendMultipleTransactions( + txsData = txsData, signer = signer, userWalletId = userWallet.walletId, network = network, @@ -73,29 +73,38 @@ class SendTransactionUseCase( cardSdkConfigRepository.setLinkedTerminal(linkedTerminal) return sendResult.fold( - ifRight = { result -> result.hash.right() }, + ifRight = { result -> result.hashes.right() }, ifLeft = { it.left() }, ) } + suspend operator fun invoke( + txData: TransactionData, + userWallet: UserWallet, + network: Network, + ): Either { + return invoke(listOf(txData), userWallet, network) + .map { it.first() } + } + private suspend fun sendDemo( userWallet: UserWallet, network: Network, - transactionData: TransactionData, + transactionsData: List, signer: TransactionSigner, - ): Either { + ): Either { val demoTransactionSender = DemoTransactionSender( walletManagersFacade .getOrCreateWalletManager(userWallet.walletId, network) ?: error("WalletManager is null"), ) - val result = demoTransactionSender.send(transactionData = transactionData, signer = signer) + val result = demoTransactionSender.sendMultiple(transactionDataList = transactionsData, signer = signer) return if (result is Result.Failure && result.error.customMessage.contains(DemoTransactionSender.ID)) { SendTransactionError.DemoCardError.left() } else { - TransactionSendResult("hash").right() + TransactionsSendResult(listOf("hash")).right() } } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt index 57f98b373b..790ed90374 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt @@ -19,7 +19,7 @@ import com.tangem.domain.staking.model.stakekit.transaction.StakingTransactionSt import com.tangem.domain.staking.model.stakekit.transaction.StakingTransactionType import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.transaction.error.SendTransactionError -import com.tangem.domain.transaction.usecase.SendMultipleTransactionUseCase +import com.tangem.domain.transaction.usecase.SendTransactionUseCase import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase import com.tangem.domain.wallets.models.UserWallet import com.tangem.features.staking.impl.analytics.StakingAnalyticsEvents @@ -42,7 +42,7 @@ internal class StakingTransactionSender @AssistedInject constructor( private val stakingBalanceUpdater: StakingBalanceUpdater.Factory, private val getStakingTransactionUseCase: GetStakingTransactionUseCase, private val getConstructedStakingTransactionUseCase: GetConstructedStakingTransactionUseCase, - private val sendMultipleTransactionUseCase: SendMultipleTransactionUseCase, + private val sendTransactionUseCase: SendTransactionUseCase, private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, private val submitHashUseCase: SubmitHashUseCase, private val saveUnsubmittedHashUseCase: SaveUnsubmittedHashUseCase, @@ -208,7 +208,7 @@ internal class StakingTransactionSender @AssistedInject constructor( onSendSuccess: (txUrl: String) -> Unit, onSendError: (SendTransactionError?) -> Unit, ) { - sendMultipleTransactionUseCase( + sendTransactionUseCase( txsData = fullTransactionsData.map { it.tangemTransaction }, userWallet = userWallet, network = cryptoCurrencyStatus.currency.network, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt index 8f5e1ef0f4..662e4e6828 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt @@ -37,10 +37,7 @@ import com.tangem.domain.tokens.* import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.transaction.error.GetFeeError -import com.tangem.domain.transaction.usecase.CreateApprovalTransactionUseCase -import com.tangem.domain.transaction.usecase.GetAllowanceUseCase -import com.tangem.domain.transaction.usecase.SendTransactionUseCase -import com.tangem.domain.transaction.usecase.ValidateTransactionUseCase +import com.tangem.domain.transaction.usecase.* import com.tangem.domain.utils.convertToSdkAmount import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId