diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 86569cbb95..c5d3a6d70e 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -1684,8 +1684,8 @@ Historische Renditen Sofortige Auszahlung Wie funktioniert das? - Verdiene %s%% jährlich - Aave • Variabler Zinssatz + Mit Aave verbinden + Aave %1$s • Variabler Zinssatz Aave Durchschnitt %s Renditen des letzten Jahres @@ -1698,7 +1698,7 @@ Effektiver Jahreszins für Versorgung Lass Dein Geld arbeiten – verdiene Zinsen auf Dein Guthaben. Verdienst auf Dein Guthaben - Verdienen %1$s%% pro Jahr + Lass dein Guthaben arbeiten Der Stakingservice ist derzeit nicht verfügbar. Bitte versuche es später erneut. Einnahmen nicht verfügbar Chart konnte nicht geladen werden... diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index 7ec812032b..16107ea2c1 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -1772,7 +1772,7 @@ Aaveは、総額819億ドル以上の資産を管理する分散型プロトコルです。 分散型・自己管理型 サービスを利用することにより、プロバイダー\n %1$sおよび%2$sに同意したことになります - 年間%s%%の収益 + Aave を接続 Aave %1$s%% • 変動金利 Aave 平均%s @@ -1796,7 +1796,7 @@ 利息は自動的に発生します Aaveの利回り 入金の処理中 - 年間%1$s%%の収益 + 残高を活用 自動 取引のネットワーク手数料をカバーするために、 %1$s %2$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 5ed2ce02b7..168ba8b435 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -192,8 +192,10 @@ Медленно Скорость и комиссия Завершить + Забыть Из Синхронизировать адреса + Начать зарабатывать К провайдеру Перейти в токен Понятно @@ -527,6 +529,7 @@ Выбранный токен не доступен в кошельке на данный момент. Но не переживайте, вы можете выразить свой интерес проголосовав за его добавление. Голосовать Кошелёк не поддерживает более одной сети + О монете Чтобы купить, обменять или получить данный токен, вам нужно добавить его к себе в портфель Этот актив в настоящее время не поддерживается в кошельке Этот токен не доступен для данного кошелька @@ -561,6 +564,7 @@ В тренде Стейкинг — простой способ получать доход с вашей криптовалюты. %s Получайте до %s APY + Токен добавлен О %s %d биржа @@ -838,6 +842,7 @@ до %d дней %s мин + Доступно от Вы получите Вы можете закрыть этот экран и проверить статус транзакции на экране информации о токене. До @@ -1214,6 +1219,7 @@ Вы получите Выберите токен не доступен + Комиссия Это мой кошелек Балансы скрыты Балансы показаны @@ -1590,7 +1596,7 @@ Минимальный депозит Политика комиссий Tangem взимает комиссию за обслуживание в размере 3% от полученного дохода. - Комиссия в сети сейчас слишком высокая. Ждём, пока она упадёт ниже вашего лимита. + Ваши средства будут автоматически переведены в Aave, как только комиссия сети снизится или баланс достигнет минимально необходимой суммы. Историческая доходность Необходимо разрешение для токена Проверьте ваше интернет соединение @@ -1603,10 +1609,10 @@ Aave — это децентрализованный протокол, управляющий активами на сумму более 81,9 миллиарда долларов США. Децентрализованный и некастодиальный Используя сервис, вы соглашаетесь с условиями провайдера %1$s и %2$s - Зарабатывайте %s%% в год - Aave • Ставка с плавающим процентом + Подключить Aave + Aave %1$s%%• Ставка с плавающим процентом Aave - Среднее %s + Сред. %s Доходность за прошлый год Текущая процентная ставка всегда переменная и автоматически рассчитывается смарт-контрактом AAVE в блокчейне на основе текущего спроса и предложения. При поддержке @@ -1618,16 +1624,16 @@ Следующие пополнения вашего счёта автоматически поступят в Aave. Активен На паузе - Закончить зарабатывать + Завершить заработок Выключив эту функцию, вы выведёте средства из Aave, получите их обратно в %s в кошельке и перестанете зарабатывать награды. Комиссия сети будет вычтена из суммы вашего вывода. Годовая доходность (APY) APY Пусть ваши деньги работают — зарабатывайте проценты на свой баланс. Проценты начисляются автоматически. - Доходность Aave + Доходность Отправка ваших средств - Зарабатывайте %1$s%% в год + Пусть ваш баланс работает на вас! Автоматически Внесите немного %1$s %2$s, чтобы покрыть комиссию сети за транзакции. Невозможно покрыть комиссию в %s diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 48aa70401e..fa0fd9a2ea 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -992,6 +992,10 @@ I realize that I can\'t use this card to recover my access code on the other cards of the current wallet Factory Reset will completely delete the wallet from the selected card or ring. You will not be able to restore the current wallet or use the card or ring to recover the access code. Factory Reset will completely delete the wallet from the selected card or ring and remove it from the app. You will not be able to restore the current wallet. + All Tangem devices have been reset. + Something went wrong with activation process. Please reset cards one by one. + Card verification failed + Please reset the next device to continue Ring owners get 3 commission-free swaps on Changelly until 15.11! Swap With 0% Fees Now! Log into the app and check your balance without scanning the card or ring @@ -1834,7 +1838,7 @@ Minimal top-up Fee policy Tangem also takes a 3% service fee on the yield earned. - Network fee is too high right now. Waiting until it falls below your limit. + Your funds will be automatically transferred to Aave once network fees are lower or your balance meets the minimum required amount. Historical returns Write description here. In one, two or three lines will be awesome. [PLACEHOLDER] Some token approve needed @@ -1863,16 +1867,16 @@ Your next top-ups will be automatically supplied to Aave. Active Paused - Stop earning + Disable yield mode Turning off will withdraw your funds from Aave, return them to %s in your wallet, and stop earning rewards. The network fee will be deducted from the amount you withdraw. Supply APY APY - Make your money work — earn interest on your balance. + Let your funds work in the background while you stay in control. Interest accrues automatically - Aave yield + Yield mode Processing your deposit - Earn %1$s%% per year + Make your balance work for you Automatic Deposit some %1$s %2$s to cover the network fee for transactions Unable to cover %s fee diff --git a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt index 36737e8d43..e86b0308e0 100644 --- a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt +++ b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyGetTokenStatusUseCase.kt @@ -13,6 +13,6 @@ class YieldSupplyGetTokenStatusUseCase( suspend operator fun invoke(token: CryptoCurrency.Token): Either = Either.catch { val tokens = yieldSupplyRepository.getCachedMarkets().orEmpty() val cachedStatus = tokens.firstOrNull { it.yieldSupplyKey == token.yieldSupplyKey() } - cachedStatus ?: error("YieldMarketToken not found") + cachedStatus ?: yieldSupplyRepository.getTokenStatus(token) } } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt index 814e1fbe1b..b124a9b02e 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt @@ -263,6 +263,8 @@ internal sealed class TokenDetailsNotification(val config: NotificationConfig) { id = R.string.yield_module_amount_not_transfered_to_aave_title, wrappedList(amount, tokenName), ), - subtitle = TextReference.EMPTY, + subtitle = resourceReference( + id = R.string.yield_module_high_fee_error, + ), ) } \ No newline at end of file diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt index 053cd01001..5d1d974638 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt @@ -8,6 +8,7 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer +import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.combinedReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference @@ -17,7 +18,7 @@ import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.network.TxInfo import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.yield.supply.YieldSupplyStatus -import com.tangem.domain.tokens.FetchCurrencyStatusUseCase +import com.tangem.domain.networks.single.SingleNetworkStatusFetcher import com.tangem.domain.tokens.GetSingleCryptoCurrencyStatusUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.domain.yield.supply.usecase.YieldSupplyActivateUseCase @@ -50,7 +51,7 @@ internal class YieldSupplyModel @Inject constructor( private val appRouter: AppRouter, private val getUserWalletUseCase: GetUserWalletUseCase, private val getSingleCryptoCurrencyStatusUseCase: GetSingleCryptoCurrencyStatusUseCase, - private val fetchCurrencyStatusUseCase: FetchCurrencyStatusUseCase, + private val singleNetworkStatusFetcher: SingleNetworkStatusFetcher, @DelayedWork private val coroutineScope: CoroutineScope, private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, private val yieldSupplyGetTokenStatusUseCase: YieldSupplyGetTokenStatusUseCase, @@ -95,7 +96,12 @@ internal class YieldSupplyModel @Inject constructor( } coroutineScope.launch(dispatchers.io) { delay(PROCESSING_UPDATE_DELAY) - fetchCurrencyStatusUseCase(userWalletId = userWallet.walletId, cryptoCurrency.id) + singleNetworkStatusFetcher( + params = SingleNetworkStatusFetcher.Params( + userWalletId = userWallet.walletId, + network = cryptoCurrency.network, + ), + ) } }.launchIn(modelScope) yieldSupplyProtocolListener.enterProtocolTriggerFlow.onEach { @@ -104,7 +110,12 @@ internal class YieldSupplyModel @Inject constructor( } coroutineScope.launch(dispatchers.io) { delay(PROCESSING_UPDATE_DELAY) - fetchCurrencyStatusUseCase(userWalletId = userWallet.walletId, cryptoCurrency.id) + singleNetworkStatusFetcher( + params = SingleNetworkStatusFetcher.Params( + userWalletId = userWallet.walletId, + network = cryptoCurrency.network, + ), + ) } }.launchIn(modelScope) } @@ -130,6 +141,7 @@ internal class YieldSupplyModel @Inject constructor( currencyId = cryptoCurrency.id, isSingleWalletWithTokens = false, ).onEach { maybeCryptoCurrency -> + Timber.tag("getSingleCryptoCurrencyStatusUseCase").d("update $maybeCryptoCurrency") maybeCryptoCurrency.fold( ifRight = { cryptoCurrencyStatus -> cryptoCurrencyStatusFlow.update { cryptoCurrencyStatus } @@ -211,7 +223,12 @@ internal class YieldSupplyModel @Inject constructor( hasActiveTransaction && yieldTransaction != null -> { coroutineScope.launch(dispatchers.io) { delay(PROCESSING_UPDATE_DELAY) - fetchCurrencyStatusUseCase(userWalletId = userWallet.walletId, cryptoCurrency.id) + singleNetworkStatusFetcher( + params = SingleNetworkStatusFetcher.Params( + userWalletId = userWallet.walletId, + network = cryptoCurrency.network, + ), + ) } uiState.update { when (yieldTransaction) { @@ -230,33 +247,10 @@ internal class YieldSupplyModel @Inject constructor( ), ) } - modelScope.launch(dispatchers.default) { - yieldSupplyGetTokenStatusUseCase(cryptoCurrencyToken) - .onRight { tokenStatus -> - uiState.update { - YieldSupplyUM.Content( - title = resourceReference( - R.string.yield_module_token_details_earn_notification_earning_on_your_balance_title, - ), - subtitle = resourceReference( - R.string.yield_module_token_details_earn_notification_earning_on_your_balance_subtitle, - ), - rewardsApy = combinedReference( - resourceReference( - R.string.yield_module_token_details_earn_notification_apy, - ), - stringReference(" ${tokenStatus.apy}%"), - ), - onClick = ::onActiveClick, - isAllowedToSpend = yieldSupplyStatus.isAllowedToSpend, - apy = tokenStatus.apy.toString(), - ) - } - }.onLeft { - Timber.e(it) - uiState.update { YieldSupplyUM.Loading } - } - } + loadActiveState( + cryptoCurrencyToken = cryptoCurrencyToken, + yieldSupplyStatus = yieldSupplyStatus, + ) } else -> { @@ -265,6 +259,49 @@ internal class YieldSupplyModel @Inject constructor( } } + private fun loadActiveState(cryptoCurrencyToken: CryptoCurrency.Token, yieldSupplyStatus: YieldSupplyStatus) { + modelScope.launch(dispatchers.default) { + yieldSupplyGetTokenStatusUseCase(cryptoCurrencyToken) + .onRight { tokenStatus -> + uiState.update { + YieldSupplyUM.Content( + title = resourceReference( + R.string.yield_module_token_details_earn_notification_earning_on_your_balance_title, + ), + subtitle = resourceReference( + R.string.yield_module_token_details_earn_notification_earning_on_your_balance_subtitle, + ), + rewardsApy = combinedReference( + resourceReference( + R.string.yield_module_token_details_earn_notification_apy, + ), + stringReference(" ${tokenStatus.apy}%"), + ), + onClick = ::onActiveClick, + isAllowedToSpend = yieldSupplyStatus.isAllowedToSpend, + apy = tokenStatus.apy.toString(), + ) + } + }.onLeft { + Timber.e(it) + uiState.update { + YieldSupplyUM.Content( + title = resourceReference( + R.string.yield_module_token_details_earn_notification_earning_on_your_balance_title, + ), + subtitle = resourceReference( + R.string.yield_module_token_details_earn_notification_earning_on_your_balance_subtitle, + ), + rewardsApy = TextReference.EMPTY, + onClick = ::onActiveClick, + isAllowedToSpend = yieldSupplyStatus.isAllowedToSpend, + apy = "", + ) + } + } + } + } + private fun sendInfoAboutProtocolStatus(cryptoCurrencyStatus: CryptoCurrencyStatus) { if (lastYieldSupplyStatus == cryptoCurrencyStatus.value.yieldSupplyStatus) return val token = cryptoCurrency as? CryptoCurrency.Token ?: return diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt index 1b9157aa2e..268470e09f 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/active/model/YieldSupplyActiveModel.kt @@ -209,7 +209,7 @@ internal class YieldSupplyActiveModel @Inject constructor( val isHighFee = if (currentFee != null && maxFee != null) currentFee > maxFee else false - val maxFiatFee = cryptoStatus.value.fiatRate?.multiply(maxFee) + val maxFiatFee = maxFee?.multiply(cryptoStatus.value.fiatRate) .format { fiat(appCurrency.code, appCurrency.symbol) } val feeDescription = if (isHighFee) { resourceReference(R.string.yield_module_earn_sheet_high_fee_description, wrappedList(maxFiatFee))