Updated on 2026-08-14

This commit is contained in:
Tangem 2025-02-13 11:59:11 +02:00
parent 5436add409
commit 6176e8088b
10 changed files with 44 additions and 28 deletions

View file

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

View file

@ -74,4 +74,7 @@ interface StakeKitApi {
@Path("transactionId") transactionId: String,
@Body body: SubmitTransactionHashRequestBody,
): ApiResponse<Unit>
@GET("transactions/{transactionId}")
suspend fun getTransaction(@Path("transactionId") transactionId: String): ApiResponse<StakingTransactionDTO>
}

View file

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

View file

@ -43,6 +43,7 @@ class DemoTransactionSender(private val walletManager: WalletManager) : Transact
override suspend fun sendMultiple(
transactionDataList: List<TransactionData>,
signer: TransactionSigner,
sendMode: TransactionSender.MultipleTransactionSendMode,
): Result<TransactionsSendResult> = Result.Failure(Exception(ID).toBlockchainSdkError())
private fun getDataToSign(): ByteArray {

View file

@ -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,
) {

View file

@ -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<TransactionsSendResult>
fun createTransactionDataExtras(

View file

@ -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<TransactionData>,
userWallet: UserWallet,
network: Network,
sendMode: TransactionSender.MultipleTransactionSendMode,
): Either<SendTransactionError?, List<String>> {
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<SendTransactionError?, String> {
return invoke(listOf(txData), userWallet, network)
return invoke(listOf(txData), userWallet, network, TransactionSender.MultipleTransactionSendMode.DEFAULT)
.map { it.first() }
}

View file

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

View file

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

View file

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