Updated on 2026-08-14

This commit is contained in:
Tangem 2024-07-24 12:25:20 +05:00
commit 96c6123d8c
19 changed files with 358 additions and 44 deletions

View file

@ -2,10 +2,12 @@ package com.tangem.common.ui.amountScreen.converters
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.ui.text.input.KeyboardType
import com.tangem.common.ui.R
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.utils.checkExceedBalance
import com.tangem.common.ui.amountScreen.utils.getFiatValue
import com.tangem.common.ui.amountScreen.utils.getKeyboardAction
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.isNullOrZero
@ -51,6 +53,7 @@ class AmountReduceByTransformer(
value = cryptoValue,
fiatValue = fiatValue,
isError = isExceedBalance,
error = resourceReference(R.string.send_validation_amount_exceeds_balance),
cryptoAmount = amountTextField.cryptoAmount.copy(value = decimalCryptoValue),
fiatAmount = amountTextField.fiatAmount.copy(value = decimalFiatValue),
keyboardOptions = KeyboardOptions(

View file

@ -2,10 +2,12 @@ package com.tangem.common.ui.amountScreen.converters
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.ui.text.input.KeyboardType
import com.tangem.common.ui.R
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.utils.checkExceedBalance
import com.tangem.common.ui.amountScreen.utils.getFiatValue
import com.tangem.common.ui.amountScreen.utils.getKeyboardAction
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.isNullOrZero
@ -45,6 +47,7 @@ class AmountReduceToTransformer(
value = cryptoValue,
fiatValue = fiatValue,
isError = isExceedBalance,
error = resourceReference(R.string.send_validation_amount_exceeds_balance),
cryptoAmount = amountTextField.cryptoAmount.copy(value = value),
fiatAmount = amountTextField.fiatAmount.copy(value = decimalFiatValue),
keyboardOptions = KeyboardOptions(

View file

@ -2,11 +2,13 @@ package com.tangem.common.ui.amountScreen.converters.field
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.ui.text.input.KeyboardType
import com.tangem.common.ui.R
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.utils.checkExceedBalance
import com.tangem.common.ui.amountScreen.utils.getCryptoValue
import com.tangem.common.ui.amountScreen.utils.getFiatValue
import com.tangem.common.ui.amountScreen.utils.getKeyboardAction
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.utils.parseToBigDecimal
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.isNullOrZero
@ -59,6 +61,7 @@ class AmountFieldChangeTransformer(
value = cryptoValue,
fiatValue = fiatValue,
isError = isExceedBalance,
error = resourceReference(R.string.send_validation_amount_exceeds_balance),
cryptoAmount = amountTextField.cryptoAmount.copy(value = decimalCryptoValue),
fiatAmount = amountTextField.fiatAmount.copy(value = decimalFiatValue),
keyboardOptions = KeyboardOptions(

View file

@ -1,16 +1,16 @@
package com.tangem.common.ui.amountScreen.ui
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateContentSize
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredHeightIn
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment.Companion.BottomCenter
import androidx.compose.ui.Alignment.Companion.TopCenter
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
@ -80,6 +80,8 @@ private fun AmountSecondary(amountField: AmountFieldModel, appCurrencyCode: Stri
val secondaryAmount = if (amountField.isFiatValue) amountField.cryptoAmount else amountField.fiatAmount
Box(
modifier = Modifier
.fillMaxWidth()
.animateContentSize()
.padding(
top = TangemTheme.dimens.spacing8,
start = TangemTheme.dimens.spacing12,
@ -105,7 +107,7 @@ private fun AmountSecondary(amountField: AmountFieldModel, appCurrencyCode: Stri
color = TangemTheme.colors.text.tertiary,
textAlign = TextAlign.Center,
modifier = Modifier
.align(BottomCenter)
.align(TopCenter)
.padding(bottom = TangemTheme.dimens.spacing32),
)
AmountFieldError(
@ -113,7 +115,10 @@ private fun AmountSecondary(amountField: AmountFieldModel, appCurrencyCode: Stri
error = amountField.error,
modifier = Modifier
.align(BottomCenter)
.padding(bottom = TangemTheme.dimens.spacing12),
.padding(
top = TangemTheme.dimens.spacing20,
bottom = TangemTheme.dimens.spacing12,
),
)
}
}

View file

@ -2,6 +2,7 @@ package com.tangem.datasource.api.stakekit.models.response.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import java.math.BigDecimal
@JsonClass(generateAdapter = true)
data class AddressArgumentDTO(
@ -10,7 +11,7 @@ data class AddressArgumentDTO(
@Json(name = "network")
val network: String? = null,
@Json(name = "minimum")
val minimum: Double? = null,
val minimum: BigDecimal? = null,
@Json(name = "maximum")
val maximum: Double? = null,
val maximum: BigDecimal? = null,
)

View file

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="add_custom_token_choose_network">Netzwerk wählen</string>
<string name="add_custom_token_title">Benutzerdefiniertes Token hinzufügen</string>
<string name="add_tokens_title">Token verwalten</string>
<string name="address_qr_code_message_format">Sende nur %1$s ( %2$s ) vom %3$s -Netzwerk an diese Adresse. Die Verwendung anderer Token und Netzwerke kann zum Verlust von Geldern führen.</string>
<string name="alert_button_how_to_scan">So scannt man</string>
<string name="alert_button_request_support">Hilfe anfordern</string>
<string name="alert_button_try_again">Erneut versuchen</string>
<string name="alert_demo_feature_disabled">Diese Funktion ist im Demomodus deaktiviert</string>
@ -37,6 +39,7 @@
<string name="biometric_lockout_warning_title">Zu viele Versuche</string>
<string name="biometric_unavailable_warning">Du hast die biometrische Authentifizierung auf deinem Telefon deaktiviert und kannst keine Wallets in der App speichern. Um Wallets zu speichern, aktiviere bitte die biometrische Authentifizierung in deinen Telefoneinstellungen.</string>
<string name="button_start_backup_process">Backup-Prozess starten</string>
<string name="buy_token_description">Von deiner Fiat-Karte oder deinem Bankkonto</string>
<plurals name="card_label_card_count">
<item quantity="one">%d Karte</item>
<item quantity="other">%d Karten</item>
@ -65,6 +68,8 @@
<string name="cardano_max_amount_has_token_title">Nicht genug ADA</string>
<string name="common_accept">Akzeptieren</string>
<string name="common_access_denied">Zugang verweigert</string>
<string name="common_all">Alle</string>
<string name="common_allow">Erlauben</string>
<string name="common_apply">Anwenden</string>
<string name="common_approval">Genehmigung</string>
<string name="common_approve">Genehmigen</string>
@ -77,12 +82,17 @@
<string name="common_buy_currency">Gehe zu %1$s</string>
<string name="common_camera_denied_alert_message">D hast keinen Zugang zur Kamera erteilt, bitte passe deine Datenschutzeinstellungen an</string>
<string name="common_cancel">Abbrechen</string>
<string name="common_claim_rewards">Stakingbelohnungen beanstpruchen</string>
<string name="common_close">Schließen</string>
<string name="common_continue">Weitermachen</string>
<string name="common_copy">Kopieren</string>
<string name="common_copy_address">Adresse kopieren</string>
<string name="common_create">Erstellen</string>
<string name="common_custom">Benutzerdefiniert</string>
<plurals name="common_days">
<item quantity="one">Tag</item>
<item quantity="other">Tage</item>
</plurals>
<string name="common_delete">Entfernen</string>
<string name="common_disabled">Deaktiviert</string>
<string name="common_done">Erledigt</string>
@ -109,6 +119,7 @@
<string name="common_next">Weiter</string>
<string name="common_no">Nein</string>
<string name="common_no_address">Keine Adresse</string>
<string name="common_now">Jetzt</string>
<string name="common_ok">OK</string>
<string name="common_origin_card">Primär Karte</string>
<string name="common_passphrase">Passphrase</string>
@ -139,12 +150,14 @@
<string name="common_support">Unterstützung</string>
<string name="common_swap">Tauschen</string>
<string name="common_terms_and_conditions">Allgemeine Geschäftsbedingungen</string>
<string name="common_today">Heute</string>
<string name="common_transaction_failed">Transaktion fehlgeschlagen</string>
<string name="common_transactions">Transaktionen</string>
<string name="common_transfer">Überweisen</string>
<string name="common_understand">Ich verstehe</string>
<string name="common_unknown_error">Es ist ein Fehler aufgetreten. Bitte versuche es erneut.</string>
<string name="common_unreachable">Nicht erreichbar</string>
<string name="common_unstake">staking beenden</string>
<string name="common_yes">Ja</string>
<string name="contract_address_copied_message">Vertragsadresse kopiert!</string>
<string name="currency_subtitle_expanded">Verfügbare Netzwerke</string>
@ -232,6 +245,7 @@
<string name="express_exchange_status_subtitle">Daten stammen vom Anbieter. Der geschätzte Betrag kann sich aufgrund der Marktbedingungen ändern.</string>
<string name="express_exchange_status_title">Status des Tausches</string>
<string name="express_exchange_status_verifying">Verifizierung erforderlich</string>
<string name="express_exchange_status_waiting_tx_hash">Wartet auf Transaktions-Hash</string>
<string name="express_exchange_token_list_subtitle">Liste aller Token, die deiner Wallet hinzugefügt wurden</string>
<string name="express_fetch_best_rates">Beste Preise werden abgerufen …</string>
<string name="express_floating_rate">Variabler Zinssatz</string>
@ -245,10 +259,12 @@
<string name="express_provider_min_amount">Erhältlich bei %s</string>
<string name="express_provider_not_available">Für dieses Paar nicht verfügbar</string>
<string name="express_provider_permission_needed">Erlaubnis erforderlich</string>
<string name="express_provider_recommended">Empfohlen</string>
<string name="express_terms_of_use">Nutzungsbedingungen</string>
<string name="express_token_list_empty_search">Keine Token gefunden. Bitte versuche eine andere Anfrage</string>
<string name="express_transaction_id">ID: %s</string>
<string name="express_transaction_id_copied">Transaktions-ID kopiert</string>
<string name="exсhange_token_description">Aus einer anderen Währung in deiner Wallet</string>
<string name="feedback_data_collection_message">Die folgenden Angaben sind freiwillig. Du kannst diese löschen, wenn du sie nicht weitergeben möchtest.</string>
<string name="feedback_preface_rate_negative">Teile uns mit, welche Funktionen du vermisst, und wir werden versuchen, dir zu helfen.</string>
<string name="feedback_preface_scan_failed">Bitte sag uns, welche Karte du hast</string>
@ -263,6 +279,8 @@
<string name="give_permission_fee_footer">Das Netzwerk erhebt eine Token-Genehmigungsgebühr, um zu überprüfen, ob Sie die Verwendung Ihres Tokens für den Swap genehmigen.</string>
<string name="give_permission_policy_type_footer">Gib das Genehmigungslimit für das ausgewählte Token an</string>
<string name="give_permission_rows_amount">Betrag %s</string>
<string name="give_permission_staking_footer">Die Genehmigungsfunktion ist erforderlich, um einer anderen Adresse die Berechtigung zur Verwendung einer bestimmten Menge Ihrer Token zu erteilen. Standardmäßig können Smart Contracts nicht auf deine Token zugreifen, es sei denn, du stimmen zu. Indem du deine Token \"freischaltest\", autorisierst du den StakeKit Smart Contract, sie zu verwenden. Die Miner des Netzwerks erhalten eine Gasgebühr (von dir bezahlt), um diese Aktion in der Blockchain aufzuzeichnen. Du kannst deine Token einsetzen, nachdem du die Genehmigung erteilt hast.</string>
<string name="give_permission_staking_subtitle">Um fortzufahren, musst du StakeKit Smart Contract erlauben, deine %s zu verwenden</string>
<string name="give_permission_swap_subtitle" formatted="false">Um fortzufahren, erteile %1s Smart Contracts die Berechtigung, dein zu %2s verwenden.</string>
<string name="give_permission_title">Erlaubnis erteilen</string>
<string name="give_permission_unlimited">Unbegrenzt</string>
@ -306,11 +324,85 @@
<item quantity="one">%1$d von %2$d Wallet</item>
<item quantity="other">%1$d von %2$d Wallets</item>
</plurals>
<string name="manage_tokens_remove">Entfernen</string>
<string name="manage_tokens_search_placeholder">z.B. BTC vertraue ich, hodl muss ich</string>
<string name="manage_tokens_toast_portfolio_updated">Dein Portfolio wurde aktualisiert</string>
<string name="manage_tokens_unavailable_description">Der ausgewählte Token ist derzeit nicht für Aktionen innerhalb der Krypto-Wallet verfügbar. Aber keine Sorge, du kannst dein Interesse bekunden, indem du den Token hochstufen.</string>
<string name="manage_tokens_unavailable_vote">Hochstimmen</string>
<string name="manage_tokens_wallet_selector_title">Wallet auswählen</string>
<string name="manage_tokens_wallet_support_only_one_network_title">Das Wallet unterstützt nicht mehr als ein Netzwerk</string>
<string name="markets_add_to_my_portfolio_description">Um mit dem Kauf, Tausch oder Erhalt dieses Vermögenswerts zu beginnen, füge diesen Token zu mindestens 1 Netzwerk hinzu</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Dieses Asset ist nicht verfügbar</string>
<string name="markets_add_to_portfolio_button">Zum Portfolio hinzufügen</string>
<string name="markets_add_token">Token hinzufügen</string>
<string name="markets_available_networks">Verfügbare Netzwerke</string>
<string name="markets_common_my_portfolio">Mein Portfolio</string>
<string name="markets_common_title">Markt</string>
<string name="markets_generate_addresses_notification">Um Adressen für ausgewählte Netzwerke zu generieren, musst du eine Tangem-Karte scannen/ einsetzen</string>
<string name="markets_loading_error_title">Die Daten konnten nicht geladen werden...</string>
<string name="markets_quick_actions">Schnelle Aktionen</string>
<string name="markets_search_result_title">Ergebnis</string>
<string name="markets_search_see_tokens_under_100k">Token unter 100k Marktkapitalisierung anzeigen</string>
<string name="markets_search_show_tokens">Token anzeigen</string>
<string name="markets_search_token_no_result_title">Kein Ergebnis</string>
<string name="markets_select_network">Netzwerk auswählen</string>
<string name="markets_select_wallet">Wallet auswählen</string>
<string name="markets_selector_interval_1m_title">1M</string>
<string name="markets_selector_interval_1y_title">1 Y</string>
<string name="markets_selector_interval_24h_title">24H</string>
<string name="markets_selector_interval_3m_title">3M</string>
<string name="markets_selector_interval_6m_title">6M</string>
<string name="markets_selector_interval_7d_title">7T</string>
<string name="markets_selector_interval_all_title">Alle</string>
<string name="markets_sort_by_experienced_buyers_title">Erfahrene Käufer</string>
<string name="markets_sort_by_rating_title">Bewertung</string>
<string name="markets_sort_by_title">Sortieren nach</string>
<string name="markets_sort_by_top_gainers_title">Top-Gewinner</string>
<string name="markets_sort_by_top_losers_title">Top-Verlierer</string>
<string name="markets_sort_by_trending_title">Beliebt</string>
<string name="markets_token_details_about_token_title">Über %s</string>
<plurals name="markets_token_details_based_on_ratings">
<item quantity="one">Bewertung, basierend auf %d</item>
<item quantity="other">Bewertungen, basierend auf %d</item>
</plurals>
<string name="markets_token_details_blockchain_site">Blockchain-Site</string>
<string name="markets_token_details_buy_pressure">Kaufdruck</string>
<string name="markets_token_details_buy_pressure_description">Die Differenz zwischen Käufer- und Verkäufervolumen</string>
<string name="markets_token_details_circulating_supply">Umlaufmenge</string>
<string name="markets_token_details_circulating_supply_description">Die Gesamtzahl der Coins, die für den Handel verfügbar sind und auf dem Markt zirkulieren</string>
<string name="markets_token_details_experienced_buyers">Erfahrene Käufer</string>
<string name="markets_token_details_experienced_buyers_description">Nettokäufer mit der zusätzlichen Anforderung, mindestens 100 ausgehende Transaktionen zu haben</string>
<string name="markets_token_details_fully_diluted_valuation">Vollständig verwässerte Bewertung</string>
<string name="markets_token_details_fully_diluted_valuation_description">Der theoretische Gesamtwert einer Kryptowährung, wenn alle Coins, die existieren könnten, im Umlauf sind, einschließlich derjenigen, die derzeit nicht im Umlauf sind</string>
<string name="markets_token_details_genesis_date">Entstehungsdatum</string>
<string name="markets_token_details_genesis_date_description">Leer</string>
<string name="markets_token_details_high">Hoch</string>
<string name="markets_token_details_holders">Inhaber/ Halter</string>
<string name="markets_token_details_holders_description">Die Änderung der Anzahl der Token-Inhaber innerhalb eines bestimmten Zeitraums</string>
<string name="markets_token_details_insights">Einblicke</string>
<string name="markets_token_details_links">Links</string>
<string name="markets_token_details_liquidity">Liquidität</string>
<string name="markets_token_details_liquidity_description">Die Änderung der Liquidität, die dem Token während des angegebenen Zeitraums zur Verfügung steht</string>
<string name="markets_token_details_liquidity_index">Liquiditätsindex</string>
<string name="markets_token_details_liquidity_index_description">Leer</string>
<string name="markets_token_details_low">Niedrig</string>
<string name="markets_token_details_market_capitalization">Marktkapitalisierung</string>
<string name="markets_token_details_market_capitalization_description">Der Gesamtmarktwert einer Kryptowährung, berechnet durch Multiplikation des aktuellen Preises der Münze mit der Gesamtzahl der im Umlauf befindlichen Münzen</string>
<string name="markets_token_details_market_rating">Marktbewertung</string>
<string name="markets_token_details_market_rating_description">Position im Krypto-Rating zwischen allen Coins basierend auf der Marktkapitalisierung</string>
<string name="markets_token_details_max_supply">Maximale Versorgung</string>
<string name="markets_token_details_max_supply_description">Leer</string>
<string name="markets_token_details_metrics">Metriken</string>
<string name="markets_token_details_official_links">Offizielle Links</string>
<string name="markets_token_details_price_performance">Preisleistung</string>
<string name="markets_token_details_repository">Aufbewahrungsort</string>
<string name="markets_token_details_security_score">Sicherheitsbewertung</string>
<string name="markets_token_details_security_score_description">Leer</string>
<string name="markets_token_details_social">Soziales</string>
<string name="markets_token_details_total_supply">Gesamtangebot</string>
<string name="markets_token_details_total_supply_description">Die maximale Anzahl von Coins oder Tokens, die jemals für eine bestimmte Kryptowährung existieren können</string>
<string name="markets_token_details_trading_volume">Handelsvolumen (24h)</string>
<string name="markets_token_details_trading_volume_24h_description">Der Gesamtbetrag einer Kryptowährung, der innerhalb der letzten 24 Stunden gehandelt wurde, wobei das Aktivitäts- und Liquiditätsniveau auf dem Markt angegeben wird</string>
<string name="onboarding_access_code_feature_1_description">Du musst einen einzigen Zugangscode einrichten, um alle deine Karten zu schützen</string>
<string name="onboarding_access_code_feature_1_title">Schützen</string>
<string name="onboarding_access_code_feature_2_description">Du kannst später auf jeder Karte einen individuellen Zugangscode einrichten</string>
@ -382,6 +474,7 @@
<string name="onboarding_title">Karte aktivieren</string>
<string name="onboarding_title_backup_card_format">Sicherungskarte Nr. %d</string>
<string name="onboarding_title_no_backup_cards">Keine Sicherungskarten</string>
<string name="onboarding_title_notifications">Benachrichtigungen</string>
<string name="onboarding_title_one_backup_card">Eine Backup-Karte hinzugefügt</string>
<string name="onboarding_title_scan_origin_card">Bereite deine Karte vor</string>
<string name="onboarding_title_two_backup_cards">Zwei Backup-Karten hinzugefügt</string>
@ -410,6 +503,7 @@
<string name="qr_scanner_camera_denied_title">Kamerazugriff verweigert</string>
<string name="receive_bottom_sheet_warning_message">%1$s ( %2$s ) im %3$s Netzwerk</string>
<string name="receive_bottom_sheet_warning_message_full">Sende nur %s an diese Adresse. Der Versand einer anderen Währung führt zu ihrem unwiderruflichen Verlust.</string>
<string name="receive_token_description">QR-Code anzeigen oder Adresse teilen</string>
<string name="referral_button_participate">Teilnehmen</string>
<string name="referral_error_failed_to_load_info">Die Informationen zum Empfehlungsprogramm konnten nicht geladen werden. Bitte versuche es später noch einmal.</string>
<string name="referral_error_failed_to_load_info_with_reason">Die Informationen über das Empfehlungsprogramm konnten nicht geladen werden. Fehlercode: %s. Bitte versuche es später noch einmal.</string>
@ -470,6 +564,8 @@
<string name="send_custom_evm_max_fee_footer">Dies sind die Kosten, die du für jede Gaseinheit zu zahlen bereit bist. Je höher der Gaspreis ist, desto schneller wird deine Transaktion bearbeitet. (Vorzugsgebühr inbegriffen)</string>
<string name="send_custom_evm_priority_fee">Prioritätsgebühr</string>
<string name="send_custom_evm_priority_fee_footer">Die Gebühr, die ein Nutzer an Miner oder Validierer zahlen kann, um die Aufnahme seiner Transaktion in einen Block zu beschleunigen.</string>
<string name="send_custom_kaspa_per_utxo_footer">Die Gebühr, die für die Nutzung jeder nicht ausgegebenen Transaktionsausgabe (UTXO) im Kaspa-Netzwerk erforderlich ist. Je mehr UTXOs du in einer Transaktion verwenden, desto höher ist die Gebühr.</string>
<string name="send_custom_kaspa_per_utxo_title">KAS per UTXO</string>
<string name="send_date_format">%1$s, %2$s</string>
<string name="send_destination_hint_address">Adresse</string>
<string name="send_destination_tag_field">Ziel-Tag</string>
@ -537,24 +633,46 @@
<string name="send_total_subtitle_fiat_format">≈ %1$s (inkl. Gebühr: %2$s)</string>
<string name="send_total_subtitle_format">%s wird gesendet</string>
<string name="send_transaction_success">Die Transaktion wurde erfolgreich signiert und an den Blockchain-Knoten gesendet. Die Walletbilanz wird aktualisiert</string>
<string name="send_tron_account_activation_error">%1s ist ein Vermögenswert im Tron-Netzwerk. Um die Gebühr zu berechnen und eine Transaktion durchzuführen, musst du etwas Tron (TRX) auf deinem Konto einzahlen.</string>
<string name="send_validation_invalid_address">Ungültige Adresse</string>
<string name="send_wallet_balance_format">%1$s (%2$s)</string>
<string name="sent_transaction_sent_title">Transaktion gesendet</string>
<string name="settings_card_settings_footer">Bereite das Scannen der Karte vor, die du einrichten möchtest.</string>
<string name="settings_forget_wallet">Entferne diese Wallet</string>
<string name="settings_forget_wallet_footer">Hiermit wird die Wallet aus der Anwendung entfernt. Die Wallet selbst kann wieder hinzugefügt werden.</string>
<string name="settings_wallet_name_title">Name</string>
<string name="staking_active">Aktiv</string>
<string name="staking_active_footer">Um deine Kryptos zu unstaken, klick hier.</string>
<string name="staking_amount_requirement_error">Die Anzahl der zu stakenden Krypros muss mindesten %s betragen</string>
<string name="staking_details_apr">Effektiver Jahreszins</string>
<string name="staking_details_apy">Jährliche prozentuale Rendite</string>
<string name="staking_details_apy_info">Die jährliche prozentuale Rendite, die du durch die Teilnahme am Staking erzielen kannst.</string>
<string name="staking_details_available">Verfügbar</string>
<string name="staking_details_average_reward_rate">Durchschnittliche Belohnungsquote</string>
<string name="staking_details_estimated_profit">%s geschätzter Profit</string>
<string name="staking_details_market_rating">Marktbewertung</string>
<string name="staking_details_metrics_block_header">Metriken</string>
<string name="staking_details_minimum_requirement">Mindestanforderungen</string>
<string name="staking_details_no_rewards_to_claim">Keine Belohnungen zu beanspruchen.</string>
<string name="staking_details_on_stake">Gestaked</string>
<string name="staking_details_reward_claiming">Belohnungen beanspruchen</string>
<string name="staking_details_reward_claiming_info">Eine Möglichkeit, Staking-Belohnungen zu erhalten. Es kann automatisch oder manuell beansprucht werden.</string>
<string name="staking_details_reward_schedule">Belohnungszeitplan</string>
<string name="staking_details_reward_schedule_info">Dabei handelt es sich um einen Zeitplan, der festlegt, wann die Teilnehmer am Staking ihre Belohnungen erhalten.</string>
<string name="staking_details_rewards_to_claim">Belohnungen, die du beanspruchen kannst: %s</string>
<string name="staking_details_title">Staking %s</string>
<string name="staking_details_unbonding_period">Entbindungsdauer</string>
<string name="staking_details_unbonding_period_info">Der Zeitraum, den du nach der Beantragung der Abhebung von Geldern aus dem Staking warten musst, bevor die Token verfügbar werden.</string>
<string name="staking_details_warmup_period">Aufwärmphase</string>
<string name="staking_details_warmup_period_info">Die zugewiesene Zeit für die Aktivierung der Teilnahme am Staking.</string>
<string name="staking_native">Natives Staking</string>
<string name="staking_notification_earn_rewards_text" formatted="false">Mit Staking kannst du %1s verdienen. Deine Staking-Belohnungen kommen alle ~%2s Tage.</string>
<string name="staking_notification_earn_rewards_title">Verdiene Staking-Belohnungen</string>
<string name="staking_rewards">Belohnungen</string>
<string name="staking_stake_more">Mehr staken</string>
<string name="staking_unstaked">unstaken</string>
<string name="staking_unstaked_footer">Prüfe, was nicht eingesetzt wurde, um dein Vermögen zu beanspruchen</string>
<string name="staking_validator">Validator/ Prüfer</string>
<string name="story_awe_description">Bewahre deine Krypto-Assets sicher auf, während die privaten Schlüssel auf deiner Karte bleiben</string>
<string name="story_awe_title">Revolutionäre Hardware-Wallet</string>
<string name="story_backup_description">Bis zu 3 physische Karten pro Wallet</string>
@ -566,11 +684,14 @@
<string name="story_meet_title">Lerne Tangem kennen</string>
<string name="story_web3_description">Tausche, kaufen Sie NFTs, vergebe Kredite und tätige Einlagen bei mehr als 100 verschiedenen dezentralen Diensten</string>
<string name="story_web3_title">Web 3.0-kompatibel</string>
<string name="swap_promo_text">Tausche mehr Token zu besseren Kursen direkt in deiner Brieftasche.</string>
<string name="swap_promo_title">Neuer Swap-Anbieter verfügbar!</string>
<string name="swapping_alert_cex_description">Der Betrag umfasst:\n- Gebühr des Dienstanbieters\n- Netzgebühr für die Rücksendung von %s von der Vermittlungsstelle an die Adresse des Nutzers.</string>
<string name="swapping_alert_dex_description">Der Betrag enthält die Gebühren des Dienstleisters.</string>
<string name="swapping_alert_title">Gebühren</string>
<string name="swapping_approve_information_text">Alle dezentralen Börsen benötigen Genehmigungen, um zu verhindern, dass intelligente Verträge ohne Ihre Erlaubnis auf Ihre Geldbörse zugreifen. Smart Contracts können nicht auf Ihre Token zugreifen, wenn Sie nicht zustimmen. Indem Sie Ihre Token \"freischalten\", ermächtigen Sie den 1-Zoll-Smart-Contract, sie auszugeben. Die Miner des Netzwerks erhalten eine (von Ihnen bezahlte) Gasgebühr, um diese Aktion in der Blockchain aufzuzeichnen. Sie können Ihre Token tauschen, nachdem Sie Ihre Zustimmung gegeben haben.</string>
<string name="swapping_approve_information_title">Genehmigen</string>
<string name="swapping_fee_estimation_error_text">Fehler bei der Gebührenschätzung. Bitte sende dein Feedback an den Support.</string>
<string name="swapping_from_title">Du wechselst</string>
<string name="swapping_high_price_impact_description">Der Tausch dieser Menge ausgewählter Token hat erhebliche Auswirkungen auf den Preis und verringert dein Ergebnis.</string>
<string name="swapping_insufficient_funds">Unzureichende Mittel</string>
@ -614,6 +735,7 @@
<string name="transaction_history_operation">Operation</string>
<string name="transaction_history_transaction_from_address">von: %s</string>
<string name="transaction_history_transaction_to_address">zu: %s</string>
<string name="try_to_load_data_again_button_title">Versuche es erneut</string>
<string name="twin_error_same_card">Du hast dieselbe Karte gescannt. Um ein Zwillings-Wallet zu erstellen, musst du die Karte mit der Nummer %d scannen.</string>
<string name="twin_error_wrong_twin">Du hast die falsche Doppelkarte gescannt. Bitte versuche eine andere Karte</string>
<string name="twins_onboarding_description_format">Die, die du in den Hand hältst, und die andere mit der Nummer %s.\n\nBeide Karten können verwendet werden, um Geld aus dieser Wallet zu versenden.</string>
@ -626,6 +748,9 @@
<string name="twins_recreate_warning">Diese Aktion ist unumkehrbar. Du hast keinen Zugriff mehr auf die alte Wallet.</string>
<string name="twins_scan_twin_with_number">Tippe auf die Doppelkarte mit der Nummer %s und entferne sie erst am Ende des Vorgangs.</string>
<string name="unlock_wallet_description_full">Verwende %s oder scanne eine Karte, um Zugriff auf deine Wallet zu erhalten.</string>
<string name="user_push_notification_agreement_argument_one">Bleib auf dem Laufenden mit den neuesten Funktionen und Neuigkeiten</string>
<string name="user_push_notification_agreement_argument_two">Sei der Erste, der von neuen Aktionen erfährt</string>
<string name="user_push_notification_agreement_header">Möchtest du Push-Benachrichtigungen verwenden?</string>
<string name="user_wallet_list_add_button">Neues Wallet hinzufügen</string>
<string name="user_wallet_list_delete_prompt">Möchtest du diese Wallet wirklich löschen?</string>
<string name="user_wallet_list_error_unable_to_unlock">Es ist ein Fehler aufgetreten, bitte scanne deine Karte, um sich anzumelden</string>
@ -667,6 +792,7 @@
<string name="wallet_connect_sessions_title">WalletConnect-Sitzungen</string>
<string name="wallet_connect_subtitle">Mit dApps verbinden</string>
<string name="wallet_connect_title">WalletConnect</string>
<string name="wallet_connect_toast_awaiting_session_proposal">Das Herstellen der Verbindung kann einige Sekunden dauern</string>
<string name="wallet_marketplace_block_title">%s Marktpreis</string>
<string name="wallet_marketprice_block_update_time">letzte 24h</string>
<string name="wallet_network_group_title">%s Netzwerk</string>
@ -675,6 +801,7 @@
<string name="wallet_settings_title">Wallet-Einstellungen</string>
<string name="wallet_title">Tangem</string>
<string name="warning_access_denied_message">Verwende %s oder scanne eine Karte, um den Zugriff auf deine Wallet freizuschalten.</string>
<string name="warning_backup_errors_message">Es scheint, dass die Aktivierung der Karte nicht korrekt abgeschlossen wurde. Dies kann an einem Problem mit dem NFC-Modul deines Gerätes oder an einem falschen Tippen der Karte auf dein Gerät liegen. Bitte wende dich an unser Support-Team, um Unterstützung zu erhalten.</string>
<string name="warning_backup_errors_title">Aktivierungsfehler</string>
<string name="warning_beacon_chain_retirement_content">Laut den Entwicklern des BNB-Netzes wird die Unterstützung für den BEP-2-Standard im Juni 2024 enden. Um den Verlust von Vermögenswerten mit diesem Standard zu vermeiden, konvertiere bitte in den BEP-20 Standard. Nutze gerne unseren Swap-Service, um sie auf das BNB Smart Chain Netzwerk zu übertragen.</string>
<string name="warning_beacon_chain_retirement_title">BNB Beacon Chain wird abgeschaltet</string>

View file

@ -621,6 +621,7 @@
<string name="send_total_subtitle_fiat_format">≈ %1$s (%2$s: 手数料を含む)</string>
<string name="send_total_subtitle_format">%sが送信されます</string>
<string name="send_transaction_success">取引は正常に署名され、ブロックチェーンノードに送信されました。ウォレットの残高はしばらくして更新されます。</string>
<string name="send_tron_account_activation_error">%1sはTronネットワークのアセットです。手数料を計算して取引を行うには、アカウントにTronTRXを入金する必要があります。</string>
<string name="send_validation_invalid_address">無効なアドレス</string>
<string name="send_wallet_balance_format">%1$s ( %2$s )</string>
<string name="sent_transaction_sent_title">取引が送信されました</string>
@ -788,6 +789,7 @@
<string name="wallet_settings_title">ウォレット設定</string>
<string name="wallet_title">Tangem</string>
<string name="warning_access_denied_message">%sを使用するか、カードをスキャンしてウォレットにアクセスしてください</string>
<string name="warning_backup_errors_message">カードのアクティベーションが正しく完了しませんでした。デバイスの NFCモジュールに問題があるか、カードをデバイスに正しくタップしていないことが原因かもしれません。サポートチームにお問い合わせください。</string>
<string name="warning_backup_errors_title">アクティベーションに失敗しました</string>
<string name="warning_beacon_chain_retirement_content">BNBネットワーク開発者によると、BEP-2規格のサポートは2024年6月に終了します。この規格の資産を失わないために、BEP-20規格に変換してください。BNBスマートチェーンネットワークへ移行するには、Tangemのスワップサービスをご利用ください。</string>
<string name="warning_beacon_chain_retirement_title">BNBビーコンチェーンは閉鎖されます。</string>

View file

@ -124,6 +124,7 @@
<string name="common_origin_card">Основная карта</string>
<string name="common_passphrase">Парольная фраза</string>
<string name="common_paste">Вставить</string>
<string name="common_range">%1$s-%2$s</string>
<string name="common_read_more">Подробнее</string>
<string name="common_receive">Получить</string>
<string name="common_reject">Отклонить</string>
@ -564,16 +565,18 @@
<string name="send_total_subtitle_fiat_format">≈ %1$s (вкл. комиссию: %2$s)</string>
<string name="send_total_subtitle_format">%s будет отправлено</string>
<string name="send_transaction_success">Транзакция успешно подписана и отправлена в блокчейн. Баланс будет обновлен через некоторое время</string>
<string name="send_tron_account_activation_error">%1$s — это монета в сети Tron. Чтобы рассчитать комиссию и совершить транзакцию, вам необходимо внести немного Tron (TRX) на свой адрес.</string>
<string name="send_tron_account_activation_error">%1s — это монета в сети Tron. Чтобы рассчитать комиссию и совершить транзакцию, вам необходимо внести немного Tron (TRX) на свой адрес.</string>
<string name="send_validation_invalid_address">Неверный адрес</string>
<string name="sent_transaction_sent_title">Транзакция отправлена</string>
<string name="settings_card_settings_footer">Подготовьтесь к сканированию карты, которую вы хотите настроить.</string>
<string name="settings_forget_wallet">Забыть кошелек</string>
<string name="settings_forget_wallet_footer">Это приведет к удалению кошелька из приложения. Сам кошелек можно добавить снова.</string>
<string name="settings_wallet_name_title">Имя</string>
<string name="staking_amount_requirement_error">Сумма для стейкинда должна быть не менее %s</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_apy_info">Годовой процентный доход, который вы можете получить от участия в стейкинге.</string>
<string name="staking_details_available">Доступно</string>
<string name="staking_details_estimated_profit">%s</string>
<string name="staking_details_reward_claiming">Способ возраграждения</string>
<string name="staking_details_reward_claiming_info">Способ получения вознаграждений за стейкинг. Он может быть автоматическим или ручным.</string>
<string name="staking_details_reward_schedule">Период возрагражения</string>

View file

@ -39,6 +39,7 @@
<string name="biometric_lockout_warning_title">Забагато спроб</string>
<string name="biometric_unavailable_warning">Ви вимкнули біометричну автентифікацію на своєму телефоні і не зможете зберігати гаманці в додатку. Щоб зберегти гаманці, будь ласка, увімкніть функцію біометричної автентифікації в налаштуваннях телефону.</string>
<string name="button_start_backup_process">Почніть процес резервного копіювання</string>
<string name="buy_token_description">З вашої фіатної картки або банківського рахунку</string>
<plurals name="card_label_card_count">
<item quantity="one">%d картка</item>
<item quantity="few">%d картки</item>
@ -83,6 +84,7 @@
<string name="common_buy_currency">Перейдіть до %1$s</string>
<string name="common_camera_denied_alert_message">Ви не надали доступ до камери, будь ласка, змініть налаштування конфіденційності</string>
<string name="common_cancel">Скасувати</string>
<string name="common_claim_rewards">Отримати винагороди</string>
<string name="common_close">Закрити</string>
<string name="common_continue">Продовжити</string>
<string name="common_copy">Копіювати</string>
@ -159,6 +161,7 @@
<string name="common_understand">Я зрозумів</string>
<string name="common_unknown_error">Виникла помилка. Будь ласка, спробуйте ще раз.</string>
<string name="common_unreachable">Недоступно</string>
<string name="common_unstake">Скасувати стейкінг</string>
<string name="common_yes">Так</string>
<string name="contract_address_copied_message">Адреса контракту скопійована!</string>
<string name="currency_subtitle_expanded">Доступні мережі</string>
@ -246,6 +249,7 @@
<string name="express_exchange_status_subtitle">Дані провайдера. Орієнтовна сума може бути змінена через ринкові умови.</string>
<string name="express_exchange_status_title">Статус обміну</string>
<string name="express_exchange_status_verifying">Потрібна верифікація</string>
<string name="express_exchange_status_waiting_tx_hash">Очікування хешу транзакції</string>
<string name="express_exchange_token_list_subtitle">Список токенів у вашому гаманцю</string>
<string name="express_fetch_best_rates">Шукаємо найвигідніший курс...</string>
<string name="express_floating_rate">Плаваюча ставка</string>
@ -259,10 +263,12 @@
<string name="express_provider_min_amount">Доступно від %s</string>
<string name="express_provider_not_available">Недоступно для цієї пари</string>
<string name="express_provider_permission_needed">Потрібен дозвіл</string>
<string name="express_provider_recommended">Рекомендовано</string>
<string name="express_terms_of_use">Умовами використання</string>
<string name="express_token_list_empty_search">Токенів не знайдено. Будь ласка, спробуйте інший запит</string>
<string name="express_transaction_id">ID: %s</string>
<string name="express_transaction_id_copied">ID транзакції скопійовано</string>
<string name="exсhange_token_description">З іншої валюти у вашому гаманці</string>
<string name="feedback_data_collection_message">Інформація нижче не є обов\'язковою. Ви можете стерти її, якщо бажаєте.</string>
<string name="feedback_preface_rate_negative">Розкажіть, яких функцій вам не вистачає, і ми спробуємо вам допомогти.</string>
<string name="feedback_preface_scan_failed">Розкажіть, будь ласка, яку картку ви маєте?</string>
@ -277,6 +283,8 @@
<string name="give_permission_fee_footer">Мережа стягує комісію за схвалення токену за підтвердження, що саме ви дозволяєте використовувати ваш токен для обміну.</string>
<string name="give_permission_policy_type_footer">Вкажіть ліміт доступу для обраного токена</string>
<string name="give_permission_rows_amount">Кількість %s</string>
<string name="give_permission_staking_footer">Функція підтвердження необхідна для надання дозволу іншій адресі на використання певної кількості ваших токенів. За задумом, смарт-контракти не можуть отримати доступ до ваших токенів без вашого схвалення. \"Розблоковуючи\" свої токени, ви дозволяєте смарт-контракту StakeKit використовувати їх. Майнери мережі отримують плату за газ (сплачену вами), щоб зафіксувати цю дію в блокчейні. Ви зможете застейкати свій токен після того, як дасте дозвіл.</string>
<string name="give_permission_staking_subtitle">Щоб продовжити, вам потрібно дозволити смарт-контракту StakeKit використовувати ваш %s</string>
<string name="give_permission_swap_subtitle" formatted="false">Щоб продовжити, вам потрібно надати дозвіл смарт-контракту %1s використовувати ваш %2s</string>
<string name="give_permission_title">Надати дозвіл</string>
<string name="give_permission_unlimited">Необмежено</string>
@ -332,20 +340,73 @@
<string name="markets_add_to_my_portfolio_description">Щоб почати купувати, обмінювати або отримувати цей актив, додайте цей токен принаймні в 1 мережу</string>
<string name="markets_add_to_my_portfolio_unavailable_description">Цей актив недоступний</string>
<string name="markets_add_to_portfolio_button">Додати в портфоліо</string>
<string name="markets_add_token">Додати токен</string>
<string name="markets_available_networks">Доступні мережі</string>
<string name="markets_common_my_portfolio">Моє портфоліо</string>
<string name="markets_common_title">Маркет</string>
<string name="markets_generate_addresses_notification">Щоб згенерувати адреси для обраних мереж, потрібно прикласти картку Tangem</string>
<string name="markets_loading_error_title">Не вдалося завантажити дані...</string>
<string name="markets_quick_actions">Швидкі дії</string>
<string name="markets_search_result_title">Результат</string>
<string name="markets_search_see_tokens_under_100k">Переглянути токени до 100к ринкової капіталізації</string>
<string name="markets_search_show_tokens">Показати токени</string>
<string name="markets_search_token_no_result_title">Жодного результату</string>
<string name="markets_select_network">Виберіть мережу</string>
<string name="markets_select_wallet">Оберіть гаманець</string>
<string name="markets_selector_interval_1m_title">1 міс.</string>
<string name="markets_selector_interval_1y_title">1 рік</string>
<string name="markets_selector_interval_24h_title">24 год.</string>
<string name="markets_selector_interval_3m_title">3 міс.</string>
<string name="markets_selector_interval_6m_title">6 міс.</string>
<string name="markets_selector_interval_7d_title">7 днів</string>
<string name="markets_selector_interval_all_title">Увесь</string>
<string name="markets_sort_by_experienced_buyers_title">Досвідчені покупці</string>
<string name="markets_sort_by_rating_title">За рейтингом</string>
<string name="markets_sort_by_title">Сортувати за</string>
<string name="markets_sort_by_top_gainers_title">Лідери росту</string>
<string name="markets_sort_by_top_losers_title">Лідери падіння</string>
<string name="markets_sort_by_trending_title">В тренді</string>
<string name="markets_token_details_about_token_title">Про %s</string>
<plurals name="markets_token_details_based_on_ratings">
<item quantity="one">На основі %d оцінки</item>
<item quantity="few">На основі %d оцінок</item>
<item quantity="many">На основі %d оцінок</item>
<item quantity="other">На основі %d оцінок</item>
</plurals>
<string name="markets_token_details_blockchain_site">Блокчейн сайт</string>
<string name="markets_token_details_buy_pressure">Давлення покупця</string>
<string name="markets_token_details_buy_pressure_description">Різниця між обсягом покупців та обсягом продавців</string>
<string name="markets_token_details_circulating_supply">Циркуляційний запас</string>
<string name="markets_token_details_circulating_supply_description">Загальна кількість монет, які доступні для торгівлі та перебувають в обігу на ринку</string>
<string name="markets_token_details_experienced_buyers">Досвідчені покупці</string>
<string name="markets_token_details_experienced_buyers_description">Мережеві покупці з додатковою вимогою мати не менше 100 вихідних транзакцій</string>
<string name="markets_token_details_fully_diluted_valuation">Повністю розведена ринкова капіталізація</string>
<string name="markets_token_details_fully_diluted_valuation_description">Загальна теоретична вартість криптовалюти, якщо всі монети, які могли б існувати, перебувають в обігу, включаючи ті, що не перебувають в обігу в даний час</string>
<string name="markets_token_details_genesis_date">Дата створення</string>
<string name="markets_token_details_high">Високий</string>
<string name="markets_token_details_holders">Тримачі</string>
<string name="markets_token_details_holders_description">Зміна кількості власників токенів протягом певного періоду часу</string>
<string name="markets_token_details_insights">Інсайти</string>
<string name="markets_token_details_links">Посилання</string>
<string name="markets_token_details_liquidity">Ліквідність</string>
<string name="markets_token_details_liquidity_description">Зміна того, скільки ліквідності доступно для токена протягом зазначеного періоду часу</string>
<string name="markets_token_details_liquidity_index">Індекс ліквідності</string>
<string name="markets_token_details_low">Низький</string>
<string name="markets_token_details_market_capitalization">Ринкова капіталізація</string>
<string name="markets_token_details_market_capitalization_description">Загальна ринкова вартість криптовалюти, що розраховується шляхом множення поточної ціни монети на загальну кількість монет в обігу</string>
<string name="markets_token_details_market_rating">Рейтинг ринку</string>
<string name="markets_token_details_market_rating_description">Позиція в крипторейтингу між усіма монетами на основі ринкової капіталізації</string>
<string name="markets_token_details_max_supply">Максимальна пропозиція</string>
<string name="markets_token_details_metrics">Метрики</string>
<string name="markets_token_details_official_links">Офіційні посилання</string>
<string name="markets_token_details_price_performance">Цінова ефективність</string>
<string name="markets_token_details_repository">Репозиторій</string>
<string name="markets_token_details_security_score">Оцінка безпеки</string>
<string name="markets_token_details_social">Соцмережі</string>
<string name="markets_token_details_total_supply">Загальна пропозиція</string>
<string name="markets_token_details_total_supply_description">Максимальна кількість монет або токенів, яка може коли-небудь існувати для певної криптовалюти</string>
<string name="markets_token_details_trading_volume">Обсяг торгів (24г)</string>
<string name="markets_token_details_trading_volume_24h_description">Загальна сума криптовалюти, якою торгували протягом останніх 24 годин, що вказує на рівень активності та ліквідності на ринку</string>
<string name="onboarding_access_code_feature_1_description">Вам потрібно встановити єдиний код доступу для захисту всіх ваших карток</string>
<string name="onboarding_access_code_feature_1_title">Захист</string>
<string name="onboarding_access_code_feature_2_description">Пізніше ви зможете налаштувати індивідуальний код доступу до кожної картки</string>
@ -450,6 +511,7 @@
<string name="qr_scanner_camera_denied_title">Доступ до камери заборонено</string>
<string name="receive_bottom_sheet_warning_message">%1$s (%2$s) у мережі %3$s</string>
<string name="receive_bottom_sheet_warning_message_full">Надсилайте лише %s на цю адресу. Надсилання будь-якої іншої валюти призведе до її незворотної втрати.</string>
<string name="receive_token_description">Покажіть QR-код або поділіться своєю адресою</string>
<string name="referral_button_participate">Взяти участь</string>
<string name="referral_error_failed_to_load_info">Не вдалося завантажити інформацію по реферальній програмі. Будь ласка, спробуйте пізніше.</string>
<string name="referral_error_failed_to_load_info_with_reason">Не вдалося завантажити інформацію по реферальній програмі. Код помилки: %s. Будь ласка, спробуйте пізніше.</string>
@ -583,6 +645,7 @@
<string name="send_total_subtitle_fiat_format">≈ %1$s (вкл. комісію: %2$s )</string>
<string name="send_total_subtitle_format">%s буде надіслано</string>
<string name="send_transaction_success">Транзакція успішно підписана і відправлена до блокчейну. Баланс гаманця буде оновлено через деякий час</string>
<string name="send_tron_account_activation_error">%1s — це монета у мережі Tron. Щоб розрахувати комісію та здійснити транзакцію, вам необхідно внести певну кількість Tron(TRX) на свій рахунок.</string>
<string name="send_validation_invalid_address">Недійсна адреса</string>
<string name="send_wallet_balance_format">%1$s (%2$s)</string>
<string name="sent_transaction_sent_title">Трансакцію надіслано</string>
@ -640,6 +703,7 @@
<string name="swapping_alert_title">Комісії</string>
<string name="swapping_approve_information_text">Всі децентралізовані біржі вимагають схвалення, щоб запобігти доступу смарт-контрактів до вашого гаманця без вашого дозволу. За задумом смарт-контракти не можуть отримати доступ до ваших токенів без вашого схвалення. \"Розблоковуючи\" свої токени, ви дозволяєте смарт-контракту 1inch витрачати ваші активи. Майнери мережі отримують плату за газ (сплачену вами), щоб зафіксувати цю дію в блокчейні. Ви можете обміняти свій токен після того, як дасте дозвіл.</string>
<string name="swapping_approve_information_title">Підтвердити</string>
<string name="swapping_fee_estimation_error_text">Помилка при розрахунку комісії. Будь ласка, надішліть відгук до служби підтримки.</string>
<string name="swapping_from_title">Ви обмінюєте</string>
<string name="swapping_high_price_impact_description">Обмін цієї кількості обраних токенів призведе до значного впливу на ціну і зменшить вашу кінцеву суму.</string>
<string name="swapping_insufficient_funds">Недостатньо коштів</string>
@ -697,6 +761,7 @@
<string name="twins_scan_twin_with_number">Прикладіть twin-картку з номером %s та не прибирайте її до завершення операції</string>
<string name="unlock_wallet_description_full">Використовуйте %s або відскануйте картку, щоб отримати доступ до свого гаманця</string>
<string name="user_push_notification_agreement_argument_one">Будьте в курсі останніх функцій та новин</string>
<string name="user_push_notification_agreement_argument_two">Дізнавайтеся першими про нові акції</string>
<string name="user_push_notification_agreement_header">Бажаєте використовувати Push-повідомлення?</string>
<string name="user_wallet_list_add_button">Додати новий гаманець</string>
<string name="user_wallet_list_delete_prompt">Ви впевнені, що хочете видалити цей гаманець?</string>
@ -748,6 +813,7 @@
<string name="wallet_settings_title">Налаштування гаманця</string>
<string name="wallet_title">Tangem</string>
<string name="warning_access_denied_message">Використовуйте %s або відскануйте картку, щоб розблокувати доступ до гаманця</string>
<string name="warning_backup_errors_message">Схоже, що активація картки була виконана неправильно. Це може бути пов\'язано з проблемою з модулем NFC вашого пристрою або неправильним прикладанням картки до пристрою. Зверніться за допомогою до нашої служби підтримки.</string>
<string name="warning_backup_errors_title">Помилка активації</string>
<string name="warning_beacon_chain_retirement_content">За рішенням розробників мережі BNB стандарт BEP-2 перестане підтримуватись у червні 2024 року. Щоб не втратити свої активи, їх необхідно конвертувати у стандарт BEP-20. Використовуйте функцію обміну, щоб перевести їх у мережу BNB Smart Chain.</string>
<string name="warning_beacon_chain_retirement_title">Відключення мережі BNB Beacon Chain</string>

View file

@ -82,6 +82,7 @@
<string name="common_buy_currency">Go to %1$s</string>
<string name="common_camera_denied_alert_message">You have not given access to your camera, please adjust your privacy settings</string>
<string name="common_cancel">Cancel</string>
<string name="common_claim_rewards">Claim rewards</string>
<string name="common_close">Close</string>
<string name="common_continue">Continue</string>
<string name="common_copy">Copy</string>
@ -156,6 +157,7 @@
<string name="common_understand">I understand</string>
<string name="common_unknown_error">There was an error. Please try again.</string>
<string name="common_unreachable">Unreachable</string>
<string name="common_unstake">Unstake</string>
<string name="common_yes">Yes</string>
<string name="contract_address_copied_message">Contract address copied!</string>
<string name="currency_subtitle_expanded">Available networks</string>
@ -637,6 +639,7 @@
<string name="settings_wallet_name_title">Name</string>
<string name="staking_active">Active</string>
<string name="staking_active_footer">To unstake your assets, click here.</string>
<string name="staking_amount_requirement_error">The amount to stake must be at least %s</string>
<string name="staking_details_apr">APR</string>
<string name="staking_details_apy">APY</string>
<string name="staking_details_apy_info">The annual percentage return you can earn from participating in staking.</string>

View file

@ -39,14 +39,18 @@ class YieldConverter(
private fun convertEnter(enterDTO: YieldDTO.ArgsDTO.Enter): Yield.Args.Enter {
return Yield.Args.Enter(
addresses = convertAddresses(enterDTO.addresses),
args = enterDTO.args.mapValues { convertAddressArgument(it.value) },
args = enterDTO.args
.mapKeys { convertArgType(it.key) }
.mapValues { convertAddressArgument(it.value) },
)
}
private fun convertAddresses(addressesDTO: YieldDTO.ArgsDTO.Enter.Addresses): Yield.Args.Enter.Addresses {
return Yield.Args.Enter.Addresses(
address = convertAddressArgument(addressesDTO.address),
additionalAddresses = addressesDTO.additionalAddresses?.mapValues { convertAddressArgument(it.value) },
additionalAddresses = addressesDTO.additionalAddresses
?.mapKeys { convertArgType(it.key) }
?.mapValues { convertAddressArgument(it.value) },
)
}
@ -122,4 +126,12 @@ class YieldConverter(
else -> Yield.RewardType.UNKNOWN
}
}
private fun convertArgType(value: String): Yield.Args.ArgType {
return when (value) {
"address" -> Yield.Args.ArgType.ADDRESS
"amount" -> Yield.Args.ArgType.AMOUNT
else -> Yield.Args.ArgType.UNKNOWN
}
}
}

View file

@ -33,15 +33,21 @@ data class Yield(
@Serializable
data class Enter(
val addresses: Addresses,
val args: Map<String, AddressArgument>,
val args: Map<ArgType, AddressArgument>,
) {
@Serializable
data class Addresses(
val address: AddressArgument,
val additionalAddresses: Map<String, AddressArgument>? = null,
val additionalAddresses: Map<ArgType, AddressArgument>? = null,
)
}
enum class ArgType {
ADDRESS,
AMOUNT,
UNKNOWN,
}
}
@Serializable
@ -113,6 +119,6 @@ data class Token(
data class AddressArgument(
val required: Boolean,
val network: String? = null,
val minimum: Double? = null,
val maximum: Double? = null,
val minimum: SerializedBigDecimal? = null,
val maximum: SerializedBigDecimal? = null,
)

View file

@ -127,7 +127,7 @@ internal class SetInitialDataStateTransformer(
startText = TextReference.Res(R.string.staking_details_minimum_requirement),
endText = TextReference.Str(
value = BigDecimalFormatter.formatCryptoAmount(
cryptoAmount = yield.args.enter.args[KEY_AMOUNT]?.minimum?.toBigDecimal(),
cryptoAmount = yield.args.enter.args[Yield.Args.ArgType.AMOUNT]?.minimum,
cryptoCurrency = cryptoCurrencyStatus.currency.symbol,
decimals = cryptoCurrencyStatus.currency.decimals,
),
@ -191,6 +191,5 @@ internal class SetInitialDataStateTransformer(
companion object {
private val EQUALITY_THRESHOLD = BigDecimal(1E-10)
private const val KEY_AMOUNT = "amount"
}
}

View file

@ -1,18 +1,33 @@
package com.tangem.features.staking.impl.presentation.state.transformers.amount
import com.tangem.common.ui.amountScreen.converters.field.AmountFieldChangeTransformer
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.utils.transformer.Transformer
internal class AmountChangeStateTransformer(
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
private val yield: Yield,
private val value: String,
) : Transformer<StakingUiState> {
private val amountRequirementStateTransformer by lazy(LazyThreadSafetyMode.NONE) {
AmountRequirementStateTransformer(
cryptoCurrencyStatus,
yield,
value,
)
}
override fun transform(prevState: StakingUiState): StakingUiState {
val updatedAmountState = AmountFieldChangeTransformer(
cryptoCurrencyStatus,
value,
).transform(prevState.amountState)
return prevState.copy(
amountState = AmountFieldChangeTransformer(cryptoCurrencyStatus, value).transform(prevState.amountState),
amountState = amountRequirementStateTransformer.transform(updatedAmountState),
)
}
}

View file

@ -1,16 +1,32 @@
package com.tangem.features.staking.impl.presentation.state.transformers.amount
import com.tangem.common.ui.amountScreen.converters.field.AmountFieldMaxAmountTransformer
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.utils.transformer.Transformer
internal class AmountMaxValueStateTransformer(
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
private val yield: Yield,
) : Transformer<StakingUiState> {
private val amountRequirementStateTransformer by lazy(LazyThreadSafetyMode.NONE) {
val value = cryptoCurrencyStatus.value.amount
?.parseBigDecimal(cryptoCurrencyStatus.currency.decimals)
.orEmpty()
AmountRequirementStateTransformer(
cryptoCurrencyStatus,
yield,
value,
)
}
override fun transform(prevState: StakingUiState): StakingUiState {
val updatedAmountState = AmountFieldMaxAmountTransformer(cryptoCurrencyStatus).transform(prevState.amountState)
return prevState.copy(
amountState = AmountFieldMaxAmountTransformer(cryptoCurrencyStatus).transform(prevState.amountState),
amountState = amountRequirementStateTransformer.transform(updatedAmountState),
)
}
}

View file

@ -0,0 +1,55 @@
package com.tangem.features.staking.impl.presentation.state.transformers.amount
import com.tangem.common.extensions.isZero
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.utils.BigDecimalFormatter
import com.tangem.core.ui.utils.parseToBigDecimal
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.staking.impl.R
import com.tangem.utils.transformer.Transformer
internal class AmountRequirementStateTransformer(
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
private val yield: Yield,
private val value: String,
) : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
val amountRequirements = yield.args.enter.args[Yield.Args.ArgType.AMOUNT]
val amountDecimal = value.parseToBigDecimal(cryptoCurrencyStatus.currency.decimals)
return if (prevState !is AmountState.Data || amountRequirements == null) {
prevState
} else {
val isAlreadyErrorState = prevState.amountTextField.isError
val isAmountRequired = amountRequirements.required
val isAmountZero = amountDecimal.isZero()
val isExceedsRequirements =
amountRequirements.maximum?.compareTo(amountDecimal) == -1 ||
amountRequirements.minimum?.compareTo(amountDecimal) == 1
val isRequirementError = !isAmountZero && isAmountRequired && isExceedsRequirements && !isAlreadyErrorState
if (isRequirementError) {
prevState.copy(
amountTextField = prevState.amountTextField.copy(
isError = true,
error = resourceReference(
R.string.staking_amount_requirement_error,
wrappedList(
BigDecimalFormatter.formatCryptoAmount(
amountRequirements.minimum,
cryptoCurrencyStatus.currency.symbol,
cryptoCurrencyStatus.currency.decimals,
),
),
),
),
)
} else {
prevState
}
}
}
}

View file

@ -67,7 +67,7 @@ internal fun StakingInitialInfoContent(state: StakingStates.InitialInfoState, cl
)
}
}
AnimatedContent(targetState = state.yieldBalance, label = "Rewards block visibility animation") {
AnimatedContent(targetState = state.yieldBalance, label = "Staking yield visibility animation") {
if (it is InnerYieldBalanceState.Data) {
ActiveStakingBlock(it.balance, clickIntents::onActiveStake)
}
@ -168,6 +168,7 @@ private fun StakingRewardBlock(
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(),
enabled = isRewardsToClaim,
onClick = onRewardsClick,
),
)
@ -192,18 +193,20 @@ private fun ActiveStakingBlock(groups: List<BalanceGroupedState>, onClick: (Bala
) {
group.items.forEachIndexed { index, balance ->
key(balance.validator.address) {
val caption = combinedReference(
if (group.type == BalanceGroupType.UNSTAKED) {
resourceReference(R.string.staking_details_unbonding_period)
val caption = if (group.type == BalanceGroupType.UNSTAKED) {
combinedReference(
resourceReference(R.string.staking_details_unbonding_period),
annotatedReference {
appendSpace()
appendColored(
text = balance.unbondingPeriod.resolveReference(),
color = TangemTheme.colors.text.accent,
)
}
} else {
resourceReference(R.string.app_name)
},
)
} else {
combinedReference(
resourceReference(R.string.app_name),
annotatedReference {
appendSpace()
appendColored(
@ -213,9 +216,9 @@ private fun ActiveStakingBlock(groups: List<BalanceGroupedState>, onClick: (Bala
),
color = TangemTheme.colors.text.accent,
)
}
},
)
},
)
}
InputRowImageInfo(
title = group.title.takeIf { index == 0 },
subtitle = stringReference(balance.validator.name),

View file

@ -148,17 +148,10 @@ private fun getButtonData(currentState: StakingUiState): Int {
private fun onPrimaryClick(currentState: StakingUiState) {
when (currentState.currentStep) {
StakingStep.InitialInfo -> {
val initialState = currentState.initialInfoState as? StakingStates.InitialInfoState.Data
if (initialState?.yieldBalance is InnerYieldBalanceState.Data) {
if (initialState.isStakeMoreAvailable) {
currentState.clickIntents.onNextClick()
}
} else {
currentState.clickIntents.onNextClick()
}
}
StakingStep.Amount -> currentState.clickIntents.onNextClick()
StakingStep.InitialInfo,
StakingStep.Validators,
StakingStep.Amount,
-> currentState.clickIntents.onNextClick()
StakingStep.Confirmation -> {
val confirmationState = currentState.confirmationState
if (confirmationState is StakingStates.ConfirmationState.Data) {
@ -171,7 +164,6 @@ private fun onPrimaryClick(currentState: StakingUiState) {
currentState.clickIntents.onBackClick()
}
}
StakingStep.Validators -> currentState.clickIntents.onNextClick()
StakingStep.RewardsValidators -> Unit
}
}

View file

@ -196,7 +196,7 @@ internal class StakingViewModel @Inject constructor(
}
override fun onAmountValueChange(value: String) {
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, value))
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, yield, value))
}
override fun onAmountPasteTriggerDismiss() {
@ -204,7 +204,7 @@ internal class StakingViewModel @Inject constructor(
}
override fun onMaxValueClick() {
stateController.update(AmountMaxValueStateTransformer(cryptoCurrencyStatus))
stateController.update(AmountMaxValueStateTransformer(cryptoCurrencyStatus, yield))
}
override fun onCurrencyChangeClick(isFiat: Boolean) {
@ -223,7 +223,7 @@ internal class StakingViewModel @Inject constructor(
}
override fun selectRewardValidator(rewardValue: String) {
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, rewardValue))
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, yield, rewardValue))
onNextClick()
}
@ -234,7 +234,7 @@ internal class StakingViewModel @Inject constructor(
RouteType.OTHER
}
stateController.update { it.copy(routeType = routeType) }
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, activeStake.cryptoValue))
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, yield, activeStake.cryptoValue))
onNextClick(activeStake.pendingActions)
}