From 5d381ed902ea78149d581230f2d935637d5fdc88 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 6 Dec 2023 16:10:36 +0300 Subject: [PATCH 1/3] Updated on 2026-08-14 --- .../tangem/feature/swap/ui/StateBuilder.kt | 30 +++++++++++++++++++ .../feature/swap/viewmodels/SwapViewModel.kt | 7 +++++ 2 files changed, 37 insertions(+) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 6d540ed412..fb166fb06c 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -784,6 +784,36 @@ internal class StateBuilder( ) } + fun updateProvidersBottomSheetContent( + uiState: SwapStateHolder, + tokenSwapInfoForProviders: Map, + ): SwapStateHolder { + val config = uiState.bottomSheetConfig?.content as? ChooseProviderBottomSheetConfig + return if (config != null) { + val providers = config.providers + uiState.copy( + bottomSheetConfig = uiState.bottomSheetConfig.copy( + content = config.copy( + providers = providers.map { + val tokenInfo = tokenSwapInfoForProviders[it.id] + if (it is ProviderState.Content && tokenInfo != null) { + val rateString = tokenInfo.tokenAmount + .getFormattedCryptoAmount(tokenInfo.cryptoCurrencyStatus.currency) + it.copy( + subtitle = stringReference(rateString), + ) + } else { + it + } + }.toImmutableList(), + ), + ), + ) + } else { + uiState + } + } + fun updateSelectedProvider(uiState: SwapStateHolder, selectedProviderId: String): SwapStateHolder { val config = uiState.bottomSheetConfig?.content as? ChooseProviderBottomSheetConfig return if (config != null) { diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 64afcb59a5..176ca7d775 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -271,6 +271,13 @@ internal class SwapViewModel @Inject constructor( if (providersState.isNotEmpty()) { val (provider, state) = updateLoadedQuotes(providersState) setupLoadedState(provider, state, fromToken) + uiState = stateBuilder.updateProvidersBottomSheetContent( + uiState = uiState, + tokenSwapInfoForProviders = providersState + .getLastLoadedSuccessStates() + .entries + .associate { it.key.providerId to it.value.toTokenInfo }, + ) } else { Timber.e("Accidentally empty quotes list") } From f750267a774a9b0f0e8e96b3d825c27b187acbe4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 6 Dec 2023 16:24:05 +0300 Subject: [PATCH 2/3] Updated on 2026-08-14 --- .../com/tangem/feature/swap/domain/SwapInteractorImpl.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 0e3c786b0a..a9ba221873 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -804,6 +804,13 @@ internal class SwapInteractorImpl @Inject constructor( if (fromToken is CryptoCurrency.Token) { return IncludeFeeInAmount.Excluded } + + val tokenForFeeBalance = + userWalletManager.getNativeTokenBalance(networkId, derivationPath) ?: ProxyAmount.empty() + + if (amount.value > tokenForFeeBalance.value) { + return IncludeFeeInAmount.BalanceNotEnough + } val feeValue = when (txFee) { TxFeeState.Empty -> BigDecimal.ZERO is TxFeeState.MultipleFeeState -> if (selectedFee == FeeType.NORMAL) { @@ -814,8 +821,6 @@ internal class SwapInteractorImpl @Inject constructor( is TxFeeState.SingleFeeState -> txFee.fee.feeValue } - val tokenForFeeBalance = - userWalletManager.getNativeTokenBalance(networkId, derivationPath) ?: ProxyAmount.empty() val amountWithFee = amount.value + feeValue return if (amountWithFee < tokenForFeeBalance.value) { IncludeFeeInAmount.Excluded From 8cbd43175aaa72f3b3b7accff03869b456b9433d Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 6 Dec 2023 16:25:53 +0300 Subject: [PATCH 3/3] Updated on 2026-08-14 --- .../java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 176ca7d775..3e47a29bf3 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -490,6 +490,7 @@ internal class SwapViewModel @Inject constructor( when (it) { is TxState.TxSent -> { uiState = stateBuilder.loadingPermissionState(uiState) + uiState = stateBuilder.dismissBottomSheet(uiState) } is TxState.UserCancelled -> Unit else -> {