From 74a5e9e0e9c20ddb99312876e01ffcf8d7ec67c4 Mon Sep 17 00:00:00 2001 From: iMaks99 <45900939+iMaks99@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:18:07 +0500 Subject: [PATCH 1/9] AND-9467 Fixed Onramp: no error when providers in /onramp-pairs are empty --- .../java/com/tangem/data/onramp/DefaultOnrampRepository.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt index 3e64c44edd..195fa95a25 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt @@ -385,6 +385,9 @@ internal class DefaultOnrampRepository( }, ) } + + if (onrampProviders.isEmpty()) throw OnrampPairsError.PairsNotFound + OnrampPair(onrampProviders) } pairsStore.store(PAIRS_KEY, onrampPairs) From d04c6d2ace9c2b20a2bc726ca42728e01c46daed Mon Sep 17 00:00:00 2001 From: iMaks99 <45900939+iMaks99@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:18:34 +0500 Subject: [PATCH 2/9] AND-9468 Fixed Onramp: No available provider error does not dissapear after change currency --- .../factory/amount/OnrampAmountStateFactory.kt | 18 ++++++++++++++++++ .../main/model/OnrampMainComponentModel.kt | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt index 9b9a6955cf..f9d3a8473e 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt @@ -1,6 +1,7 @@ package com.tangem.features.onramp.main.entity.factory.amount import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.wrappedList @@ -144,6 +145,23 @@ internal class OnrampAmountStateFactory( ) } + fun getAmountSecondaryResetState(): OnrampMainComponentUM { + val currentState = currentStateProvider() + if (currentState !is OnrampMainComponentUM.Content) return currentState + + val amountState = currentState.amountBlockState + + if (amountState.secondaryFieldModel is OnrampAmountSecondaryFieldUM.Content) return currentState + + return currentState.copy( + amountBlockState = amountState.copy( + secondaryFieldModel = OnrampAmountSecondaryFieldUM.Content( + amount = TextReference.EMPTY, + ), + ), + ) + } + private fun OnrampQuote.toProviderBlockState(isBestRate: Boolean): OnrampProviderBlockUM { return OnrampProviderBlockUM.Content( paymentMethod = paymentMethod, diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt index c3610c16d1..43915a8e50 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt @@ -157,7 +157,11 @@ internal class OnrampMainComponentModel @Inject constructor( } private suspend fun updatePairsAndQuotes() { - fetchPairsUseCase.invoke(params.cryptoCurrency).onLeft(::handleOnrampError) + _state.update { amountStateFactory.getAmountSecondaryLoadingState() } + fetchPairsUseCase.invoke(params.cryptoCurrency).fold( + ifLeft = ::handleOnrampError, + ifRight = { _state.update { amountStateFactory.getAmountSecondaryResetState() } }, + ) startLoadingQuotes() } From c8535819c5ccb8d6fa729e91eafc8af22913befd Mon Sep 17 00:00:00 2001 From: iMaks99 <45900939+iMaks99@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:18:41 +0500 Subject: [PATCH 3/9] AND-9469 Fixed Onramp: infinite loader when there is error on all quotes --- .../main/entity/factory/OnrampStateFactory.kt | 3 +- .../main/model/OnrampMainComponentModel.kt | 74 ++++++++++--------- 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt index 3af6368c14..015923aafc 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt @@ -74,7 +74,7 @@ internal class OnrampStateFactory( ) } - private fun getErrorState(errorCode: String? = null): OnrampMainComponentUM { + fun getErrorState(errorCode: String? = null): OnrampMainComponentUM { val state = currentStateProvider() val endButton = state.topBarConfig.endButtonUM.copy(enabled = true) @@ -84,6 +84,7 @@ internal class OnrampStateFactory( buyButtonConfig = state.buyButtonConfig.copy(enabled = false), amountBlockState = state.amountBlockState.copy( amountFieldModel = state.amountBlockState.amountFieldModel.copy(isError = true), + secondaryFieldModel = OnrampAmountSecondaryFieldUM.Content(TextReference.EMPTY), ), providerBlockState = OnrampProviderBlockUM.Empty, errorNotification = NotificationUM.Warning.OnrampErrorNotification( diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt index 43915a8e50..70508d247c 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt @@ -199,39 +199,7 @@ internal class OnrampMainComponentModel @Inject constructor( .onEach { maybeQuotes -> maybeQuotes.fold( ifLeft = ::handleOnrampError, - ifRight = { quotes -> - quotes.filterIsInstance().forEach { errorState -> - sendOnrampErrorAnalytic(errorState.error) - } - val quote = quotes.firstOrNull() ?: return@onEach - - val bestProvider = quote as? OnrampQuote.Data - val isMultipleQuotes = !quotes.isSingleItem() - val isOtherQuotesHasData = quotes - .filter { it.paymentMethod == quote.paymentMethod } - .filterNot { it == bestProvider } - .any { it is OnrampQuote.Data } - val hasBestProvider = isMultipleQuotes && isOtherQuotesHasData - - val isBestProvider = quote == bestProvider && hasBestProvider - - if (quote is OnrampQuote.Data && lastAmount.value != quote.fromAmount.value) { - lastAmount.value = quote.fromAmount.value - analyticsEventHandler.send( - OnrampAnalyticsEvent.ProviderCalculated( - providerName = quote.provider.info.name, - tokenSymbol = params.cryptoCurrency.symbol, - paymentMethod = quote.paymentMethod.name, - ), - ) - } - _state.update { - amountStateFactory.getAmountSecondaryUpdatedState( - quote = quote, - isBestRate = isBestProvider, - ) - } - }, + ifRight = ::handleQuoteResult, ) } .launchIn(modelScope) @@ -300,6 +268,46 @@ internal class OnrampMainComponentModel @Inject constructor( super.onDestroy() } + private fun handleQuoteResult(quotes: List) { + quotes.filterIsInstance().forEach { errorState -> + sendOnrampErrorAnalytic(errorState.error) + } + + val quote = quotes.firstOrNull() + + if (quote == null) { + _state.update { stateFactory.getErrorState() } + return + } + + val bestProvider = quote as? OnrampQuote.Data + val isMultipleQuotes = !quotes.isSingleItem() + val isOtherQuotesHasData = quotes + .filter { it.paymentMethod == quote.paymentMethod } + .filterNot { it == bestProvider } + .any { it is OnrampQuote.Data } + val hasBestProvider = isMultipleQuotes && isOtherQuotesHasData + + val isBestProvider = quote == bestProvider && hasBestProvider + + if (quote is OnrampQuote.Data && lastAmount.value != quote.fromAmount.value) { + lastAmount.value = quote.fromAmount.value + analyticsEventHandler.send( + OnrampAnalyticsEvent.ProviderCalculated( + providerName = quote.provider.info.name, + tokenSymbol = params.cryptoCurrency.symbol, + paymentMethod = quote.paymentMethod.name, + ), + ) + } + _state.update { + amountStateFactory.getAmountSecondaryUpdatedState( + quote = quote, + isBestRate = isBestProvider, + ) + } + } + private fun showDemoWarning() { val alertUM = AlertDemoModeUM(onConfirmClick = {}) From effb76fcac29c431511b4db56fc1a0684a7a63b7 Mon Sep 17 00:00:00 2001 From: iMaks99 <45900939+iMaks99@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:18:47 +0500 Subject: [PATCH 4/9] AND-9474 Fixed Onramp: no quote requests if enter number with a dot --- .../entity/factory/amount/OnrampAmountFieldChangeConverter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountFieldChangeConverter.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountFieldChangeConverter.kt index 72a1c7a608..de2bf21fd3 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountFieldChangeConverter.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountFieldChangeConverter.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.utils.parseBigDecimalOrNull import com.tangem.features.onramp.main.entity.OnrampAmountSecondaryFieldUM import com.tangem.features.onramp.main.entity.OnrampMainComponentUM import com.tangem.features.onramp.main.entity.OnrampProviderBlockUM @@ -24,7 +25,7 @@ internal class OnrampAmountFieldChangeConverter( val amountState = state.amountBlockState val amountTextField = amountState.amountFieldModel - val fiatDecimal = value.toBigDecimalOrNull() ?: BigDecimal.ZERO + val fiatDecimal = value.parseBigDecimalOrNull() ?: BigDecimal.ZERO val isDoneActionEnabled = !fiatDecimal.isNullOrZero() val amountFieldModel = amountState.amountFieldModel.copy( fiatValue = value, From 7d93987bdd88f2c893511eb51bbb4198496ad9a3 Mon Sep 17 00:00:00 2001 From: Anton Tkachev Date: Fri, 13 Dec 2024 14:18:12 +0400 Subject: [PATCH 5/9] AND-9455 [Custom Token] Removed derivation path selector display when HD wallet is not supported --- .../com/tangem/domain/tokens/model/Network.kt | 2 +- .../PreviewCustomTokenFormComponent.kt | 2 +- .../entity/customtoken/CustomTokenFormUM.kt | 2 +- .../model/CustomTokenFormModel.kt | 28 ++++++++++++------- .../managetokens/ui/CustomTokenFormContent.kt | 16 ++++++++--- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt index ecec15cb33..d9f986af09 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt @@ -82,7 +82,7 @@ data class Network( data class Custom(override val value: String) : DerivationPath() /** - * Represents a lack of derivation path. + * Represents a lack of derivation path, which means the wallet does not support the HD wallet feature. */ @Serializable data object None : DerivationPath() { diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenFormComponent.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenFormComponent.kt index 599776031c..312678a0c2 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenFormComponent.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenFormComponent.kt @@ -18,7 +18,7 @@ import kotlinx.collections.immutable.toPersistentMap internal class PreviewCustomTokenFormComponent( networkName: ClickableFieldUM = PreviewCustomTokenFormComponent.networkName, - derivationPath: ClickableFieldUM = PreviewCustomTokenFormComponent.derivationPath, + derivationPath: ClickableFieldUM? = PreviewCustomTokenFormComponent.derivationPath, canAddToken: Boolean = false, tokenForm: CustomTokenFormUM.TokenFormUM? = PreviewCustomTokenFormComponent.tokenForm, notifications: PersistentList = PreviewCustomTokenFormComponent.notifications, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/customtoken/CustomTokenFormUM.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/customtoken/CustomTokenFormUM.kt index 085d721b82..e85644cbe4 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/customtoken/CustomTokenFormUM.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/customtoken/CustomTokenFormUM.kt @@ -10,7 +10,7 @@ import kotlinx.collections.immutable.persistentMapOf internal data class CustomTokenFormUM( val networkName: ClickableFieldUM, - val derivationPath: ClickableFieldUM, + val derivationPath: ClickableFieldUM?, val tokenForm: TokenFormUM?, val notifications: PersistentList = persistentListOf(), val canAddToken: Boolean = false, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt index 61220167cc..0e0198c571 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt @@ -37,7 +37,8 @@ import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject -@Suppress("LongParameterList") +// TODO: Divide to sub-components: https://tangem.atlassian.net/browse/AND-9479 +@Suppress("LongParameterList", "LargeClass") @ComponentScoped internal class CustomTokenFormModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, @@ -83,19 +84,26 @@ internal class CustomTokenFormModel @Inject constructor( } else { null }, - derivationPath = ClickableFieldUM( - label = resourceReference(R.string.custom_token_derivation_path), - value = if (params.derivationPath == null || params.derivationPath.isDefault) { - resourceReference(R.string.custom_token_derivation_path_default) - } else { - stringReference(params.derivationPath.name) - }, - onClick = ::selectDerivationPath, - ), + derivationPath = getDerivationPathFormIfSupported(), saveToken = ::addCurrency, ) } + private fun getDerivationPathFormIfSupported(): ClickableFieldUM? { + // If network doesn't support derivation path, return null + if (params.network.derivationPath is Network.DerivationPath.None) return null + + return ClickableFieldUM( + label = resourceReference(R.string.custom_token_derivation_path), + value = if (params.derivationPath == null || params.derivationPath.isDefault) { + resourceReference(R.string.custom_token_derivation_path_default) + } else { + stringReference(params.derivationPath.name) + }, + onClick = ::selectDerivationPath, + ) + } + @OptIn(FlowPreview::class) private fun observeTokenFormUpdates() { state diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/CustomTokenFormContent.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/CustomTokenFormContent.kt index 5880c3f679..b175af525f 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/CustomTokenFormContent.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/CustomTokenFormContent.kt @@ -117,12 +117,13 @@ private fun FormContent(model: CustomTokenFormUM, modifier: Modifier = Modifier) val tokenForm = model.tokenForm if (tokenForm != null) { - TokenForm(tokenForm) + TokenForm(tokenForm = tokenForm) } - ClickableField( - model = model.derivationPath, - ) + val derivationPath = model.derivationPath + if (derivationPath != null) { + ClickableField(model = derivationPath) + } model.notifications.fastForEach { notification -> Notification( @@ -278,6 +279,13 @@ private class PreviewCustomTokenFormComponentProvider : PreviewCustomTokenFormComponent( tokenForm = null, ), + PreviewCustomTokenFormComponent( + derivationPath = null, + ), + PreviewCustomTokenFormComponent( + tokenForm = null, + derivationPath = null, + ), ) } // endregion Preview From 39e67b9d2eba5206691028e92be2c2004295260e Mon Sep 17 00:00:00 2001 From: iMaks99 <45900939+iMaks99@users.noreply.github.com> Date: Mon, 16 Dec 2024 11:14:46 +0500 Subject: [PATCH 6/9] AND-9480 Fixed Onramp: update texts on Choose provider screen --- core/res/src/main/res/values-de/strings.xml | 5 +-- core/res/src/main/res/values-es/strings.xml | 9 ++++++ core/res/src/main/res/values-fr/strings.xml | 20 +++++++++++- core/res/src/main/res/values-ja/strings.xml | 3 +- core/res/src/main/res/values-ru/strings.xml | 8 ++--- .../src/main/res/values-uk-rUA/strings.xml | 32 ++++++++++++++++++- core/res/src/main/res/values/strings.xml | 2 +- .../src/main/res/drawable/ic_lightning_16.xml | 0 .../providers/ui/SelectProviderBottomSheet.kt | 26 +++++++++++++++ 9 files changed, 95 insertions(+), 10 deletions(-) rename {features/swap/presentation => core/ui}/src/main/res/drawable/ic_lightning_16.xml (100%) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 1055b86c5d..3cc2368a82 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -258,7 +258,7 @@ Bereitgestellt von Status Tangem bietet Token-Swaps über Drittanbieter gemäß den jeweiligen Bedingungen des jeweiligen Anbieters an. - Anbieter wählen + Anbieter Es ist ein Fehler aufgetreten. Code: %s Fehler %1$s. Der ausgewählte Anbieter kann die angegebene Transaktion nicht verarbeiten. Bitte runde den Wert auf %2$s auf oder änder diesen. Der gewählte Anbieter ist im Moment nicht verfügbar. Bitte versuche es später noch einmal. (Code: %s) @@ -584,6 +584,7 @@ Suche nach Land Nicht verfügbar Suche nach Währung + Durch die Nutzung der Onramp-Funktionalität stimmst Du den %1$s und %2$s des Anbieters zu. Der Kaufbetrag sollte nicht höher sein als %s Der zu kaufende Betrag muss mindestens %s betragen Keine verfügbaren Anbieter für diese Währung @@ -665,7 +666,7 @@ Scanne die Karte oder Ring, um ihre Einstellungen zu ändern. Die Änderungen wirken sich nur auf die von dir gescannte Karte oder Ring aus und haben keine Auswirkungen auf andere mit deiner Wallet verknüpften Geräte. Halte deine Karte oder Ring bereit! Sicherheitswarnung - Dein Konto verfügt nicht über genügend Guthaben, um diese Kryptowährung zu verkaufen. Bitte zahle den gewünschten Vermögenswert ein, um fortzufahren. + Dein Konto verfügt nicht über ausreichend Guthaben, um Kryptowährungen zu verkaufen. Bitte zahle den gewünschten Vermögenswert ein, um fortzufahren. Unzureichendes Guthaben Der Verkauf von Kryptowährung ist in Deiner Region derzeit nicht möglich. Wir arbeiten aktiv daran, Ihnen diese Option bald anzubieten – bleib dran! Regionale Einschränkung diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index 8ecdd2c7e7..683983950c 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -3,6 +3,9 @@ ¿No encuentra el token en su billetera? Consulte los mercados para encontrarlo y añadirlo a la compra ¿No encuentra el token en su billetera? Consulte los mercados para encontrarlo y añadirlo a la venta Vender + Esto puede tardar unos segundos. Inténtelo de nuevo más tarde. + Los datos aún no se han cargado. + La acción no está disponible actualmente. Inténtalo de nuevo más tarde o actualiza los datos deslizando el dedo hacia abajo en la pantalla. Elige el token ¿No encuentras el token en tu billetera? Consulte los mercados para encontrarlo y agregarlo al intercambio No hay tokens disponibles para intercambiar con el token seleccionado. Por favor elige otro. @@ -308,6 +311,7 @@ Por favor, díganos qué tarjeta tiene Hola equipo de soporte, Por favor, cuéntenos más sobre tu problema. Cada pequeño detalle puede ayudar. + Billetera previamente activada Mis recomendaciones No se puede escanear una tarjeta Comentarios @@ -571,6 +575,7 @@ Buscar por país Indisponible Buscar por moneda + Al utilizar la funcionalidad onramp, acepta %1$s y %2$s del proveedor. El monto de la compra no debe ser mayor a %s La cantidad a comprar debe ser como mínimo %s No hay proveedores disponibles para esta moneda @@ -650,6 +655,7 @@ Escanee su tarjeta Escanee la tarjeta para cambiar sus ajustes. Los cambios afectarán solo a la tarjeta que has escaneado y no afectarán a otras tarjetas vinculadas a su billetera. ¡Prepare su tarjeta! + Alerta de seguridad No tiene fondos suficientes en su saldo para vender esta criptomoneda. Deposite el activo deseado para continuar. Saldo insuficiente La venta de criptomonedas no está disponible en su región en este momento. Estamos trabajando activamente para ofrecerle esta opción pronto. ¡Manténgase conectado! @@ -694,6 +700,7 @@ Los aranceles aduaneros son altos Debido a las peculiaridades de la red %1$s, la tarifa por transferir el saldo completo es más alta. Para reducir la comisión, puedes dejar %2$s. La tarifa es más alta + Su saldo no puede ser inferior al monto del alquiler. Mantenga al menos %1$s en su cuenta o retire todos los fondos. La comisión incluida excede el monto de la transferencia, lo que resulta en un valor negativo Cantidad no válida La cantidad mínima de envío es %1$s. Asegúrate de que el saldo restante después del envío no sea menor que %2$s. @@ -866,6 +873,7 @@ Usted recibe Elige token no disponible + Esta es mi billetera Saldos ocultos Saldos mostrados Cancelar @@ -935,6 +943,7 @@ Desbloquear todo con %s La blockchain está Inaccesible. Inténtelo más tarde Escanee la tarjeta o el anillo + Esta billetera ya ha sido activada anteriormente.\nSi no fue usted quien lo hizo, comuníquese con el servicio de asistencia.\nTangem nunca vende billeteras junto con el código de acceso generado previamente. Solicitud para firmar un mensaje.\n\n%s Dapp %1$s, solicitando\nfirmar transacción BNB.\n\n%2$s Orden de intercambio por %1$s\nPrecio: %2$s\nCantidad a recibir: %3$s\nCantidad a pagar: %4$s diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 4e3fe4704b..55d428f3d3 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -3,10 +3,18 @@ Jeton non trouvé dans votre portefeuille ? Consultez les marchés pour le trouver et l\'ajouter à l\'achat Jeton non trouvé dans votre portefeuille ? Consultez les marchés pour le trouver et l\'ajouter à la vente Vendre + Cela peut prendre quelques secondes. Veuillez réessayer plus tard. + Les données n\'ont pas encore été chargées. + Cette action n\'est pas disponible actuellement. Veuillez réessayer plus tard ou actualiser les données en faisant glisser votre doigt vers le bas sur l\'écran. + Le bouton n\'est pas disponible Choisissez le jeton Jeton non trouvé dans votre portefeuille ? Consultez les marchés pour le trouver et l\'ajouter à l\'échange Il n\'y a pas de token disponible pour échanger avec le token sélectionné. Veuillez en choisir un autre. Aucune paire disponible + Pour utiliser la fonction d\'échange, votre portefeuille doit contenir au moins 2 jetons. + Ajouter des jetons + Vous n\'avez qu\'un seul token ajouté à votre portefeuille. Pour utiliser la fonction d\'échange, vous devez ajouter au moins 2 tokens. + Ajouter des jetons Sélectionnez le jeton que vous souhaitez recevoir Sélectionnez le jeton que vous souhaitez échanger Choisissez le réseau @@ -250,7 +258,7 @@ Fourni par Statut Tangem propose des échanges de jetons via des fournisseurs tiers selon les conditions de chaque fournisseur - Choisissez un fournisseur + Fournisseur Une erreur s\'est produite. Code : %s Erreur %1$s. Le fournisseur sélectionné ne peut pas traiter la transaction spécifiée. Veuillez arrondir la valeur à %2$s ou la modifier Le fournisseur sélectionné n\'est pas disponible pour le moment. Veuillez réessayer plus tard. (Code : %s) @@ -263,6 +271,9 @@ Le montant a été remboursé en %1$s (réseau %2$s) Visitez le site Web du fournisseur pour la vérification Vérification KYC requise par le fournisseur + Acheté + Achat + En cours d\'achat Annulé Confirmé En attente de confirmation @@ -308,6 +319,7 @@ Veuillez nous dire quelle carte vous avez Chère équipe de support, Veuillez nous en dire plus sur votre problème. Chaque petit détail peut nous aider. + Portefeuille précédemment activé Mes suggestions Impossible de scanner une carte Commentaires @@ -571,6 +583,7 @@ Recherche par pays Indisponible Recherche par devise + En utilisant la fonctionnalité onramp, vous acceptez %1$s et %2$s du fournisseur Le montant de l\'achat ne doit pas dépasser %s Le montant à acheter doit être au moins %s Aucun fournisseur disponible pour cette devise @@ -599,6 +612,7 @@ %1$s (%2$s) sur le réseau %3$s L’envoi de toute autre devise entraînera sa perte irréversible. Envoyez uniquement %s à cette adresse. L\'envoi de toute autre devise entraînera sa perte irréversible. + Envoyez uniquement %1$s sur le réseau %2$s Transférez des fonds depuis un autre portefeuille ou une autre bourse Participer Échec du chargement des informations sur le programme de parrainage. Veuillez réessayer plus tard. @@ -650,6 +664,7 @@ Scannez votre carte Scannez la carte pour modifier ses paramètres. Les modifications n\'affecteront que la carte que vous avez scannée et n\'affecteront pas les autres cartes liées à votre portefeuille. Préparez votre carte ! + Alerte de sécurité Vous n\'avez pas assez de fonds sur votre solde pour vendre cette cryptomonnaie. Veuillez déposer l\'actif souhaité pour continuer. Solde insuffisant La vente de cryptomonnaies n\'est pas disponible dans votre région pour le moment. Nous travaillons activement pour vous proposer cette option prochainement. Restez connecté ! @@ -694,6 +709,7 @@ Les frais de douane sont élevés En raison des particularités du réseau %1$s, les frais de transfert de la totalité du solde sont plus élevés. Pour réduire la commission, vous pouvez en laisser %2$s. Les frais sont plus élevés + Le solde de votre compte ne peut pas être inférieur au montant du loyer. Veuillez conserver au moins %1$s sur votre compte ou retirer tous les fonds. La commission incluse dépasse le montant du transfert, ce qui entraîne une valeur négative Montant invalide Le montant minimum d\'envoi est de %1$s. Veuillez vous assurer que le solde restant après l\'envoi ne sera pas inférieur à %2$s. @@ -866,6 +882,7 @@ Vous recevez Choisir le jeton non disponible + C\'est mon portefeuille Soldes masqués Soldes affichés Annuler @@ -935,6 +952,7 @@ Tout déverrouiller avec %s La blockchain n\'est pas accessible. Réessayez plus tard Scanner la carte ou la bague + Ce portefeuille a déjà été activé auparavant.\nSi cela n\'a pas été fait par vous, veuillez contacter le support.\nTangem ne vend jamais de portefeuilles avec le code d\'accès pré-généré. Demande de signature d\'un message.\n\n%s Dapp %1$s, demandant de\nsigner la transaction BNB.\n\n%2$s Ordre de trade pour %1$s\nPrix : %2$s\nMontant à recevoir : %3$s\nMontant à payer : %4$s diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index 7b931f0406..bd018bcf92 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -255,7 +255,7 @@ 提供元 ステータス Tangemは、各プロバイダーの条件に従って、サードパーティプロバイダーを介してトークンスワップを提供します。 - プロバイダーを選択 + プロバイダー エラーが発生しました。コード: %s エラー%1$s 。選択したプロバイダーは指定された取引を処理できません。値を%2$sに切り上げるか、変更してください。 選択したプロバイダーは現在利用できません。しばらくしてからもう一度お試しください。(コード: %s ) @@ -576,6 +576,7 @@ 国で検索 利用不可 通貨で検索 + オンランプ機能を使用することにより、プロバイダの%1$sおよび%2$sに同意するものとします 買付金額は%s以下にしてください 買付金額は少なくとも%sである必要があります この通貨で利用可能なプロバイダーはありません diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 5424eee393..dce01434b7 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -5,7 +5,7 @@ Продать Это может занять несколько секунд. Пожалуйста, попробуйте позже. Данные ещё не загрузились - Действие в данный момент недоступно, пожалуйста попробуйте позже или обновить данные, сделав свайп экрана вниз. + Это действие в данный момент недоступно, пожалуйста попробуйте позже или обновите данные, сделав свайп экрана вниз. Кнопка недоступна Выберите токен Не нашли свой токен? Перейдите в раздел «Рынок» на главной странице и добавьте его в свой портфель для обмена. @@ -264,7 +264,7 @@ Предоставлено Статус Tangem предоставляет доступ к обмену через сторонних поставщиков в соответствии с их правилами - Выберите провайдера + Провайдер Произошла ошибка. Код: %s Ошибка %1$s. Выбранный провайдер не может обработать указанную транзакцию. Округлите значение до %2$s или измените его. Выбранный провайдер недоступен для обмена. Попробуйте позже. (Код: %s) @@ -602,11 +602,11 @@ Нет доступных провайдеров для выбранной валюты Оплата с Доступно до %s - Доступно с %s + Доступно от %s Вы сможете продолжить транзакцию через сервис стороннего провайдера, %s Переход к %s... Наши сервисы недоступны в данной стране - Ваше местоположение определено как + Ваше место жительства определено как Страна проживания Пожалуйста, укажите правильную страну, чтобы обеспечить точность доступных способов оплаты и услуг. Настройки 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 80f21fbd9b..7a2ba44136 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -2,10 +2,20 @@ Токен не знайдено у вашому портфелі? Перевірте Ринки, щоб знайти та додати його для покупки Токен не знайдено у вашому портфелі? Перевірте Ринки, щоб знайти та додати його для продажу + Продати + Це може зайняти кілька секунд. Будь ласка, спробуйте пізніше. + Дані ще не завантажилися + Наразі ця дія недоступна, будь ласка спробуйте пізніше або оновіть дані, зробивши свайп екрану до низу. + Кнопка недоступна Оберіть токен Токен не знайдено у вашому портфелі? Перевірте ринки, щоб знайти та додати його для обміну Немає доступних токенів для обміну з обраним токеном. Будь ласка, оберіть інший. Немає вільної пари + Щоб скористатися функцією обміну, у вашому портфелі має бути щонайменше 2 токени. + У вас додано лише 1 токен. Щоб скористатися функцією обміну, потрібно додати мінімум 2 токени. + Додайте токени + Оберіть токен для отримання + Оберіть токен для обміну Оберіть мережу Додати токен Токени @@ -253,8 +263,9 @@ Послугу надає Статус Tangem пропонує обмін токенів через сторонніх провайдерів відповідно до умов кожного провайдера - Оберіть провайдера + Провайдер Виникла помилка. Код: %s + Помилка %1$s. Обраний провайдер не може обробити зазначену транзакцію. Округліть значення до %2$s або змініть його. Наразі обраний провайдер недоступний для обміну. Спробуй пізніше. (Код: %s) Наразі обмін неможливий. Спробуй пізніше. (Код: %s) Курс обміну @@ -265,6 +276,9 @@ Сума була повернута в %1$s (%2$s мережі) Відвідайте сайт провайдера для перевірки Провайдер вимагає проходження KYC верифікації + Куплено + Купівля + Купівля... Скасовано Підтверджено Підтвердження @@ -579,6 +593,8 @@ Відновлення коду доступу Ідентичні картки Код доступу + Доступно з %s + Tangem забезпечує доступ к покупці через сторонніх провайдерів згідно з їхніми умовами Пошук за країною Недоступно Пошук по валюті @@ -592,8 +608,10 @@ Перенаправлення на %s... Наші сервіси недоступні в цій країні Ваше місце проживання визначено як + Країна проживання Будь ласка, виберіть правильну країну, щоб забезпечити точні способи оплати та послуги. Параметри + Ви можете закрити цей екран і перевірити статус транзакції на екрані деталей токена. Ви можете перевірити статус транзакції на сторінці токена Через Групами @@ -604,8 +622,11 @@ Налаштування Ви не надали доступ до своєї камери Доступ до камери заборонено + Memo не вимагається %1$s (%2$s) у мережі %3$s + Використання іншої мережі може призвести до втрати коштів. Надсилайте лише %s на цю адресу. Надсилання будь-якої іншої валюти призведе до її незворотної втрати. + Надсилайте лише %1$s у мережі %2$s Переказуйте кошти з будь-якого гаманця або біржі Взяти участь Не вдалося завантажити інформацію по реферальній програмі. Будь ласка, спробуйте пізніше. @@ -661,6 +682,11 @@ Сканувати Відскануйте картку або кільце, щоб змінити її налаштування. Зміни торкнуться лише тої картки або кільця, які ви відсканували, і не вплинуть на інші пристрої, прив\'язані до вашого гаманця. Підготуйте свій Tangem! + Оповіщення безпеки + На вашому балансі недостатньо коштів для продажу криптовалюти. Будь ласка, внесіть бажаний актив, щоб продовжити. + Недостатній баланс + Продаж криптовалюти у вашому регіоні тимчасово недоступний. Ми активно працюємо над тим, щоб додати цю можливість. Слідкуйте за нашими новинами! + Регіональні обмеження Вже включено до введеної адреси Сума комісії у %s разів перевищує рекомендовану. Переконайтеся, що вказана комісія вірна. Ви вказали комісію нижче рекомендованої, це може спричинити затримку вашої транзакції. Продовжити? @@ -701,6 +727,7 @@ Встановлена комісія завелика Через особливості мережі %1$s комісія за переказ всього балансу вища. Щоб зменшити комісію, Ви можете залишити %2$s. Підвищена комісія + Баланс вашого рахунку не може бути меншим за орендну плату. Будь ласка, залиште на рахунку не менше %1$s або виведіть всі кошти. Включена комісія перевищує суму переказу, що призводить до від’ємного значення Недопустима сума Мінімальна сума переказу - %1$s. Будь ласка, переконайтеся, що залишок після переказу не буде меншим ніж %2$s. @@ -873,6 +900,7 @@ Ви отримаєте Оберіть токен недоступно + Це мій гаманець Баланси приховано Баланси показано Скасувати @@ -902,6 +930,7 @@ Недоступно для покупки Недоступно для продажу Недоступно для обміну з %s + Недоступно для обміну контракт: %s У вас ще немає транзакцій Не вдалося завантажити історію транзакцій.\nНатисніть кнопку нижче, щоб оновити інформацію @@ -941,6 +970,7 @@ Розблокувати все з %s Блокчейн недоступний. Спробуйте пізніше Відскануйте картку або кільце + Цей гаманець вже був активований раніше.\nЯкщо це було зроблено не вами, зверніться до служби підтримки.\nTangem ніколи не продає гаманці разом з попередньо згенерованим кодом доступу. Запит на підпис повідомлення.\n\n%s Dapp %1$s, запит на\nпідпис транзакції BNB.\n\n%2$s Торговий ордер на %1$s\nЦіна: %2$s\nСума до отримання: %3$s\nСума до сплати: %4$s diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index ffccaa511b..12d15e5487 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -258,7 +258,7 @@ Provided by Status Tangem offers token swaps via 3rd-party providers according to each provider\'s terms - Choose provider + Provider An error occurred. Code: %s Error %1$s. The selected provider cannot process the specified transaction. Please round the value up to %2$s or change it Selected provider is unavailable at the moment. Please try again later. (Code: %s) diff --git a/features/swap/presentation/src/main/res/drawable/ic_lightning_16.xml b/core/ui/src/main/res/drawable/ic_lightning_16.xml similarity index 100% rename from features/swap/presentation/src/main/res/drawable/ic_lightning_16.xml rename to core/ui/src/main/res/drawable/ic_lightning_16.xml diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/ui/SelectProviderBottomSheet.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/ui/SelectProviderBottomSheet.kt index 7d6e9ced4f..f8cc232b66 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/ui/SelectProviderBottomSheet.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/ui/SelectProviderBottomSheet.kt @@ -12,9 +12,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -72,6 +75,7 @@ internal fun SelectProviderBottomSheetContent(state: SelectPaymentAndProviderUM, state.selectedPaymentMethod.providers.fastForEach { provider -> key(provider.providerId) { ProviderItem(state = provider) } } + OnrampMoreProviders() } } @@ -251,6 +255,28 @@ private fun UnavailableProviderItem( } } +@Composable +private fun OnrampMoreProviders() { + Icon( + painter = rememberVectorPainter( + ImageVector.vectorResource(R.drawable.ic_lightning_16), + ), + contentDescription = null, + tint = TangemTheme.colors.icon.informative, + modifier = Modifier + .padding(top = 16.dp), + ) + Text( + text = stringResource(R.string.express_more_providers_soon), + style = TangemTheme.typography.caption2, + color = TangemTheme.colors.icon.informative, + modifier = Modifier + .padding(top = 4.dp, bottom = 24.dp) + .padding(horizontal = TangemTheme.dimens.spacing56), + textAlign = TextAlign.Center, + ) +} + // region Preview @Preview(showBackground = true, widthDp = 360) @Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) From 64ca541aece177485ed9864833076e60df56b58e Mon Sep 17 00:00:00 2001 From: Vlad Kozarez Date: Mon, 16 Dec 2024 13:30:29 +0300 Subject: [PATCH 7/9] AND-9486 fixed custom fee for eip1559 --- .../data/staking/DefaultStakingRepository.kt | 6 +++--- .../repository/DefaultCurrenciesRepository.kt | 16 +++++++++++----- .../fee/custom/EthereumEIPCustomFeeConverter.kt | 10 ++++++++-- .../com/tangem/blockchainsdk/utils/Blockchain.kt | 9 ++++++--- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt index 7c7242509b..03d4dda03f 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt @@ -10,7 +10,7 @@ import com.tangem.blockchain.common.TransactionStatus import com.tangem.blockchain.common.transaction.Fee import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.blockchainsdk.utils.toCoinId -import com.tangem.blockchainsdk.utils.toMigratedCointId +import com.tangem.blockchainsdk.utils.toMigratedCoinId import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toCompressedPublicKey import com.tangem.data.common.api.safeApiCall @@ -555,7 +555,7 @@ internal class DefaultStakingRepository( override fun getStakingApproval(cryptoCurrency: CryptoCurrency): StakingApproval { return when (getIntegrationKey(cryptoCurrency.id)) { Blockchain.Ethereum.id + Blockchain.Polygon.toCoinId(), - Blockchain.Ethereum.id + Blockchain.Polygon.toMigratedCointId(), + Blockchain.Ethereum.id + Blockchain.Polygon.toMigratedCoinId(), -> StakingApproval.Needed(ETHEREUM_POLYGON_APPROVE_SPENDER) else -> StakingApproval.Empty } @@ -644,7 +644,7 @@ internal class DefaultStakingRepository( Blockchain.Solana.run { id + toCoinId() } to SOLANA_INTEGRATION_ID, Blockchain.Cosmos.run { id + toCoinId() } to COSMOS_INTEGRATION_ID, Blockchain.Tron.run { id + toCoinId() } to TRON_INTEGRATION_ID, - Blockchain.Ethereum.id + Blockchain.Polygon.toMigratedCointId() to ETHEREUM_POLYGON_INTEGRATION_ID, + Blockchain.Ethereum.id + Blockchain.Polygon.toMigratedCoinId() to ETHEREUM_POLYGON_INTEGRATION_ID, // Blockchain.Ethereum.id + Blockchain.Polygon.toCoinId() to ETHEREUM_POLYGON_INTEGRATION_ID, Blockchain.BSC.run { id + toCoinId() } to BINANCE_INTEGRATION_ID, // Blockchain.Polkadot.run { id + toCoinId() } to POLKADOT_INTEGRATION_ID, diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index c64af39a71..7b6b5e6223 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -2,10 +2,7 @@ package com.tangem.data.tokens.repository import com.tangem.blockchain.common.Blockchain import com.tangem.blockchainsdk.compatibility.getL2CompatibilityTokenComparison -import com.tangem.blockchainsdk.utils.ExcludedBlockchains -import com.tangem.blockchainsdk.utils.fromNetworkId -import com.tangem.blockchainsdk.utils.toCoinId -import com.tangem.blockchainsdk.utils.toNetworkId +import com.tangem.blockchainsdk.utils.* import com.tangem.data.common.api.safeApiCall import com.tangem.data.common.cache.CacheRegistry import com.tangem.data.common.currency.* @@ -360,7 +357,9 @@ internal class DefaultCurrenciesRepository( val storedCoin = storedTokens.tokens .find { - it.networkId == blockchainNetworkId && it.id == coinId && it.derivationPath == derivationPath.value + it.networkId == blockchainNetworkId && + compareIdWithMigrations(it, coinId) && + it.derivationPath == derivationPath.value } ?: error("Coin in this network $networkId not found") val coin = responseCurrenciesFactory.createCurrency(storedCoin, userWallet.scanResponse) @@ -548,6 +547,13 @@ internal class DefaultCurrenciesRepository( ) } + private fun compareIdWithMigrations(token: UserTokensResponse.Token, coinId: String): Boolean { + return when { + token.id == OLD_POLYGON_NAME -> NEW_POLYGON_NAME == coinId + else -> token.id == coinId + } + } + private suspend fun fetchTokens(userWallet: UserWallet) { val userWalletId = userWallet.walletId diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumEIPCustomFeeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumEIPCustomFeeConverter.kt index 081ba60665..88495f81e6 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumEIPCustomFeeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumEIPCustomFeeConverter.kt @@ -61,8 +61,14 @@ internal class EthereumEIPCustomFeeConverter( value: ImmutableList, ): Fee.Ethereum.EIP1559 { val feeAmount = value[FEE_AMOUNT].value.parseToBigDecimal(value[FEE_AMOUNT].decimals) - val maxFee = value[MAX_FEE].value.parseToBigDecimal(GAS_DECIMALS).toBigInteger() - val priorityFee = value[PRIORITY_FEE].value.parseToBigDecimal(GAS_DECIMALS).toBigInteger() + val maxFeeDecimals = value[MAX_FEE].decimals + val maxFee = value[MAX_FEE].value.parseToBigDecimal(maxFeeDecimals) + .movePointRight(maxFeeDecimals) + .toBigInteger() + val priorityFeeDecimals = value[PRIORITY_FEE].decimals + val priorityFee = value[PRIORITY_FEE].value.parseToBigDecimal(priorityFeeDecimals) + .movePointRight(priorityFeeDecimals) + .toBigInteger() val gasLimit = value[GAS_LIMIT].value.parseToBigDecimal(GAS_DECIMALS).toBigInteger() return normalFee.copy( diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt index 4152ec301f..562255b087 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt @@ -303,7 +303,7 @@ fun Blockchain.toCoinId(): String { Blockchain.EthereumClassic, Blockchain.EthereumClassicTestnet -> "ethereum-classic" Blockchain.Stellar, Blockchain.StellarTestnet -> "stellar" Blockchain.Cardano -> "cardano" - Blockchain.Polygon, Blockchain.PolygonTestnet -> "polygon-ecosystem-token" + Blockchain.Polygon, Blockchain.PolygonTestnet -> NEW_POLYGON_NAME Blockchain.Arbitrum, Blockchain.ArbitrumTestnet -> "arbitrum-one" Blockchain.Avalanche, Blockchain.AvalancheTestnet -> "avalanche-2" Blockchain.Solana, Blockchain.SolanaTestnet -> "solana" @@ -387,8 +387,8 @@ fun Blockchain.toCoinId(): String { * New CoinId to existing coin "id" field. * To support both old and new coin id. */ -fun Blockchain.toMigratedCointId(): String = when (this) { - Blockchain.Polygon, Blockchain.PolygonTestnet -> "polygon-ecosystem-token" +fun Blockchain.toMigratedCoinId(): String = when (this) { + Blockchain.Polygon, Blockchain.PolygonTestnet -> NEW_POLYGON_NAME else -> toCoinId() } @@ -422,5 +422,8 @@ fun Blockchain.minimalAmount(): BigDecimal { return BigDecimal.ONE.movePointLeft(decimals()) } +const val OLD_POLYGON_NAME = "matic-network" +const val NEW_POLYGON_NAME = "polygon-ecosystem-token" + private const val NODL = "NODL" private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 From df5782340aa47585efbbdf603715c5d95d52209d Mon Sep 17 00:00:00 2001 From: Vlad Kozarez Date: Mon, 16 Dec 2024 13:47:37 +0300 Subject: [PATCH 8/9] [Lokalize] sync strings --- core/res/src/main/res/values-ru/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index dce01434b7..92629c43f6 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -325,6 +325,7 @@ Скажите, пожалуйста, какая у вас карта или кольцо? Привет, команда поддержки, Пожалуйста, расскажите нам больше о вашей проблеме. Каждая маленькая деталь может помочь. + Ранее активированный кошелек Мои предложения Не могу отсканировать карту/кольцо Обращение в поддержку @@ -597,6 +598,7 @@ Поиск по стране Недоступно Поиск по валюте + Пользуясь сервисом покупки, вы соглашаетесь с %1$s и %2$s Сумма покупки не может быть больше, чем %s Сумма покупки должна составлять минимум %s Нет доступных провайдеров для выбранной валюты From c5918d1d4914dd815f6dc91cba34cd80d0593851 Mon Sep 17 00:00:00 2001 From: Mama1emon Date: Mon, 16 Dec 2024 12:58:33 +0400 Subject: [PATCH 9/9] AND-9287 Action buttons (main screen): there is no message about demo for sell Signed-off-by: Mama1emon --- .../tap/network/exchangeServices/CurrencyExchangeManager.kt | 5 ++++- .../onramp/selecttoken/model/OnrampOperationModel.kt | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt index 94185a495a..9e0154ad1b 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt @@ -43,7 +43,10 @@ class CurrencyExchangeManager( override suspend fun update() { _initializationStatus.value = lceLoading() - buyService.update() + if (!store.inject(DaggerGraphState::onrampFeatureToggles).isFeatureEnabled) { + buyService.update() + } + sellService.update() _initializationStatus.value = lceContent() diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt index 35b84b1490..59673147bb 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selecttoken/model/OnrampOperationModel.kt @@ -23,6 +23,7 @@ import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.tokens.legacy.TradeCryptoAction import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.wallets.usecase.GetWalletsUseCase +import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.features.onramp.impl.R import com.tangem.features.onramp.selecttoken.OnrampOperationComponent.Params import com.tangem.features.onramp.selecttoken.entity.OnrampOperationUM @@ -44,6 +45,7 @@ internal class OnrampOperationModel @Inject constructor( private val reduxStateHolder: ReduxStateHolder, private val isDemoCardUseCase: IsDemoCardUseCase, private val messageSender: UiMessageSender, + private val onrampFeatureToggles: OnrampFeatureToggles, ) : Model() { val state: StateFlow get() = _state @@ -72,7 +74,7 @@ internal class OnrampOperationModel @Inject constructor( }, ) - if (params is Params.Sell) { + if (params is Params.Sell || !onrampFeatureToggles.isFeatureEnabled) { showErrorIfDemoModeOrElse { selectToken(status) } } else { selectToken(status)