From 6176e8088b1e4219058bb9b466649d5791eb4bc4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 13 Feb 2025 11:59:11 +0200 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/di/domain/StakingDomainModule.kt | 6 ++-- .../datasource/api/stakekit/StakeKitApi.kt | 3 ++ .../DefaultTransactionRepository.kt | 3 +- .../domain/demo/DemoTransactionSender.kt | 1 + ...se.kt => GetStakingTransactionsUseCase.kt} | 2 +- .../transaction/TransactionRepository.kt | 6 ++-- .../usecase/SendTransactionUseCase.kt | 5 ++- .../state/helpers/StakingTransactionSender.kt | 32 ++++++++++++++----- .../SetConfirmationStateInitTransformer.kt | 12 ++----- gradle/dependencies.toml | 2 +- 10 files changed, 44 insertions(+), 28 deletions(-) rename domain/staking/src/main/java/com/tangem/domain/staking/{GetStakingTransactionUseCase.kt => GetStakingTransactionsUseCase.kt} (97%) diff --git a/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt index 53e9546b1b..db77c4ceba 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt @@ -100,11 +100,11 @@ internal object StakingDomainModule { @Provides @Singleton - fun provideInitializeStakingProcessUseCase( + fun provideGetStakingTransactionsUseCase( stakingRepository: StakingRepository, stakingErrorResolver: StakingErrorResolver, - ): GetStakingTransactionUseCase { - return GetStakingTransactionUseCase( + ): GetStakingTransactionsUseCase { + return GetStakingTransactionsUseCase( stakingRepository = stakingRepository, stakingErrorResolver = stakingErrorResolver, ) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/StakeKitApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/StakeKitApi.kt index 745fa5fe39..d6519755c5 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/StakeKitApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/StakeKitApi.kt @@ -74,4 +74,7 @@ interface StakeKitApi { @Path("transactionId") transactionId: String, @Body body: SubmitTransactionHashRequestBody, ): ApiResponse + + @GET("transactions/{transactionId}") + suspend fun getTransaction(@Path("transactionId") transactionId: String): ApiResponse } \ No newline at end of file diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index 84f0b8020d..07f16b38b8 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -166,6 +166,7 @@ internal class DefaultTransactionRepository( signer: TransactionSigner, userWalletId: UserWalletId, network: Network, + mode: TransactionSender.MultipleTransactionSendMode, ) = withContext(coroutineDispatcherProvider.io) { val blockchain = Blockchain.fromId(network.id.value) val walletManager = walletManagersFacade.getOrCreateWalletManager( @@ -173,7 +174,7 @@ internal class DefaultTransactionRepository( blockchain = blockchain, derivationPath = network.derivationPath.value, ) - (walletManager as TransactionSender).sendMultiple(txsData, signer) + (walletManager as TransactionSender).sendMultiple(txsData, signer, mode) } override fun createTransactionDataExtras( diff --git a/domain/demo/src/main/java/com/tangem/domain/demo/DemoTransactionSender.kt b/domain/demo/src/main/java/com/tangem/domain/demo/DemoTransactionSender.kt index 5ebe3d67f6..81a09ca897 100644 --- a/domain/demo/src/main/java/com/tangem/domain/demo/DemoTransactionSender.kt +++ b/domain/demo/src/main/java/com/tangem/domain/demo/DemoTransactionSender.kt @@ -43,6 +43,7 @@ class DemoTransactionSender(private val walletManager: WalletManager) : Transact override suspend fun sendMultiple( transactionDataList: List, signer: TransactionSigner, + sendMode: TransactionSender.MultipleTransactionSendMode, ): Result = Result.Failure(Exception(ID).toBlockchainSdkError()) private fun getDataToSign(): ByteArray { diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingTransactionUseCase.kt b/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingTransactionsUseCase.kt similarity index 97% rename from domain/staking/src/main/java/com/tangem/domain/staking/GetStakingTransactionUseCase.kt rename to domain/staking/src/main/java/com/tangem/domain/staking/GetStakingTransactionsUseCase.kt index 16ac583d13..f8e5694870 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingTransactionUseCase.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/GetStakingTransactionsUseCase.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.delay /** * Use case for creating enter action */ -class GetStakingTransactionUseCase( +class GetStakingTransactionsUseCase( private val stakingRepository: StakingRepository, private val stakingErrorResolver: StakingErrorResolver, ) { diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt index 78c4150057..61ac813b52 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt @@ -1,9 +1,6 @@ package com.tangem.domain.transaction -import com.tangem.blockchain.common.Amount -import com.tangem.blockchain.common.TransactionData -import com.tangem.blockchain.common.TransactionExtras -import com.tangem.blockchain.common.TransactionSigner +import com.tangem.blockchain.common.* import com.tangem.blockchain.common.transaction.Fee import com.tangem.blockchain.common.transaction.TransactionSendResult import com.tangem.blockchain.common.transaction.TransactionsSendResult @@ -65,6 +62,7 @@ interface TransactionRepository { signer: TransactionSigner, userWalletId: UserWalletId, network: Network, + sendMode: TransactionSender.MultipleTransactionSendMode = TransactionSender.MultipleTransactionSendMode.DEFAULT, ): com.tangem.blockchain.extensions.Result fun createTransactionDataExtras( 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 c6fc973fc9..ba89fcc80f 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 @@ -5,6 +5,7 @@ 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.TransactionSender import com.tangem.blockchain.common.TransactionSigner import com.tangem.blockchain.common.transaction.TransactionsSendResult import com.tangem.blockchain.extensions.Result @@ -34,6 +35,7 @@ class SendTransactionUseCase( txsData: List, userWallet: UserWallet, network: Network, + sendMode: TransactionSender.MultipleTransactionSendMode, ): Either> { val card = userWallet.scanResponse.card val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins @@ -61,6 +63,7 @@ class SendTransactionUseCase( signer = signer, userWalletId = userWallet.walletId, network = network, + sendMode = sendMode, ) when (sendResult) { is Result.Failure -> handleError(sendResult).left() @@ -84,7 +87,7 @@ class SendTransactionUseCase( userWallet: UserWallet, network: Network, ): Either { - return invoke(listOf(txData), userWallet, network) + return invoke(listOf(txData), userWallet, network, TransactionSender.MultipleTransactionSendMode.DEFAULT) .map { it.first() } } 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 1de6d402d2..cc4b4686a5 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 @@ -2,13 +2,12 @@ package com.tangem.features.staking.impl.presentation.state.helpers import arrow.core.getOrElse import com.tangem.blockchain.common.TransactionData +import com.tangem.blockchain.common.TransactionSender import com.tangem.blockchain.common.transaction.Fee import com.tangem.common.ui.amountScreen.models.AmountState -import com.tangem.domain.staking.GetConstructedStakingTransactionUseCase -import com.tangem.domain.staking.GetStakingTransactionUseCase -import com.tangem.domain.staking.SaveUnsubmittedHashUseCase -import com.tangem.domain.staking.SubmitHashUseCase +import com.tangem.domain.staking.* import com.tangem.domain.staking.model.SubmitHashData +import com.tangem.domain.staking.model.stakekit.NetworkType import com.tangem.domain.staking.model.stakekit.PendingAction import com.tangem.domain.staking.model.stakekit.StakingError import com.tangem.domain.staking.model.stakekit.Yield @@ -44,7 +43,7 @@ import java.math.BigDecimal internal class StakingTransactionSender @AssistedInject constructor( private val stateController: StakingStateController, private val stakingBalanceUpdater: StakingBalanceUpdater.Factory, - private val getStakingTransactionUseCase: GetStakingTransactionUseCase, + private val getStakingTransactionsUseCase: GetStakingTransactionsUseCase, private val getConstructedStakingTransactionUseCase: GetConstructedStakingTransactionUseCase, private val sendTransactionUseCase: SendTransactionUseCase, private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, @@ -192,7 +191,7 @@ internal class StakingTransactionSender @AssistedInject constructor( val validatorAddress = validatorState.chosenValidator.address val amount = getAmount(amountState, fee, confirmationState.reduceAmountBy) - return getStakingTransactionUseCase( + return getStakingTransactionsUseCase( userWalletId = userWallet.walletId, network = cryptoCurrencyStatus.currency.network, params = ActionParams( @@ -216,19 +215,36 @@ internal class StakingTransactionSender @AssistedInject constructor( onSendSuccess: (txUrl: String) -> Unit, onSendError: (SendTransactionError?) -> Unit, ) { + if (fullTransactionsData.isEmpty()) return + + val sortedTransactions = fullTransactionsData.sortedBy { it.stakeKitTransaction.stepIndex } + + val firstTransaction = sortedTransactions.first() + val network = firstTransaction.stakeKitTransaction.network + + val sendMode = if (network == NetworkType.SOLANA && + firstTransaction.stakeKitTransaction.type == StakingTransactionType.SPLIT + ) { + TransactionSender.MultipleTransactionSendMode.WAIT_AFTER_FIRST + } else { + TransactionSender.MultipleTransactionSendMode.DEFAULT + } + sendTransactionUseCase( - txsData = fullTransactionsData.map { it.tangemTransaction }, + txsData = sortedTransactions.map { it.tangemTransaction }, userWallet = userWallet, network = cryptoCurrencyStatus.currency.network, + sendMode = sendMode, ).fold( ifLeft = { error -> onSendError(error) }, ifRight = { transactionHashes -> submitHash( - transactions = fullTransactionsData.map { it.stakeKitTransaction }, + transactions = sortedTransactions.map { it.stakeKitTransaction }, transactionHashes = transactionHashes, ) + val txUrl = getExplorerTransactionUrlUseCase( txHash = transactionHashes.last(), networkId = cryptoCurrencyStatus.currency.network.id, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateInitTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateInitTransformer.kt index d9d1354ee5..4f1c22ef3a 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateInitTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateInitTransformer.kt @@ -10,7 +10,6 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.features.staking.impl.presentation.state.* import com.tangem.features.staking.impl.presentation.state.utils.isCompositePendingActions import com.tangem.features.staking.impl.presentation.state.utils.isTronStakedBalance -import com.tangem.lib.crypto.BlockchainUtils import com.tangem.utils.extensions.isPositive import com.tangem.utils.transformer.Transformer import kotlinx.collections.immutable.ImmutableList @@ -45,10 +44,10 @@ internal class SetConfirmationStateInitTransformer( override fun transform(prevState: StakingUiState): StakingUiState { val actionType = when { isEnter -> StakingActionCommonType.Enter - isImplicitExit || isExplicitExit -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled(prevState)) + isImplicitExit || isExplicitExit -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled()) else -> when (pendingAction?.type) { StakingActionType.STAKE -> StakingActionCommonType.Enter - StakingActionType.UNSTAKE -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled(prevState)) + StakingActionType.UNSTAKE -> StakingActionCommonType.Exit(isPartiallyUnstakeDisabled()) StakingActionType.CLAIM_REWARDS, StakingActionType.RESTAKE_REWARDS, -> StakingActionCommonType.Pending.Rewards @@ -81,12 +80,7 @@ internal class SetConfirmationStateInitTransformer( ) } - private fun isPartiallyUnstakeDisabled(state: StakingUiState): Boolean { - // TODO staking [REDACTED_TASK_KEY] support solana multisize hashes signing - if (BlockchainUtils.isSolana(state.cryptoCurrencyBlockchainId)) { - return true - } - + private fun isPartiallyUnstakeDisabled(): Boolean { val exitArgs = yieldArgs.exit ?: return false val exitAmount = exitArgs.args[Yield.Args.ArgType.AMOUNT] ?: return false val min = exitAmount.minimum ?: return false diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 25cba236e9..19845ff923 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -89,7 +89,7 @@ markdownComposeView = "0.5.4" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-948" +tangemBlockchainSdk = "develop-949" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-434" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^