Updated on 2026-08-14

This commit is contained in:
Tangem 2024-08-12 22:01:26 +05:00
parent f748b8539d
commit f1238f5ef8
20 changed files with 528 additions and 88 deletions

View file

@ -0,0 +1,25 @@
package com.tangem.domain.staking
import arrow.core.Either
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.domain.staking.model.stakekit.StakingError
import com.tangem.domain.staking.model.stakekit.transaction.StakingTransaction
import com.tangem.domain.staking.repositories.StakingErrorResolver
import com.tangem.domain.staking.repositories.StakingRepository
class GetConstructedStakingTransactionUseCase(
private val stakingRepository: StakingRepository,
private val stakingErrorResolver: StakingErrorResolver,
) {
suspend operator fun invoke(
networkId: String,
fee: Fee,
transactionId: String,
): Either<StakingError, Pair<StakingTransaction, TransactionData.Compiled>> = Either.catch {
stakingRepository.constructTransaction(networkId, fee, transactionId)
}.mapLeft {
stakingErrorResolver.resolve(it)
}
}

View file

@ -22,19 +22,14 @@ class GetStakingTransactionUseCase(
userWalletId: UserWalletId,
network: Network,
params: ActionParams,
): Either<StakingError, StakingTransaction> {
): Either<StakingError, List<StakingTransaction>> {
return Either.catch {
val createAction = stakingRepository.createAction(userWalletId, network, params)
// workaround, sometimes transaction is not created immediately after actions/enter
delay(PATCH_TRANSACTION_REQUEST_DELAY)
val createdTransaction = createAction.transactions
?.get(createAction.currentStepIndex)
?: error("No available transaction to patch")
val patchedTransaction = stakingRepository.constructTransaction(createdTransaction.id)
patchedTransaction
createAction.transactions ?: error("No available transaction to patch")
}.mapLeft {
stakingErrorResolver.resolve(it)
}

View file

@ -1,6 +1,7 @@
package com.tangem.domain.staking
import arrow.core.Either
import com.tangem.domain.staking.model.StakingApproval
import com.tangem.domain.staking.model.stakekit.StakingError
import com.tangem.domain.staking.repositories.StakingErrorResolver
import com.tangem.domain.staking.repositories.StakingRepository
@ -10,9 +11,9 @@ class IsApproveNeededUseCase(
private val stakingRepository: StakingRepository,
private val stakingErrorResolver: StakingErrorResolver,
) {
operator fun invoke(cryptoCurrency: CryptoCurrency): Either<StakingError, Boolean> {
operator fun invoke(cryptoCurrency: CryptoCurrency): Either<StakingError, StakingApproval> {
return Either
.catch { stakingRepository.isApproveNeeded(cryptoCurrency) }
.catch { stakingRepository.getStakingApproval(cryptoCurrency) }
.mapLeft { stakingErrorResolver.resolve(it) }
}
}

View file

@ -1,7 +1,12 @@
package com.tangem.domain.staking.repositories
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.domain.core.lce.LceFlow
import com.tangem.domain.staking.model.*
import com.tangem.domain.staking.model.StakingApproval
import com.tangem.domain.staking.model.StakingAvailability
import com.tangem.domain.staking.model.StakingEntryInfo
import com.tangem.domain.staking.model.UnsubmittedTransactionMetadata
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.YieldBalance
import com.tangem.domain.staking.model.stakekit.YieldBalanceList
@ -66,7 +71,11 @@ interface StakingRepository {
suspend fun estimateGas(userWalletId: UserWalletId, network: Network, params: ActionParams): StakingGasEstimate
suspend fun constructTransaction(transactionId: String): StakingTransaction
suspend fun constructTransaction(
networkId: String,
fee: Fee,
transactionId: String,
): Pair<StakingTransaction, TransactionData.Compiled>
suspend fun submitHash(transactionId: String, transactionHash: String)
@ -77,6 +86,6 @@ interface StakingRepository {
/** Returns whether additional staking is possible if there is already active staking */
fun isStakeMoreAvailable(networkId: Network.ID): Boolean
/** Returns whether approve is needed before staking */
fun isApproveNeeded(cryptoCurrency: CryptoCurrency): Boolean
/** Returns staking approval */
fun getStakingApproval(cryptoCurrency: CryptoCurrency): StakingApproval
}