Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-13 16:06:08 +05:00
commit 6c641b3655
5 changed files with 55 additions and 15 deletions

View file

@ -63,7 +63,7 @@ internal class StakingStateController @Inject constructor(
}
}
private fun dismissAlert() {
fun dismissAlert() {
mutableUiState.update { it.copy(event = consumedEvent()) }
}

View file

@ -33,4 +33,12 @@ internal sealed class StakingAlertUM : AlertUM {
override val confirmButtonText = resourceReference(R.string.common_ok)
override val onConfirmClick = null
}
data class FeeIncreased(
override val onConfirmClick: () -> Unit,
) : StakingAlertUM() {
override val title: TextReference? = null
override val message: TextReference = resourceReference(id = R.string.send_notification_high_fee_title)
override val confirmButtonText: TextReference = resourceReference(id = R.string.common_ok)
}
}

View file

@ -4,9 +4,14 @@ import arrow.core.getOrElse
import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.domain.staking.*
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.model.SubmitHashData
import com.tangem.domain.staking.model.stakekit.*
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.StakingTransaction
@ -18,7 +23,10 @@ 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.presentation.state.*
import com.tangem.features.staking.impl.presentation.state.FeeState
import com.tangem.features.staking.impl.presentation.state.StakingStateController
import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.features.staking.impl.presentation.state.utils.checkAndCalculateSubtractedAmount
import com.tangem.features.staking.impl.presentation.state.utils.isCompositePendingActions
import com.tangem.utils.extensions.orZero
@ -55,6 +63,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
onConstructError: (StakingError) -> Unit,
onSendSuccess: (String) -> Unit,
onSendError: (SendTransactionError?) -> Unit,
onFeeIncreased: (Fee) -> Unit,
) {
val state = stateController.value
@ -82,13 +91,22 @@ internal class StakingTransactionSender @AssistedInject constructor(
return
}
onConstructSuccess(fullTransactionsData.map { it.stakeKitTransaction })
val totalFee = fullTransactionsData.sumOf { it.stakeKitTransaction.gasEstimate?.amount.orZero() }
sendStakingTransaction(
fullTransactionsData = fullTransactionsData,
onSendSuccess = onSendSuccess,
onSendError = onSendError,
)
if (fee.amount.value.orZero() >= totalFee) {
onConstructSuccess(fullTransactionsData.map { it.stakeKitTransaction })
sendStakingTransaction(
fullTransactionsData = fullTransactionsData,
onSendSuccess = onSendSuccess,
onSendError = onSendError,
)
} else {
onFeeIncreased(
Fee.Common(
fee.amount.copy(value = totalFee),
),
)
}
}
private suspend fun getStakingTransactions(

View file

@ -1,6 +1,5 @@
package com.tangem.features.staking.impl.presentation.state.transformers
import com.tangem.core.ui.extensions.TextReference
import com.tangem.features.staking.impl.presentation.state.InnerConfirmationStakingState
import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.StakingUiState
@ -19,7 +18,6 @@ internal class SetConfirmationStateInProgressTransformer : Transformer<StakingUi
copy(
isPrimaryButtonEnabled = false,
innerState = InnerConfirmationStakingState.IN_PROGRESS,
footerText = TextReference.EMPTY,
)
} else {
this

View file

@ -31,7 +31,10 @@ import com.tangem.domain.staking.GetActionsUseCase
import com.tangem.domain.staking.InvalidatePendingTransactionsUseCase
import com.tangem.domain.staking.IsAnyTokenStakedUseCase
import com.tangem.domain.staking.IsApproveNeededUseCase
import com.tangem.domain.staking.analytics.StakeScreenSource
import com.tangem.domain.staking.analytics.StakingAnalyticsEvent
import com.tangem.domain.staking.model.StakingApproval
import com.tangem.domain.staking.model.stakekit.*
import com.tangem.domain.staking.model.stakekit.action.StakingAction
import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType
import com.tangem.domain.staking.model.stakekit.transaction.StakingTransaction
@ -47,9 +50,6 @@ import com.tangem.domain.utils.convertToSdkAmount
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.domain.staking.analytics.StakeScreenSource
import com.tangem.domain.staking.analytics.StakingAnalyticsEvent
import com.tangem.domain.staking.model.stakekit.*
import com.tangem.features.staking.impl.analytics.StakingParamsInterceptor
import com.tangem.features.staking.impl.analytics.utils.StakingAnalyticSender
import com.tangem.features.staking.impl.navigation.InnerStakingRouter
@ -314,6 +314,22 @@ internal class StakingViewModel @Inject constructor(
stakingEventFactory.createSendTransactionErrorAlert(error)
stateController.update(SetConfirmationStateResetAssentTransformer)
},
onFeeIncreased = { increasedFee ->
stateController.updateAll(
SetConfirmationStateResetAssentTransformer,
SetConfirmationStateAssentTransformer(
appCurrencyProvider = Provider { appCurrency },
feeCryptoCurrencyStatus = feeCryptoCurrencyStatus,
fee = increasedFee,
),
)
stateController.updateEvent(
StakingEvent.ShowAlert(
StakingAlertUM.FeeIncreased(stateController::dismissAlert),
),
)
updateNotifications()
},
)
}.saveIn(sendTransactionJobHolder)
}