diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 516445f46f..9f60bb1ef1 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -97,6 +97,10 @@ %d tag %d tage + + Tag + Tage + Entfernen Deaktiviert Erledigt @@ -143,6 +147,7 @@ Änderungen speichern Suchen Token suchen + sek. Seed phrase Aktion auswählen Verkaufen @@ -343,7 +348,7 @@ Hochstimmen Wallet auswählen Das Wallet unterstützt nicht mehr als ein Netzwerk - Um mit dem Kauf, Tausch oder Erhalt dieses Vermögenswerts zu beginnen, füge diesen Token zu mindestens 1 Netzwerk hinzu + Um dieses Asset zu kaufen, zu tauschen oder zu erhalten, füge diesen Deinem Portfolio hinzu Dieses Asset ist nicht verfügbar Dieses Asset ist für dieses Wallet nicht verfügbar Zum Portfolio hinzufügen @@ -378,6 +383,10 @@ Top-Verlierer Beliebt Über %s + + %d Börse + %d Börsen + Bewertung, basierend auf %d Bewertungen, basierend auf %d @@ -389,6 +398,12 @@ Umlaufmenge Die Gesamtzahl der Coins, die für den Handel verfügbar sind und auf dem Markt zirkulieren Umlaufmenge + Keine Börsen gefunden + Umtausch + Vorsicht + Riskant + Vertrauenswürdig + Börsen Erfahrene Käufer Nettokäufer mit der zusätzlichen Anforderung, mindestens 100 ausgehende Transaktionen zu haben Erfahrene Käufer @@ -407,6 +422,7 @@ Liquidität Liquiditätsindex Leer + Gelistet auf Niedrig MarketCap Der Gesamtmarktwert einer Kryptowährung, berechnet sich durch Multiplikation des aktuellen Preises des Coins mit der Gesamtzahl der im Umlauf befindlichen Coins @@ -429,6 +445,7 @@ Handelsvolumen (24h) Der Gesamtbetrag einer Kryptowährung, der innerhalb der letzten 24 Stunden gehandelt wurde, wobei das Aktivitäts- und Liquiditätsniveau auf dem Markt angegeben wird Handelsvolumen (24h) + Volumen Rufe dies auf oder tippe auf die Suchleiste, um Token direkt vom Markt hinzuzufügen Token hinzufügen NFC ist auf deinem Gerät nicht verfügbar @@ -721,8 +738,8 @@ Händisch Pro Block Täglich + Alle %s Täglich - Alle %1$s Sek. Pro Epoche Pro Ära Stündlich @@ -733,6 +750,7 @@ Mehr staken Du setzt %1$s ein und erhältst jährlich %2$s Zum Entsperren antippen + Tippe zum Entsperren oder Abstimmen Zum abheben antippen Stake %s Staking beenden%s @@ -747,7 +765,7 @@ Validatoren Strategischer Partner Abstimmung - Abstimmung gesperrt + Abstimmung Zurückziehen Deine Einsätze Bewahre deine Krypto-Assets sicher auf, während die privaten Schlüssel auf deiner Karte bleiben diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index ba3e1b02eb..dda95dc787 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -343,7 +343,7 @@ Votar a favor Elegir wallet La billetera no admite más de una red - Para comprar, intercambiar o recibir este activo, agréguelo a su cartera + Para comprar, intercambiar o recibir este activo, agréguelo a su portafolio Este activo no está disponible Añadir al portafolio Agregue un token @@ -720,7 +720,6 @@ Bloquear Día Cada día - Cada %1$s segundo(s) Época Era Hora diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index e310d6723c..8dd4b2083a 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -343,7 +343,7 @@ Vote positif Choisissez un portefeuille Le portefeuille ne prend pas en charge plus d\'un réseau - Pour commencer à acheter, échanger ou recevoir cet actif, ajoutez ce jeton à au moins 1 réseau + Pour acheter, échanger ou recevoir cet actif, ajoutez-le à votre portefeuille Cet actif n\'est pas disponible Ajouter au portfolio Ajoutez un jeton @@ -720,7 +720,6 @@ Bloquer Jour Chaque jour - Toute(s) les %1$s seconde(s) Époque Ère Heure diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index 0d15d6edfc..d138f32aa7 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -728,8 +728,6 @@ 毎日 %sごと 毎日 - %1$s日ごとに - %1$s秒毎 エポック毎 時代毎 毎時間 diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index e8db31eab3..287d5c483c 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -153,6 +153,7 @@ Сохранить изменения Поиск Поиск токенов + сек Seed-фраза Выберите действие Продать @@ -296,6 +297,7 @@ Обращение в поддержку Обращение в поддержку Tangem Не могу отправить транзакцию + Ошибка в описании монеты Транзакция Комиссия сети за одобрение токена будет взиматься за подтверждение того, что именно вы разрешаете использовать ваш токен для обмена. Укажите лимит доступа к выбранному токену @@ -754,8 +756,6 @@ За блок Ежедневно Каждый день - Каждые %1$s дня - Каждые %1$s сек За эпоху За эру Ежечасно @@ -766,7 +766,7 @@ Застейкать еще Вы стейкаете %1$s и будете получать %2$s ежегодно Нажмите для разблокировки - Нажмите для разблокировки или голосования + Нажмите для разблокировки Нажмите для вывода Застейкать %s Вывести %s @@ -797,7 +797,7 @@ Поддержка Web 3.0 Обменивайте больше токенов по лучшим курсам прямо в вашем кошельке. Новый провайдер обмена! - В сумму включено: \n• комиссия провайдера сервиса\n• комиссия сети за отправку %s от биржи обратно на адрес пользователя + В сумму включено: \n• комиссия провайдера сервиса\n• комиссия сети за отправку %s от биржи обратно на адрес пользователя. В сумму включена комиссия провайдера сервиса. Комиссии Подтверждения считаются отраслевым стандартом для всех децентрализованных бирж и защищают ваш кошелек от доступа со стороны смарт-контракта без вашего разрешения. По замыслу смарт-контракты не могут получить доступ к вашим токенам, если вы не одобрите доступ со своей стороны. «Разблокируя» свои токены, вы даете смарт-контракту 1inch разрешение тратить ваши активы. Майнеры сети получают компенсацию за газ (оплачиваемый вами) за запись этого действия в блокчейне. Как только разрешение будет предоставлено, вы сможете обменять свой токен. diff --git a/core/res/src/main/res/values-uk-rUA/strings.xml b/core/res/src/main/res/values-uk-rUA/strings.xml index 5a9fb13979..4108386e2e 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -737,7 +737,6 @@ Блок День Щодня - Кожні %1$s сек Епоха Ера Година diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 7d4c202a25..a9f2c6ffa7 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -119,12 +119,14 @@ Get addresses Go to provider Go to token + hour Import In progress Later %1$s left Locked Main network + month Network fee Amount sent will be reduced by %1$s (%2$s) to cover the selected fee level Next @@ -147,6 +149,7 @@ Save changes Search Search tokens + sec Seed phrase Select action Sell @@ -172,6 +175,7 @@ There was an error. Please try again. Unreachable Unstake + week Yes Contract address copied! Available networks @@ -290,6 +294,7 @@ Feedback Tangem feedback Can\'t send a transaction + Coin description error Transaction The network will charge a token approval fee to verify that you are authorizing the use of your token for the swap. Specify the approve limit for the selected token @@ -738,8 +743,6 @@ Daily Each %s Each day - Each %1$s days - Each %1$s sec Per Epoch Per Era Hourly @@ -748,7 +751,7 @@ Rewards Stake locked Stake more - You stake %1$s and will be receiving %2$s yearly + You stake %1$s and will be receiving your reward each %2$s Tap to unlock Tap to unlock or vote Tap to withdraw diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateLoadingTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateLoadingTransformer.kt index 60e1fd090c..e32fc821f9 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateLoadingTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetConfirmationStateLoadingTransformer.kt @@ -8,15 +8,17 @@ import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.staking.model.stakekit.Yield import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.features.staking.impl.R import com.tangem.features.staking.impl.presentation.state.* -import com.tangem.utils.extensions.orZero +import com.tangem.features.staking.impl.presentation.state.utils.getRewardSchedule import com.tangem.utils.transformer.Transformer import kotlinx.collections.immutable.persistentListOf internal class SetConfirmationStateLoadingTransformer( private val yield: Yield, private val appCurrency: AppCurrency, + private val cryptoCurrency: CryptoCurrency, ) : Transformer { override fun transform(prevState: StakingUiState): StakingUiState { @@ -38,7 +40,7 @@ internal class SetConfirmationStateLoadingTransformer( availableValidators = filteredValidators, ), notifications = persistentListOf(), - footerText = getFooter(prevState, chosenValidator), + footerText = getFooter(prevState), transactionDoneState = TransactionDoneState.Empty, pendingAction = possibleConfirmationState?.pendingAction, pendingActions = possibleConfirmationState?.pendingActions, @@ -49,30 +51,25 @@ internal class SetConfirmationStateLoadingTransformer( ) } - private fun getFooter(state: StakingUiState, validator: Yield.Validator): TextReference { + private fun getFooter(state: StakingUiState): TextReference { val amountState = state.amountState as? AmountState.Data val isEnterAction = state.actionType == StakingActionCommonType.ENTER - val apr = validator.apr.orZero() val amountDecimal = amountState?.amountTextField?.fiatAmount?.value - val potentialReward = amountDecimal?.multiply(apr) - val amountValue = BigDecimalFormatter.formatFiatAmount( fiatAmount = amountDecimal, fiatCurrencyCode = appCurrency.code, fiatCurrencySymbol = appCurrency.symbol, ) - val potentialRewardValue = BigDecimalFormatter.formatFiatAmount( - fiatAmount = potentialReward, - fiatCurrencyCode = appCurrency.code, - fiatCurrencySymbol = appCurrency.symbol, - withApproximateSign = true, + val rewardSchedule = getRewardSchedule( + yield.metadata.rewardSchedule, + cryptoCurrency.network.id.value, ) - return if (isEnterAction && amountDecimal != null && potentialReward != null) { + return if (isEnterAction && amountDecimal != null && rewardSchedule != null) { resourceReference( id = R.string.staking_summary_description_text, - formatArgs = wrappedList(amountValue, potentialRewardValue), + formatArgs = wrappedList(amountValue, rewardSchedule), ) } else { TextReference.EMPTY diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt index 31e7acbe08..e979ce93c5 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt @@ -9,7 +9,6 @@ import com.tangem.core.ui.extensions.* import com.tangem.core.ui.pullToRefresh.PullToRefreshConfig import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.domain.appcurrency.model.AppCurrency -import com.tangem.domain.core.serialization.SerializedBigDecimal import com.tangem.domain.staking.model.stakekit.BalanceItem import com.tangem.domain.staking.model.stakekit.Yield import com.tangem.domain.tokens.model.CryptoCurrencyStatus @@ -19,6 +18,7 @@ import com.tangem.features.staking.impl.presentation.state.* import com.tangem.features.staking.impl.presentation.state.bottomsheet.InfoType import com.tangem.features.staking.impl.presentation.state.converters.RewardsValidatorStateConverter import com.tangem.features.staking.impl.presentation.state.converters.YieldBalancesConverter +import com.tangem.features.staking.impl.presentation.state.utils.getRewardSchedule import com.tangem.features.staking.impl.presentation.viewmodel.StakingClickIntents import com.tangem.lib.crypto.BlockchainUtils.isPolkadot import com.tangem.utils.Provider @@ -102,20 +102,18 @@ internal class SetInitialDataStateTransformer( val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() return listOfNotNull( - createAnnualPercentageRateItem(yield.validators), + createAnnualPercentageRateItem(), createAvailableItem(cryptoCurrencyStatus), - createUnbondingPeriodItem(yield.metadata.cooldownPeriod?.days), - createMinimumRequirementItem( - cryptoCurrencyStatus = cryptoCurrencyStatus, - minimumCryptoAmount = yield.args.enter.args[Yield.Args.ArgType.AMOUNT]?.minimum, - ), - createRewardClaimingItem(yield.metadata.rewardClaiming), - createWarmupPeriodItem(yield.metadata.warmupPeriod.days), - createRewardScheduleItem(yield.metadata.rewardSchedule), + createUnbondingPeriodItem(), + createMinimumRequirementItem(cryptoCurrencyStatus), + createRewardClaimingItem(), + createWarmupPeriodItem(), + createRewardScheduleItem(), ).toPersistentList() } - private fun createAnnualPercentageRateItem(validators: List): RoundedListWithDividersItemData { + private fun createAnnualPercentageRateItem(): RoundedListWithDividersItemData { + val validators = yield.validators return RoundedListWithDividersItemData( id = R.string.staking_details_annual_percentage_rate, startText = TextReference.Res(R.string.staking_details_annual_percentage_rate), @@ -140,8 +138,8 @@ internal class SetInitialDataStateTransformer( ) } - private fun createUnbondingPeriodItem(cooldownPeriodDays: Int?): RoundedListWithDividersItemData? { - cooldownPeriodDays ?: return null + private fun createUnbondingPeriodItem(): RoundedListWithDividersItemData? { + val cooldownPeriodDays = yield.metadata.cooldownPeriod?.days ?: return null return RoundedListWithDividersItemData( id = R.string.staking_details_unbonding_period, startText = TextReference.Res(R.string.staking_details_unbonding_period), @@ -156,9 +154,8 @@ internal class SetInitialDataStateTransformer( private fun createMinimumRequirementItem( cryptoCurrencyStatus: CryptoCurrencyStatus, - minimumCryptoAmount: SerializedBigDecimal?, ): RoundedListWithDividersItemData? { - if (minimumCryptoAmount == null) return null + val minimumCryptoAmount = yield.args.enter.args[Yield.Args.ArgType.AMOUNT]?.minimum ?: return null if (!isPolkadot(cryptoCurrencyStatus.currency.network.id.value)) return null val formattedAmount = BigDecimalFormatter.formatCryptoAmount( @@ -174,9 +171,8 @@ internal class SetInitialDataStateTransformer( ) } - private fun createRewardClaimingItem( - rewardClaiming: Yield.Metadata.RewardClaiming, - ): RoundedListWithDividersItemData? { + private fun createRewardClaimingItem(): RoundedListWithDividersItemData? { + val rewardClaiming = yield.metadata.rewardClaiming val endTextId = rewardClaimingResources[rewardClaiming] ?: return null return RoundedListWithDividersItemData( @@ -187,7 +183,8 @@ internal class SetInitialDataStateTransformer( ) } - private fun createWarmupPeriodItem(warmupPeriodDays: Int): RoundedListWithDividersItemData? { + private fun createWarmupPeriodItem(): RoundedListWithDividersItemData? { + val warmupPeriodDays = yield.metadata.warmupPeriod.days if (warmupPeriodDays == 0) return null return RoundedListWithDividersItemData( @@ -202,10 +199,8 @@ internal class SetInitialDataStateTransformer( ) } - private fun createRewardScheduleItem( - rewardSchedule: Yield.Metadata.RewardSchedule, - ): RoundedListWithDividersItemData? { - val endTextReference = getRewardScheduleText(rewardSchedule) ?: return null + private fun createRewardScheduleItem(): RoundedListWithDividersItemData? { + val endTextReference = getRewardScheduleText() ?: return null return RoundedListWithDividersItemData( id = R.string.staking_details_reward_schedule, @@ -257,17 +252,16 @@ internal class SetInitialDataStateTransformer( return resourceReference(R.string.common_range, wrappedList(formattedMinApr, formattedMaxApr)) } - private fun getRewardScheduleText(rewardSchedule: Yield.Metadata.RewardSchedule): TextReference? { - return when (rewardSchedule) { - Yield.Metadata.RewardSchedule.BLOCK -> resourceReference(R.string.staking_reward_schedule_block) - Yield.Metadata.RewardSchedule.WEEK -> resourceReference(R.string.staking_reward_schedule_week) - Yield.Metadata.RewardSchedule.HOUR -> resourceReference(R.string.staking_reward_schedule_hour) - Yield.Metadata.RewardSchedule.DAY -> resourceReference(R.string.staking_reward_schedule_each_day) - Yield.Metadata.RewardSchedule.MONTH -> resourceReference(R.string.staking_reward_schedule_month) - Yield.Metadata.RewardSchedule.ERA -> resourceReference(R.string.staking_reward_schedule_era) - Yield.Metadata.RewardSchedule.EPOCH -> resourceReference(R.string.staking_reward_schedule_epoch) - Yield.Metadata.RewardSchedule.UNKNOWN -> null - } + private fun getRewardScheduleText(): TextReference? { + val rewardSchedule = getRewardSchedule( + yield.metadata.rewardSchedule, + cryptoCurrencyStatusProvider().currency.network.id.value, + ) ?: return null + + return resourceReference( + R.string.staking_reward_schedule_each, + wrappedList(rewardSchedule), + ) } private companion object { diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/utils/StakingRewardsUtils.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/utils/StakingRewardsUtils.kt new file mode 100644 index 0000000000..5012e225b7 --- /dev/null +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/utils/StakingRewardsUtils.kt @@ -0,0 +1,52 @@ +package com.tangem.features.staking.impl.presentation.state.utils + +import com.tangem.core.ui.extensions.* +import com.tangem.domain.staking.model.stakekit.Yield +import com.tangem.features.staking.impl.R +import com.tangem.features.staking.impl.presentation.state.utils.StakingRewardSchedule.COSMOS_SCHEDULE +import com.tangem.features.staking.impl.presentation.state.utils.StakingRewardSchedule.SOLANA_SCHEDULE +import com.tangem.lib.crypto.BlockchainUtils.isCosmos +import com.tangem.lib.crypto.BlockchainUtils.isSolana +import com.tangem.lib.crypto.BlockchainUtils.isTron +import com.tangem.utils.StringsSigns.MINUS +import com.tangem.utils.StringsSigns.NON_BREAKING_SPACE + +private data object StakingRewardSchedule { + val COSMOS_SCHEDULE = 5 to 12 + val SOLANA_SCHEDULE = 2 to 3 +} + +internal fun getRewardSchedule(schedule: Yield.Metadata.RewardSchedule, networkId: String): TextReference? = + when (schedule) { + Yield.Metadata.RewardSchedule.BLOCK, + Yield.Metadata.RewardSchedule.EPOCH, + Yield.Metadata.RewardSchedule.ERA, + -> getCustomRewardSchedule(networkId) + Yield.Metadata.RewardSchedule.WEEK -> resourceReference(R.string.common_week) + Yield.Metadata.RewardSchedule.HOUR -> resourceReference(R.string.common_hour) + Yield.Metadata.RewardSchedule.DAY -> pluralReference(R.plurals.common_days_no_param, count = 1) + Yield.Metadata.RewardSchedule.MONTH -> resourceReference(R.string.common_month) + Yield.Metadata.RewardSchedule.UNKNOWN -> null + } + +private fun getCustomRewardSchedule(networkId: String): TextReference? { + return when { + isSolana(networkId) -> { + combinedReference( + stringReference("${SOLANA_SCHEDULE.first}$MINUS${SOLANA_SCHEDULE.second}$NON_BREAKING_SPACE"), + pluralReference( + id = R.plurals.common_days_no_param, + count = SOLANA_SCHEDULE.second, + ), + ) + } + isCosmos(networkId) -> { + combinedReference( + stringReference("${COSMOS_SCHEDULE.first}$MINUS${COSMOS_SCHEDULE.second}$NON_BREAKING_SPACE"), + resourceReference(R.string.common_second_no_param), + ) + } + isTron(networkId) -> pluralReference(R.plurals.common_days_no_param, count = 1) + else -> null + } +} \ No newline at end of file diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt index 4e21b0746c..c59d051434 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt @@ -37,7 +37,10 @@ import com.tangem.domain.tokens.* import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.transaction.error.GetFeeError -import com.tangem.domain.transaction.usecase.* +import com.tangem.domain.transaction.usecase.CreateApprovalTransactionUseCase +import com.tangem.domain.transaction.usecase.GetAllowanceUseCase +import com.tangem.domain.transaction.usecase.SendTransactionUseCase +import com.tangem.domain.transaction.usecase.ValidateTransactionUseCase import com.tangem.domain.utils.convertToSdkAmount import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId @@ -219,7 +222,13 @@ internal class StakingViewModel @Inject constructor( when { isInitState() -> { stateController.update(SetConfirmationStateResetAssentTransformer) - stateController.update(SetConfirmationStateLoadingTransformer(yield, appCurrency)) + stateController.update( + SetConfirmationStateLoadingTransformer( + yield = yield, + appCurrency = appCurrency, + cryptoCurrency = cryptoCurrencyStatus.currency, + ), + ) if (balanceState != null) { stateController.update(SetPossiblePendingTransactionTransformer(balanceState, cryptoCurrencyStatus)) } @@ -260,7 +269,13 @@ internal class StakingViewModel @Inject constructor( } override fun getFee(pendingAction: PendingAction?, pendingActions: ImmutableList?) { - stateController.update(SetConfirmationStateLoadingTransformer(yield, appCurrency)) + stateController.update( + SetConfirmationStateLoadingTransformer( + yield = yield, + appCurrency = appCurrency, + cryptoCurrency = cryptoCurrencyStatus.currency, + ), + ) viewModelScope.launch { feeLoader.getFee( pendingAction = pendingAction,