Updated on 2026-08-14
This commit is contained in:
commit
dca398ca95
12 changed files with 359 additions and 145 deletions
|
|
@ -51,18 +51,23 @@
|
|||
property to make the "android:screenOrientation" work on API <37
|
||||
https://developer.android.com/about/versions/16/behavior-changes-16
|
||||
-->
|
||||
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
|
||||
<property
|
||||
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
|
||||
android:value="true" />
|
||||
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.wallet.api.enabled"
|
||||
android:value="true" />
|
||||
|
||||
<!--
|
||||
Use android:launchMode="singleInstance" to ensure a single MainActivity instance in its own task;
|
||||
Prevents duplicate launches from deep links/external intents
|
||||
-->
|
||||
<activity
|
||||
android:name="com.tangem.tap.MainActivity"
|
||||
android:configChanges="uiMode"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:launchMode="singleInstance"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/SplashTheme"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 7d225a195eb001f9f4ce88aa4a6fa2d965b9159c
|
||||
Subproject commit d3ba082fadbdb583a45cc1c714c57b382cbbe6ef
|
||||
|
|
@ -89,6 +89,7 @@ internal class DeepLinkFactory @Inject constructor(
|
|||
AppRoute.Initial,
|
||||
AppRoute.Home,
|
||||
is AppRoute.Welcome,
|
||||
is AppRoute.PushNotification,
|
||||
is AppRoute.Disclaimer,
|
||||
is AppRoute.Stories,
|
||||
is AppRoute.Onboarding,
|
||||
|
|
|
|||
|
|
@ -4,11 +4,44 @@
|
|||
<string name="access_code_alert_skip_ok">Trotzdem überspringen</string>
|
||||
<string name="access_code_alert_skip_title">Zugangscode nicht festgelegt</string>
|
||||
<string name="access_code_check_title">Zugangscode eingeben</string>
|
||||
<string name="access_code_check_warining_delete">Falscher Zugangscode. Deine Hot-Wallet wird nach %s weiteren Fehlversuchen gelöscht.</string>
|
||||
<string name="access_code_check_warining_lock">Falscher Zugangscode. App wird bei %s weiteren Eingabefehlern gesperrt</string>
|
||||
<string name="access_code_check_warining_wait">Falscher Zugangscode.\nBitte warte %s Sekunden und versuche es erneut.</string>
|
||||
<string name="access_code_confirm_description">Bestätige Deinen zuvor eingegebenen Code, um fortzufahren</string>
|
||||
<string name="access_code_confirm_title">Zugangscode erneut eingeben</string>
|
||||
<string name="access_code_create_description">Lege einen %s -stelligen Zugangscode fest, um Deine Wallet zu entsperren.</string>
|
||||
<string name="access_code_create_title">Zugangscode erstellen</string>
|
||||
<string name="access_code_navtitle">Zugangscode</string>
|
||||
<string name="account_add_limit_dialog_description">Du kannst nicht mehr erstellen als %1$s Konto/Konten. Archiviere eines, um es neu hinzuzufügen.</string>
|
||||
<string name="account_add_limit_dialog_title">Neues Konto kann nicht hinzugefügt werden</string>
|
||||
<string name="account_archive_success_message">Konto archiviert</string>
|
||||
<string name="account_archived_accounts">Archivierte Konten</string>
|
||||
<string name="account_archived_recover">Wiederherstellen</string>
|
||||
<string name="account_archived_recover_dialog_description">Du bist dabei, dich zu erholen \"%1$s”.</string>
|
||||
<string name="account_archived_recover_dialog_title">Konto wiederherstellen</string>
|
||||
<string name="account_archived_title">Archiviert</string>
|
||||
<string name="account_create_success_message">Konto erstellt</string>
|
||||
<string name="account_details_archive">Archivkonto</string>
|
||||
<string name="account_details_archive_action">Archiv</string>
|
||||
<string name="account_details_archive_description">Du archivierst dieses Konto, kannst es aber jederzeit entarchivieren.</string>
|
||||
<string name="account_details_title">Konto</string>
|
||||
<string name="account_edit_success_message">Konto gespeichert</string>
|
||||
<string name="account_form_account_index">Kontonummer %s – wird zur Adressableitung verwendet.</string>
|
||||
<string name="account_form_create_button">Konto hinzufügen</string>
|
||||
<string name="account_form_edit_button">Speichern</string>
|
||||
<string name="account_form_name">Kontoname</string>
|
||||
<string name="account_form_placeholder_edit_account">Konto</string>
|
||||
<string name="account_form_placeholder_new_account">Neues Konto</string>
|
||||
<string name="account_form_title_create">Konto hinzufügen</string>
|
||||
<string name="account_form_title_edit">Konto bearbeiten</string>
|
||||
<string name="account_label_tokens_info">%1$s in %2$s</string>
|
||||
<string name="account_recover_success_message">Konto wiederhergestellt</string>
|
||||
<string name="account_reorder_description">Tippe lange auf ein Konto, um die Konten neu anzuordnen</string>
|
||||
<string name="account_unsaved_dialog_action_first">Weiter bearbeiten</string>
|
||||
<string name="account_unsaved_dialog_action_second">Verwerfen</string>
|
||||
<string name="account_unsaved_dialog_message_create">Bist Du sicher, dass Du das neue Konto verwerfen willst?</string>
|
||||
<string name="account_unsaved_dialog_message_edit">Bist Du sicher, dass Du die Bearbeitungen verwerfen willst?</string>
|
||||
<string name="account_unsaved_dialog_title">Nicht gespeicherte Änderungen</string>
|
||||
<string name="action_buttons_buy_empty_search_message">Du kannst Deinen Token nicht finden? Gehe zum Bereich „Markt“ auf der Hauptseite und fügen diesen zum kaufen im Portfolio hinzu.</string>
|
||||
<string name="action_buttons_sell_empty_search_message">Du kannst Deinen Token nicht finden? Gehe zum Bereich „Markt“ auf der Hauptseite und fügen diesen zum verkaufen im Portfolio hinzu.</string>
|
||||
<string name="action_buttons_sell_navigation_bar_title">Verkaufen</string>
|
||||
|
|
@ -43,12 +76,18 @@
|
|||
<string name="alert_manage_tokens_unsupported_message">Tokens im %1$s -Netzwerk werden von dieser Karte oder Ring aufgrund einer Firmware-Einschränkung nicht unterstützt.</string>
|
||||
<string name="alert_troubleshooting_scan_card_title">Hast du Probleme beim Scannen deiner Karte oder Ring?</string>
|
||||
<string name="alert_unsupported_card">Diese Karte oder Ring ist für die Zusammenarbeit mit Tangem nicht geeignet</string>
|
||||
<string name="app_settings_biometrics_footer">Verwenden %1$s, um Deine Wallet schnell und sicher zu entsperren und alle sensiblen Aktionen zu autorisieren, wie z. B. das Unterschreiben von Transaktionen. Für Hardware-Wallets benötigst Du weiterhin eine Karte zum signieren.</string>
|
||||
<string name="app_settings_default_fee">Standardgebühr</string>
|
||||
<string name="app_settings_default_fee_footer">Aktiviere die Option Standardgebühr, um die Transaktionsgebühren automatisch festzulegen und die Gebührenseite beim Senden von Geldern zu überspringen. Du kannst bei Bedarf jederzeit zu dieser Seite zurückkehren.</string>
|
||||
<string name="app_settings_enable_biometrics_description">Gehe zu den Einstellungen, um die biometrische Authentifizierung in der Tangem-App zu aktivieren</string>
|
||||
<string name="app_settings_enable_biometrics_title">Biometrische Authentifizierung aktivieren</string>
|
||||
<string name="app_settings_off_biometrics_alert_message">Wenn Du %1$s deaktivierst, musst Du Deinen Passcode eingeben, um die App zu entsperren und um mit Deiner Wallet zu interagieren.</string>
|
||||
<string name="app_settings_off_require_access_code_alert_message">Du wirst später nach dem Zugangscode Deiner Wallet gefragt, damit wir sie für die zukünftige Verwendung sicher aufbewahren können</string>
|
||||
<string name="app_settings_off_saved_access_code_alert_message">Dadurch werden alle gespeicherten Zugangscodes für die Wallet gelöscht. Jede weitere Operation mit der Wallet erfordert die Übermittlung des Zugangscodes.</string>
|
||||
<string name="app_settings_off_saved_wallet_alert_message">Durch das Entfernen der gespeicherten Geräte werden alle gespeicherten Wallets und deren Zugangscodes aus der App gelöscht.</string>
|
||||
<string name="app_settings_on_require_access_code_alert_message">Dadurch werden alle gespeicherten Wallet-Zugangscodes gelöscht. Für jede weitere Interaktion mit dem Wallet ist die Eingabe des Zugangscodes erforderlich.</string>
|
||||
<string name="app_settings_require_access_code">Zugangscode erforderlich</string>
|
||||
<string name="app_settings_require_access_code_footer">Mit dieser Option wird die biometrische Authentifizierung für vertrauliche Aktionen deaktiviert. Du musst Deinen Zugangscode jedes Mal eingeben, z. B. wenn Du eine Transaktion unterzeichnest.</string>
|
||||
<string name="app_settings_saved_access_codes">Zugangscode speichern</string>
|
||||
<string name="app_settings_saved_access_codes_footer">Bei Interaktionen mit deiner Karte oder Ring wird anstelle des Zugangscodes eine biometrische Authentifizierung abgefragt.</string>
|
||||
<string name="app_settings_saved_wallet">Behalte die Wallet in der App</string>
|
||||
|
|
@ -58,6 +97,14 @@
|
|||
<string name="app_settings_theme_mode_system">Systemstandard</string>
|
||||
<string name="app_settings_theme_selector_title">Thema</string>
|
||||
<string name="app_settings_title">App Einstellungen</string>
|
||||
<string name="auth_info_add_wallet_title">Wallet hinzufügen</string>
|
||||
<string name="auth_info_subtitle">Wähle eine Wallet zum Einloggen</string>
|
||||
<string name="auth_info_title">Willkommen zurück!</string>
|
||||
<plurals name="auth_wallet_hardware_description">
|
||||
<item quantity="one">%s Karte</item>
|
||||
<item quantity="other">%s Karten</item>
|
||||
</plurals>
|
||||
<string name="auth_wallet_mobile_description">Handy-Wallet</string>
|
||||
<string name="backup_complete_description">Du hast Deine Wallet erfolgreich gesichert.</string>
|
||||
<string name="backup_complete_seed_description">Diese Wörter können bei Verlust nicht wiederhergestellt werden. Bewahre diese an einem sicheren Ort auf.</string>
|
||||
<string name="backup_complete_title">Sicherung abgeschlossen</string>
|
||||
|
|
@ -81,6 +128,16 @@
|
|||
<string name="biometric_lockout_warning_description">Bitte versuche es in 30 Sekunden erneut oder scanne die Karte oder Ring</string>
|
||||
<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="bitcoin_promo_activation_error">Bei der Bearbeitung Deines Aktionscodes ist ein Fehler aufgetreten. Bitte versuche es später noch einmal.</string>
|
||||
<string name="bitcoin_promo_activation_error_title">Fehler bei der Aktivierung</string>
|
||||
<string name="bitcoin_promo_activation_success">Dein Promo-Code wurde erfolgreich aktiviert. Ein Bonus von 10 USDT in Bitcoin wird Deinem Konto innerhalb von 14 Tagen gutgeschrieben.</string>
|
||||
<string name="bitcoin_promo_activation_success_title">Promo-Code aktiviert</string>
|
||||
<string name="bitcoin_promo_already_activated">Dieser Aktionscode wurde bereits verwendet und kann nicht erneut aktiviert werden.</string>
|
||||
<string name="bitcoin_promo_already_activated_title">Code nicht verfügbar</string>
|
||||
<string name="bitcoin_promo_invalid_code">Dieser Aktionscode ist ungültig und kann nicht aktiviert werden.</string>
|
||||
<string name="bitcoin_promo_invalid_code_title">Ungültiger Code</string>
|
||||
<string name="bitcoin_promo_no_address">Für den Erhalt des Bonus ist eine Bitcoin-Adresse erforderlich. Bitte füge eine zu Deiner Wallet hinzu und starte die Aktivierung erneut.</string>
|
||||
<string name="bitcoin_promo_no_address_title">Bitcoin-Adresse erforderlich</string>
|
||||
<string name="button_start_backup_process">Backup-Prozess starten</string>
|
||||
<string name="buy_token_description">Verwende eine Bankkarte oder eine andere Zahlungsmethode</string>
|
||||
<plurals name="card_label_card_count">
|
||||
|
|
@ -116,6 +173,7 @@
|
|||
<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_accounts">Konten</string>
|
||||
<string name="common_add">Hinzufügen</string>
|
||||
<string name="common_add_to_portfolio">Zum Portfolio hinzufügen</string>
|
||||
<string name="common_add_token">Token hinzufügen</string>
|
||||
|
|
@ -168,6 +226,7 @@
|
|||
<item quantity="other">Tage</item>
|
||||
</plurals>
|
||||
<string name="common_delete">Entfernen</string>
|
||||
<string name="common_disable">Deaktivieren</string>
|
||||
<string name="common_disabled">Deaktiviert</string>
|
||||
<string name="common_disconnect">Trennen</string>
|
||||
<string name="common_done">Erledigt</string>
|
||||
|
|
@ -197,16 +256,23 @@
|
|||
<string name="common_in_progress">In Arbeit</string>
|
||||
<string name="common_later">Später</string>
|
||||
<string name="common_left">%1$s übrig</string>
|
||||
<string name="common_legacy_bitcoin_address">Legacy Bitcoin</string>
|
||||
<string name="common_locked">Gesperrt</string>
|
||||
<string name="common_main_network">Hauptnetz</string>
|
||||
<string name="common_month">monat</string>
|
||||
<string name="common_network_fee_title">Netzgebühr</string>
|
||||
<string name="common_network_fee_warning_content">Der überwiesene Betrag wird um %1$s (%2$s) gekürzt, um die gewählte Gebührenhöhe zu decken.</string>
|
||||
<plurals name="common_networks_count">
|
||||
<item quantity="one">%1$s Netzwerk</item>
|
||||
<item quantity="other">%1$s Netzwerke</item>
|
||||
</plurals>
|
||||
<string name="common_new_address">Neue Adresse</string>
|
||||
<string name="common_next">Weiter</string>
|
||||
<string name="common_nft">NFT</string>
|
||||
<string name="common_no">Nein</string>
|
||||
<string name="common_no_address">Keine Adresse</string>
|
||||
<string name="common_not_added">Nicht hinzugefügt</string>
|
||||
<string name="common_not_now">Nicht jetzt</string>
|
||||
<string name="common_now">Jetzt</string>
|
||||
<string name="common_ok">OK</string>
|
||||
<string name="common_open_in_browser">Im Browser öffnen</string>
|
||||
|
|
@ -222,6 +288,7 @@
|
|||
<string name="common_reject">Ablehnen</string>
|
||||
<string name="common_reload">Neu laden</string>
|
||||
<string name="common_rename">Umbenennen</string>
|
||||
<string name="common_required">Erforderlich</string>
|
||||
<string name="common_save">Speichern</string>
|
||||
<string name="common_save_changes">Änderungen speichern</string>
|
||||
<string name="common_search">Suchen</string>
|
||||
|
|
@ -249,6 +316,7 @@
|
|||
<string name="common_support">Unterstützung</string>
|
||||
<string name="common_supported_networks">Unterstützte Netzwerke</string>
|
||||
<string name="common_swap">Tauschen</string>
|
||||
<string name="common_tangem">Tangem</string>
|
||||
<string name="common_terms_and_conditions">Allgemeine Geschäftsbedingungen</string>
|
||||
<string name="common_terms_of_use">Nutzungsbedingungen</string>
|
||||
<string name="common_today">Heute</string>
|
||||
|
|
@ -260,6 +328,7 @@
|
|||
<string name="common_transaction_status">Transaktionsstatus</string>
|
||||
<string name="common_transactions">Transaktionen</string>
|
||||
<string name="common_transfer">Überweisung</string>
|
||||
<string name="common_unable_to_load">Die Daten konnten nicht geladen werden…</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>
|
||||
|
|
@ -322,6 +391,11 @@
|
|||
<string name="details_title">Details</string>
|
||||
<string name="disclaimer_error_loading">Überprüfe deine Internetverbindung oder wechseln zu einem anderen Netzwerk</string>
|
||||
<string name="disclaimer_title">Nutzungsbedingungen</string>
|
||||
<string name="domain_receive_assets_default_address">Standardadresse</string>
|
||||
<string name="domain_receive_assets_navigation_title">Empfangen von Vermögenswerten</string>
|
||||
<string name="domain_receive_assets_onboarding_description">Das Senden von Vermögenswerten in anderen Netzwerken führt zu dauerhaftem Verlust.</string>
|
||||
<string name="domain_receive_assets_onboarding_network_name">%s Netzwerk</string>
|
||||
<string name="domain_receive_assets_onboarding_title">Sende Geld nur mit</string>
|
||||
<string name="email_preface_wc_error">Hallo Support-Team, ich habe einen Fehler mit dem Code %s festgestellt.</string>
|
||||
<string name="email_subject_wc_error">WalletConnect-Fehler</string>
|
||||
<string name="error_wrong_wallet_tapped">Du hast eine Karte oder Ring aus einer anderen Wallet verwendet. Tippe auf die Karte oder Ring, die dieser Wallet zugeordnet ist.</string>
|
||||
|
|
@ -348,8 +422,8 @@
|
|||
<string name="express_exchange_notification_refund_title">Der Betrag wurde in %1$s (%2$s Netzwerk) zurückerstattet.</string>
|
||||
<string name="express_exchange_notification_verification_text">Besuche die Website des Anbieters zur Überprüfung</string>
|
||||
<string name="express_exchange_notification_verification_title">KYC-Überprüfung durch den Anbieter erforderlich</string>
|
||||
<string name="express_exchange_status_bought">Gekauft</string>
|
||||
<string name="express_exchange_status_buying">Einkaufen</string>
|
||||
<string name="express_exchange_status_bought">Kauf abgeschlossen</string>
|
||||
<string name="express_exchange_status_buying">Kauf steht aus</string>
|
||||
<string name="express_exchange_status_buying_active">Warten auf Kauf...</string>
|
||||
<string name="express_exchange_status_canceled">Transaktion abgebrochen</string>
|
||||
<string name="express_exchange_status_confirmed">Anzahlung bestätigt</string>
|
||||
|
|
@ -381,6 +455,7 @@
|
|||
<string name="express_provider">Anbieter</string>
|
||||
<string name="express_provider_best_rate">Bester Preis</string>
|
||||
<string name="express_provider_fca_warning_list">Warnliste der FCA</string>
|
||||
<string name="express_provider_in_fca_warning_list">Anbieter in FCA-Warnliste</string>
|
||||
<string name="express_provider_max_amount">Verfügbar bis zu %s</string>
|
||||
<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>
|
||||
|
|
@ -428,10 +503,19 @@
|
|||
<string name="home_button_scan">Karte oder Ring scannen</string>
|
||||
<string name="hot_crypto_add_token_subtitle">An %s</string>
|
||||
<string name="hot_crypto_token_network">Im %s Netzwerk</string>
|
||||
<string name="hw_access_code_create_alert_title">Willst Du den Vorgang zur Erstellung des Zugangscodes wirklich beenden?</string>
|
||||
<string name="hw_activation_need_backup">Jetzt sichern</string>
|
||||
<string name="hw_activation_need_description">Um die Einrichtung abzuschließen, sicher Deine Wallet und sicher den App-Zugriff mit einem Access Code.</string>
|
||||
<string name="hw_activation_need_finish">Jetzt beenden</string>
|
||||
<string name="hw_activation_need_title">Wallet-Aktivierung abschließen</string>
|
||||
<string name="hw_activation_need_warning_description">Um das Setup abzuschließen, sicher den App-Zugriff mit Access Code.</string>
|
||||
<string name="hw_backup_alert_description">Wenn dies der Fall ist, musst Du von vorne beginnen.</string>
|
||||
<string name="hw_backup_alert_title">Bist Du sicher, dass Du den Aktivierungsprozess beenden willst?</string>
|
||||
<string name="hw_backup_close_description">Wenn dies der Fall ist, musst Du von vorne beginnen.</string>
|
||||
<string name="hw_backup_google_drive_description">Wiederherstellung einer bestehenden Wallet, die in Ihrem Google Drive-Backup gespeichert ist</string>
|
||||
<string name="hw_backup_google_drive_title">Google Drive-Backup</string>
|
||||
<string name="hw_backup_hardware_description">Verbesser Deine Sicherheit sofort mit einer erstklassigen Hardware-Wallet von Tangem.</string>
|
||||
<string name="hw_backup_hardware_title">Hardware-Wallet</string>
|
||||
<string name="hw_backup_need_action">Gehe zum Backup</string>
|
||||
<string name="hw_backup_need_description">Um Deine Wallet mit einem Zugangscode zu sichern, führe zuerst die Sicherung durch.</string>
|
||||
<string name="hw_backup_need_title">Sicherung zuerst beenden</string>
|
||||
|
|
@ -443,6 +527,21 @@
|
|||
<string name="hw_create_seed_description">Bleibe über die neuesten Funktionen und Neuigkeiten auf dem Laufenden</string>
|
||||
<string name="hw_create_seed_title">Sicherung der Seed-Phrase</string>
|
||||
<string name="hw_create_title">Mobile Wallet erstellen</string>
|
||||
<string name="hw_import_seed_phrase_already_imported">Diese Wiederherstellungsphrase wurde bereits importiert</string>
|
||||
<string name="hw_mobile_wallet">Mobile Wallet</string>
|
||||
<string name="hw_upgrade_funds_access_description">Dein Geld bleibt während des gesamten Prozesses sicher und vollständig zugänglich</string>
|
||||
<string name="hw_upgrade_funds_access_title">Zugang zu Geldern</string>
|
||||
<string name="hw_upgrade_general_security_description">Alle privaten Wallet-Daten werden aus der mobilen App entfernt und nur sicher auf Deinem Tangem-Gerät gespeichert</string>
|
||||
<string name="hw_upgrade_general_security_title">Allgemeine Sicherheit</string>
|
||||
<string name="hw_upgrade_key_migration_description">Private Schlüssel werden von der App auf Deine Tangem-Karte oder Deinen Tangem-Ring verschoben</string>
|
||||
<string name="hw_upgrade_key_migration_title">Schlüsselmigration</string>
|
||||
<string name="hw_upgrade_scan_device">Gerät scannen</string>
|
||||
<string name="hw_upgrade_start_action">Upgrade starten</string>
|
||||
<string name="hw_upgrade_start_description">Du bist dabei, Deine Wallet auf Tangem Wallet zu aktualisieren. Dies wird Dein Vermögen mit cold-storage sicher verwahren.</string>
|
||||
<string name="hw_upgrade_start_title">Tangem Wallet</string>
|
||||
<string name="hw_upgrade_title">Upgrade auf Hardware Wallet</string>
|
||||
<string name="hw_upgrade_to_cold_banner_description">Bewahren Deine Kryptowährungen sicher auf - mit der erstklassigen Hardware-Wallet von Tangem.</string>
|
||||
<string name="hw_upgrade_to_cold_banner_title">Wallet mit einem Hardware-Backup aufrüsten</string>
|
||||
<string name="information_generated_with_ai">Diese Informationen wurden mithilfe von KI generiert.\nTippe hier, wenn Du Fehler finden.</string>
|
||||
<string name="initial_message_change_access_code_body">Um den Zugangscode zu ändern, halte die Karte oder Ring wie oben gezeigt an das Gerät und entferne sie erst am Ende des Vorgangs.</string>
|
||||
<string name="initial_message_change_passcode_body">Um den Passcode zu ändern, halte die Karte oder Ring wie oben gezeigt an das Gerät und entferne sie erst am Ende des Vorgangs.</string>
|
||||
|
|
@ -647,6 +746,9 @@
|
|||
<string name="notification_referral_promo_button">Jetzt beitreten</string>
|
||||
<string name="notification_referral_promo_text">Teile Deinen Code – verdiene 5 USDT pro Verkauf. Deine Freunde erhalten 10 % Rabatt.</string>
|
||||
<string name="notification_referral_promo_title">Erhalte BELOHNUNGEN für jeden Freund!</string>
|
||||
<string name="notification_sepa_button">Krypto kaufen</string>
|
||||
<string name="notification_sepa_text">Profitiere von null Gebühren beim Kauf von Kryptowährungen per SEPA-Überweisung.</string>
|
||||
<string name="notification_sepa_title">Krypto mit SEPA kaufen</string>
|
||||
<string name="onboarding_access_code_feature_1_description">Du musst einen einzigen Zugangscode einrichten, um alle deine Geräte 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 oder Ring einen individuellen Zugangscode einrichten</string>
|
||||
|
|
@ -727,7 +829,7 @@
|
|||
<string name="onboarding_title_no_backup_cards">Keine Sicherungsgeräte</string>
|
||||
<string name="onboarding_title_notifications">Benachrichtigungen</string>
|
||||
<string name="onboarding_title_one_backup_card">Eine Backupgerät hinzugefügt</string>
|
||||
<string name="onboarding_title_scan_origin_card">Bereite deine Karte oder Ring vor</string>
|
||||
<string name="onboarding_title_scan_origin_card">Bereite Deine Karte oder Deinen Ring vor</string>
|
||||
<string name="onboarding_title_two_backup_cards">Zweites Backupgerät hinzugefügt</string>
|
||||
<string name="onboarding_top_up_body">Um zu beginnen, lade einfach die wallet mit einem beliebigen Betrag auf</string>
|
||||
<string name="onboarding_top_up_body_no_account_error">Um zu beginnen, lade die Wallet einfach mit mehr als %1$s %2$s auf.</string>
|
||||
|
|
@ -769,6 +871,7 @@
|
|||
<string name="onramp_statuses_view_footer">Du kannst diesen Bildschirm schließen und den Transaktionsstatus auf dem Bildschirm mit den Token-Details überprüfen.</string>
|
||||
<string name="onramp_transaction_status_footer_text">Du kannst diesen Bildschirm schließen und den Transaktionsstatus auf dem Bildschirm mit den Token-Details überprüfen.</string>
|
||||
<string name="onramp_via">Über</string>
|
||||
<string name="onramp_you_will_pay_title">Du zahlst</string>
|
||||
<string name="organize_tokens_group">Gruppe erstellen</string>
|
||||
<string name="organize_tokens_sort_by_balance">Nach Guthaben</string>
|
||||
<string name="organize_tokens_title">Token organisieren</string>
|
||||
|
|
@ -866,6 +969,7 @@
|
|||
<string name="send_date_format">%1$s, %2$s</string>
|
||||
<string name="send_destination_tag_field">Ziel-Tag</string>
|
||||
<string name="send_enter_address_field">Adresse eingeben</string>
|
||||
<string name="send_enter_address_field_ens">ENS-Name oder Adresse eingeben</string>
|
||||
<string name="send_error_address_same_as_wallet">Die Adresse stimmt mit der Adresse Ihrer Brieftasche überein</string>
|
||||
<string name="send_error_dust_amount_format">Minimaler Betrag ist %s</string>
|
||||
<string name="send_error_dust_change_format">Minimaler Wechselgeld ist %s</string>
|
||||
|
|
@ -947,14 +1051,20 @@
|
|||
<string name="send_validation_invalid_amount">Ungültiger Betrag</string>
|
||||
<string name="send_validation_invalid_fee">Die Gebühr geht über die Bilanz hinaus</string>
|
||||
<string name="send_validation_invalid_total">Der Gesamtbetrag geht über die Bilanz hinaus</string>
|
||||
<string name="send_with_swap_change_token_alert_message">Bist Du sicher, dass Du den Empfangstoken ändern möchtest? Dadurch werden Dein zuvor eingegebenen Daten zurückgesetzt.</string>
|
||||
<string name="send_with_swap_change_token_alert_title">Token ändern</string>
|
||||
<string name="send_with_swap_confirm_title">Tauschen und senden</string>
|
||||
<string name="send_with_swap_convert_token_alert_message">Mit der Konvertierung fortfahren? Dadurch werden Deine vorherigen Daten gelöscht.</string>
|
||||
<string name="send_with_swap_convert_token_alert_title">Konvertierung bestätigen</string>
|
||||
<string name="send_with_swap_correct_recipient_network_notification_message">Das Senden einer anderen Währung führt zu deren unwiderruflichem Verlust.</string>
|
||||
<string name="send_with_swap_correct_recipient_network_notification_title">Wähle das richtige Empfängernetzwerk</string>
|
||||
<string name="send_with_swap_notification_text">Sende uns ein Token, und wir konvertieren es unterwegs. Dein Empfänger erhält genau das, was er braucht – nahtlos.</string>
|
||||
<string name="send_with_swap_recipient_amount_text">Wird an den Empfänger gesendet</string>
|
||||
<string name="send_with_swap_recipient_amount_success_title">Der Empfänger erhält</string>
|
||||
<string name="send_with_swap_recipient_amount_text">An den Empfänger</string>
|
||||
<string name="send_with_swap_recipient_amount_title">Zu erhaltender Betrag</string>
|
||||
<string name="send_with_swap_recipient_get_amount">Empfänger erhält %s</string>
|
||||
<string name="send_with_swap_remove_convert_alert_message">Möchtest Du die Konvertierung wirklich abbrechen? Deine bisherigen Daten werden gelöscht.</string>
|
||||
<string name="send_with_swap_remove_convert_alert_title">Konvertierung entfernen</string>
|
||||
<string name="send_with_swap_title">Senden mit Swap</string>
|
||||
<string name="sent_transaction_sent_title">Transaktion gesendet</string>
|
||||
<string name="settings_card_settings_footer">Bereite das Scannen der Karte oder Ring vor, die du einrichten möchtest.</string>
|
||||
|
|
@ -1121,6 +1231,7 @@
|
|||
<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_high_price_impact_title">Hoher Einfluss auf den Preis</string>
|
||||
<string name="swapping_insufficient_funds">Unzureichende Mittel</string>
|
||||
<string name="swapping_permission_header">Erlaubnis erteilen</string>
|
||||
<string name="swapping_swap_action">Tauschen</string>
|
||||
|
|
@ -1207,6 +1318,7 @@
|
|||
<string name="user_wallet_list_rename_popup_title">Wallet umbenennen</string>
|
||||
<string name="user_wallet_list_unlock_all">Alle freischalten</string>
|
||||
<string name="user_wallet_list_unlock_all_with">Alle mit %s freischalten</string>
|
||||
<string name="visa_balance_limits_details_limits">Grenzen</string>
|
||||
<plurals name="visa_limits_available_for_days_title">
|
||||
<item quantity="one">Verfügbar für %d Tag</item>
|
||||
<item quantity="other">Verfügbar für %d Tage</item>
|
||||
|
|
@ -1224,6 +1336,7 @@
|
|||
<string name="visa_onboarding_success_screen_description">Schon kann es losgehen!</string>
|
||||
<string name="visa_onboarding_wallet_connect_description">Du kannst Deine Verbindung \n auf der Website des Drittanbieters \n herstellen und zurück zur Tangem-App gelangen</string>
|
||||
<string name="visa_onboarding_wallet_connect_title">Zur Website gehen</string>
|
||||
<string name="visa_onboarding_wallet_list_header">Wallet wählen</string>
|
||||
<string name="visa_onboarding_welcome_back_description">Fahren wir mit der Einrichtung Deines Kontos fort.</string>
|
||||
<string name="visa_onboarding_welcome_back_title">Willkommen zurück!</string>
|
||||
<string name="visa_onboarding_welcome_description">Folge den Schritten, um Dein Konto einzurichten.</string>
|
||||
|
|
@ -1300,8 +1413,11 @@
|
|||
<string name="wallet_promo_banner_title">Entdecke die Tangem Wallet</string>
|
||||
<string name="wallet_settings_access_code_description">Geheimcode zum Schutz dieser Wallet. Wird für Anmeldung und Signaturen verwendet.</string>
|
||||
<string name="wallet_settings_access_code_title">Zugangscode festlegen/ändern</string>
|
||||
<string name="wallet_settings_change_access_code_title">Zugangscode ändern</string>
|
||||
<string name="wallet_settings_push_notifications_description">Bleib stets über eingehende Wallet-Transaktionen und Tangem-Updates auf dem Laufenden.</string>
|
||||
<string name="wallet_settings_push_notifications_huawei_warning">Push-Benachrichtigungen funktionieren derzeit möglicherweise nicht auf Huawei-Geräten. Wir arbeiten aktiv an einer Lösung und werden in einem kommenden Update einen Fix veröffentlichen. Vielen Dank für Ihr Verständnis!</string>
|
||||
<string name="wallet_settings_push_notifications_title">Transaktionsbenachrichtigungen</string>
|
||||
<string name="wallet_settings_set_access_code_title">Zugangscode festlegen</string>
|
||||
<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 oder Ring, um den Zugriff auf deine Wallet freizuschalten.</string>
|
||||
|
|
@ -1329,8 +1445,8 @@
|
|||
<string name="warning_express_approval_in_progress_message">Die Genehmigung des Swaps ist im Gange und wird in Kürze abgeschlossen sein.</string>
|
||||
<string name="warning_express_approval_in_progress_title">Genehmigung in Arbeit</string>
|
||||
<string name="warning_express_dust_message">Der Mindestbetrag für den Tausch beträgt %1$s. Bitte stelle sicher, dass der Restsaldo nach dem Swap nicht unter %2$s liegt.</string>
|
||||
<string name="warning_express_no_exchangeable_coins_description">Sie haben keine Token in Ihrem Portfolio, gegen die %s getauscht werden kann. Bitte fügen Sie einen anderen Token hinzu, um den Tausch durchzuführen.</string>
|
||||
<string name="warning_express_no_exchangeable_coins_title">Keine Token zum Tauschen verfügbar</string>
|
||||
<string name="warning_express_no_exchangeable_coins_description">Du hast keine Token in Deinem Portfolio, gegen die %s getauscht werden kann. Bitte füge einen anderen Token hinzu, um den Austausch zu ermöglichen.</string>
|
||||
<string name="warning_express_no_exchangeable_coins_title">Keine kompatiblen Token hinzugefügt</string>
|
||||
<string name="warning_express_not_enough_fee_for_token_tx_description">Um eine Transaktion durchzuführen, du etwas etwas einzahlen %1$s %2$s</string>
|
||||
<string name="warning_express_not_enough_fee_for_token_tx_title">Die Gebühr %s kann nicht gedeckt werden</string>
|
||||
<string name="warning_express_notification_invalid_reserve_amount_title">Der zu erhaltende Betrag muss mindestens %s betragen</string>
|
||||
|
|
@ -1389,7 +1505,7 @@
|
|||
<string name="warning_some_networks_unreachable_message">Wischen Sie nach unten, um zu aktualisieren, oder versuchen Sie es später erneut.</string>
|
||||
<string name="warning_some_networks_unreachable_title">Einige Netzwerke sind nicht erreichbar</string>
|
||||
<string name="warning_some_token_balances_not_updated">Einige Token-Guthaben konnten nicht aktualisiert werden</string>
|
||||
<string name="warning_stellar_token_trustline_not_enough_xlm">Nicht genug %s. Lade Dein XLM-Konto auf, um dieses Token zu verknüpfen</string>
|
||||
<string name="warning_stellar_token_trustline_not_enough_xlm">Nicht genug %s. Lade Dein XLM-Konto auf, um Trustline zu öffnen.</string>
|
||||
<string name="warning_testnet_card_message">Dies ist eine Testnet-Karte. Sie kann keine Transaktionen verarbeiten und sollte nur zu Test- und Entwicklungszwecken verwendet werden.</string>
|
||||
<string name="warning_testnet_card_title">Nur für Testzwecke</string>
|
||||
<string name="warning_token_balance_not_updated">Der Kontostand ist möglicherweise veraltet. Aktualisiere bittre die Seite.</string>
|
||||
|
|
@ -1416,6 +1532,7 @@
|
|||
<string name="wc_alert_unknown_error_description_no_error_code">Wenn das Problem weiterhin besteht, wende Dich bitte an unseren Support.</string>
|
||||
<string name="wc_alert_unknown_error_title">Wir haben einen unbekannten Fehler festgestellt.</string>
|
||||
<string name="wc_alert_unsupported_dapps_description">Tangem Wallet unterstützt derzeit nicht %s</string>
|
||||
<string name="wc_alert_unsupported_dapps_title">Nicht unterstützte dApp</string>
|
||||
<string name="wc_alert_unsupported_method_description">Fehlercode: 8 005. Wenn das Problem weiterhin besteht, wende Dich bitte an unseren Support.</string>
|
||||
<string name="wc_alert_unsupported_method_title">Wir haben einen unbekannten Fehler festgestellt.</string>
|
||||
<string name="wc_alert_unsupported_network_description">Dieses Netzwerk %s wird von Tangem Wallet nicht unterstützt und kann nicht verbunden werden.</string>
|
||||
|
|
@ -1426,6 +1543,7 @@
|
|||
<string name="wc_alert_verified_domain_title">Verifizierte Domain</string>
|
||||
<string name="wc_alert_wrong_card_description">Falsche Karte oder falscher Ring in der App ausgewählt</string>
|
||||
<string name="wc_alert_wrong_card_title">Wir haben eine Art Problem</string>
|
||||
<string name="wc_all_dapps_disconnected">Alle dApps getrennt</string>
|
||||
<string name="wc_allow_to_spend">Erlaubnis auszugeben</string>
|
||||
<string name="wc_common_address">Vertragsadresse</string>
|
||||
<string name="wc_common_connect">Verbinden</string>
|
||||
|
|
@ -1434,7 +1552,9 @@
|
|||
<string name="wc_common_networks">Netzwerke</string>
|
||||
<string name="wc_common_unlimited">Unbegrenzt</string>
|
||||
<string name="wc_common_wallet">Wallet</string>
|
||||
<string name="wc_connected_app_title">Verbundene App</string>
|
||||
<string name="wc_connected_networks">Verbundene Netzwerke</string>
|
||||
<string name="wc_connected_to">Verbunden mit %1$s</string>
|
||||
<string name="wc_connection_reqeust_can_view_balance">Anzeige des Kontostands und der Aktivitäten in Deiner Wallet</string>
|
||||
<string name="wc_connection_reqeust_cant_sign">Signiere die Transaktionen ohne eine Vorankündigung</string>
|
||||
<string name="wc_connection_reqeust_request_approval">Genehmigung für Transaktionen anfordern</string>
|
||||
|
|
@ -1445,8 +1565,9 @@
|
|||
<string name="wc_contents">Inhalt</string>
|
||||
<string name="wc_copy_data_button_text">Daten kopieren</string>
|
||||
<string name="wc_custom_allowance_title">Benutzerdefinierter Freibetrag</string>
|
||||
<string name="wc_dapp_disconnected">dApp getrennt</string>
|
||||
<string name="wc_disconnect_all">Alle trennen</string>
|
||||
<string name="wc_disconnect_all_alert_desc">Alle dApp-Sitzungen werden getrennt. Ihre Wallet wird nicht mehr mit dApps verbunden sein.</string>
|
||||
<string name="wc_disconnect_all_alert_desc">Alle dApp-Sitzungen werden getrennt. Deien Wallet ist nicht mehr mit dApps verknüpft.</string>
|
||||
<string name="wc_disconnect_all_alert_title">Alle dApps trennen</string>
|
||||
<string name="wc_errors_invalid_domain_subtitle">Versuchen Sie erneut, mit einer neuen URI zu koppeln</string>
|
||||
<string name="wc_errors_invalid_domain_title">Ungültige dApp-Domain</string>
|
||||
|
|
@ -1456,21 +1577,34 @@
|
|||
<string name="wc_errors_proposal_expired_title">Verbindungsvorschlag abgelaufen</string>
|
||||
<string name="wc_estimated_wallet_changes">Geschätzte Wallet-Änderungen</string>
|
||||
<string name="wc_estimated_wallet_changes_not_simulated">Die Transaktion konnte nicht simuliert werden. Bitte sei vorsichtig.</string>
|
||||
<string name="wc_estimation_is_not_supported">Die Schätzung wird nicht unterstützt für %s</string>
|
||||
<string name="wc_fee_suggested">Vorgeschlagen von %s</string>
|
||||
<string name="wc_insufficient_warning_subtitle">Lade Dein Guthaben auf, um die Netzwerkgebühr zu decken</string>
|
||||
<string name="wc_insufficient_warning_title">Unzureichend %1$s</string>
|
||||
<string name="wc_malicious_transaction">Böswillige/ gefährliche Transaktion</string>
|
||||
<string name="wc_missing_required_network_description">Füge Deinem Profil für dieses Wallet das Netzwerk %s hinzu</string>
|
||||
<string name="wc_missing_required_network_description">Füge das Netzwerk %s zu Deinem Portfolio für diese Wallet hinzu</string>
|
||||
<string name="wc_missing_required_network_title">Die Wallet verfügt über keine erforderlichen Netzwerke</string>
|
||||
<string name="wc_new_connection">Neue Verbindung</string>
|
||||
<string name="wc_no_sessions_desc">Verbinde Deine Wallet mit einer anderen dApp</string>
|
||||
<string name="wc_no_sessions_desc">Verbinde Deine Wallet mit verschiedenen dApps</string>
|
||||
<string name="wc_no_sessions_title">Keine Sitzungen</string>
|
||||
<string name="wc_no_wallet_changes_detected">Keine Wallet-Änderungen erkannt</string>
|
||||
<string name="wc_notification_security_risk_subtitle">Es wurden potenzielle Risiken oder bösartiges Verhalten erkannt. Das Verbinden oder Signieren von Transaktionen kann zum Verlust von Geldern führen.</string>
|
||||
<string name="wc_notification_security_risk_title">Bekanntes Sicherheitsrisiko</string>
|
||||
<string name="wc_qr_scan_hint">Öffne die Web3-App und wähle die Option WalletConnect</string>
|
||||
<string name="wc_request_from">Anfrage von</string>
|
||||
<string name="wc_send_anyway">Trotzdem signieren</string>
|
||||
<string name="wc_signature_type">Art der Signatur</string>
|
||||
<string name="wc_specify_networks_subtitle">Für die dApp-Verbindung ist mindestens ein Netzwerk erforderlich</string>
|
||||
<string name="wc_specify_networks_title">Ausgewählte Netzwerke angeben</string>
|
||||
<string name="wc_successfully_signed">Erfolgreich signiert</string>
|
||||
<string name="wc_transaction_info_to_title">An</string>
|
||||
<string name="wc_transaction_request">Transaktionsanfrage</string>
|
||||
<string name="wc_transaction_request_title">Transaktionsanfrage</string>
|
||||
<string name="wc_unlimited_amount">Unbegrenzte Menge</string>
|
||||
<string name="wc_uri_already_used_description">Stelle sicher, dass bei jedem Kopplungsversuch ein frischer und eindeutiger URI verwendet wird.</string>
|
||||
<string name="wc_uri_already_used_title">URI bereits verwendet</string>
|
||||
<string name="wc_wallet_connect">WalletConnect</string>
|
||||
<string name="wc_warning_transaction">Verdächtige Transaktion</string>
|
||||
<string name="welcome_interrupted_backup_alert_discard">Verwerfen</string>
|
||||
<string name="welcome_interrupted_backup_alert_message">Du hast eine unterbrochene Sicherung. Möchtest du diese fortsetzen?</string>
|
||||
<string name="welcome_interrupted_backup_alert_resume">Ja, fortsetzen</string>
|
||||
|
|
|
|||
|
|
@ -14,15 +14,18 @@
|
|||
<string name="access_code_navtitle">アクセスコード</string>
|
||||
<string name="account_add_limit_dialog_description">%1$s個を超えるアカウントは作成できません。新しいアカウントを追加するには、1つをアーカイブしてください。</string>
|
||||
<string name="account_add_limit_dialog_title">新しいアカウントを追加できません</string>
|
||||
<string name="account_archive_success_message">アカウントはアーカイブされました</string>
|
||||
<string name="account_archived_accounts">アーカイブされたアカウント</string>
|
||||
<string name="account_archived_recover">回復する</string>
|
||||
<string name="account_archived_recover_dialog_description">「 %1$s 」を回復しようとしています。</string>
|
||||
<string name="account_archived_recover_dialog_title">アカウントを回復する</string>
|
||||
<string name="account_archived_title">アーカイブ済み</string>
|
||||
<string name="account_create_success_message">アカウントを作成しました</string>
|
||||
<string name="account_details_archive">アカウントをアーカイブする</string>
|
||||
<string name="account_details_archive_action">アーカイブ</string>
|
||||
<string name="account_details_archive_description">このアカウントをアーカイブしますが、いつでも復元できます。</string>
|
||||
<string name="account_details_title">アカウント</string>
|
||||
<string name="account_edit_success_message">アカウントが保存されました</string>
|
||||
<string name="account_form_account_index">アカウント番号%s — アドレス導出に使用されます。</string>
|
||||
<string name="account_form_create_button">アカウントを追加</string>
|
||||
<string name="account_form_edit_button">保存</string>
|
||||
|
|
@ -32,6 +35,7 @@
|
|||
<string name="account_form_title_create">アカウントを追加</string>
|
||||
<string name="account_form_title_edit">アカウントを編集</string>
|
||||
<string name="account_label_tokens_info">%1$s ( %2$s内)</string>
|
||||
<string name="account_recover_success_message">アカウントが回復しました</string>
|
||||
<string name="account_reorder_description">アカウントを長押しして並べ替える</string>
|
||||
<string name="account_unsaved_dialog_action_first">編集を続ける</string>
|
||||
<string name="account_unsaved_dialog_action_second">破棄</string>
|
||||
|
|
@ -125,7 +129,7 @@
|
|||
<string name="biometric_unavailable_warning">お使いの携帯電話で生体認証が無効になっているため、アプリにウォレットを保存できません。ウォレットを保存するには、携帯電話の設定で生体認証機能を有効にしてください。</string>
|
||||
<string name="bitcoin_promo_activation_error">プロモーションコードの処理中にエラーが発生しました。しばらくしてからもう一度お試しください。</string>
|
||||
<string name="bitcoin_promo_activation_error_title">アクティベーションエラー</string>
|
||||
<string name="bitcoin_promo_activation_success">プロモーションコードが正常に有効化されました。14日以内に10 USDT相当のビットコインボーナスが付与されます。</string>
|
||||
<string name="bitcoin_promo_activation_success">プロモーションコードが正常に有効化されました。14日以内に10 USDT相当のビットコインがアカウントに入金されます。</string>
|
||||
<string name="bitcoin_promo_activation_success_title">プロモーションコードが有効になりました</string>
|
||||
<string name="bitcoin_promo_already_activated">このプロモーションコードは既に使用されているため、再度使うことはできません。</string>
|
||||
<string name="bitcoin_promo_already_activated_title">コードが利用できません</string>
|
||||
|
|
@ -247,6 +251,7 @@
|
|||
<string name="common_in_progress">進行中</string>
|
||||
<string name="common_later">後で</string>
|
||||
<string name="common_left">残り%1$s</string>
|
||||
<string name="common_legacy_bitcoin_address">レガシービットコイン</string>
|
||||
<string name="common_locked">ロックされています</string>
|
||||
<string name="common_main_network">メインネットワーク</string>
|
||||
<string name="common_month">月</string>
|
||||
|
|
@ -255,6 +260,7 @@
|
|||
<plurals name="common_networks_count">
|
||||
<item quantity="other">%dネットワーク</item>
|
||||
</plurals>
|
||||
<string name="common_new_address">新しいアドレス</string>
|
||||
<string name="common_next">次</string>
|
||||
<string name="common_nft">NFT</string>
|
||||
<string name="common_no">いいえ</string>
|
||||
|
|
@ -304,6 +310,7 @@
|
|||
<string name="common_support">サポート</string>
|
||||
<string name="common_supported_networks">対応ネットワーク</string>
|
||||
<string name="common_swap">スワップ</string>
|
||||
<string name="common_tangem">Tangem</string>
|
||||
<string name="common_terms_and_conditions">利用規約</string>
|
||||
<string name="common_terms_of_use">利用規約</string>
|
||||
<string name="common_today">今日</string>
|
||||
|
|
@ -377,6 +384,7 @@
|
|||
<string name="details_title">詳細</string>
|
||||
<string name="disclaimer_error_loading">インターネット接続を確認するか、別のネットワークに切り替えてください。</string>
|
||||
<string name="disclaimer_title">利用規約</string>
|
||||
<string name="domain_receive_assets_default_address">デフォルトアドレス</string>
|
||||
<string name="domain_receive_assets_navigation_title">資金を受け取る</string>
|
||||
<string name="domain_receive_assets_onboarding_description">他のネットワークで資産を送金すると、永久に失われます。</string>
|
||||
<string name="domain_receive_assets_onboarding_network_name">%sネットワーク</string>
|
||||
|
|
@ -526,7 +534,7 @@
|
|||
<string name="hw_upgrade_start_title">Tangemウォレット</string>
|
||||
<string name="hw_upgrade_title">ハードウェアウォレットにアップグレード</string>
|
||||
<string name="hw_upgrade_to_cold_banner_description">Tangemの業界最高水準のハードウェアウォレットで、暗号資産を安全に保管しましょう。</string>
|
||||
<string name="hw_upgrade_to_cold_banner_title">ハードウェアバックアップでウォレットをアップグレード</string>
|
||||
<string name="hw_upgrade_to_cold_banner_title">ハードウェアバックアップで、ウォレットをアップグレード</string>
|
||||
<string name="information_generated_with_ai">この情報はAIで生成されました。 \nエラーが見つかった場合は、ここをタップしてください。</string>
|
||||
<string name="initial_message_change_access_code_body">アクセスコードを変更するには、上図のようにカードまたはリングをタップし、操作が終了するまで取り外さないでください。</string>
|
||||
<string name="initial_message_change_passcode_body">パスコードを変更するには、上記のようにカードをタップし、操作が終了するまで取り外さないでください。</string>
|
||||
|
|
@ -849,6 +857,7 @@
|
|||
<string name="onramp_statuses_view_footer">この画面を閉じて、トークンの詳細画面で取引状況を確認できます。</string>
|
||||
<string name="onramp_transaction_status_footer_text">この画面を閉じて、トークンの詳細画面で取引状況を確認できます。</string>
|
||||
<string name="onramp_via">経由</string>
|
||||
<string name="onramp_you_will_pay_title">支払い</string>
|
||||
<string name="organize_tokens_group">グループ</string>
|
||||
<string name="organize_tokens_sort_by_balance">残高順</string>
|
||||
<string name="organize_tokens_title">トークンを整理する</string>
|
||||
|
|
@ -1302,6 +1311,7 @@
|
|||
<string name="visa_onboarding_in_progress_description">長くはかかりません。アカウントを設定しています。</string>
|
||||
<string name="visa_onboarding_in_progress_issuer_description">長くはかかりません。アクティベーションを完了しています。</string>
|
||||
<string name="visa_onboarding_in_progress_title">準備完了です!</string>
|
||||
<string name="visa_onboarding_pin_code_description">4桁のコードを設定します。 \nお支払いの際に使用されます。</string>
|
||||
<string name="visa_onboarding_pin_not_accepted">PINの認証に失敗しました。もう一度お試しいただくか、別のコードを使用してください。</string>
|
||||
<string name="visa_onboarding_pin_validation_error_message">無効な暗証番号:連続や繰り返しを避けてください</string>
|
||||
<string name="visa_onboarding_wallet_connect_title">ウェブサイトに移動</string>
|
||||
|
|
|
|||
|
|
@ -14,15 +14,18 @@
|
|||
<string name="access_code_navtitle">Access code</string>
|
||||
<string name="account_add_limit_dialog_description">You cannot create more than %1$s accounts. Archive one to add new.</string>
|
||||
<string name="account_add_limit_dialog_title">Can’t add new account</string>
|
||||
<string name="account_archive_success_message">Account archived</string>
|
||||
<string name="account_archived_accounts">Archived accounts</string>
|
||||
<string name="account_archived_recover">Recover</string>
|
||||
<string name="account_archived_recover_dialog_description">You’re about to recover “%1$s”.</string>
|
||||
<string name="account_archived_recover_dialog_title">Recover account</string>
|
||||
<string name="account_archived_title">Archived</string>
|
||||
<string name="account_create_success_message">Account created</string>
|
||||
<string name="account_details_archive">Archive account</string>
|
||||
<string name="account_details_archive_action">Archive</string>
|
||||
<string name="account_details_archive_description">You are archiving this account, but you can always get it back.</string>
|
||||
<string name="account_details_title">Account</string>
|
||||
<string name="account_edit_success_message">Account saved</string>
|
||||
<string name="account_form_account_index">Account #%s — used for address derivation.</string>
|
||||
<string name="account_form_create_button">Add account</string>
|
||||
<string name="account_form_edit_button">Save</string>
|
||||
|
|
@ -32,6 +35,7 @@
|
|||
<string name="account_form_title_create">Add account</string>
|
||||
<string name="account_form_title_edit">Edit account</string>
|
||||
<string name="account_label_tokens_info">%1$s in %2$s</string>
|
||||
<string name="account_recover_success_message">Account recovered</string>
|
||||
<string name="account_reorder_description">Long tap on an account to reorder accounts</string>
|
||||
<string name="account_unsaved_dialog_action_first">Keep Editing</string>
|
||||
<string name="account_unsaved_dialog_action_second">Discard</string>
|
||||
|
|
@ -252,6 +256,7 @@
|
|||
<string name="common_in_progress">In progress</string>
|
||||
<string name="common_later">Later</string>
|
||||
<string name="common_left">%1$s left</string>
|
||||
<string name="common_legacy_bitcoin_address">Legacy Bitcoin</string>
|
||||
<string name="common_locked">Locked</string>
|
||||
<string name="common_main_network">Main network</string>
|
||||
<string name="common_month">month</string>
|
||||
|
|
@ -261,6 +266,7 @@
|
|||
<item quantity="one">%d network</item>
|
||||
<item quantity="other">%d networks</item>
|
||||
</plurals>
|
||||
<string name="common_new_address">New address</string>
|
||||
<string name="common_next">Next</string>
|
||||
<string name="common_nft">NFT</string>
|
||||
<string name="common_no">No</string>
|
||||
|
|
@ -310,6 +316,7 @@
|
|||
<string name="common_support">Support</string>
|
||||
<string name="common_supported_networks">Supported networks</string>
|
||||
<string name="common_swap">Swap</string>
|
||||
<string name="common_tangem">Tangem</string>
|
||||
<string name="common_tangem_wallet">Tangem Wallet</string>
|
||||
<string name="common_terms_and_conditions">terms and conditions</string>
|
||||
<string name="common_terms_of_use">Terms of Use</string>
|
||||
|
|
@ -385,6 +392,7 @@
|
|||
<string name="details_title">Details</string>
|
||||
<string name="disclaimer_error_loading">Check your internet connection or switch to a different network</string>
|
||||
<string name="disclaimer_title">Terms of service</string>
|
||||
<string name="domain_receive_assets_default_address">Default Address</string>
|
||||
<string name="domain_receive_assets_navigation_title">Receive assets</string>
|
||||
<string name="domain_receive_assets_onboarding_description">Sending assets in other networks will result in permanent loss.</string>
|
||||
<string name="domain_receive_assets_onboarding_network_name">%s network</string>
|
||||
|
|
@ -534,7 +542,7 @@
|
|||
<string name="hw_upgrade_start_title">Tangem Wallet</string>
|
||||
<string name="hw_upgrade_title">Upgrade to Hardware Wallet</string>
|
||||
<string name="hw_upgrade_to_cold_banner_description">Keep your crypto safe with Tangem’s best-in-class hardware wallet.</string>
|
||||
<string name="hw_upgrade_to_cold_banner_title">Upgrade wallet with a hardware
backup</string>
|
||||
<string name="hw_upgrade_to_cold_banner_title">Upgrade wallet with a hardware backup</string>
|
||||
<string name="information_generated_with_ai">This information was generated with AI.\nTap here, if you find any errors.</string>
|
||||
<string name="initial_message_change_access_code_body">To change the access code tap the card or ring as shown above and do not remove until the end of the operation</string>
|
||||
<string name="initial_message_change_passcode_body">To change the passcode tap the card as shown above and do not remove until the end of the operation</string>
|
||||
|
|
@ -864,6 +872,7 @@
|
|||
<string name="onramp_statuses_view_footer">You can close this screen and check the transaction status on the token details screen.</string>
|
||||
<string name="onramp_transaction_status_footer_text">You can close this screen and check the transaction status on the token details screen.</string>
|
||||
<string name="onramp_via">Via</string>
|
||||
<string name="onramp_you_will_pay_title">You will pay</string>
|
||||
<string name="organize_tokens_group">Group</string>
|
||||
<string name="organize_tokens_sort_by_balance">By balance</string>
|
||||
<string name="organize_tokens_title">Organize tokens</string>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package com.tangem.data.walletconnect.pair
|
||||
|
||||
import androidx.core.net.toUri
|
||||
import com.tangem.domain.walletconnect.WcPairService
|
||||
import com.tangem.domain.walletconnect.model.WcPairRequest
|
||||
import com.tangem.domain.walletconnect.repository.WcSessionsManager
|
||||
|
|
@ -38,8 +37,19 @@ class DefaultWcPairService @Inject constructor(
|
|||
}
|
||||
|
||||
private suspend fun existSessionTopic(uri: String) = runCatching {
|
||||
val sessionTopic = uri.toUri().getQueryParameter("sessionTopic") ?: return@runCatching false
|
||||
val deeplinkRegex = Regex(WC_PARAM_REGEX)
|
||||
val matched = deeplinkRegex.findAll(uri)
|
||||
val sessionTopic = matched
|
||||
.firstOrNull { it.value.contains(WC_TOPIC_QUERY_NAME) }
|
||||
?.groupValues
|
||||
?.lastOrNull()
|
||||
?: return@runCatching false
|
||||
val isExistSession = sessionsManager.findSessionByTopic(sessionTopic) != null
|
||||
return@runCatching isExistSession
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val WC_TOPIC_QUERY_NAME = "sessionTopic"
|
||||
const val WC_PARAM_REGEX = "([a-zA-Z\\d-]+)=([a-zA-Z\\d]+)"
|
||||
}
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ sealed interface WcEthMethod : WcMethod {
|
|||
val account: String,
|
||||
val dataForSign: String,
|
||||
) : WcEthMethod {
|
||||
val humanMsg: String = params.message.orEmpty()
|
||||
val humanMsg: String = params.message?.contents.orEmpty()
|
||||
}
|
||||
|
||||
data class SendTransaction(
|
||||
|
|
|
|||
|
|
@ -6,5 +6,11 @@ import com.squareup.moshi.JsonClass
|
|||
@JsonClass(generateAdapter = true)
|
||||
data class WcEthSignTypedDataParams(
|
||||
@Json(name = "message")
|
||||
val message: String?,
|
||||
)
|
||||
val message: Message?,
|
||||
) {
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class Message(
|
||||
@Json(name = "contents")
|
||||
val contents: String?,
|
||||
)
|
||||
}
|
||||
|
|
@ -9,8 +9,10 @@ import com.tangem.core.ui.extensions.mask
|
|||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.core.ui.message.DialogMessage
|
||||
import com.tangem.core.ui.message.GlobalLoadingMessage
|
||||
import com.tangem.domain.models.network.NetworkStatus
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.tokens.GetMultiCryptoCurrencyStatusUseCase
|
||||
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||
import com.tangem.domain.wallets.PromoCodeActivationResult
|
||||
import com.tangem.domain.wallets.PromoCodeActivationResult.*
|
||||
import com.tangem.domain.wallets.models.errors.ActivatePromoCodeError
|
||||
|
|
@ -19,23 +21,28 @@ import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
|
|||
import com.tangem.feature.wallet.deeplink.analytics.PromoActivationAnalytics
|
||||
import com.tangem.feature.wallet.impl.R
|
||||
import com.tangem.features.wallet.deeplink.PromoDeeplinkHandler
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withTimeoutOrNull
|
||||
import timber.log.Timber
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
internal class DefaultPromoDeeplinkHandler @AssistedInject constructor(
|
||||
@Assisted private val scope: CoroutineScope,
|
||||
@Assisted private val queryParams: Map<String, String>,
|
||||
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
|
||||
private val getMultiCryptoCurrencyStatusUseCase: GetMultiCryptoCurrencyStatusUseCase,
|
||||
private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
|
||||
private val activateBitcoinPromocodeUseCase: ActivateBitcoinPromocodeUseCase,
|
||||
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
|
||||
private val analyticsEventsHandler: AnalyticsEventHandler,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : PromoDeeplinkHandler {
|
||||
|
||||
init {
|
||||
|
|
@ -62,13 +69,30 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor(
|
|||
}
|
||||
|
||||
private fun findBitcoinAddress(userWallet: UserWallet, promoCode: String) {
|
||||
scope.launch {
|
||||
getMultiCryptoCurrencyStatusUseCase.invokeMultiWalletSync(userWallet.walletId).onRight { currencies ->
|
||||
val bitcoinAddress = currencies.find { it.currency.id.rawNetworkId == Blockchain.Bitcoin.id }
|
||||
?.value
|
||||
?.networkAddress
|
||||
?.defaultAddress
|
||||
?.value
|
||||
scope.launch(context = dispatchers.default) {
|
||||
val bitcoinStatus = withTimeoutOrNull(
|
||||
FETCH_TIMEOUT_SECONDS.seconds,
|
||||
{
|
||||
multiNetworkStatusSupplier
|
||||
.invoke(MultiNetworkStatusProducer.Params(userWallet.walletId))
|
||||
.first { statuses ->
|
||||
statuses.any { status -> status.network.rawId == Blockchain.Bitcoin.id }
|
||||
}.first { status -> status.network.rawId == Blockchain.Bitcoin.id }
|
||||
},
|
||||
)
|
||||
|
||||
if (bitcoinStatus == null) {
|
||||
Timber.tag(LOG_TAG).d("No bitcoin, bitcoin network status == null")
|
||||
showAlert(NoBitcoinAddress)
|
||||
} else {
|
||||
val networkAddress = when (bitcoinStatus.value) {
|
||||
is NetworkStatus.Verified -> (bitcoinStatus.value as NetworkStatus.Verified).address
|
||||
is NetworkStatus.NoAccount -> (bitcoinStatus.value as NetworkStatus.NoAccount).address
|
||||
else -> null
|
||||
}
|
||||
|
||||
val bitcoinAddress = networkAddress
|
||||
?.defaultAddress?.value
|
||||
|
||||
if (bitcoinAddress != null) {
|
||||
Timber.tag(LOG_TAG).d(
|
||||
|
|
@ -76,12 +100,11 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor(
|
|||
)
|
||||
activatePromoCode(bitcoinAddress = bitcoinAddress, promoCode = promoCode)
|
||||
} else {
|
||||
Timber.tag(LOG_TAG).d("no Bitcoin address")
|
||||
uiMessageSender.send(GlobalLoadingMessage(false))
|
||||
delay(DEFAULT_MESSAGE_SENDER_DELAY)
|
||||
Timber.tag(LOG_TAG).d("No Bitcoin address $bitcoinStatus.value")
|
||||
showAlert(NoBitcoinAddress)
|
||||
}
|
||||
}.onLeft {
|
||||
Timber.tag(LOG_TAG).e("Error on getting userWallet currencies: $it")
|
||||
showAlert(Failed)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -144,5 +167,6 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor(
|
|||
companion object {
|
||||
private const val LOG_TAG = "PromoCodeActivation"
|
||||
private const val DEFAULT_MESSAGE_SENDER_DELAY = 500L
|
||||
private const val FETCH_TIMEOUT_SECONDS = 5
|
||||
}
|
||||
}
|
||||
|
|
@ -19,8 +19,8 @@ sealed class PromoActivationAnalytics(
|
|||
"State" to when (result) {
|
||||
PromoCodeActivationResult.Failed -> "Error"
|
||||
PromoCodeActivationResult.InvalidPromoCode -> "Invalid"
|
||||
PromoCodeActivationResult.NoBitcoinAddress -> "No Address "
|
||||
PromoCodeActivationResult.PromoCodeAlreadyUsed -> "Already Use"
|
||||
PromoCodeActivationResult.NoBitcoinAddress -> "No Address"
|
||||
PromoCodeActivationResult.PromoCodeAlreadyUsed -> "Already Used"
|
||||
PromoCodeActivationResult.Activated -> "Activated"
|
||||
},
|
||||
),
|
||||
|
|
|
|||
|
|
@ -10,14 +10,13 @@ import com.tangem.core.decompose.ui.UiMessageSender
|
|||
import com.tangem.core.ui.extensions.TextReference
|
||||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.core.ui.message.DialogMessage
|
||||
import com.tangem.domain.models.currency.CryptoCurrency
|
||||
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
||||
import com.tangem.domain.models.StatusSource
|
||||
import com.tangem.domain.models.network.Network
|
||||
import com.tangem.domain.models.network.NetworkAddress
|
||||
import com.tangem.domain.models.network.NetworkStatus
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.domain.tokens.GetMultiCryptoCurrencyStatusUseCase
|
||||
import com.tangem.domain.tokens.error.TokenListError
|
||||
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||
import com.tangem.domain.wallets.PromoCodeActivationResult
|
||||
import com.tangem.domain.wallets.models.GetUserWalletError
|
||||
import com.tangem.domain.wallets.models.errors.ActivatePromoCodeError
|
||||
|
|
@ -26,25 +25,27 @@ import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
|
|||
import com.tangem.feature.wallet.deeplink.DefaultPromoDeeplinkHandler
|
||||
import com.tangem.feature.wallet.deeplink.analytics.PromoActivationAnalytics
|
||||
import com.tangem.feature.wallet.impl.R
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||
import io.mockk.*
|
||||
import io.mockk.impl.annotations.MockK
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
import kotlinx.coroutines.test.*
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import timber.log.Timber
|
||||
import java.math.BigDecimal
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
class DefaultPromoDeeplinkHandlerTest {
|
||||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var uiMessageSender: UiMessageSender
|
||||
|
||||
@MockK
|
||||
private lateinit var getMultiCryptoCurrencyStatusUseCase: GetMultiCryptoCurrencyStatusUseCase
|
||||
private lateinit var multiNetworkStatusSupplier: MultiNetworkStatusSupplier
|
||||
|
||||
@MockK
|
||||
private lateinit var activateBitcoinPromocodeUseCase: ActivateBitcoinPromocodeUseCase
|
||||
|
|
@ -55,31 +56,60 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
@MockK
|
||||
private lateinit var analyticsEventHandler: AnalyticsEventHandler
|
||||
|
||||
private lateinit var messageSlot: CapturingSlot<UiMessage>
|
||||
private lateinit var testDispatcher: TestDispatcher
|
||||
private lateinit var testScope: TestScope
|
||||
private lateinit var messages: MutableList<UiMessage>
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@Before
|
||||
fun setUp() {
|
||||
testDispatcher = StandardTestDispatcher()
|
||||
testScope = TestScope(testDispatcher)
|
||||
|
||||
Dispatchers.setMain(testDispatcher)
|
||||
|
||||
MockKAnnotations.init(this)
|
||||
every { analyticsEventHandler.send(any()) } returns Unit
|
||||
messageSlot = slot()
|
||||
every { uiMessageSender.send(capture(messageSlot)) } just runs
|
||||
messages = mutableListOf()
|
||||
every { uiMessageSender.send(capture(messages)) } just runs
|
||||
|
||||
Timber.uprootAll() // Disable Timber logging for tests
|
||||
Timber.uprootAll()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
testScope.cancel()
|
||||
@Test
|
||||
fun `GIVEN empty and non-BTC then BTC WHEN supplier emits THEN activated dialog is shown`() = runTest {
|
||||
val promoCode = "PROMO123"
|
||||
val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to promoCode)
|
||||
val userWallet = mockUserWallet("ABCDEF")
|
||||
every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet)
|
||||
|
||||
val ethStatus = buildNetworkStatus(rawNetworkId = "ethereum", address = "0x123")
|
||||
val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz")
|
||||
coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flow {
|
||||
emit(emptySet())
|
||||
emit(setOf(ethStatus))
|
||||
emit(setOf(btcStatus))
|
||||
}
|
||||
coEvery { activateBitcoinPromocodeUseCase.invoke("bc1qxyz", promoCode) } returns Either.Right("ok")
|
||||
val dispatcherProvider = testDispatcherProvider(testScheduler)
|
||||
|
||||
DefaultPromoDeeplinkHandler(
|
||||
scope = this,
|
||||
queryParams = queryParams,
|
||||
uiMessageSender = uiMessageSender,
|
||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
||||
advanceUntilIdle()
|
||||
advanceTimeBy(500)
|
||||
advanceUntilIdle()
|
||||
|
||||
val sent = messages.last { it is DialogMessage } as DialogMessage
|
||||
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success_title))
|
||||
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success))
|
||||
|
||||
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
|
||||
verify(exactly = 1) {
|
||||
analyticsEventHandler.send(
|
||||
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.Activated),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -90,13 +120,14 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
scope = this,
|
||||
queryParams = queryParams,
|
||||
uiMessageSender = uiMessageSender,
|
||||
getMultiCryptoCurrencyStatusUseCase = getMultiCryptoCurrencyStatusUseCase,
|
||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
)
|
||||
|
||||
val sent = messageSlot.captured as DialogMessage
|
||||
val sent = messages.last { it is DialogMessage } as DialogMessage
|
||||
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_invalid_code_title))
|
||||
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_invalid_code))
|
||||
|
||||
|
|
@ -117,46 +148,14 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
scope = this,
|
||||
queryParams = queryParams,
|
||||
uiMessageSender = uiMessageSender,
|
||||
getMultiCryptoCurrencyStatusUseCase = getMultiCryptoCurrencyStatusUseCase,
|
||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
)
|
||||
|
||||
val sent = messageSlot.captured as DialogMessage
|
||||
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_error_title))
|
||||
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_error))
|
||||
|
||||
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
|
||||
verify(exactly = 1) {
|
||||
analyticsEventHandler.send(
|
||||
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.Failed),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN token status error WHEN getWalletCurrenciesScreen THEN failed dialog is shown`() = runTest {
|
||||
val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to "PROMO123")
|
||||
val userWallet = mockUserWallet("ABCDEF")
|
||||
every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet)
|
||||
coEvery { getMultiCryptoCurrencyStatusUseCase.invokeMultiWalletSync(userWallet.walletId) } returns Either.Left(
|
||||
TokenListError.DataError(Exception("boom")),
|
||||
)
|
||||
|
||||
DefaultPromoDeeplinkHandler(
|
||||
scope = this,
|
||||
queryParams = queryParams,
|
||||
uiMessageSender = uiMessageSender,
|
||||
getMultiCryptoCurrencyStatusUseCase = getMultiCryptoCurrencyStatusUseCase,
|
||||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
)
|
||||
|
||||
advanceUntilIdle()
|
||||
|
||||
val sent = messageSlot.captured as DialogMessage
|
||||
val sent = messages.last { it is DialogMessage } as DialogMessage
|
||||
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_error_title))
|
||||
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_error))
|
||||
|
||||
|
|
@ -173,25 +172,26 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to "PROMO123")
|
||||
val userWallet = mockUserWallet("ABCDEF")
|
||||
every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet)
|
||||
// Return only ETH status so BTC is not found
|
||||
val ethStatus = buildStatusForNetwork(rawNetworkId = "ethereum", address = "0x123")
|
||||
coEvery { getMultiCryptoCurrencyStatusUseCase.invokeMultiWalletSync(userWallet.walletId) } returns Either.Right(
|
||||
listOf(ethStatus),
|
||||
)
|
||||
val btcUnreachable = buildUnreachableNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id)
|
||||
coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcUnreachable))
|
||||
val dispatcherProvider = testDispatcherProvider(testScheduler)
|
||||
|
||||
DefaultPromoDeeplinkHandler(
|
||||
scope = this,
|
||||
queryParams = queryParams,
|
||||
uiMessageSender = uiMessageSender,
|
||||
getMultiCryptoCurrencyStatusUseCase = getMultiCryptoCurrencyStatusUseCase,
|
||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
||||
advanceUntilIdle()
|
||||
advanceTimeBy(500)
|
||||
advanceUntilIdle()
|
||||
|
||||
val sent = messageSlot.captured as DialogMessage
|
||||
val sent = messages.last { it is DialogMessage } as DialogMessage
|
||||
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_no_address_title))
|
||||
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_no_address))
|
||||
|
||||
|
|
@ -209,25 +209,27 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to promoCode)
|
||||
val userWallet = mockUserWallet("ABCDEF")
|
||||
every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet)
|
||||
val btcStatus = buildStatusForNetwork(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz")
|
||||
coEvery { getMultiCryptoCurrencyStatusUseCase.invokeMultiWalletSync(userWallet.walletId) } returns Either.Right(
|
||||
listOf(btcStatus),
|
||||
)
|
||||
val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz")
|
||||
coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatus))
|
||||
coEvery { activateBitcoinPromocodeUseCase.invoke("bc1qxyz", promoCode) } returns Either.Right("ok")
|
||||
val dispatcherProvider = testDispatcherProvider(testScheduler)
|
||||
|
||||
DefaultPromoDeeplinkHandler(
|
||||
scope = this,
|
||||
queryParams = queryParams,
|
||||
uiMessageSender = uiMessageSender,
|
||||
getMultiCryptoCurrencyStatusUseCase = getMultiCryptoCurrencyStatusUseCase,
|
||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
||||
advanceUntilIdle()
|
||||
advanceTimeBy(500)
|
||||
advanceUntilIdle()
|
||||
|
||||
val sent = messageSlot.captured as DialogMessage
|
||||
val sent = messages.last { it is DialogMessage } as DialogMessage
|
||||
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success_title))
|
||||
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success))
|
||||
|
||||
|
|
@ -312,25 +314,27 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
val queryParams = mapOf(DeeplinkConst.PROMO_CODE_KEY to promoCode)
|
||||
val userWallet = mockUserWallet("ABCDEF")
|
||||
every { getSelectedWalletSyncUseCase.invoke() } returns Either.Right(userWallet)
|
||||
val btcStatus = buildStatusForNetwork(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz")
|
||||
coEvery { getMultiCryptoCurrencyStatusUseCase.invokeMultiWalletSync(userWallet.walletId) } returns Either.Right(
|
||||
listOf(btcStatus),
|
||||
)
|
||||
val btcStatus = buildNetworkStatus(rawNetworkId = Blockchain.Bitcoin.id, address = "bc1qxyz")
|
||||
coEvery { multiNetworkStatusSupplier.invoke(any()) } returns flowOf(setOf(btcStatus))
|
||||
coEvery { activateBitcoinPromocodeUseCase.invoke("bc1qxyz", promoCode) } returns Either.Left(error)
|
||||
val dispatcherProvider = testDispatcherProvider(testScheduler)
|
||||
|
||||
DefaultPromoDeeplinkHandler(
|
||||
scope = this,
|
||||
queryParams = queryParams,
|
||||
uiMessageSender = uiMessageSender,
|
||||
getMultiCryptoCurrencyStatusUseCase = getMultiCryptoCurrencyStatusUseCase,
|
||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||
activateBitcoinPromocodeUseCase = activateBitcoinPromocodeUseCase,
|
||||
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
|
||||
analyticsEventsHandler = analyticsEventHandler,
|
||||
dispatchers = dispatcherProvider,
|
||||
)
|
||||
|
||||
advanceUntilIdle()
|
||||
advanceTimeBy(500)
|
||||
advanceUntilIdle()
|
||||
|
||||
val sent = messageSlot.captured as DialogMessage
|
||||
val sent = messages.last { it is DialogMessage } as DialogMessage
|
||||
Truth.assertThat(sent.title).isEqualTo(expectedTitle)
|
||||
Truth.assertThat(sent.message).isEqualTo(expectedMessage)
|
||||
}
|
||||
|
|
@ -341,7 +345,7 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
return userWallet
|
||||
}
|
||||
|
||||
private fun buildStatusForNetwork(rawNetworkId: String, address: String): CryptoCurrencyStatus {
|
||||
private fun buildNetworkStatus(rawNetworkId: String, address: String): NetworkStatus {
|
||||
val networkId = Network.ID(Network.RawID(rawNetworkId), Network.DerivationPath.None)
|
||||
val network = Network(
|
||||
id = networkId,
|
||||
|
|
@ -357,39 +361,50 @@ class DefaultPromoDeeplinkHandlerTest {
|
|||
nameResolvingType = Network.NameResolvingType.NONE,
|
||||
)
|
||||
|
||||
val currencyId = CryptoCurrency.ID(
|
||||
prefix = CryptoCurrency.ID.Prefix.TOKEN_PREFIX,
|
||||
body = CryptoCurrency.ID.Body.NetworkId(rawNetworkId),
|
||||
suffix = CryptoCurrency.ID.Suffix.RawID(rawNetworkId),
|
||||
)
|
||||
|
||||
val coin = CryptoCurrency.Coin(
|
||||
id = currencyId,
|
||||
network = network,
|
||||
name = rawNetworkId,
|
||||
symbol = network.currencySymbol,
|
||||
decimals = 8,
|
||||
iconUrl = null,
|
||||
isCustom = false,
|
||||
)
|
||||
|
||||
val value = CryptoCurrencyStatus.NoQuote(
|
||||
amount = BigDecimal.ZERO,
|
||||
yieldBalance = null,
|
||||
hasCurrentNetworkTransactions = false,
|
||||
pendingTransactions = emptySet(),
|
||||
networkAddress = NetworkAddress.Single(
|
||||
val value = NetworkStatus.Verified(
|
||||
address = NetworkAddress.Single(
|
||||
defaultAddress = NetworkAddress.Address(
|
||||
value = address,
|
||||
type = NetworkAddress.Address.Type.Primary,
|
||||
),
|
||||
),
|
||||
sources = CryptoCurrencyStatus.Sources(),
|
||||
amounts = emptyMap(),
|
||||
pendingTransactions = emptyMap(),
|
||||
source = StatusSource.ACTUAL,
|
||||
)
|
||||
|
||||
return CryptoCurrencyStatus(
|
||||
currency = coin,
|
||||
value = value,
|
||||
return NetworkStatus(network = network, value = value)
|
||||
}
|
||||
|
||||
private fun buildUnreachableNetworkStatus(rawNetworkId: String): NetworkStatus {
|
||||
val networkId = Network.ID(Network.RawID(rawNetworkId), Network.DerivationPath.None)
|
||||
val network = Network(
|
||||
id = networkId,
|
||||
backendId = rawNetworkId,
|
||||
name = rawNetworkId,
|
||||
currencySymbol = rawNetworkId.take(3).uppercase(),
|
||||
derivationPath = Network.DerivationPath.None,
|
||||
isTestnet = false,
|
||||
standardType = Network.StandardType.Unspecified("UNSPECIFIED"),
|
||||
hasFiatFeeRate = false,
|
||||
canHandleTokens = false,
|
||||
transactionExtrasType = Network.TransactionExtrasType.NONE,
|
||||
nameResolvingType = Network.NameResolvingType.NONE,
|
||||
)
|
||||
|
||||
val value = NetworkStatus.Unreachable(address = null)
|
||||
|
||||
return NetworkStatus(network = network, value = value)
|
||||
}
|
||||
|
||||
private fun testDispatcherProvider(scheduler: TestCoroutineScheduler): CoroutineDispatcherProvider {
|
||||
val dispatcher: CoroutineDispatcher = StandardTestDispatcher(scheduler)
|
||||
return object : CoroutineDispatcherProvider {
|
||||
override val main: CoroutineDispatcher = dispatcher
|
||||
override val mainImmediate: CoroutineDispatcher = dispatcher
|
||||
override val io: CoroutineDispatcher = dispatcher
|
||||
override val default: CoroutineDispatcher = dispatcher
|
||||
override val single: CoroutineDispatcher = dispatcher
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue