Updated on 2026-08-14

This commit is contained in:
Tangem 2024-10-08 15:40:17 +05:00
parent a88572a019
commit 22ba475aae
18 changed files with 80 additions and 17 deletions

View file

@ -12,6 +12,7 @@ import com.tangem.domain.staking.model.StakingApproval
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.domain.staking.model.stakekit.StakingError
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType
import com.tangem.domain.staking.model.stakekit.transaction.ActionParams
import com.tangem.domain.staking.model.stakekit.transaction.StakingGasEstimate
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
@ -66,7 +67,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
val validatorAddress = validatorState.chosenValidator.address
val approval = stakingApproval as? StakingApproval.Needed
if (approval != null) {
if (approval != null && state.actionType == StakingActionCommonType.ENTER) {
val allowance = getAllowanceUseCase(
userWalletId = userWallet.walletId,
cryptoCurrency = cryptoCurrencyStatus.currency,
@ -182,7 +183,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
amount = amount,
address = sourceAddress,
validatorAddress = validatorAddress,
token = yield.token,
token = yield.getCurrentToken(cryptoCurrencyStatus.currency.id.rawCurrencyId),
passthrough = action?.passthrough,
type = action?.type,
),

View file

@ -18,6 +18,7 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.transaction.error.SendTransactionError
import com.tangem.domain.transaction.usecase.SendTransactionUseCase
import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase
import com.tangem.domain.utils.convertToSdkAmount
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.features.staking.impl.analytics.StakingAnalyticsEvents
import com.tangem.features.staking.impl.presentation.state.*
@ -67,6 +68,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
?: error("No confirmation state")
val fee = (confirmationState.feeState as? FeeState.Content)?.fee
?: error("No fee provided")
val amountState = state.amountState as? AmountState.Data ?: error("No amount state")
val stakingTransactions = getStakingTransactions(
state = state,
@ -77,6 +79,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
val fullTransactionsData = getConstructedTransactions(
stakingTransactions = stakingTransactions,
fee = fee,
amount = amountState.amountTextField.cryptoAmount.value.orZero(),
onConstructError = onConstructError,
)
@ -131,6 +134,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
private suspend fun getConstructedTransactions(
stakingTransactions: List<StakingTransaction>?,
fee: Fee,
amount: BigDecimal,
onConstructError: (StakingError) -> Unit,
) = coroutineScope {
stakingTransactions
@ -142,6 +146,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
getConstructedStakingTransactionUseCase(
networkId = cryptoCurrencyStatus.currency.network.id.value,
fee = fee,
amount = amount.convertToSdkAmount(cryptoCurrencyStatus.currency),
transactionId = transaction.id,
).fold(
ifRight = { (constructedTransaction, transactionData) ->
@ -188,7 +193,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
amount = amount,
address = defaultAddress,
validatorAddress = validatorAddress,
token = yield.token,
token = yield.getCurrentToken(cryptoCurrencyStatus.currency.id.rawCurrencyId),
passthrough = action?.passthrough,
type = action?.type,
),
@ -287,13 +292,17 @@ internal class StakingTransactionSender @AssistedInject constructor(
private fun composeStakeTransaction(confirmationState: StakingStates.ConfirmationState.Data): PendingTransaction {
val state = stateController.value
val yieldBalance = cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data
val token = yield.getCurrentToken(cryptoCurrencyStatus.currency.id.rawCurrencyId)
return PendingTransaction(
groupId = UUID.randomUUID().toString(),
token = token,
type = BalanceType.STAKED,
amount = (state.amountState as? AmountState.Data)?.amountTextField?.cryptoAmount?.value ?: BigDecimal.ZERO,
rawCurrencyId = cryptoCurrencyStatus.currency.id.rawCurrencyId,
validator = (confirmationState.validatorState as? ValidatorState.Content)?.chosenValidator,
balancesId = (cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data)?.getBalancesUniqueId() ?: 0,
balancesId = yieldBalance?.getBalancesUniqueId() ?: 0,
)
}

View file

@ -1,12 +1,16 @@
package com.tangem.features.staking.impl.presentation.state.transformers
import com.tangem.domain.staking.model.PendingTransaction
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.YieldBalance
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.staking.impl.presentation.state.*
import com.tangem.features.staking.impl.presentation.state.BalanceState
import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.utils.transformer.Transformer
internal class SetPossiblePendingTransactionTransformer(
private val yield: Yield,
private val balanceState: BalanceState,
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
) : Transformer<StakingUiState> {
@ -14,13 +18,16 @@ internal class SetPossiblePendingTransactionTransformer(
override fun transform(prevState: StakingUiState): StakingUiState {
val possibleConfirmationState =
prevState.confirmationState as? StakingStates.ConfirmationState.Data ?: return prevState
val yieldBalance = cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data
val balancesId = (cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data)?.getBalancesUniqueId() ?: 0
val balancesId = yieldBalance?.getBalancesUniqueId() ?: 0
val token = yield.getCurrentToken(cryptoCurrencyStatus.currency.id.rawCurrencyId)
return prevState.copy(
confirmationState = possibleConfirmationState.copy(
possiblePendingTransaction = PendingTransaction(
groupId = balanceState.groupId,
token = token,
type = balanceState.type,
amount = balanceState.cryptoDecimal,
rawCurrencyId = balanceState.rawCurrencyId,

View file

@ -232,7 +232,9 @@ internal class StakingViewModel @Inject constructor(
),
)
if (balanceState != null) {
stateController.update(SetPossiblePendingTransactionTransformer(balanceState, cryptoCurrencyStatus))
stateController.update(
SetPossiblePendingTransactionTransformer(yield, balanceState, cryptoCurrencyStatus),
)
}
stateController.update(
@ -252,7 +254,9 @@ internal class StakingViewModel @Inject constructor(
isAssentState() -> {
getFee(pendingAction, pendingActions)
if (balanceState != null) {
stateController.update(SetPossiblePendingTransactionTransformer(balanceState, cryptoCurrencyStatus))
stateController.update(
SetPossiblePendingTransactionTransformer(yield, balanceState, cryptoCurrencyStatus),
)
}
val amountState = value.amountState as? AmountState.Data
if (amountState?.amountTextField?.isWarning == true) {