Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-17 16:23:25 +07:00
commit 8b576c6492
49 changed files with 238 additions and 148 deletions

View file

@ -302,7 +302,9 @@ class MainActivity : AppCompatActivity(), ActivityResultCallbackHolder {
}
private fun createAppThemeModeFlow(): SharedFlow<AppThemeMode> {
val tangemApplication = application as TangemApplication
val tangemApplication = requireNotNull(application as? TangemApplication) {
"Application is null"
}
return tangemApplication.getAppThemeModeUseCase()
.filterNotNull()

View file

@ -54,8 +54,8 @@ class PushNotificationDelegate(private val context: Context) {
.setContentIntent(pendingIntent)
.setVibrate(vibratePattern)
.apply {
imageUrl?.let { uri ->
val bitmap = getBitmapImageFromUrl(uri)
if (imageUrl != null) {
val bitmap = getBitmapImageFromUrl(imageUrl)
setStyle(
NotificationCompat
.BigPictureStyle()
@ -64,7 +64,10 @@ class PushNotificationDelegate(private val context: Context) {
}
}
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val service = context.getSystemService(Context.NOTIFICATION_SERVICE)
val notificationManager = requireNotNull(service as? NotificationManager) {
"NotificationManager not available"
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(

View file

@ -6,6 +6,7 @@ import com.tangem.tap.features.welcome.redux.WelcomeReducer
import com.tangem.tap.proxy.redux.DaggerGraphReducer
import org.rekotlin.Action
@Suppress("CanBeNonNullable")
fun appReducer(action: Action, state: AppState?): AppState {
requireNotNull(state)
if (action is AppAction.RestoreState) return action.state

View file

@ -18,6 +18,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import org.rekotlin.Middleware
@Suppress("MemberNameEqualsClassName")
internal object LegacyMiddleware {
private val prepareDetailsScreenJobHolder = JobHolder()

View file

@ -4,9 +4,9 @@ import android.content.Context
import android.os.Build
import android.os.Vibrator
import android.os.VibratorManager
import com.tangem.tap.common.haptic.DefaultVibratorHapticManager
import com.tangem.core.ui.haptic.TangemHapticEffect
import com.tangem.core.ui.haptic.VibratorHapticManager
import com.tangem.tap.common.haptic.DefaultVibratorHapticManager
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -22,10 +22,14 @@ class HapticModule {
@Singleton
fun provideHapticManager(@ApplicationContext context: Context): VibratorHapticManager {
val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val vibratorManager = context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
val service = context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE)
val vibratorManager = requireNotNull(service as? VibratorManager) {
"VibratorManager not available"
}
vibratorManager.defaultVibrator
} else {
context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val service = context.getSystemService(Context.VIBRATOR_SERVICE)
requireNotNull(service as? Vibrator) { "Vibrator service not available" }
}
return if (vibrator.hasVibrator()) {

View file

@ -30,7 +30,7 @@ class TapWalletManager(
// ensuring that only one job is active at any given time.
loadUserWalletDataJob = CoroutineScope(dispatchers.io)
.launch { loadUserWalletData(userWallet) }
.also { it.join() }
.apply { join() }
}
private suspend fun loadUserWalletData(userWallet: UserWallet) {

View file

@ -120,16 +120,14 @@ internal class LegacyScanProcessor @Inject constructor(
}
}
private fun sendAnalytics(analyticsEvent: AnalyticsEvent?, scanResponse: ScanResponse) {
analyticsEvent?.let { event ->
// this workaround needed to send CardWasScannedEvent without adding a context
val interceptor = CardContextInterceptor(scanResponse)
val params = event.params.toMutableMap()
interceptor.intercept(params)
event.params = params.toMap()
private fun sendAnalytics(analyticsEvent: AnalyticsEvent, scanResponse: ScanResponse) {
// this workaround needed to send CardWasScannedEvent without adding a context
val interceptor = CardContextInterceptor(scanResponse)
val params = analyticsEvent.params.toMutableMap()
interceptor.intercept(params)
analyticsEvent.params = params.toMap()
Analytics.send(event)
}
Analytics.send(analyticsEvent)
}
// TODO: [REDACTED_JIRA]

View file

@ -23,11 +23,7 @@ import com.tangem.domain.card.repository.CardSdkConfigRepository
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.visa.model.TangemPayInitialCredentials
import com.tangem.domain.visa.model.VisaActivationInput
import com.tangem.domain.visa.model.VisaDataForApprove
import com.tangem.domain.visa.model.VisaSignedDataByCustomerWallet
import com.tangem.domain.visa.model.sign
import com.tangem.domain.visa.model.*
import com.tangem.domain.wallets.derivations.derivationStyleProvider
import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles
import com.tangem.operations.ScanTask
@ -82,13 +78,12 @@ internal class DefaultTangemSdkManager(
secureStorage = tangemSdk.secureStorage,
)
}
override val needEnrollBiometrics: Boolean
get() = tangemSdk.authenticationManager.needEnrollBiometrics
override val canUseBiometry: Boolean
get() = tangemSdk.authenticationManager.canAuthenticate || needEnrollBiometrics
override val needEnrollBiometrics: Boolean
get() = tangemSdk.authenticationManager.needEnrollBiometrics
override val keystoreManager: KeystoreManager
get() = tangemSdk.keystoreManager

View file

@ -177,7 +177,7 @@ class VisaCardActivationTask @AssistedInject constructor(
.getOrElse { raise(it.tangemError) }
if (remoteState !is VisaActivationRemoteState.CardWalletSignatureRequired) {
return raise(VisaActivationError.WrongRemoteState.tangemError)
raise(VisaActivationError.WrongRemoteState.tangemError)
}
visaActivationRepository.getCardWalletAcceptanceData(

View file

@ -36,11 +36,6 @@ internal class BiometricUserWalletsListManager(
.mapLatest { it.userWallets }
.distinctUntilChanged()
override val savedWalletsCount: Flow<Int>
get() = state
.mapLatest { walletsCount }
.distinctUntilChanged()
override val userWalletsSync: List<UserWallet>
get() = state.value.userWallets
@ -71,6 +66,11 @@ internal class BiometricUserWalletsListManager(
override val walletsCount: Int
get() = state.value.userWallets.size
override val savedWalletsCount: Flow<Int>
get() = state
.mapLatest { walletsCount }
.distinctUntilChanged()
override suspend fun unlock(type: UnlockType): CompletionResult<UserWallet> {
return unlockAndSetSelectedUserWallet(type)
.mapFailure { error ->

View file

@ -20,11 +20,6 @@ internal class RuntimeUserWalletsListManager : UserWalletsListManager {
.mapLatest { listOfNotNull(it.userWallet) }
.distinctUntilChanged()
override val savedWalletsCount: Flow<Int>
get() = state
.mapLatest { walletsCount }
.distinctUntilChanged()
override val selectedUserWallet: Flow<UserWallet>
get() = state
.mapLatest { it.userWallet }
@ -46,6 +41,11 @@ internal class RuntimeUserWalletsListManager : UserWalletsListManager {
override val walletsCount: Int
get() = if (hasUserWallets) 1 else 0
override val savedWalletsCount: Flow<Int>
get() = state
.mapLatest { walletsCount }
.distinctUntilChanged()
override suspend fun select(userWalletId: UserWalletId): CompletionResult<UserWallet> = catching {
state.value.userWallet
?.takeIf { it.walletId == userWalletId }

View file

@ -34,6 +34,7 @@ import org.rekotlin.Action
import org.rekotlin.Middleware
import timber.log.Timber
@Suppress("MemberNameEqualsClassName")
class DetailsMiddleware {
private val appSettingsMiddleware = AppSettingsMiddleware()
val detailsMiddleware: Middleware<AppState> = { _, stateProvider ->

View file

@ -14,6 +14,7 @@ import com.tangem.tap.store
import kotlinx.coroutines.launch
import org.rekotlin.Middleware
@Suppress("MemberNameEqualsClassName")
class BackupMiddleware {
val backupMiddleware: Middleware<AppState> = { dispatch, state ->
{ next ->

View file

@ -33,12 +33,12 @@ class MoonPayService(
private val userWalletProvider: () -> UserWallet?,
) : SellService {
override val initializationStatus: StateFlow<SellServiceInitializationStatus>
get() = _initializationStatus
private val _initializationStatus: MutableStateFlow<SellServiceInitializationStatus> =
MutableStateFlow(value = lceLoading())
override val initializationStatus: StateFlow<SellServiceInitializationStatus>
get() = _initializationStatus
private var status: MoonPayStatus? = null
override suspend fun update() {

View file

@ -3,6 +3,7 @@ package com.tangem.tap.proxy.redux
import com.tangem.tap.common.redux.AppState
import org.rekotlin.Middleware
@Suppress("MemberNameEqualsClassName")
object DaggerGraphMiddleware {
val daggerGraphMiddleware: Middleware<AppState> = { _, _ ->
{ next ->

View file

@ -1191,9 +1191,9 @@
<string name="staking_details_account_fee">Gebühr für das Staking-Konto</string>
<string name="staking_details_account_fee_info">Ein Staking-Konto ist ein spezielles Konto, auf dem eingesetzte SOL-Token gespeichert werden. Es wird erstellt, indem Sie Ihre Token an einen Validator delegieren, um an der Transaktionsvalidierung teilzunehmen und Belohnungen zu erhalten. Für die Einrichtung des Staking-Kontos wird eine geringe Gebühr erhoben, die nach Abschluss des Stakings zurückerstattet wird.</string>
<string name="staking_details_annual_percentage_rate">Jährliche prozentuale Rendite</string>
<string name="staking_details_annual_percentage_rate_info">Die jährliche prozentuale Rendite, die du durch die Teilnahme am Staking erzielen kannst.</string>
<string name="staking_details_annual_percentage_rate_info">APR: Zeigt den Zinssatz, den Sie in einem Jahr ohne Zinseszins verdienen könnten. Die verdienten Zinsen werden nicht zu Ihrem Kontostand hinzugefügt, sodass Sie auf diese Zinsen keine zusätzlichen Zinsen erhalten.</string>
<string name="staking_details_annual_percentage_yield">Jährlicher prozentualer Ertrag</string>
<string name="staking_details_annual_percentage_yield_info">APY zeigt den jährlichen prozentualen Ertrag des Validators basierend auf seiner Leistung</string>
<string name="staking_details_annual_percentage_yield_info">APY: Zeigt die gesamten Zinsen, die Sie in einem Jahr mit Zinseszins verdienen könnten. Zinseszins bedeutet, dass die verdienten Zinsen Ihrem Kontostand hinzugefügt werden, sodass Sie auch auf diese Zinsen Zinsen erhalten.</string>
<string name="staking_details_apr">Effektiver Jahreszins</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_auto_claiming_rewards_daily_text">Belohnungen sammeln sich täglich automatisch in deinem Staking-Konto an.</string>
@ -1884,6 +1884,7 @@
<string name="yield_module_balance_info_sheet_title">Deine%s ist in Aave hinterlegt</string>
<string name="yield_module_chart_loading_error">Chart konnte nicht geladen werden...</string>
<string name="yield_module_deposit_error_notification_title">Das Bereitstellen von %1$s %2$s bei Aave steht aus.</string>
<string name="yield_module_disable_button">Deaktiviere den Yield-Modus</string>
<string name="yield_module_earn_badge">APY %1$s%%</string>
<string name="yield_module_earn_sheet_available_title">Verfügbar</string>
<string name="yield_module_earn_sheet_current_apy_title">Aktueller effektiver Jahreszins</string>
@ -1912,11 +1913,12 @@
<string name="yield_module_network_fee_unreachable_notification_description">Prüfe Deine Netzwerkverbindung</string>
<string name="yield_module_network_fee_unreachable_notification_title">Informationen zu den Netzwerkgebühren nicht erreichbar</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">Jede Einzahlung, die Du tätigst, wird automatisch an Aave weitergeleitet.</string>
<string name="yield_module_promo_screen_auto_balance_subtitle_v2">Alle %1$s auf Ihrem Konto werden automatisch an Aave bereitgestellt.</string>
<string name="yield_module_promo_screen_auto_balance_title">Automatische Übertragung zu Aave</string>
<string name="yield_module_promo_screen_cash_out_subtitle">Senden, tauschen oder verkaufen Deine Gelder sofort, wann immer Du willst.</string>
<string name="yield_module_promo_screen_cash_out_title">Jederzeit Zugriff auf Dein Geld</string>
<string name="yield_module_promo_screen_cash_out_title">Sofort verfügbar</string>
<string name="yield_module_promo_screen_how_it_works_button_title">Wie funktioniert das?</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave ist ein dezentrales Protokoll, das ein Gesamtvermögen von über 61 Milliarden Dollar verwaltet.</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave ist ein On-Chain-Protokoll zur Erstellung von nicht-kustodialen Liquiditätsmärkten, um Zinsen mit variablem Satz zu verdienen.</string>
<string name="yield_module_promo_screen_self_custodial_title">Dezentral und selbstverwahrend</string>
<string name="yield_module_promo_screen_terms_disclaimer">Durch die Nutzung dieses Dienstes erklärst Du Dich mit provider\n%1$s und %2$s einverstanden</string>
<string name="yield_module_promo_screen_title">Mit Aave verbinden</string>
@ -1932,11 +1934,12 @@
<string name="yield_module_start_earning_sheet_description">Dein %s wird an Aave übermittelt, bleibt aber verwaltbar.</string>
<string name="yield_module_start_earning_sheet_fee_policy">Siehe Gebührenrichtlinie</string>
<string name="yield_module_start_earning_sheet_next_deposits">Deine nächste Aufladung wird automatisch an Aave weitergeleitet.</string>
<string name="yield_module_start_earning_sheet_next_deposits_v2">Alle Ihre zukünftigen eingehenden %1$s-Einlagen werden automatisch an Aave bereitgestellt.</string>
<string name="yield_module_status_active">Aktiv</string>
<string name="yield_module_status_paused">Pausiert</string>
<string name="yield_module_stop_earning">Deaktiviere den Yield-Modus</string>
<string name="yield_module_stop_earning_sheet_description">Wenn Du diese Option deaktivierst, werden Deine Vermögenswerte von Aave abgezogen, in Deiner Wallet wieder in %s umgewandelt und die Zinsgutschrift gestoppt.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Die Netzwerkgebühr wird von dem Betrag, den Du abhebst, abgezogen.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Eine Netzwerkgebühr wird von der Blockchain erhoben, wenn Sie den Yield-Modus verlassen.</string>
<string name="yield_module_stop_earning_sheet_title">Deaktiviere den Yield-Modus</string>
<string name="yield_module_supply">Angebot</string>
<string name="yield_module_supply_apr">Effektiver Jahreszins für Versorgung</string>

View file

@ -985,8 +985,8 @@
<string name="staking_details_account_fee">Tarifa de staking de la cuenta </string>
<string name="staking_details_account_fee_info">Una cuenta de staking es una cuenta especial donde se almacenan los tokens SOL de staking. Se crea cuando delegas sus tokens a un validador para participar en la validación de transacciones y ganar recompensas. Se cobra una pequeña tarifa por crear la cuenta de staking, que se devuelve una vez que se completa el staking.</string>
<string name="staking_details_annual_percentage_rate">Porcentaje de rendimiento anual</string>
<string name="staking_details_annual_percentage_rate_info">El porcentaje de rendimiento anual que podrá ganar como participante en el staking.</string>
<string name="staking_details_annual_percentage_yield_info">APY muestra el porcentaje de rendimiento anual del validador en función de su rendimiento</string>
<string name="staking_details_annual_percentage_rate_info">APR: Muestra el interés que podrías ganar en un año sin capitalización. Los intereses ganados no se añaden a tu saldo, por lo que no ganas intereses adicionales sobre ellos.</string>
<string name="staking_details_annual_percentage_yield_info">APY: Muestra el total de intereses que podrías ganar en un año con capitalización. La capitalización significa que los intereses ganados se añaden a tu saldo, por lo que también ganas intereses sobre esos intereses.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_auto_claiming_rewards_daily_text">Las recompensas se acumulan automáticamente en su saldo de staking diariamente.</string>
@ -1076,6 +1076,7 @@
<string name="staking_reward_schedule_month">Mensual</string>
<string name="staking_reward_schedule_week">Semanal</string>
<string name="staking_rewards">Recompensas</string>
<string name="staking_solana_details_auto_claiming_rewards_daily_text">Las recompensas en Solana se agregan automáticamente a tu saldo de staking y no pueden mostrarse por separado.</string>
<string name="staking_stake_locked">El stake está bloqueado</string>
<string name="staking_stake_more">Hacer más staking</string>
<string name="staking_stake_more_button_unavailability_reason">Al hacer staking de %1$s, se realiza sobre todo su saldo de %2$s. Cualquier %2$s adicional que deposite en su billetera Tangem también se pondrá en staking automáticamente.</string>
@ -1499,6 +1500,7 @@
<string name="yield_module_balance_info_sheet_title">Su %s está depositado en Aave</string>
<string name="yield_module_chart_loading_error">No se puede cargar el gráfico...</string>
<string name="yield_module_deposit_error_notification_title">El suministro de %1$s %2$s a Aave está pendiente.</string>
<string name="yield_module_disable_button">Desactivar el modo de rendimiento</string>
<string name="yield_module_earn_badge">APY %1$s%%</string>
<string name="yield_module_earn_sheet_available_title">Disponible</string>
<string name="yield_module_earn_sheet_current_apy_title">APY actual</string>
@ -1527,11 +1529,12 @@
<string name="yield_module_network_fee_unreachable_notification_description">Compruebe su conexión de red</string>
<string name="yield_module_network_fee_unreachable_notification_title">Información de tarifas de red inaccesible</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">Cada depósito que realice se suministrará a Aave automáticamente.</string>
<string name="yield_module_promo_screen_auto_balance_subtitle_v2">Todos los %1$s en tu cuenta se suministrarán automáticamente a Aave.</string>
<string name="yield_module_promo_screen_auto_balance_title">Transferencia automática a Aave</string>
<string name="yield_module_promo_screen_cash_out_subtitle">Envíe, intercambie o venda sus fondos al instante, cuando quiera.</string>
<string name="yield_module_promo_screen_cash_out_title">Acceda a sus fondos en cualquier momento</string>
<string name="yield_module_promo_screen_cash_out_title">Acceso inmediato</string>
<string name="yield_module_promo_screen_how_it_works_button_title">¿Cómo funciona?</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave es un protocolo descentralizado que administra más de 61 billones de dólares en valor total.</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave es un protocolo on-chain para crear mercados de liquidez no custodiales y ganar intereses a tasa variable.</string>
<string name="yield_module_promo_screen_self_custodial_title">Descentralizado y autocustodiado</string>
<string name="yield_module_promo_screen_terms_disclaimer">Al utilizar este servicio, usted acepta que el proveedor\n%1$s y %2$s</string>
<string name="yield_module_promo_screen_title">Conectar Aave</string>
@ -1547,11 +1550,12 @@
<string name="yield_module_start_earning_sheet_description">Su %s se suministrará a Aave, pero seguirá siendo gestionable.</string>
<string name="yield_module_start_earning_sheet_fee_policy">Ver política de tarifas</string>
<string name="yield_module_start_earning_sheet_next_deposits">Sus próximas recargas se suministrarán automáticamente a Aave.</string>
<string name="yield_module_start_earning_sheet_next_deposits_v2">Todos tus futuros depósitos %1$s se suministrarán automáticamente a Aave.</string>
<string name="yield_module_status_active">Activo</string>
<string name="yield_module_status_paused">En pausa</string>
<string name="yield_module_stop_earning">Desactivación del modo de rendimiento</string>
<string name="yield_module_stop_earning_sheet_description">Al desactivar esto, retirará sus fondos de Aave a %s en su billetera y dejará de ganar recompensas.</string>
<string name="yield_module_stop_earning_sheet_fee_note">La comisión de red se deducirá del importe que retire.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Se cobra una comisión de red por la blockchain al salir del modo Yield.</string>
<string name="yield_module_stop_earning_sheet_title">Desactivar el modo de rendimiento</string>
<string name="yield_module_supply">Suministrar</string>
<string name="yield_module_supply_apr">Suministro APY</string>

View file

@ -959,7 +959,8 @@
<string name="staking_details_account_fee">Frais de staking du compte</string>
<string name="staking_details_account_fee_info">Un compte de staking est un compte spécial où sont stockés les jetons SOL stakés. Il est créé lorsque vous déléguez vos jetons à un validateur pour participer à la validation des transactions et gagner des récompenses. Des frais minimes sont facturés pour la création du compte de staking, qui sont restitués une fois le staking terminé.</string>
<string name="staking_details_annual_percentage_rate">Pourcentage de rendement annuel</string>
<string name="staking_details_annual_percentage_rate_info">Le pourcentage de rendement annuel que vous pouvez gagner en participant au staking.</string>
<string name="staking_details_annual_percentage_rate_info">APR : Montre le taux dintérêt que vous pourriez gagner en un an sans capitalisation. Les intérêts gagnés ne sont pas ajoutés à votre solde, donc vous ne gagnez pas dintérêts supplémentaires dessus.</string>
<string name="staking_details_annual_percentage_yield_info">APY : Montre le total des intérêts que vous pourriez gagner en un an avec capitalisation. La capitalisation signifie que les intérêts gagnés sont ajoutés à votre solde, et vous gagnez également des intérêts sur ces intérêts.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_auto_claiming_rewards_daily_text">Les récompenses s\'accumulent automatiquement sur votre solde de staking quotidiennement.</string>
@ -1049,6 +1050,7 @@
<string name="staking_reward_schedule_month">Mois</string>
<string name="staking_reward_schedule_week">Semaine</string>
<string name="staking_rewards">Récompenses</string>
<string name="staking_solana_details_auto_claiming_rewards_daily_text">Les récompenses sur Solana sont automatiquement ajoutées à votre solde de staking et ne peuvent pas être affichées séparément.</string>
<string name="staking_stake_locked">Stake verrouillé</string>
<string name="staking_stake_more">Staker plus</string>
<string name="staking_stake_more_button_unavailability_reason">Lorsque vous stakez %1$s, la totalité de votre solde %2$s est stakeée. Tout dépôt supplémentaire de %2$s sur votre portefeuille Tangem sera également staké automatiquement.</string>
@ -1477,6 +1479,7 @@
<string name="yield_module_balance_info_sheet_title">Vos %s sont déposés dans Aave.</string>
<string name="yield_module_chart_loading_error">Impossible de charger le graphique...</string>
<string name="yield_module_deposit_error_notification_title">Lapprovisionnement de %1$s %2$s sur Aave est en attente.</string>
<string name="yield_module_disable_button">Désactiver le mode rendement</string>
<string name="yield_module_earn_badge">APY %1$s%%</string>
<string name="yield_module_earn_sheet_available_title">Disponible</string>
<string name="yield_module_earn_sheet_current_apy_title">APY actuel</string>
@ -1505,11 +1508,12 @@
<string name="yield_module_network_fee_unreachable_notification_description">Vérifiez votre connexion réseau.</string>
<string name="yield_module_network_fee_unreachable_notification_title">Informations sur les frais de réseau inaccessibles</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">Chaque dépôt que vous effectuez sera automatiquement transféré à Aave.</string>
<string name="yield_module_promo_screen_auto_balance_subtitle_v2">Tous les %1$s de votre compte seront automatiquement fournis à Aave.</string>
<string name="yield_module_promo_screen_auto_balance_title">Transfert automatique vers Aave</string>
<string name="yield_module_promo_screen_cash_out_subtitle">Envoyez, échangez ou vendez vos fonds instantanément, quand vous le souhaitez.</string>
<string name="yield_module_promo_screen_cash_out_title">Accédez à vos fonds à tout moment</string>
<string name="yield_module_promo_screen_cash_out_title">Accès immédiat</string>
<string name="yield_module_promo_screen_how_it_works_button_title">Comment ça marche ?</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave est un protocole décentralisé qui gère plus de 61 milliards de dollars en valeur totale.</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave est un protocole on-chain permettant de créer des marchés de liquidité non dépositaire pour gagner des intérêts à taux variable.</string>
<string name="yield_module_promo_screen_self_custodial_title">Décentralisé et auto-détenu</string>
<string name="yield_module_promo_screen_terms_disclaimer">En utilisant ce service, vous acceptez les conditions générales du fournisseur %1$s et %2$s.</string>
<string name="yield_module_promo_screen_title">Connecter Aave</string>
@ -1525,11 +1529,12 @@
<string name="yield_module_start_earning_sheet_description">Vos %s seront fournis à Aave, mais resteront gérables.</string>
<string name="yield_module_start_earning_sheet_fee_policy">Voir la politique tarifaire</string>
<string name="yield_module_start_earning_sheet_next_deposits">Vos prochains dépôts seront automatiquement transférés vers Aave.</string>
<string name="yield_module_start_earning_sheet_next_deposits_v2">Tous vos futurs dépôts %1$s seront automatiquement fournis à Aave.</string>
<string name="yield_module_status_active">Actif</string>
<string name="yield_module_status_paused">En pause</string>
<string name="yield_module_stop_earning">Désactivation du mode de rendement</string>
<string name="yield_module_stop_earning_sheet_description">En désactivant cela, vos fonds seront retirés d\'Aave vers %s dans votre portefeuille et vous ne gagnerez plus de récompenses.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Les frais de réseau seront déduits du montant que vous retirez.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Des frais de réseau sont prélevés par la blockchain lorsque vous quittez le mode Yield.</string>
<string name="yield_module_stop_earning_sheet_title">Désactiver le mode rendement</string>
<string name="yield_module_supply_apr">Rendement annuel brut (APY)</string>
<string name="yield_module_token_details_earn_notification_apy">APY</string>

View file

@ -54,6 +54,8 @@
<string name="account_unsaved_dialog_message_create">新しいアカウントを破棄してもよろしいですか?</string>
<string name="account_unsaved_dialog_message_edit">編集内容を破棄してもよろしいですか?</string>
<string name="account_unsaved_dialog_title">保存されていない変更</string>
<string name="accounts_migration_alert_message">一部のカスタムトークンは、その派生がそのアカウントに属しているため、「 %1$s 」から「 %2$s 」に移動されました。</string>
<string name="accounts_migration_alert_title">一部のカスタムトークンが移動されました</string>
<string name="action_buttons_buy_empty_search_message">トークンが見つかりませんか?メインページのマーケットセクションに移動し、ポートフォリオに追加して買付できるようにします。</string>
<string name="action_buttons_sell_empty_search_message">トークンが見つかりませんか?メインページのマーケットセクションに移動し、ポートフォリオに追加して売却できるようにします。</string>
<string name="action_buttons_sell_navigation_bar_title">売却</string>
@ -1172,8 +1174,8 @@
<string name="staking_details_account_fee">ステーキングアカウント手数料</string>
<string name="staking_details_account_fee_info">ステーキングアカウントとは、ステーキングされたSOLが保管される特別なアカウントです。トークンをバリデーターに委任し、取引の検証に参加して報酬を受け取る際に作成されます。ステーキングアカウントの作成には少額の手数料がかかりますが、ステーキング完了後に返金されます。</string>
<string name="staking_details_annual_percentage_rate">年率</string>
<string name="staking_details_annual_percentage_rate_info">ステーキングに参加することで得られる年間収益率</string>
<string name="staking_details_annual_percentage_yield_info">APYは、バリデータのパフォーマンスに基づいた年間利回りを示します。</string>
<string name="staking_details_annual_percentage_rate_info">APR1年間で得られる利息を単利で表示します。得た利息は残高に加算されず、その利息にはさらに利息がつきません</string>
<string name="staking_details_annual_percentage_yield_info">APY1年間で得られる合計利息を複利込みで表示します。複利とは、得た利息が残高に加算され、その利息にもさらに利息がつくことを意味します。</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_auto_claiming_rewards_daily_text">報酬は毎日自動的にステーキング残高に蓄積されます。</string>
@ -1834,6 +1836,7 @@
<string name="yield_module_balance_info_sheet_title">あなたの%sはAaveに預けられています</string>
<string name="yield_module_chart_loading_error">チャートを読み込めません・・</string>
<string name="yield_module_deposit_error_notification_title">Aaveへの%1$s %2$sの供給は保留中です。</string>
<string name="yield_module_disable_button">利回りモードを無効にする</string>
<string name="yield_module_earn_badge">年利%1$s%%</string>
<string name="yield_module_earn_sheet_available_title">利用可能</string>
<string name="yield_module_earn_sheet_current_apy_title">現在のAPY</string>
@ -1862,9 +1865,10 @@
<string name="yield_module_network_fee_unreachable_notification_description">ネットワーク接続を確認してください</string>
<string name="yield_module_network_fee_unreachable_notification_title">ネットワーク手数料についての情報にアクセスできません</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">あなたが行うすべての入金は、自動的にAaveへ供給されます。</string>
<string name="yield_module_promo_screen_auto_balance_subtitle_v2">アカウントのすべての %1$s は自動的に Aave に供給されます。</string>
<string name="yield_module_promo_screen_auto_balance_title">Aaveへの自動送金</string>
<string name="yield_module_promo_screen_cash_out_subtitle">いつでも、即座に資金を送信、交換、売却できます。</string>
<string name="yield_module_promo_screen_cash_out_title">いつでも資金にアクセス可能</string>
<string name="yield_module_promo_screen_cash_out_title">すぐに利用可能</string>
<string name="yield_module_promo_screen_how_it_works_button_title">使い方</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aaveは、総額610億ドル以上の資産を管理する分散型プロトコルです。</string>
<string name="yield_module_promo_screen_self_custodial_title">分散型・自己管理型</string>
@ -1882,11 +1886,12 @@
<string name="yield_module_start_earning_sheet_description">%sはAaveに供給されますが、管理可能な状態のままになります。</string>
<string name="yield_module_start_earning_sheet_fee_policy">入金手数料ポリシーを見る</string>
<string name="yield_module_start_earning_sheet_next_deposits">次回の入金は自動的にAaveに供給されます。</string>
<string name="yield_module_start_earning_sheet_next_deposits_v2">今後のすべての %1$s 入金は自動的に Aave に供給されます。</string>
<string name="yield_module_status_active">アクティブ</string>
<string name="yield_module_status_paused">停止中</string>
<string name="yield_module_stop_earning">利回りモードを解除中</string>
<string name="yield_module_stop_earning_sheet_description">これをオフにすると、Aaveから資産が引き出され、ウォレット内の%sに変換され、利回りの発生が停止します。</string>
<string name="yield_module_stop_earning_sheet_fee_note">出金金額からネットワーク手数料が差し引かれます。</string>
<string name="yield_module_stop_earning_sheet_fee_note">ネットワーク手数料とは、ブロックチェーン上で取引を処理して承認するためにユーザーが支払う料金のことです。</string>
<string name="yield_module_stop_earning_sheet_title">利回りモードを無効にする</string>
<string name="yield_module_supply">供給</string>
<string name="yield_module_supply_apr">供給APY</string>

View file

@ -179,6 +179,7 @@
<item quantity="other">дней</item>
</plurals>
<string name="common_delete">Удалить</string>
<string name="common_disable">Отключить</string>
<string name="common_disabled">Отключено</string>
<string name="common_disconnect">Отключить</string>
<string name="common_done">Готово</string>
@ -1068,7 +1069,8 @@
<string name="staking_details_account_fee">Комиссия за стейкинг аккаунт</string>
<string name="staking_details_account_fee_info">Стейкинг аккаунт — это специальный счет, на котором хранятся застейканные токены SOL. Он создается при делегировании ваших токенов валидатору для участия в подтверждении транзакций и получении наград. За создание стейкинг аккаунта взимается небольшая комиссия, которая возвращается после завершения стейкинга.</string>
<string name="staking_details_annual_percentage_rate">Процентная ставка</string>
<string name="staking_details_annual_percentage_rate_info">Годовой процентный доход, который вы можете получить от участия в стейкинге.</string>
<string name="staking_details_annual_percentage_rate_info">APR: Показывает процент, который вы можете заработать за год без учёта сложного процента. Начисленные проценты не добавляются к балансу, поэтому на них не начисляются дополнительные проценты.</string>
<string name="staking_details_annual_percentage_yield_info">APY: Показывает общий процент, который вы можете заработать за год с учётом сложного процента. Сложный процент означает, что начисленные проценты добавляются к вашему балансу, и на них тоже начисляются проценты.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_auto_claiming_rewards_daily_text">Награда автоматически аккумулируется на вашем стейкинг балансе.</string>
@ -1596,14 +1598,15 @@
<string name="yield_module_balance_info_sheet_subtitle">Ваши средства в данный момент размещены в протоколе Aave, но вы можете воспользоваться ими в любое время.</string>
<string name="yield_module_balance_info_sheet_title">Ваш %s внесён в Aave</string>
<string name="yield_module_chart_loading_error">Невозможно загрузить график</string>
<string name="yield_module_deposit_error_notification_title">Отправка %1$s %2$s на Aave ожидает выполнения.</string>
<string name="yield_module_deposit_error_notification_title">Отправка %1$s %2$s в Aave.</string>
<string name="yield_module_disable_button">Завершить режим доходности</string>
<string name="yield_module_earn_badge">APY %1$s%%</string>
<string name="yield_module_earn_sheet_available_title">Доступно</string>
<string name="yield_module_earn_sheet_current_apy_title">Текущий APY</string>
<string name="yield_module_earn_sheet_fee_description">При пополнении в режиме доходности с баланса будет удержана комиссия сети, не превышающая %1$s.</string>
<string name="yield_module_earn_sheet_high_fee_description">Сейчас комиссия сети слишком высока для выполнения операции. Средства будут отправлены, как только она снизится до %1$s или ниже.</string>
<string name="yield_module_earn_sheet_my_funds_title">Мои средства</string>
<string name="yield_module_earn_sheet_provider_description">Ваши %1$s теперь внесён в Aave и приносит проценты. У вас есть токен %2$s, который отражает ваш баланс и со временем увеличивается. При пополнении средства автоматически направляются в Aave для получения процентов за вычетом комиссии за транзакцию.</string>
<string name="yield_module_earn_sheet_provider_description">Ваши %1$s теперь внесены в Aave и приносят проценты. У вас есть токен %2$s, который отражает ваш баланс и со временем увеличивается. При пополнении средства автоматически направляются в Aave для получения процентов за вычетом комиссии за транзакцию.</string>
<string name="yield_module_earn_sheet_title">Режим доходности</string>
<string name="yield_module_earn_sheet_total_earnings_title">Итоговый доход</string>
<string name="yield_module_earn_sheet_transfers_title">Переводы в Aave</string>
@ -1620,18 +1623,19 @@
<string name="yield_module_fee_policy_tangem_service_fee_title">Tangem взимает комиссию за обслуживание в размере 15% от полученного дохода.</string>
<string name="yield_module_high_fee_error">Ваши средства будут автоматически переведены в Aave, как только комиссия сети снизится или баланс достигнет минимально необходимой суммы.</string>
<string name="yield_module_historical_returns">Историческая доходность</string>
<string name="yield_module_main_view_approve_notification_description">Разрешение для вашего токена в Yield сервисе было отозвано. Откройте токен, чтобы выдать разрешение снова.</string>
<string name="yield_module_main_view_approve_notification_description">Разрешение для вашего токена в режиме доходности было отозвано. Откройте токен, чтобы выдать разрешение снова.</string>
<string name="yield_module_main_view_approve_notification_title">Необходимо разрешение для токена</string>
<string name="yield_module_network_fee_unreachable_notification_description">Проверьте ваше интернет соединение</string>
<string name="yield_module_network_fee_unreachable_notification_title">Информация о комиссии недоступна</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">Каждое пополнение вашего адреса автоматически будет отправляться в Aave.</string>
<string name="yield_module_promo_screen_auto_balance_subtitle_v2">Все %1$s на вашем аккаунте будут автоматически переданы в Aave.</string>
<string name="yield_module_promo_screen_auto_balance_title">Автоперевод в AAVE</string>
<string name="yield_module_promo_screen_cash_out_subtitle">Отправляйте, обменивайте или продавайте свои средства мгновенно, когда захотите.</string>
<string name="yield_module_promo_screen_cash_out_title">Мгновенный вывод средств</string>
<string name="yield_module_promo_screen_cash_out_title">Свободный доступ</string>
<string name="yield_module_promo_screen_how_it_works_button_title">Как это работает?</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave — децентрализованный протокол, управляющий активами на сумму более $61 млрд.</string>
<string name="yield_module_promo_screen_self_custodial_title">Децентрализованный и некастодиальный</string>
<string name="yield_module_promo_screen_terms_disclaimer">Используя сервис, вы соглашаетесь с условиями провайдера %1$s и %2$s</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave — ончейн-протокол для некостодиальных рынков ликвидности, позволяющий получать доход с переменной ставкой.</string>
<string name="yield_module_promo_screen_self_custodial_title">Децентрализованный и некостодиальный</string>
<string name="yield_module_promo_screen_terms_disclaimer">Используя сервис, вы соглашаетесь с %1$s и %2$s</string>
<string name="yield_module_promo_screen_title">Подключить Aave</string>
<string name="yield_module_promo_screen_variable_rate_info">Aave %1$s%% • Плавающая ставка</string>
<string name="yield_module_provider">Aave</string>
@ -1642,14 +1646,15 @@
<string name="yield_module_rate_info_sheet_title">Ставка может меняться</string>
<string name="yield_module_receive_sheet_description">При пополнении ваши средства автоматически отправляются в Aave для начала начисления процентов. Для покрытия комиссии с вас будет удержана небольшая плата в размере %s.</string>
<string name="yield_module_start_earning">Начать зарабатывать</string>
<string name="yield_module_start_earning_sheet_description">Ваш %s будет передан в Aave и останется всегда доступным.</string>
<string name="yield_module_start_earning_sheet_description">Ваши %s будет переданы в Aave и останутся всегда доступными.</string>
<string name="yield_module_start_earning_sheet_fee_policy">Политика комиссий</string>
<string name="yield_module_start_earning_sheet_next_deposits">Следующие пополнения вашего счёта автоматически поступят в Aave.</string>
<string name="yield_module_start_earning_sheet_next_deposits_v2">Все ваши будущие поступления %1$s будут автоматически направляться в Aave.</string>
<string name="yield_module_status_active">Активен</string>
<string name="yield_module_status_paused">На паузе</string>
<string name="yield_module_stop_earning">Завершение режима доходности</string>
<string name="yield_module_stop_earning_sheet_description">Выключив эту функцию, вы выведёте средства из Aave, получите их обратно в %s в своем кошельке и перестанете зарабатывать награды.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Комиссия сети будет вычтена из суммы вашего вывода.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Комиссия сети взимается блокчейном при выходе из режима доходности.</string>
<string name="yield_module_stop_earning_sheet_title">Завершить режим доходности</string>
<string name="yield_module_supply">Внесение</string>
<string name="yield_module_supply_apr">Годовая доходность (APY)</string>
@ -1657,12 +1662,12 @@
<string name="yield_module_token_details_earn_notification_description">Проценты начисляются автоматически.</string>
<string name="yield_module_token_details_earn_notification_earning_on_your_balance_subtitle">Проценты начисляются автоматически.</string>
<string name="yield_module_token_details_earn_notification_earning_on_your_balance_title">Режим доходности</string>
<string name="yield_module_token_details_earn_notification_processing">Отправка ваших средств</string>
<string name="yield_module_token_details_earn_notification_processing">Включение режима доходности</string>
<string name="yield_module_token_details_earn_notification_title">Режим доходности</string>
<string name="yield_module_transfer_mode_automatic">Автоматически</string>
<string name="yield_module_unable_to_cover_fee_description">Внесите немного %1$s %2$s, чтобы покрыть комиссию сети за транзакции.</string>
<string name="yield_module_unable_to_cover_fee_title">Невозможно покрыть комиссию в %s</string>
<string name="yield_module_unavailable_subtitle">Сервис доходности в данный момент недоступен. Пожалуйста, попробуйте позже.</string>
<string name="yield_module_unavailable_subtitle">Режим доходности в данный момент недоступен. Пожалуйста, попробуйте позже.</string>
<string name="yield_module_unavailable_title">Режим доходности недоступен</string>
<string name="yield_supply_chart_loading_error">Невозможно загрузить график</string>
</resources>

View file

@ -964,7 +964,8 @@
<string name="staking_details_account_fee">Комісія за стейкінг-акаунт</string>
<string name="staking_details_account_fee_info">Стейкінг-акаунт — це спеціальний рахунок, на якому зберігаються застейкані SOL токени. Він створюється, коли ви делегуєте свої токени валідатору для участі у перевірці транзакцій та отримання винагород. За створення стейкінг-акаунту стягується невелика комісія, яка повертається після завершення стейкінгу.</string>
<string name="staking_details_annual_percentage_rate">Процентна ставка</string>
<string name="staking_details_annual_percentage_rate_info">Річний відсоток, який ви можете отримати, беручи участь у стейкінгу.</string>
<string name="staking_details_annual_percentage_rate_info">APR: Показує відсоток, який ви можете заробити за рік без урахування складного відсотка. Нараховані відсотки не додаються до вашого балансу, тому на них не нараховуються додаткові відсотки.</string>
<string name="staking_details_annual_percentage_yield_info">APY: Показує загальний відсоток, який ви можете заробити за рік з урахуванням складного відсотка. Складний відсоток означає, що нараховані відсотки додаються до вашого балансу, і на них також нараховуються відсотки.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_auto_claiming_rewards_daily_text">Винагороди автоматично накопичуються на вашому балансі щодня.</string>
@ -1054,6 +1055,7 @@
<string name="staking_reward_schedule_month">Місяць</string>
<string name="staking_reward_schedule_week">Потижнево</string>
<string name="staking_rewards">Винагороди</string>
<string name="staking_solana_details_auto_claiming_rewards_daily_text">Нагороди на Solana автоматично додаються до вашого стейкінг-балансу і не можуть відображатися окремо.</string>
<string name="staking_stake_locked">Стейкінг закрито</string>
<string name="staking_stake_more">Застейкати більше</string>
<string name="staking_stake_more_button_unavailability_reason">При стейкінгу %1$s, весь ваш %2$s Баланс застейкний. Будь-які додаткові %2$s поповнены на Ваш гаманець Tangem буде також автоматично застейкано.</string>
@ -1453,13 +1455,14 @@
<string name="yield_module_balance_info_sheet_title">Ваш %s внесений у Aave</string>
<string name="yield_module_chart_loading_error">Неможливо завантажити графік</string>
<string name="yield_module_deposit_error_notification_title">Поповнення %1$s %2$s на Aave очікує виконання.</string>
<string name="yield_module_disable_button">Завершити заробіток</string>
<string name="yield_module_earn_badge">APY %1$s%%</string>
<string name="yield_module_earn_sheet_available_title">Доступно</string>
<string name="yield_module_earn_sheet_current_apy_title">Поточний APY</string>
<string name="yield_module_earn_sheet_fee_description">При поповненні для кредитування з балансу буде вирахувано комісію мережі, що не перевищує %1$s.</string>
<string name="yield_module_earn_sheet_high_fee_description">Наразі мережева комісія є занадто високою, щоб здійснювати кредитування. Кошти будуть надані, як тільки вона знизиться до %1$s або нижче.</string>
<string name="yield_module_earn_sheet_my_funds_title">Мої кошти</string>
<string name="yield_module_earn_sheet_provider_description">Ваші %1$s тепер розміщено в Aave і приносить дохід. У вас є токен %2$s, який представляє ваш баланс і з часом збільшується. При поповненні кошти автоматично направляються в Aave для отримання процентів з вирахуванням комісії за транзакцію.</string>
<string name="yield_module_earn_sheet_provider_description">Ваші %1$s тепер розміщені в Aave і приносять дохід. У вас є токен %2$s, який представляє ваш баланс і з часом збільшується. При поповненні кошти автоматично направляються в Aave для отримання процентів з вирахуванням комісії за транзакцію.</string>
<string name="yield_module_earn_sheet_title">Режим дохідності</string>
<string name="yield_module_earn_sheet_total_earnings_title">Підсумковий дохід</string>
<string name="yield_module_earn_sheet_transfers_title">Перекази в Aave</string>
@ -1481,11 +1484,12 @@
<string name="yield_module_network_fee_unreachable_notification_description">Перевірте підключення до мережі</string>
<string name="yield_module_network_fee_unreachable_notification_title">Інформація про комісію недоступна</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">Кожен ваш депозит буде автоматично надходити до Aave.</string>
<string name="yield_module_promo_screen_auto_balance_subtitle_v2">Всі %1$s на вашому рахунку будуть автоматично передані в Aave.</string>
<string name="yield_module_promo_screen_auto_balance_title">Автопереказ до AAVE</string>
<string name="yield_module_promo_screen_cash_out_subtitle">Відправляйте, обмінюйте або продавайте свої кошти миттєво, в будь-який час.</string>
<string name="yield_module_promo_screen_cash_out_title">Миттєвий вивід коштів</string>
<string name="yield_module_promo_screen_cash_out_title">Вільний доступ</string>
<string name="yield_module_promo_screen_how_it_works_button_title">Як це працює?</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave — децентралізований протокол, що керує активами на понад $61 млрд.</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave — це ончейн-протокол для створення некостодіальних ринків ліквідності, що дозволяє отримувати дохід з змінною ставкою.</string>
<string name="yield_module_promo_screen_self_custodial_title">Децентралізований та некастодіальний</string>
<string name="yield_module_promo_screen_terms_disclaimer">Використовуючи сервіс, ви погоджуєтесь з умовами провайдера %1$s та %2$s</string>
<string name="yield_module_promo_screen_title">Підключити Aave</string>
@ -1501,11 +1505,12 @@
<string name="yield_module_start_earning_sheet_description">Ваш %s буде передано до Aave, і залишиться завжди доступним.</string>
<string name="yield_module_start_earning_sheet_fee_policy">Політика комісій</string>
<string name="yield_module_start_earning_sheet_next_deposits">Ваші наступні поповнення рахунку автоматично надходитимуть до Aave.</string>
<string name="yield_module_start_earning_sheet_next_deposits_v2">Всі ваші майбутні надходження %1$s будуть автоматично спрямовані в Aave.</string>
<string name="yield_module_status_active">Активний</string>
<string name="yield_module_status_paused">На паузі</string>
<string name="yield_module_stop_earning">Вимкнення режиму прибутковості</string>
<string name="yield_module_stop_earning_sheet_description">Вимкнення цієї опції виведе ваші активи з Aave, отримаєте їх назад у %s у вашому гаманці і зупинить накопичення нагород.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Комісія мережі буде вирахувана з суми, яку ви знімаєте.</string>
<string name="yield_module_stop_earning_sheet_fee_note">Комісію мережі стягує блокчейн при виході з режиму доходності.</string>
<string name="yield_module_stop_earning_sheet_title">Завершити заробіток</string>
<string name="yield_module_supply_apr">Річна прибутковість (APY)</string>
<string name="yield_module_token_details_earn_notification_apy">APY</string>

View file

@ -1196,9 +1196,9 @@
<string name="staking_details_account_fee">Stake account fee</string>
<string name="staking_details_account_fee_info">A staking account is a special account where staked SOL tokens are stored. It is created when you delegate your tokens to a validator to participate in transaction validation and receive rewards. A small fee is charged for creating the staking account, which is returned after the staking is completed.</string>
<string name="staking_details_annual_percentage_rate">Annual percentage rate</string>
<string name="staking_details_annual_percentage_rate_info">The annual percentage return you can earn from participating in staking.</string>
<string name="staking_details_annual_percentage_rate_info">APR: Shows the interest rate you could earn in a year without compounding. Your earned interest is not added to your balance, so your earnings dont grow on themselves.</string>
<string name="staking_details_annual_percentage_yield">Annual percentage yield</string>
<string name="staking_details_annual_percentage_yield_info">APY shows the validators annual percentage yield based on its performance</string>
<string name="staking_details_annual_percentage_yield_info">APY: Shows the total interest you could earn in a year with compounding. Compounding means your earned interest is added to your balance, so you also earn interest on that interest.</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_auto_claiming_rewards_daily_text">Rewards automatically accumulate in your staking balance daily.</string>
@ -1897,85 +1897,88 @@
<string name="xtz_withdrawal_message_ignore">No, send all</string>
<string name="xtz_withdrawal_message_reduce">Reduce by %s XTZ</string>
<string name="xtz_withdrawal_message_warning">To avoid paying an increased commission the next time you top up your wallet, reduce the amount by %s XTZ</string>
<string name="yield_module_alert_description">With Yield mode active, all future deposits to this address will go to Aave. You can still manage your funds freely.</string>
<string name="yield_module_alert_description">When Yield Mode is active, all future top-ups to this address will be supplied to Aave. You can still manage your funds freely.</string>
<string name="yield_module_alert_title">Your %s is supplied to Aave</string>
<string name="yield_module_amount_not_transfered_to_aave_title">Supplying %1$s %2$s to Aave is pending</string>
<string name="yield_module_approve_needed_notification_cta">Approve</string>
<string name="yield_module_approve_needed_notification_description">Your tokens approval has been revoked. Grant it again to resume service functionality.</string>
<string name="yield_module_approve_needed_notification_description">Your token\'s approval has been revoked. Grant it again to resume the service\'s functionality.</string>
<string name="yield_module_approve_needed_notification_title">Approve needed</string>
<string name="yield_module_approve_sheet_fee_note">The fee will be taken out, and your assets will be lent again.</string>
<string name="yield_module_approve_sheet_subtitle">To continue earning, approval is required.</string>
<string name="yield_module_approve_sheet_fee_note">The fee will be deducted, and your assets will be resupplied.</string>
<string name="yield_module_approve_sheet_subtitle">To continue generating yield, approval is required.</string>
<string name="yield_module_approve_sheet_title">Confirm approval</string>
<string name="yield_module_balance_info_sheet_subtitle">Your funds are currently supplied to the Aave protocol, but you can manage them at any time.</string>
<string name="yield_module_balance_info_sheet_title">Your %s is deposited in Aave</string>
<string name="yield_module_balance_info_sheet_title">Your %s is supplied to Aave</string>
<string name="yield_module_chart_loading_error">Unable to load chart...</string>
<string name="yield_module_deposit_error_notification_title">Supplying %1$s %2$s to Aave is pending.</string>
<string name="yield_module_deposit_error_notification_title">Supplying %1$s %2$s to Aave.</string>
<string name="yield_module_disable_button">Disable Yield Mode</string>
<string name="yield_module_earn_badge">APY %1$s%%</string>
<string name="yield_module_earn_sheet_available_title">Available</string>
<string name="yield_module_earn_sheet_current_apy_title">Current APY</string>
<string name="yield_module_earn_sheet_fee_description">When topping up for lending, a network fee not exceeding %1$s will be deducted from the balance.</string>
<string name="yield_module_earn_sheet_high_fee_description">The network fee is currently too high to execute lending. Funds will be supplied once it drops to %1$s or below.</string>
<string name="yield_module_earn_sheet_my_funds_title">My funds</string>
<string name="yield_module_earn_sheet_provider_description">Your %1$s is now deployed to Aave and earning yield. You hold %2$s tokens, which represent your balance and accrue yield automatically. When you top up, funds are added to Aave to earn more yield, minus fees.</string>
<string name="yield_module_earn_sheet_title">Yield mode</string>
<string name="yield_module_earn_sheet_total_earnings_title">Total earnings</string>
<string name="yield_module_earn_sheet_provider_description">Your %1$s is now deployed to Aave and generating yield. You hold %2$s tokens, representing your balance and accruing yield automatically. When you top up, the funds are supplied to Aave to generate more yield, after fees are deducted.</string>
<string name="yield_module_earn_sheet_title">Yield Mode</string>
<string name="yield_module_earn_sheet_total_earnings_title">Total yield</string>
<string name="yield_module_earn_sheet_transfers_title">Transfers to Aave</string>
<string name="yield_module_explore_sheet_explore_aave_button_title">Explore Aave</string>
<string name="yield_module_fee_policy_sheet_current_fee_note">This is the current supply fee on %s. The actual cost will be shown on the activation tab.</string>
<string name="yield_module_fee_policy_sheet_current_fee_title">Current fee</string>
<string name="yield_module_fee_policy_sheet_description">All future %s deposits will be supplied to Aave automatically, with the transaction fee deducted.</string>
<string name="yield_module_fee_policy_sheet_fee_note">An approximate network fee of %1$s (%2$s) will be deducted from each future top-up, and it wont exceed your %3$s (%4$s) limit.</string>
<string name="yield_module_fee_policy_sheet_max_fee_note">If network fees rise above maximum fee, the transaction wont go through until they decrease. You can change this limit later.</string>
<string name="yield_module_fee_policy_sheet_description">All future %s top-ups will be supplied to Aave automatically, after the transaction fee is deducted.</string>
<string name="yield_module_fee_policy_sheet_fee_note">An approximate network fee of %1$s (%2$s) will be deducted from each future top-up, and it won\'t exceed your %3$s (%4$s) limit.</string>
<string name="yield_module_fee_policy_sheet_max_fee_note">If network fees rise above the maximum fee, the transaction won\'t go through until they decrease. You can change this limit later.</string>
<string name="yield_module_fee_policy_sheet_max_fee_title">Maximum fee</string>
<string name="yield_module_fee_policy_sheet_min_amount_note">The minimum amount is calculated based on the current network fee so that it does not exceed 4%% of the top-up amount, which makes the minimum %1$s (%2$s).</string>
<string name="yield_module_fee_policy_sheet_min_amount_note">The minimum amount is calculated based on the current network fee, ensuring it doesn\'t exceed 4%% of the top-up amount, which equals the minimum %1$s (%2$s).</string>
<string name="yield_module_fee_policy_sheet_min_amount_title">Minimum top-up</string>
<string name="yield_module_fee_policy_sheet_title">Top-up fee policy</string>
<string name="yield_module_fee_policy_tangem_service_fee_title">Tangem also takes a 15% service fee on yield earned.</string>
<string name="yield_module_fee_policy_tangem_service_fee_title">Tangem also takes a 15% service fee on yield generated.</string>
<string name="yield_module_high_fee_error">Your funds will be automatically supplied to Aave once network fees are lower or your balance meets the minimum required amount.</string>
<string name="yield_module_historical_returns">Historical returns</string>
<string name="yield_module_main_view_approve_notification_description">Approval for your token in the Yield mode has been revoked. Open the token to grant permission again.</string>
<string name="yield_module_main_view_approve_notification_description">Approval for your token in Yield Mode has been revoked. Open the token to grant permission again.</string>
<string name="yield_module_main_view_approve_notification_title">Token approval needed</string>
<string name="yield_module_network_fee_unreachable_notification_description">Check your network connection</string>
<string name="yield_module_network_fee_unreachable_notification_title">Network fee info unreachable</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">Every deposit you make will be supplied to Aave automatically.</string>
<string name="yield_module_promo_screen_auto_balance_title">Auto-Transfer to Aave</string>
<string name="yield_module_promo_screen_auto_balance_subtitle">Every top-up will be supplied to Aave automatically.</string>
<string name="yield_module_promo_screen_auto_balance_subtitle_v2">All %1$s on your account will be supplied to Aave automatically.</string>
<string name="yield_module_promo_screen_auto_balance_title">Auto-supply to Aave</string>
<string name="yield_module_promo_screen_cash_out_subtitle">Send, swap, or sell your funds instantly, anytime you want.</string>
<string name="yield_module_promo_screen_cash_out_title">Access your funds anytime</string>
<string name="yield_module_promo_screen_cash_out_title">No lock-ups</string>
<string name="yield_module_promo_screen_how_it_works_button_title">How it works?</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave is a decentralized protocol managing over $61 billion in total value.</string>
<string name="yield_module_promo_screen_self_custodial_subtitle">Aave is an on-chain protocol that offers non-custodial liquidity markets, enabling users to accrue yield at variable rates.</string>
<string name="yield_module_promo_screen_self_custodial_title">Decentralized and self-custodial</string>
<string name="yield_module_promo_screen_terms_disclaimer">By using this service, you agree with provider\n%1$s and %2$s</string>
<string name="yield_module_promo_screen_title">Connect Aave</string>
<string name="yield_module_promo_screen_title">Connect to Aave</string>
<string name="yield_module_promo_screen_variable_rate_info">Aave %1$s%% • Variable Interest Rate</string>
<string name="yield_module_provider">Aave</string>
<string name="yield_module_rate_info_sheet_chart_average">Avg %s</string>
<string name="yield_module_rate_info_sheet_chart_title">Last year\'s returns</string>
<string name="yield_module_rate_info_sheet_description">Current interest rate is always variable and automatically computed by the Aave on-chain smart-contract, based on real-time supply and demand.</string>
<string name="yield_module_rate_info_sheet_description">The current interest rate is always variable and automatically computed by Aave\'s on-chain smart contract, based on real-time supply and demand.</string>
<string name="yield_module_rate_info_sheet_powered_by">Powered by</string>
<string name="yield_module_rate_info_sheet_title">Interest rate is variable</string>
<string name="yield_module_receive_sheet_description">When you top up, your funds will be automatically sent to Aave to start earning interest. %s will be deducted to cover the transaction fee.</string>
<string name="yield_module_receive_sheet_description">When you top up, your funds will be automatically supplied to Aave to start generating yield. %s will be deducted to cover the transaction fee.</string>
<string name="yield_module_start_earning">Supply assets</string>
<string name="yield_module_start_earning_sheet_description">Your %s will be supplied to Aave, but will remain manageable.</string>
<string name="yield_module_start_earning_sheet_description">Your %s will be supplied to Aave with no lock-ups and will remain fully accessible.</string>
<string name="yield_module_start_earning_sheet_fee_policy">See top-up fee policy</string>
<string name="yield_module_start_earning_sheet_next_deposits">Your next top-ups will be automatically supplied to Aave.</string>
<string name="yield_module_start_earning_sheet_next_deposits_v2">All your future incoming %1$s deposits will be automatically supplied to Aave.</string>
<string name="yield_module_status_active">Active</string>
<string name="yield_module_status_paused">Paused</string>
<string name="yield_module_stop_earning">Disabling Yield Mode</string>
<string name="yield_module_stop_earning_sheet_description">Turning this off will withdraw your assets from Aave, convert them back to %s in your wallet, and stop yield accrual.</string>
<string name="yield_module_stop_earning_sheet_fee_note">The network fee will be deducted from the amount you withdraw.</string>
<string name="yield_module_stop_earning_sheet_title">Disable yield mode</string>
<string name="yield_module_stop_earning_sheet_fee_note">A network fee is charged by the blockchain when you exit Yield Mode.</string>
<string name="yield_module_stop_earning_sheet_title">Disable Yield Mode</string>
<string name="yield_module_supply">Supply</string>
<string name="yield_module_supply_apr">Supply APY</string>
<string name="yield_module_token_details_earn_notification_apy">APY</string>
<string name="yield_module_token_details_earn_notification_description">Interest accrues automatically.</string>
<string name="yield_module_token_details_earn_notification_description">Interest accrues automatically</string>
<string name="yield_module_token_details_earn_notification_earning_on_your_balance_subtitle">Interest accrues automatically</string>
<string name="yield_module_token_details_earn_notification_earning_on_your_balance_title">Yield mode</string>
<string name="yield_module_token_details_earn_notification_processing">Processing your top-up</string>
<string name="yield_module_token_details_earn_notification_earning_on_your_balance_title">Yield Mode</string>
<string name="yield_module_token_details_earn_notification_processing">Enabling Yield Mode</string>
<string name="yield_module_token_details_earn_notification_title">Yield Mode</string>
<string name="yield_module_transfer_mode_automatic">Automatic</string>
<string name="yield_module_unable_to_cover_fee_description">Deposit some %1$s %2$s to cover the network fee for transactions</string>
<string name="yield_module_unable_to_cover_fee_description">Add some %1$s %2$s to cover the network fee for transactions.</string>
<string name="yield_module_unable_to_cover_fee_title">Unable to cover %s fee</string>
<string name="yield_module_unavailable_subtitle">The Yield mode service isnt available at the moment. Please try again later.</string>
<string name="yield_module_unavailable_title">Yield mode unavailable</string>
<string name="yield_module_unavailable_subtitle">Yield Mode isn\'t available at the moment. Please try again later.</string>
<string name="yield_module_unavailable_title">Yield Mode unavailable</string>
<string name="yield_supply_chart_loading_error">Unable to load chart...</string>
</resources>

View file

@ -10,10 +10,15 @@ package com.tangem.core.ui.components.bottomsheets
data class TangemBottomSheetConfig(
val isShown: Boolean,
val onDismissRequest: () -> Unit,
val dismissOnClickOutside: () -> Boolean = { true },
val content: TangemBottomSheetConfigContent,
) {
companion object {
val Empty = TangemBottomSheetConfig(false, {}, TangemBottomSheetConfigContent.Empty)
val Empty = TangemBottomSheetConfig(
isShown = false,
onDismissRequest = {},
content = TangemBottomSheetConfigContent.Empty,
)
}
}

View file

@ -88,7 +88,17 @@ inline fun <reified T : TangemBottomSheetConfigContent> DefaultModalBottomSheetW
noinline footer: @Composable (BoxScope.(T) -> Unit)?,
) {
var isVisible by remember { mutableStateOf(value = config.isShown) }
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = skipPartiallyExpanded)
val sheetState = rememberModalBottomSheetState(
skipPartiallyExpanded = skipPartiallyExpanded,
confirmValueChange = { sheetValue ->
if (config.dismissOnClickOutside().not()) {
// Ignore transitions to hidden (prevents dismiss on outside click/back press)
sheetValue != SheetValue.Hidden
} else {
true
}
},
)
if (isVisible && config.content is T) {
BasicModalBottomSheetWithFooter<T>(

View file

@ -66,7 +66,7 @@ fun TangemTheme(
) {
val themeColors = if (isDark) darkThemeColors() else lightThemeColors()
val rememberedColors = remember { themeColors }
.also { it.update(themeColors) }
.apply { update(themeColors) }
val systemUiController = rememberSystemUiController()
val systemBarsIconsController = remember(systemUiController) { SystemBarsIconsController(systemUiController) }

View file

@ -13,7 +13,7 @@ import androidx.compose.runtime.*
fun TangemThemeRedesign(content: @Composable () -> Unit) {
val themeColors = if (LocalIsInDarkTheme.current) darkThemeColors() else lightThemeColors(redesign = true)
val rememberedColors = remember { themeColors }
.also { it.update(themeColors) }
.apply { update(themeColors) }
val rootBackgroundColor = rememberedColors.background.secondary
MaterialTheme(

View file

@ -6,7 +6,7 @@ import java.math.BigInteger
import java.math.RoundingMode
private val HUNDRED_PERCENT = 100.toBigInteger() // base 100%
val INCREASE_GAS_LIMIT_FOR_SUPPLY = 112.toBigInteger() // 12% increase
val INCREASE_GAS_LIMIT_FOR_SUPPLY = 120.toBigInteger() // 20% increase
fun Fee.fixFee(cryptoCurrency: CryptoCurrency, gasLimit: BigInteger): Fee = when (this) {
is Fee.Ethereum.Legacy -> copy(

View file

@ -314,9 +314,9 @@ class YieldSupplyEstimateEnterFeeUseCaseTest {
val deployFee = txs.first().fee as Fee.Ethereum.EIP1559
val approveFee = txs[1].fee as Fee.Ethereum.EIP1559
val enterFee = txs.last().fee as Fee.Ethereum.EIP1559
Truth.assertThat(deployFee.gasLimit).isEqualTo(BigInteger.valueOf(1_120))
Truth.assertThat(approveFee.gasLimit).isEqualTo(BigInteger.valueOf(2_240))
Truth.assertThat(enterFee.gasLimit).isEqualTo(BigInteger.valueOf(3_360))
Truth.assertThat(deployFee.gasLimit).isEqualTo(BigInteger.valueOf(1_200))
Truth.assertThat(approveFee.gasLimit).isEqualTo(BigInteger.valueOf(2_400))
Truth.assertThat(enterFee.gasLimit).isEqualTo(BigInteger.valueOf(3_600))
}
@Test
@ -353,9 +353,9 @@ class YieldSupplyEstimateEnterFeeUseCaseTest {
val deployFee = txs.first().fee as Fee.Ethereum.Legacy
val approveFee = txs[1].fee as Fee.Ethereum.Legacy
val enterFee = txs.last().fee as Fee.Ethereum.Legacy
Truth.assertThat(deployFee.gasLimit).isEqualTo(BigInteger.valueOf(1_120))
Truth.assertThat(approveFee.gasLimit).isEqualTo(BigInteger.valueOf(2_240))
Truth.assertThat(enterFee.gasLimit).isEqualTo(BigInteger.valueOf(3_360))
Truth.assertThat(deployFee.gasLimit).isEqualTo(BigInteger.valueOf(1_200))
Truth.assertThat(approveFee.gasLimit).isEqualTo(BigInteger.valueOf(2_400))
Truth.assertThat(enterFee.gasLimit).isEqualTo(BigInteger.valueOf(3_600))
}
private fun getDeployTx() = uncompiled(

View file

@ -94,7 +94,8 @@ internal fun YieldSupplyActionContent(
YieldSupplyFeeRow(
title = resourceReference(R.string.common_network_fee_title),
value = fee,
modifier = Modifier.fillMaxWidth()
modifier = Modifier
.fillMaxWidth()
.clip(RoundedCornerShape(14.dp))
.background(TangemTheme.colors.background.action)
.padding(horizontal = 16.dp, vertical = 12.dp),
@ -139,7 +140,10 @@ private class YieldSupplyActionContentPreviewProvider : PreviewParameterProvider
R.string.yield_module_start_earning_sheet_description,
wrappedList("USDT"),
),
footer = resourceReference(R.string.yield_module_start_earning_sheet_next_deposits),
footer = resourceReference(
R.string.yield_module_start_earning_sheet_next_deposits_v2,
wrappedList("USDT"),
),
footerLink = resourceReference(R.string.yield_module_start_earning_sheet_fee_policy),
currencyIconState = CurrencyIconState.Loading,
yieldSupplyFeeUM = YieldSupplyFeeUM.Content(

View file

@ -55,8 +55,9 @@ internal fun YieldSupplyBlockContent(yieldSupplyUM: YieldSupplyUM, modifier: Mod
resourceReference(R.string.yield_module_stop_earning),
modifier,
)
YieldSupplyUM.Unavailable -> SupplyUnavailable(modifier)
YieldSupplyUM.Initial -> Unit
YieldSupplyUM.Unavailable,
YieldSupplyUM.Initial,
-> Unit
}
}
}
@ -80,18 +81,6 @@ private fun SupplyAvailable(supplyUM: YieldSupplyUM.Available, modifier: Modifie
)
}
@Composable
private fun SupplyUnavailable(modifier: Modifier = Modifier) {
SupplyInfo(
title = resourceReference(R.string.yield_module_unavailable_title),
subtitle = resourceReference(R.string.yield_module_unavailable_subtitle),
rewardsApy = null,
iconTint = TangemTheme.colors.icon.inactive,
button = null,
modifier = modifier,
)
}
@Suppress("LongMethod")
@Composable
private fun SupplyContent(supplyUM: YieldSupplyUM.Content, modifier: Modifier = Modifier) {

View file

@ -7,4 +7,5 @@ data class YieldSupplyPromoUM(
val policyLink: String,
val title: TextReference,
val subtitle: TextReference,
val tokenSymbol: String,
)

View file

@ -34,6 +34,7 @@ internal class YieldSupplyPromoModel @Inject constructor(
val uiState: YieldSupplyPromoUM = YieldSupplyPromoUM(
tosLink = TangemBlogUrlBuilder.YIELD_SUPPLY_TOS_URL,
policyLink = TangemBlogUrlBuilder.YIELD_SUPPLY_PRIVACY_URL,
tokenSymbol = params.currency.symbol,
title = resourceReference(R.string.yield_module_promo_screen_title),
subtitle = resourceReference(
R.string.yield_module_promo_screen_variable_rate_info,

View file

@ -113,7 +113,7 @@ private fun ColumnScope.Content(yieldSupplyPromoUM: YieldSupplyPromoUM, clickInt
),
)
SpacerH32()
PromoItems()
PromoItems(yieldSupplyPromoUM.tokenSymbol)
}
SpacerH32()
}
@ -151,7 +151,7 @@ private fun YieldStatusAppBar(onBackClick: () -> Unit, onHowItWorksClick: () ->
}
@Composable
private fun PromoItems() {
private fun PromoItems(tokenSymbol: String) {
PromoItem(
icon = R.drawable.ic_flash_new_24,
title = resourceReference(R.string.yield_module_promo_screen_cash_out_title),
@ -161,7 +161,10 @@ private fun PromoItems() {
PromoItem(
icon = R.drawable.ic_repeat_24,
title = resourceReference(R.string.yield_module_promo_screen_auto_balance_title),
subtitle = resourceReference(R.string.yield_module_promo_screen_auto_balance_subtitle),
subtitle = resourceReference(
R.string.yield_module_promo_screen_auto_balance_subtitle_v2,
wrappedList(tokenSymbol),
),
)
SpacerH24()
PromoItem(
@ -258,6 +261,7 @@ private fun YieldSupplyPromoContent_Preview() {
tosLink = "https://tangem.com/terms-of-service/",
policyLink = "https://tangem.com/privacy-policy/",
title = resourceReference(R.string.yield_module_promo_screen_title),
tokenSymbol = "USDT",
subtitle = resourceReference(R.string.yield_module_promo_screen_variable_rate_info, wrappedList("5.3")),
),
clickIntents = object : YieldSupplyPromoClickIntents {

View file

@ -58,7 +58,7 @@ internal class YieldSupplyActiveComponent(
@Composable
override fun Footer() {
SecondaryButton(
text = stringResourceSafe(R.string.yield_module_stop_earning),
text = stringResourceSafe(R.string.yield_module_disable_button),
onClick = params.callback::onStopEarning,
modifier = Modifier
.fillMaxWidth()

View file

@ -2,6 +2,7 @@ package com.tangem.features.yield.supply.impl.subcomponents.active
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.arkivanov.decompose.extensions.compose.subscribeAsState
import com.arkivanov.decompose.router.stack.StackNavigation
import com.arkivanov.decompose.router.stack.childStack
@ -59,9 +60,10 @@ internal class YieldSupplyActiveEntryComponent(
@Composable
override fun BottomSheet() {
val stackState by innerStack.subscribeAsState()
val isTransactionInProgress by model.isTransactionInProgressFlow.collectAsStateWithLifecycle()
YieldSupplyActiveEntryBottomSheet(
stackState = stackState,
dismissOnClickOutside = { !isTransactionInProgress },
onDismiss = ::dismiss,
)
}

View file

@ -11,6 +11,9 @@ import com.tangem.features.yield.supply.impl.subcomponents.approve.YieldSupplyAp
import com.tangem.features.yield.supply.impl.subcomponents.stopearning.YieldSupplyStopEarningComponent
import com.tangem.utils.TangemBlogUrlBuilder
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import javax.inject.Inject
@ModelScoped
@ -25,15 +28,25 @@ internal class YieldSupplyActiveEntryModel @Inject constructor(
private val params = paramsContainer.require<YieldSupplyActiveEntryComponent.Params>()
val isTransactionInProgressFlow: StateFlow<Boolean>
field = MutableStateFlow(false)
override fun onStopEarning() {
router.push(YieldSupplyActiveRoute.Exit)
}
override fun onBackClick() {
router.pop()
if (!isTransactionInProgressFlow.value) {
router.pop()
}
}
override fun onTransactionProgress(inProgress: Boolean) {
isTransactionInProgressFlow.update { inProgress }
}
override fun onTransactionSent() {
isTransactionInProgressFlow.update { false }
params.onDismiss()
}

View file

@ -226,7 +226,7 @@ private fun YieldSupplyActiveMyFunds(
color = TangemTheme.colors.stroke.primary,
)
HighComissionInfoRow(
title = resourceReference(R.string.common_network_fee_title),
title = resourceReference(R.string.common_estimated_fee),
info = state.currentFee,
isHighComission = state.isHighFee,
)

View file

@ -14,12 +14,14 @@ import com.tangem.features.yield.supply.impl.subcomponents.active.model.YieldSup
@Composable
internal fun YieldSupplyActiveEntryBottomSheet(
stackState: ChildStack<YieldSupplyActiveRoute, ComposableModularContentComponent>,
dismissOnClickOutside: () -> Boolean,
onDismiss: () -> Unit,
) {
TangemModalBottomSheetWithFooter<TangemBottomSheetConfigContent.Empty>(
config = TangemBottomSheetConfig(
isShown = true,
onDismissRequest = onDismiss,
dismissOnClickOutside = dismissOnClickOutside,
content = TangemBottomSheetConfigContent.Empty,
),
containerColor = TangemTheme.colors.background.tertiary,

View file

@ -106,6 +106,7 @@ internal class YieldSupplyApproveComponent(
interface ModelCallback {
fun onBackClick()
fun onTransactionProgress(inProgress: Boolean)
fun onTransactionSent()
}
}

View file

@ -117,6 +117,8 @@ internal class YieldSupplyApproveModel @Inject constructor(
}
fun onClick() {
params.callback.onTransactionProgress(true)
val yieldSupplyFeeUM = uiState.value.yieldSupplyFeeUM as? YieldSupplyFeeUM.Content ?: return
uiState.update(YieldSupplyTransactionInProgressTransformer)
@ -153,6 +155,7 @@ internal class YieldSupplyApproveModel @Inject constructor(
}
},
)
params.callback.onTransactionProgress(false)
},
ifRight = {
val event = AnalyticsParam.TxSentFrom.Earning(

View file

@ -2,6 +2,7 @@ package com.tangem.features.yield.supply.impl.subcomponents.startearning
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.arkivanov.decompose.extensions.compose.subscribeAsState
import com.arkivanov.decompose.router.stack.StackNavigation
import com.arkivanov.decompose.router.stack.childStack
@ -56,9 +57,11 @@ internal class YieldSupplyStartEarningEntryComponent(
@Composable
override fun BottomSheet() {
val stackState by innerStack.subscribeAsState()
val uiState by model.uiState.collectAsStateWithLifecycle()
YieldSupplyStartEarningBottomSheet(
stackState = stackState,
dismissOnClickOutside = { !uiState.isTransactionSending },
onDismiss = ::dismiss,
)
}

View file

@ -8,8 +8,8 @@ import com.tangem.core.decompose.navigation.Router
import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.features.yield.supply.impl.R
import com.tangem.features.yield.supply.api.analytics.YieldSupplyAnalytics
import com.tangem.features.yield.supply.impl.R
import com.tangem.features.yield.supply.impl.common.entity.YieldSupplyActionUM
import com.tangem.features.yield.supply.impl.common.entity.YieldSupplyFeeUM
import com.tangem.features.yield.supply.impl.subcomponents.feepolicy.YieldSupplyFeePolicyComponent
@ -40,7 +40,10 @@ internal class YieldSupplyStartEarningEntryModel @Inject constructor(
R.string.yield_module_start_earning_sheet_description,
wrappedList(params.cryptoCurrency.symbol),
),
footer = resourceReference(R.string.yield_module_start_earning_sheet_next_deposits),
footer = resourceReference(
R.string.yield_module_start_earning_sheet_next_deposits_v2,
wrappedList(params.cryptoCurrency.symbol),
),
footerLink = resourceReference(R.string.yield_module_start_earning_sheet_fee_policy),
currencyIconState = CryptoCurrencyToIconStateConverter().convert(params.cryptoCurrency),
yieldSupplyFeeUM = YieldSupplyFeeUM.Loading,
@ -54,7 +57,9 @@ internal class YieldSupplyStartEarningEntryModel @Inject constructor(
}
override fun onBackClick() {
router.pop()
if (!uiState.value.isTransactionSending) {
router.pop()
}
}
override fun onFeePolicyClick() {

View file

@ -45,7 +45,7 @@ import java.math.BigDecimal
import javax.inject.Inject
import kotlin.properties.Delegates
@Suppress("LongParameterList")
@Suppress("LongParameterList", "LargeClass")
@ModelScoped
internal class YieldSupplyStartEarningModel @Inject constructor(
override val dispatchers: CoroutineDispatcherProvider,
@ -96,7 +96,10 @@ internal class YieldSupplyStartEarningModel @Inject constructor(
R.string.yield_module_start_earning_sheet_description,
wrappedList(cryptoCurrency.symbol),
),
footer = resourceReference(R.string.yield_module_start_earning_sheet_next_deposits),
footer = resourceReference(
R.string.yield_module_start_earning_sheet_next_deposits_v2,
wrappedList(cryptoCurrency.symbol),
),
footerLink = resourceReference(R.string.yield_module_start_earning_sheet_fee_policy),
currencyIconState = CryptoCurrencyToIconStateConverter().convert(params.cryptoCurrency),
yieldSupplyFeeUM = YieldSupplyFeeUM.Loading,

View file

@ -14,12 +14,14 @@ import com.tangem.features.yield.supply.impl.subcomponents.startearning.YieldSup
@Composable
internal fun YieldSupplyStartEarningBottomSheet(
stackState: ChildStack<YieldSupplyStartEarningRoute, ComposableModularContentComponent>,
dismissOnClickOutside: () -> Boolean,
onDismiss: () -> Unit,
) {
TangemModalBottomSheetWithFooter<TangemBottomSheetConfigContent.Empty>(
config = TangemBottomSheetConfig(
isShown = true,
onDismissRequest = onDismiss,
dismissOnClickOutside = dismissOnClickOutside,
content = TangemBottomSheetConfigContent.Empty,
),
containerColor = TangemTheme.colors.background.tertiary,

View file

@ -107,6 +107,7 @@ internal class YieldSupplyStopEarningComponent(
interface ModelCallback {
fun onBackClick()
fun onTransactionProgress(inProgress: Boolean)
fun onTransactionSent()
}
}

View file

@ -126,6 +126,8 @@ internal class YieldSupplyStopEarningModel @Inject constructor(
}
fun onClick() {
params.callback.onTransactionProgress(true)
val yieldSupplyFeeUM = uiState.value.yieldSupplyFeeUM as? YieldSupplyFeeUM.Content ?: return
analytics.send(
YieldSupplyAnalytics.ButtonStopEarning(
@ -163,6 +165,7 @@ internal class YieldSupplyStopEarningModel @Inject constructor(
}
},
)
params.callback.onTransactionProgress(false)
},
ifRight = {
onStopEarningTransactionSuccess()

View file

@ -5,6 +5,7 @@ import com.tangem.core.configtoggle.blockchain.ExcludedBlockchainsManager
import org.jetbrains.annotations.TestOnly
import javax.inject.Inject
@Suppress("MemberNameEqualsClassName")
class ExcludedBlockchains @Inject internal constructor(
private val excludedBlockchainsManager: ExcludedBlockchainsManager,
) : Set<Blockchain> {

View file

@ -26,7 +26,7 @@ internal object CardSdkModule {
artworksDirectory = File(
context.getExternalFilesDir(null) ?: context.filesDir,
"card_artworks",
).also { it.mkdirs() },
).apply { mkdirs() },
)
}
}

@ -1 +1 @@
Subproject commit 005d624edbb899bb8fae1c9444ea34b6eac86603
Subproject commit 193db8a0247a1f33574dcdd5f9ec4dab2c28ea73