Updated on 2026-08-14
This commit is contained in:
parent
5436add409
commit
6176e8088b
10 changed files with 44 additions and 28 deletions
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
) {
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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() }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ^
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue