From 681219056751985c45574ae7906699b6c2fc458a Mon Sep 17 00:00:00 2001 From: limichange Date: Tue, 21 Jan 2025 14:07:31 +0800 Subject: [PATCH 01/55] feat: Enhance TableRow component with drag-and-drop animation support for mobile native --- packages/components/src/composite/Table/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/components/src/composite/Table/index.tsx b/packages/components/src/composite/Table/index.tsx index dece678785f..4e9d08d3cbe 100644 --- a/packages/components/src/composite/Table/index.tsx +++ b/packages/components/src/composite/Table/index.tsx @@ -154,6 +154,9 @@ function TableRow({ minHeight={DEFAULT_ROW_HEIGHT} onPress={handlePress} bg={isDragging ? '$bgActive' : '$bgApp'} + scale={isDragging && platformEnv.isNative ? 0.9 : 1} + animation="fast" + animateOnly={['transform']} borderRadius="$3" dataSet={!platformEnv.isNative && draggable ? dataSet : undefined} onLongPress={platformEnv.isNative && draggable ? drag : undefined} From 03813804f828b20ed90aa65e9722ea59281dae20 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 11:00:21 +0800 Subject: [PATCH 02/55] feat: update i18n content --- .../views/Market/MarketHomeWithProvider.tsx | 24 + .../pages/PrimeDashboard/PrimeDashboard.tsx | 2 + packages/shared/src/locale/json/ar.json | 2306 ----------------- packages/shared/src/locale/json/bn.json | 10 +- packages/shared/src/locale/json/de.json | 10 +- packages/shared/src/locale/json/en.json | 2306 ----------------- packages/shared/src/locale/json/en_US.json | 10 +- packages/shared/src/locale/json/es.json | 10 +- packages/shared/src/locale/json/fr_FR.json | 8 +- packages/shared/src/locale/json/hi_IN.json | 8 +- packages/shared/src/locale/json/id.json | 10 +- packages/shared/src/locale/json/it_IT.json | 10 +- packages/shared/src/locale/json/ja_JP.json | 10 +- packages/shared/src/locale/json/ko_KR.json | 10 +- packages/shared/src/locale/json/pt.json | 8 +- packages/shared/src/locale/json/pt_BR.json | 8 +- packages/shared/src/locale/json/ru.json | 10 +- packages/shared/src/locale/json/th_TH.json | 8 +- packages/shared/src/locale/json/uk_UA.json | 8 +- packages/shared/src/locale/json/vi.json | 10 +- packages/shared/src/locale/json/zh_CN.json | 8 +- packages/shared/src/locale/json/zh_HK.json | 8 +- packages/shared/src/locale/json/zh_TW.json | 8 +- packages/shared/src/locale/localeJsonMap.ts | 2 - 24 files changed, 112 insertions(+), 4700 deletions(-) create mode 100644 packages/kit/src/views/Market/MarketHomeWithProvider.tsx delete mode 100644 packages/shared/src/locale/json/ar.json delete mode 100644 packages/shared/src/locale/json/en.json diff --git a/packages/kit/src/views/Market/MarketHomeWithProvider.tsx b/packages/kit/src/views/Market/MarketHomeWithProvider.tsx new file mode 100644 index 00000000000..bff46610879 --- /dev/null +++ b/packages/kit/src/views/Market/MarketHomeWithProvider.tsx @@ -0,0 +1,24 @@ +import { EJotaiContextStoreNames } from '@onekeyhq/kit-bg/src/states/jotai/atoms'; +import { EAccountSelectorSceneName } from '@onekeyhq/shared/types'; +import { AccountSelectorProviderMirror } from '../../components/AccountSelector'; +import { MarketHome } from './MarketHome'; +import { MarketWatchListProviderMirror } from './MarketWatchListProviderMirror'; + +export default function MarketHomeWithProvider() { + PrimeRouter; + return ( + + + + + + ); +} diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index 8cad6ff18cf..aad707c8e9f 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -35,6 +35,8 @@ import { usePrimePayment } from '../../hooks/usePrimePayment'; import { PrimeSubscriptionPlans } from './PrimeSubscriptionPlans'; import { PrimeUserInfo } from './PrimeUserInfo'; +// intl.formatMessage({ id: ETranslations.global_prime }) + function showDebugMessageByDialog(obj: any) { Dialog.debugMessage({ debugMessage: obj, diff --git a/packages/shared/src/locale/json/ar.json b/packages/shared/src/locale/json/ar.json deleted file mode 100644 index 24bc52e83cb..00000000000 --- a/packages/shared/src/locale/json/ar.json +++ /dev/null @@ -1,2306 +0,0 @@ -{ - "Setting.Reset_app_description": "Reset app on this device after 10 failed passcode attempts.", - "Toast.web_auth": "Set failed", - "Token_manage.custom_token_address_faild": "Failed to find the contract address. Try agian. ", - "Token_manage.hidden_token": "{num} Hidden token", - "account_model.watched": "Watched", - "action_save": "Save", - "address.verify_address_instruction": "Verify on device to prevent address replacement attacks", - "address_book.button_close": "Close", - "address_book.button_copy": "Copy", - "address_book.button_next": "Next", - "address_book.button_reset": "Reset", - "address_book.confirm_message": "Confirming this operation will reset your address book data. To avoid losing your data entirely, you can copy the data to the clipboard and save it.", - "address_book.confirm_title": "Confirm", - "address_book.data_anomaly": "Data anomaly", - "address_book.data_anomaly_content": "من المحتمل أن بيانات دفتر العناوين الخاص بك قد تعرضت لتغييرات غير طبيعية.", - "address_book.data_anomaly_description": "Your contact data may have undergone abnormal changes. To ensure the security of your assets, we strongly recommend resetting your address book.", - "address_book.data_anomaly_what_do": "ماذا علي أن أفعل؟", - "address_book.data_anomaly_why_reset": "Why do I need to reset my address book?", - "address_book.data_anomaly_why_reset_description": "أفضل طريقة لضمان الأمان هي إعادة تعيين معلومات دفتر العناوين وإعادة التحقق من أمان البيانات. يمكنك النقر على \"إعادة تعيين\" لبدء عملية إعادة التعيين.", - "address_book.data_anomaly_why_risk": "Why is my data at risk?", - "address_book.data_anomaly_why_risk_description": "Your data is different from the last confirmation save. OneKey doesn't save your data, but ensures that the data will not be tampered with.", - "address_book.data_anomaly_will_lost": "هل سيتم فقدان بيانات دفتر العناوين؟", - "address_book.data_anomaly_will_lost_description": "بعد إعادة التعيين، سيتم مسح دفتر العناوين الخاص بك. لتجنب فقدان البيانات، قم بتصديره بالنقر على \"نسخ\". يرجى التعامل مع البيانات المصدرة بحذر.", - "address_book.dialog_subtitle": "اكتشف كيف يعزز دفتر عناوين OneKey أمان عناوين جهات الاتصال الخاصة بك.", - "address_book.edit_added_on": "تمت الإضافة على", - "address_book.edit_last_edited": "تم التعديل الأخير", - "address_book.empty_add_button": "Add", - "address_book.empty_description": "You haven't added any address yet.", - "address_book.encrypted_storage_description": "OneKey ensures your information security. All your contact data is encrypted and hash-verified with each use to prevent tampering.", - "address_book.encrypted_storage_title": "Encrypted storage", - "address_book.menu_copy": "Copy", - "address_book.menu_edit": "Edit", - "address_book.menu_title": "Menu", - "address_book.no_results_description": "No match found for your search. Please re-enter.", - "address_book.no_results_title": "No Results", - "address_book.search_placeholder": "Search", - "address_book.title": "Address book", - "address_book_add_address.add_to_evm_chains": "Also add to additional EVM-compatible Chains", - "address_book_add_address.address": "Address", - "address_book_add_address.address_exists": "The address already exists.", - "address_book_add_address.address_invalid_error": "Invalid address. Please check and re-enter.", - "address_book_add_address.address_placeholder": "Address or domain", - "address_book_add_address.button_save": "Save", - "address_book_add_address.chain": "Network", - "address_book_add_address.name": "Name", - "address_book_add_address.name_empty_error": "Name cannot be empty.", - "address_book_add_address.name_exists": "The name already exists.", - "address_book_add_address.name_length_erro": "The maximum length is {num} characters.", - "address_book_add_address.name_required": "Required", - "address_book_add_address.title": "Add address", - "address_book_add_address.toast_add_success": "Add successful", - "address_book_add_address.toast_copy_success": "Copied", - "address_book_add_address.toast_delete_success": "Delete successful", - "address_book_add_address.toast_reset_success": "Reset successful", - "address_book_add_address.toast_save_success": "Save successful", - "address_book_edit_address.button_cancel": "Cancel", - "address_book_edit_address.button_confirm": "Confirm", - "address_book_edit_address.delete_contact_message": "Please confirm whether to delete this contact from the address book.", - "address_book_edit_address.delete_contact_title": "Delete Contact", - "address_book_edit_address.title": "Edit Address", - "address_book_select.title": "Select contact", - "address_input.contract_popover": "You are sending to a contract address, not a regular user address. Incorrect transfers to a contract address may result in asset loss. Double-check the address and watch for risks.", - "address_input.first_transfer_popover": "First transfer to this address on {network}. Double-check the address and watch for risks.", - "address_input.transferred_popover": "Previous transfers to this address have been detected. Don’t forget to double-check to ensure it is the intended address.", - "address_label.allowlist": "Allowlist", - "address_type": "Address type", - "adress_book.add_address_add_to_allowlist": "Add to allowlist", - "allowlist.enabled_popover_content": "يمكنك فقط تحويل الأموال إلى الحسابات داخل المحفظة أو إلى العناوين المدرجة في القائمة البيضاء في دفتر العناوين. إذا كنت تفهم المخاطر، يمكنك تعطيلها في https://1key.so/send/protectionالإعدادات >> الحماية", - "allowlist.enabled_popover_title": "Allowlist enabled", - "approve_edit.approve_amount": "Approve amount", - "approve_edit.less_than_swap": "Allowance can't be less than the swap amount", - "approve_edit.title": "Edit allowance", - "approve_edit.unlimited_amount": "Unlimited amount", - "auth.Numeric_Passcode": "6-Digit numeric passcode ", - "auth.Passcode_protection": "Enable passcode protection?", - "auth.Passcode_protection_description": "Enable passcode protection: after 10 failed passcode attempts will reset App, you can change it anytime on Setting.", - "auth.alphanumeric_passcode ": "Alphanumeric passcode ", - "auth.biometric_cancel": "User canceled {biometric} authentication", - "auth.biometric_failed": "Passcode required to enable {biometric}", - "auth.confirm_passcode_form_label": "Confirm passcode", - "auth.confirm_passcode_form_placeholder": "Re-enter your passcode", - "auth.confirm_password_form_label": "Confirm password", - "auth.confirm_password_form_placeholder": "Re-enter your password", - "auth.enter_your_passcode": "Enter your passcode", - "auth.enter_your_password": "Enter your password", - "auth.erro_passcode_too_long": "Passcode cannot exceed {length} characters", - "auth.erro_password_too_long": "Password cannot exceed {length} characters", - "auth.error_passcode_empty ": "Please enter a passcode", - "auth.error_passcode_incorrect": "Incorrect passcode", - "auth.error_passcode_not_match": "Passcodes do not match", - "auth.error_passwcode_too_short": "Passcode must be at least {length} characters", - "auth.error_password_empty": "Please enter a password", - "auth.error_password_incorrect": "Incorrect password", - "auth.error_password_not_match": "Passwords do not match", - "auth.error_password_too_short": "Password must be at least {length} characters", - "auth.new_passcode_form_label": "New passcode", - "auth.new_passcode_same_as_old": "New passcode must differ from the old one", - "auth.new_passwcode_form_placeholder": "Create a strong passcode", - "auth.new_password_form_label": "New password", - "auth.new_password_form_placeholder": "Create a strong password", - "auth.new_password_same_as_old": "New password must differ from the old one", - "auth.passcode_cooldown": "Try again in {cooldowntime} min", - "auth.passcode_failed_alert": "{count} more failed attempts will reset the device", - "auth.passcode_set": "Passcode set", - "auth.password_set": "Password set", - "auth.set_passcode": "Set passcode", - "auth.set_password": "Set password", - "auth.with_biometric": "Authentication with {biometric}", - "backup.address_book_labels": "Address book & labels", - "backup.all_devices": "All devices", - "backup.backup_deleted": "Backup deleted", - "backup.backup_imported": "Backup imported", - "backup.backup_now": "Backup now", - "backup.backup_to_google_drive": "Backup to Google Drive", - "backup.backup_to_icloud": "Backup to iCloud", - "backup.data_already_present": "All the data in this backup is already present on the current device.", - "backup.delete_this_backup": "Delete this backup?", - "backup.enable_feature_download_google_drive": "To enable this feature, please download Google Drive, log in, and ensure that OneKey has the necessary permissions.", - "backup.encrypted_backup_contents": "Encrypted backup contents", - "backup.file_permanently_deleted": "This file will be permanently deleted from iCloud. Make sure you have written down the recovery phrases as you won’t be able to restore the wallets otherwise.", - "backup.file_permanently_deleted_android": "This file will be permanently deleted from Google Drive. Make sure you have written down the recovery phrases as you won’t be able to restore the wallets otherwise.", - "backup.go_system_settings": "Go system settings", - "backup.google_drive_auto_backup_paused": "Google Drive auto-backup paused", - "backup.google_drive_securely_syncs_data": "Google Drive securely syncs your data across devices (excluding hardware wallets). Please authorize OneKey to access your Google Drive. Neither OneKey nor Google can access your wallets.", - "backup.google_drive_status": "Google Drive status", - "backup.icloud_auto_backup_paused": "iCloud auto-backup paused", - "backup.icloud_backup_securely_syncs_your_data": "iCloud backup securely syncs your data across devices (excluding hardware wallets), ensuring that both OneKey and Apple cannot access your wallets.", - "backup.icloud_status": "iCloud Status", - "backup.import_data": "Import data", - "backup.import_from_google_drive": "Import from Google Drive", - "backup.import_from_icloud": "Import from iCloud", - "backup.no_available_google_drive_backups_to_import": "You have no available Google Drive backups to import.", - "backup.no_available_icloud_backups_to_import": "You have no available iCloud backups to import.", - "backup.no_content_available_for_backup": "No content available for backup.", - "backup.no_data": "No Data", - "backup.number_wallets_number_accounts": "{number0} Wallets · {number1} Accounts", - "backup.off_device": "Off-device ({number})", - "backup.on_device": "On-device", - "backup.onekey_doesnt_back_up_hardware_wallets": "OneKey doesn't back up hardware wallets, please record and safeguard your recovery phrase.", - "backup.only_accounts_with_addresses_will_be_backed_up": "For the app wallet, only accounts with addresses will be backed up.", - "backup.please_log_in_to_your_apple_account_and_activate_icloud_drive": "Please log in to your Apple account and activate the iCloud Drive feature before proceeding.", - "backup.please_upgrade_app_to_import_data": "Please upgrade your app to import the data from a newer version.", - "backup.recovery_phrase_backed_up": "Recovery phrase backed up", - "backup.securely_store_recent_backups": "We'll securely store your most recent 30 daily backups plus the last monthly backup for each of the past 24 months, ready for restoration at any time.", - "backup.turn_off": "Turn off", - "backup.turn_on": "Turn on", - "backup.updated_time": "Updated: {time}", - "backup.upgrade_required": "Upgrade required", - "backup.verify_app_passcode_to_import_data": "Verify the App passcode at the time of backup to Import data.", - "backup.verify_app_password_to_import_data": "Verify the App password at the time of backup to Import data.", - "backup.verify_apple_account_and_icloud_drive_enabled": "Please verify your Apple account login and ensure iCloud Drive is enabled and authorized for OneKey.", - "backup.verify_google_account_and_google_drive_enabled": "Please verify your Google account login and ensure Google Drive is enabled and authorized for OneKey.", - "balance_detail.button_acknowledge": "Acknowledge", - "balance_detail.button_balance": "Balance Details", - "balance_detail.button_cancel": "Cancel", - "balance_detail.button_confirm": "Confirm", - "balance_detail.button_done": "Done", - "balance_detail.disable_protection_warning_description": "Disabling inscription protection may result in the accidental transfer of inscription tokens or NFTs. To migrate your inscription assets safely, please use an inscription-compatible wallet such as Unisat or OKX.", - "balance_detail.disable_protection_warning_title": "Disabling inscription protection may lead to loss of inscription assets", - "balance_detail.enable_protection_title": "Enabling Inscription Protection", - "balance_detail.enable_protection_warning": "Inscription assets (Ordinals NFT and BRC-20 tokens) are currently not supported.
To view the details of the protection, check \"Balance Details\".
\nTo migrate your inscription assets safely, please use an inscription-compatible wallet such as Unisat or OKX.", - "balance_detail.frozen": "Frozen", - "balance_detail.frozen_by_inscription": "Inscription Protection", - "balance_detail.how_to_migrate": "How to Migrate Ordinals NFT / BRC-20 Tokens?", - "balance_detail.spendable": "Spendable", - "balance_detail.total": "Total", - "balance_detail.what_is_frozen_balance": "What is Frozen Balance?", - "bandwidth_consumed": "Bandwidth consumed", - "bandwidth_energy.bandwidth": "Bandwidth", - "bandwidth_energy.description": "You can obtain free resources for covering transaction fees by staking TRX on the network. The resources used will dynamically recover to their original amount after a certain period.", - "bandwidth_energy.energy": "Energy", - "bandwidth_energy.get_resources": "Get Resources", - "bandwidth_energy.rent_energy": "Rent Energy", - "bandwidth_energy.title": "Bandwidth & Energy", - "bandwidth_energy.what_is_bandwidth_energy": "What is Bandwidth & Energy on Tron?", - "bip44__standard": "BIP44 standard", - "browser.bookmark": "Bookmark", - "browser.can_be_re_enabled_in_settings": "Can be re-enabled in settings.", - "browser.copy_link": "Copy link", - "browser.dapp_listed_by": "dApp listed by", - "browser.disable": "Global Disable", - "browser.fetching_dapp_info": "Fetching dApp info...", - "browser.hide_on_this_site": "Hide on this site", - "browser.import": "Import", - "browser.invalid_url": "Invalid URL", - "browser.last_verified_at": "Last verified at", - "browser.risk_detection": "Risk detection", - "browser.search_dapp_or_enter_url": "Search dApps or enter URL", - "browser.switch_to_account": "Switch to {account}?", - "clear_build_in_networks_data": "Build-in networks", - "coming_soon": "Coming soon", - "coming_soon_desc": "We're currently developing this feature and will make it available soon.", - "confirm_exit_dialog_desc": "Are you sure you want to exit the data migration process?", - "confirm_exit_dialog_title": "Confirm exit", - "contact_us_instruction": "Need more help?", - "content__amount": "Amount", - "content__custom": "Custom", - "content__fast": "Fast", - "content__from": "From", - "content__gas_limit": "Gas Limit", - "content__gas_price": "Gas Price ({network})", - "content__normal": "Normal", - "content__slow": "Slow", - "content__to": "To", - "copy_address_modal_item_create_address_instruction": "Create address", - "copy_address_modal_title": "Account address", - "copy_anyway": "Copy anyway", - "copy_recovery_phrases_warning_desc": "Clipboard access can expose your recovery phrase to unauthorized apps.", - "copy_recovery_phrases_warning_title": "Copy recovery phrase?", - "count_assets": "{count} assets", - "count_hidden_assets": "{count} hidden assets", - "count_words": "{length} words", - "create_qr_based_hidden_wallet_dialog_title": "Create QR-based hidden wallet", - "create_qr_bassed_hidden_wallet_create_hidden_wallet_desc": "After the standard wallet is created, enter a passphrase to make a hidden wallet.", - "create_qr_bassed_hidden_wallet_create_hidden_wallet_title": "Create hidden wallet", - "create_qr_bassed_hidden_wallet_create_standard_wallet_desc": "No passphrase is needed before displaying the QR code. Tap the ✅ button, show the code, and scan it with the app to create a QR-based standard wallet.", - "create_qr_bassed_hidden_wallet_create_standard_wallet_title": "Create standard wallet", - "custom_network.add_custom_network_failed_toast_text": "Add custom network failed; please try again.", - "custom_network.add_custom_network_successfully_toast_text": "Add custom network successfully", - "custom_network.add_network_action_text": "Add custom network", - "custom_network.form_alert_text": "Untrusted networks can fake blockchain and track you. Use only trusted ones.", - "custom_network.network_exists_feedback_text": "Network already exists", - "custom_network.remove_network_dialog_description": "You will have to add it back to access your assets on this network.", - "custom_network.remove_network_dialog_title": "Remove this network?", - "custom_rpc_cta_label": "Add custom RPC", - "custom_rpc_desc": "The custom RPC will replace OneKey’s node. To revert, disable or delete the custom RPC. If not necessary, use OneKey's nodes for optimal service.", - "custom_rpc_edit_dialog_title": "Custom {network} RPC", - "custom_rpc_empty_title": "No custom RPC", - "custom_rpc_title": "Custom RPC", - "dapp_connect.allow_this_site_to_access": "Allow this site to access your {chain} address.", - "dapp_connect.allow_to_access_your_chain_auth": "Allow this site to access your {chain} auth.", - "dapp_connect.allow_to_access_your_chain_decrypted_message": "Allow to access your {chain} decrypted message", - "dapp_connect.allow_to_access_your_chain_encrypted_message": "Allow to access your {chain} encrypted message", - "dapp_connect.allow_to_access_your_chain_link": "Allow this site to access your {chain} link.", - "dapp_connect.allow_to_access_your_chain_login": "Allow this site to access your {chain} login.", - "dapp_connect.allow_to_access_your_chain_message_signature": "Allow to access your {chain} message signature.", - "dapp_connect.allow_to_access_your_chain_public_key": "Allow to access your {chain} public key.", - "dapp_connect.allow_to_access_your_chain_register": "Allow this site to access your {chain} register.", - "dapp_connect.amount": "Amount", - "dapp_connect.amount_should_be_at_least": "Amount should be at least {0}.", - "dapp_connect.amount_should_not_exceed": "Amount should not exceed {0}.", - "dapp_connect.attackers_disguise_sites_warning": "Attackers may disguise malicious sites as well-known Web3 sites by replacing with unusual characters. Check URL again before approving any requests.", - "dapp_connect.authorization_successful": "Authorization Successful", - "dapp_connect.confirm": "Confirm", - "dapp_connect.connect_to_website": "Connected to {url}", - "dapp_connect.connection_request": "Connection Request", - "dapp_connect.create": "Create", - "dapp_connect.create_invoice_request": "Create Invoice Request", - "dapp_connect.decrypted_request": "Decrypted request", - "dapp_connect.description_optional": "Description (Optional)", - "dapp_connect.detected_malicious_behavior_warning": "Detected malicious behavior on this site by multiple credible sources, it is strongly recommended to reject any request by this site.", - "dapp_connect.do_not_ask_again": "Don’t ask again.", - "dapp_connect.encrypted_request": "Encrypted request", - "dapp_connect.enter_amount": "Enter amount", - "dapp_connect.export": "Export", - "dapp_connect.export_public_key": "Export Public Key", - "dapp_connect.hardware_wallets_do_not_support_solana_message_signing": "Hardware wallets do not support Solana message signing.", - "dapp_connect.hide_full_message": "Hide raw message", - "dapp_connect.http_connection_not_secure": "Insecure HTTP", - "dapp_connect.initiate_message_signature_request": "Initiate message signature request", - "dapp_connect.invoice_created": "Invoice created.", - "dapp_connect.invoice_description": "Invoice description", - "dapp_connect.invoice_payment_request": "Invoice Payment Request", - "dapp_connect.link_successful": "Link Successful", - "dapp_connect.lnurl_approve_request": "LNURL Approve Request", - "dapp_connect.lnurl_connect_request": "LNURL Connect Request", - "dapp_connect.lnurl_login_request": "LNURL Login Request", - "dapp_connect.lnurl_pay_request": "LNURL Pay Request", - "dapp_connect.lnurl_register_request": "LNURL Register Request", - "dapp_connect.lnurl_withdraw_request": "LNURL Withdraw Request", - "dapp_connect.login_successful": "Login Successful", - "dapp_connect.malicious_site_detected": "Marked as malicious by multiple sources.", - "dapp_connect.malicious_site_warning": "Malicious site", - "dapp_connect.message": "Message", - "dapp_connect.message_to_the_payer": "A message to the payer", - "dapp_connect.msg_authentication_failed_verify_again": "Authentication failed, please verify again.", - "dapp_connect.msg_description_can_be_up_to_int_characters": "Description can be up to {number} characters.", - "dapp_connect.msg_invalid_lightning_payment_request": "Invalid lightning payment request.", - "dapp_connect.msg_no_content": "No content.", - "dapp_connect.nostr_event_kind_0": "Metadata", - "dapp_connect.nostr_event_kind_1": "Short Text Note", - "dapp_connect.nostr_event_kind_10002": "Relay List Metadata", - "dapp_connect.nostr_event_kind_1984": "Reporting", - "dapp_connect.nostr_event_kind_2": "Recommend Relay", - "dapp_connect.nostr_event_kind_22242": "Client Authentication", - "dapp_connect.nostr_event_kind_24133": "Nostr Connect", - "dapp_connect.nostr_event_kind_3": "Follows", - "dapp_connect.nostr_event_kind_30008": "Profile Badges", - "dapp_connect.nostr_event_kind_30009": "Badge Definition", - "dapp_connect.nostr_event_kind_30023": "Long-form Content", - "dapp_connect.nostr_event_kind_30078": "Application-specific Data", - "dapp_connect.nostr_event_kind_4": "Encrypted Direct Messages", - "dapp_connect.nostr_event_kind_40": "Channel Creation", - "dapp_connect.nostr_event_kind_41": "Channel Metadata", - "dapp_connect.nostr_event_kind_42": "Channel Message", - "dapp_connect.nostr_event_kind_43": "Channel Hide Message", - "dapp_connect.nostr_event_kind_44": "Channel Mute User", - "dapp_connect.nostr_event_kind_5": "Event Deletion", - "dapp_connect.nostr_event_kind_7": "Reaction", - "dapp_connect.nostr_event_kind_8": "Badge Award", - "dapp_connect.nostr_event_kind_9734": "Zap Request", - "dapp_connect.nostr_event_kind_9735": "Zap", - "dapp_connect.nostr_event_kind_unknown": "Nostr {kind} event", - "dapp_connect.nostr_plaintext": "Plaintext", - "dapp_connect.order_alert": "You are using order authorization, ensure the dApp is trustworthy to avoid asset loss.", - "dapp_connect.pay_to_node": "Pay to Lightning Node", - "dapp_connect.permit_sign_alert": "You’re using {type} authorization, ensure the dApp is trustworthy to avoid asset loss.", - "dapp_connect.proceed_at_my_own_risk": "Proceed at my own risk", - "dapp_connect.registration_successful": "Registration Successful", - "dapp_connect.request_for_lnurl_linking_key": "Request for LNURL linking key", - "dapp_connect.request_invoices_and_lightning_information": "Request invoices and lightning information", - "dapp_connect.requested_permissions": "Requested permissions", - "dapp_connect.retrieve_your_encryption_public_key": "Retrieve your encryption public key", - "dapp_connect.risk_sign": "This type of signature request can sometimes be used for malicious purposes. Only sign it if you fully trust the website.", - "dapp_connect.sats_between": "between {min} and {max} sats", - "dapp_connect.send_approval_requests": "Send approval requests", - "dapp_connect.signature_request": "Signature request", - "dapp_connect.site_not_using_private_connection_warning": "The site does not use a private connection, attackers may be able to view and change the information you send and get through this site.", - "dapp_connect.site_suspected_of_malicious_behavior_warning": "This site is suspected of malicious behavior, continuing to approve requests may pose security risks.", - "dapp_connect.suspected_malicious_behavior": "Suspected malicious behavior", - "dapp_connect.suspected_malicious_behavior_on_this_site": "Suspected malicious behavior", - "dapp_connect.the_sites_connection_is_not_secure": "The site's connection is not secure.", - "dapp_connect.url_contains_unusual_characters": "Suspicious URL", - "dapp_connect.url_contains_unusual_characters_warning": "URL contains unusual characters.", - "dapp_connect.verified_site": "Verified", - "dapp_connect.verified_site_warning": "Verified site.", - "dapp_connect.verified_web3_site_warning": "Verified Web3 site by multiple credible sources, can be used with confidence.", - "dapp_connect.view_decrypted_message": "View decrypted message", - "dapp_connect.view_encrypted_message": "View encrypted message", - "dapp_connect.view_full_message": "View raw message", - "dapp_connect.view_your_balance_and_activity": "View your balance and activity", - "dapp_connect.watch_your_account_balance_and_activity": "Watch your account balance and activity", - "dapp_connect.withdraw_request_sent": "Withdraw Request Sent", - "date.today": "Today", - "date.yesterday": "Yesterday", - "derivation_path": "Derivation path", - "description_403": "Our services are not available in your region.", - "device_auth.certificate": "Certificate", - "device_auth.continue_anyway_warning_message": "We're currently unable to verify your device. Continuing may pose security risks.", - "device_auth.request_desc": "Confirm on your device to verify its authenticity and secure your connection.", - "device_auth.request_title": "Device authentication", - "device_auth.successful_desc": "Your device is now officially verified! You're all set to enjoy a secure and seamless experience.", - "device_auth.successful_title": "Verification successful", - "device_auth.temporarily_unavailable": "Verification temporarily unavailable", - "device_auth.temporarily_unavailable_help_text": "Currently, we're unable to verify your device due to server issues. Please try again later.", - "device_auth.unofficial_device_detected": "Unofficial device detected", - "device_auth.unofficial_device_detected_help_text": "Your device could not be verified as official. Please contact us immediately.", - "device_auth.verifying_component_label": "In progress", - "device_auth.verifying_desc": "Please wait...", - "device_auth.verifying_title": "Verifying device", - "dont_have_mobile_app_yet": "Don’t have the mobile App yet?", - "downgrade_warning_checkbox_label": "I will NOT downgrade to OneKey v4", - "downgrade_warning_description": "Do NOT downgrade to OneKey v4. Downgrading will lead to irreversible data loss.", - "downgrade_warning_title": "Important: Do not downgrade", - "earn.24h_earnings": "24h earnings", - "earn.24h_earnings_tooltip": "Estimated 24 hours earnings based on your activated amount.", - "earn.active": "Active", - "earn.annually": "Annually", - "earn.approaching_staking_cap": "As we’re approaching the staking cap, please check your staking results. You’ll need to restake if marked as overflow.", - "earn.auto_risk_control": "التحكم في المخاطر التلقائية", - "earn.auto_risk_control_desc_1": "في الحالات القصوى، مثل اختراق البروتوكول أو إلغاء ربط الأسعار، سيقوم مديرو الخزنة بسحب الاستثمارات من المجمع بشكل استباقي.", - "earn.auto_risk_control_desc_2": "ستبقى الأموال في قسم الخمول في الخزنة لاستخدامها عند السحب، مع إعطاء الأولوية لسلامة رأس المال.", - "earn.auto_risk_control_desc_3": "عندما يتم تفعيل التحكم في المخاطر، تزداد الأموال الخاملة في المجمع، مما يؤدي إلى انخفاض العائدات.", - "earn.auto_risk_control_disclaimer": "توفر ميزة \"التحكم التلقائي في المخاطر\" طبقة إضافية من الحماية لاستثماراتك. تعتمد دقة هذه الميزات وتوقيتها على الدعم من جهات خارجية. سنبذل قصارى جهدنا لضمان التشغيل العادي، ولكن قد تكون هناك قيود فنية أو تشغيلية في مواقف معينة. لذلك، لا نتحمل أي مسؤولية قانونية إذا لم تعمل ميزة \"التحكم التلقائي في المخاطر\" بالشكل المقصود.", - "earn.auto_risk_control_subtitle": "حماية أموالك في المواقف القصوى", - "earn.automatically": "automatically", - "earn.available_assets": "All assets", - "earn.available_assets_desc": "Increase your holdings by staking assets.", - "earn.banner_stake_in_babylon_ecosystem": "Stake Your BTC with Babylon", - "earn.check_staking_results_overflow": "Check your staking results. If marked as overflow, need to be withdrawn and claimed", - "earn.claim": "Claim", - "earn.claim_assets_after_processing": "Claim your assets once the processing is complete", - "earn.claim_available_in_number_days": "Claim available in {number} days", - "earn.claim_limitations": "Due to the limitations of Lido, you must claim each of your withdrawals separately.", - "earn.claim_rewards": "Claim rewards", - "earn.claim_rewards_morpho_desc": "يتم حساب المكافآت من جميع مراكز المراهنة على Morpho ويتم تحديثها كل أسبوعين تقريبًا.", - "earn.claim_together_tooltip": "Automatically claimed to your wallet after each asset staking or withdrawal request.", - "earn.claim_token": "Claim {token}", - "earn.claim_token_desc": "Claim your {token} after the withdrawal request has been processed.", - "earn.claimable": "Claimable", - "earn.claimable_in_future": "{value} {symbol} ({fiatValue}) قابلة للمطالبة في المستقبل", - "earn.claimed": "Claimed", - "earn.commission": "Commission", - "earn.commission_tooltip": "A specific percentage of your rewards or points is deducted as a commission for the provider.", - "earn.confirmed_cap": "Confirmed cap", - "earn.currently_staking": "Currently staking", - "earn.daily": "Daily", - "earn.disclaimer": "تنصل", - "earn.early_withdraw_stake_unstaking_period": "Early withdraw your stake anytime with a unstaking period of {number} days", - "earn.earn_during_unstaking_tooltip": "Assets will continue to earn rewards during the unstaking period after withdrawal.", - "earn.earn_points": "Earn points", - "earn.earn_points_desc": "OneKey partners with Babylon, enabling you to stake and complete Babylon’s tasks to earn points.", - "earn.earn_symbol": "Earn {symbol}", - "earn.earn_up_to_number_per_year": "Earn up to {number} per year", - "earn.earn_up_to_number_per_year_desc": "The APR is updated hourly and adjusted according to changes in TVL.", - "earn.earnings_start": "Earnings start", - "earn.est_annual_rewards": "Est. annual rewards", - "earn.est_receive": "Est. receive", - "earn.feature_1_desc": "Stake your assets and earn passive returns effortlessly", - "earn.feature_1_title": "Activate idle assets", - "earn.feature_2_desc": "Secure staking with the freedom to withdraw anytime", - "earn.feature_2_title": "Enjoy flexible staking", - "earn.feature_3_desc": "Boost your earnings with optimized staking at peak profitability", - "earn.feature_3_title": "Maximize your rewards", - "earn.feature_list_title": "Watch your holdings grow", - "earn.finality_provider": "Finality provider", - "earn.how_does_the_lido_protocol_work": "How does the Lido protocol work?", - "earn.how_does_the_lido_protocol_work_desc": "Lido provides an innovative solution to the hurdles presented by traditional PoS staking by effectively lowering barriers to entry and the costs associated with locking up one's assets in a single protocol. When a user deposits their assets to Lido, the tokens are staked on the Lido blockchain via the protocol.", - "earn.in_number": "In {number}", - "earn.insufficient_balance": "Insufficient balance", - "earn.insufficient_claimable_balance": "Insufficient claimable balance.", - "earn.insufficient_staked_balance": "Insufficient staked balance", - "earn.investment_details": "Investment details", - "earn.last_day": "Last day", - "earn.last_month": "Last month", - "earn.last_week": "Last week", - "earn.lending": "Lending", - "earn.less_than_number_days": "< {number} days", - "earn.lido_token_redemption": "Lido {token} redemption", - "earn.lido_token_staking": "Lido {token} staking", - "earn.liquid_staking": "Liquid staking", - "earn.manually": "manually", - "earn.maximum_staking_alert": "The maximum staking amount is {number} {symbol}.", - "earn.min_max_staking": "Min./Max. staking", - "earn.min_staking": "Min. staking", - "earn.min_total_staking": "Min. total staking", - "earn.minimum_amount": "The minimum amount is {number}.", - "earn.minimum_claim_tooltip": "The minimum reward claim is {number} {symbol}, but rewards will be claimed to your wallet with each staking or withdrawal request, without limits.", - "earn.minimum_staking_alert": "The minimum staking amount is {number} {symbol}.", - "earn.minimum_total_staking_alert": "The minimum total staking amount must be above {number} {symbol}.", - "earn.minimum_withdrawal_alert": "The minimum withdrawal amount is {number} {symbol}.", - "earn.missing_rewards": "Missing rewards", - "earn.missing_rewards_tooltip": "Estimated yearly rewards you could earn if your assets were staked, based on the current value.", - "earn.monthly": "Monthly", - "earn.native_apy": "Native APY", - "earn.native_staking": "Native staking", - "earn.no_orders": "No orders", - "earn.no_orders_desc": "You haven’t staked any assets yet.", - "earn.not_enough_token": "Not enough {token}?", - "earn.number_day": "{number} day", - "earn.number_days": "{number} day(s)", - "earn.number_days_left": "{number} days left", - "earn.number_days_number_block": "{number_days} days ({number} block)", - "earn.number_hours": "{number} hours", - "earn.number_minutes": "{number} minutes", - "earn.number_seconds": "{number} seconds", - "earn.number_symbol_left": "{number} {symbol} left", - "earn.overflow": "Overflow", - "earn.overflow_alert": "Overflow stake should be withdrawn and claimed.", - "earn.overflow_number_alert": "{number} BTC is in overflow and should be withdrawn and claimed.", - "earn.pay_with": "Pay with", - "earn.pending_activation": "Pending activation", - "earn.pending_activation_tooltip": "New staking needs to wait around {number} before becoming active and starting to earn rewards.", - "earn.pending_activation_tooltip_eth": "Your staked ETH becomes active once the validator reaches the 32 ETH requirement.", - "earn.pending_transactions_data_out_of_sync": "Data may take time to sync after the successful transaction.", - "earn.portfolio": "Portfolio", - "earn.portfolio_details": "Portfolio details", - "earn.protection": "حماية", - "earn.protocol_rewards": "مكافآت البروتوكول", - "earn.provider_asset_staking": "{provider} {asset} staking", - "earn.provider_asset_withdrawal": "{provider} {asset} withdrawal", - "earn.provider_staked": "Provider staked", - "earn.reaching_staking_cap": "Staking is temporarily unavailable due to hitting the cap or passing the deadline.", - "earn.receive": "Receive", - "earn.receive_lido_nft": "Receive Lido NFT", - "earn.receive_lido_nft_desc": "Each withdrawal request generates a Lido NFT, and its appearance changes when your {token} becomes available for withdrawal.", - "earn.receive_steth_desc": "When you stake ETH you receive 1:1 stETH. You can unstake and trade this liquid asset at any time.", - "earn.receive_stmatic_desc": "When you stake MATIC you receive stMATIC. You can unstake and trade this liquid asset at any time.", - "earn.receive_token": "Receive {token}", - "earn.receive_token_trade_anytime": "Receive {token} and trade it at any time", - "earn.recommended": "Recommended", - "earn.redeem": "Redeem", - "earn.request_withdrawal": "Request withdrawal", - "earn.request_withdrawal_steth_desc": "Lock your stETH/wstETH by issuing a withdrawal request. After 1-4 days, the locked stETH will be destroyed and your ETH will become available for withdrawal.", - "earn.request_withdrawal_stmatic_desc": "1-4 days after issuing a withdrawal request, the locked stMATIC will be destroyed and your MATIC will become available for withdrawal.", - "earn.reward_tokens": "Reward tokens", - "earn.reward_value": "Reward value", - "earn.rewards": "Rewards", - "earn.rewards_automatically_restaked": "Rewards are {automatically} restaked, increasing your staked body", - "earn.rewards_dynamic_real_time": "Rewards are dynamic and update in real time based on market supply and demand", - "earn.rewards_manually_restaked": "Rewards need to be {manually} withdrawn and restaked", - "earn.rewards_percentage": "Rewards (%)", - "earn.rewards_updated_around_time": "Rewards updated around {time}", - "earn.rewards_updated_daily": "Rewards updated {daily}", - "earn.rewards_updated_daily_steth_desc": "There’ll be a daily update on your stETH balances, which includes the staking rewards.", - "earn.rewards_updated_daily_stmatic_desc": "During the staking period, the value of stMATIC changes to reflect earnings.", - "earn.select_a_claimable_order": "Select a claimable order", - "earn.select_an_order_to_withdraw": "Select an order to withdraw", - "earn.select_for_early_withdrawal": "Select for early withdrawal", - "earn.select_for_early_withdrawal_desc": "Unstake your assets before their expiration", - "earn.stake": "Stake", - "earn.stake_and_earn": "Stake and earn", - "earn.stake_in_babylon_ecosystem": "Stake in Babylon ecosystem", - "earn.stake_release_period": "Stake release period", - "earn.stake_release_period_desc": "After issuing a withdrawal request, you'll get an NFT certificate to claim funds. It'll take about 1-4 days before you can claim.", - "earn.stake_through_onekey_earn_points": "Stake through OneKey and earn the same points as on the official website", - "earn.stake_token": "Stake {token}", - "earn.staked": "Staked", - "earn.staked_assets_available_after_period": "After the above time period, then your staked assets will be available to claim.", - "earn.staked_value": "Staked value", - "earn.staking_cap": "Staking cap", - "earn.staking_methods": "Staking methods", - "earn.symbol_staking_provider": "{symbol} staking provider", - "earn.term": "Term", - "earn.term_tooltip": "BTC can be claimed at the end of the staking term.", - "earn.token_available_to_stake": "{token} available to stake", - "earn.token_is_claimable": "{token} is claimable", - "earn.token_is_pending": "{token} is pending", - "earn.token_is_staked": "{token} is staked", - "earn.total_apy": "Total APY", - "earn.total_staked_value": "Total staked value", - "earn.transaction_loss": "Transaction loss", - "earn.transaction_loss_when_claim": "Due to the est network fee exceeding your rewards, this transaction will result in a loss of {number}.", - "earn.transaction_loss_when_stake": "Based on the current estimated rate, it will take about {number} days for your earnings to cover the losses.", - "earn.tvl": "TVL", - "earn.unlock_time": "Unlock time", - "earn.unstake_all_due_to_min_withdrawal": "Due to the minimum withdrawal amount of {number} {symbol}, this transaction will unstake all assets to avoid insufficient funds for the next withdrawal.", - "earn.unstaking_period": "Unstaking period", - "earn.unstaking_period_tooltip": "The estimated period from requesting withdrawal to when tokens can be claimed.", - "earn.unsupported_path_desc": "Switch the derivation path to Taproot", - "earn.unsupported_path_title": "This stake doesn’t support {path}", - "earn.unsupported_token": "Unsupported token", - "earn.unsupported_token_desc": "This token is not currently supported for Buy service.", - "earn.until_next_launch": "Until next launch", - "earn.until_next_launch_tooltip": "A minimum of 32 ETH is required for a pool to begin producing rewards for users.", - "earn.up_to_number_days": "Up to {number} days", - "earn.up_to_number_in_annual_rewards": "Up to {number} in annual rewards", - "earn.update_frequency": "Update frequency", - "earn.updated_daily": "Updated daily", - "earn.validator": "Validator", - "earn.wallet_not_support_stake": "The connected wallet do not support stake. Try switch to another one.", - "earn.weekly": "Weekly", - "earn.what_is_lending": "What is lending?", - "earn.what_is_lending_desc": "Lending lets you earn passive income by supplying assets to a lending protocol’s liquidity pool. Borrowers pay interest on borrowed funds, and you receive a portion as interest, growing your holdings over time.", - "earn.what_is_liquid_staking": "What is liquid staking?", - "earn.what_is_liquid_staking_desc": "Liquid staking lets you earn rewards while keeping your tokens liquid. You can trade or lend them, giving you more flexibility to explore other DeFi opportunities for higher returns.", - "earn.what_is_native_staking": "What is native staking?", - "earn.what_is_native_staking_desc": "Native staking allows you to earn passive income by locking your tokens to secure a Proof-of-Stake blockchain. In return, you receive rewards in the same tokens, offering a low-risk way to grow your assets.", - "earn.what_is_the_possible_risk_of_lido": "What is the possible risk of Lido?", - "earn.what_is_the_possible_risk_of_lido_desc": "There is a certain risk in using Lido for staking, such as network or validator failures that may result in the loss of staked assets (penalties), or Lido smart contract vulnerabilities or errors. Although the code has been open-sourced, audited and widely covered, any cryptocurrency investment carries risks and needs to be evaluated independently.", - "earn.why_do_you_receive_steth": "Why do you receive stETH?", - "earn.why_do_you_receive_steth_desc": "When you deposit ETH into Lido, you receive Lido's liquid staking token, stETH, which represents your proportional claim to ETH in Lido. As validators operating on Lido receive rewards, you are eligible to receive rewards proportional to your stake, which is typically expected to occur daily.", - "earn.why_do_you_receive_stmatic": "Why do you receive stMATIC?", - "earn.why_do_you_receive_stmatic_desc": "When you deposit MATIC into Lido, you receive Lido's liquid staking token, stMATIC, which represents your proportional claim to MATIC in Lido. As validators operating on Lido receive rewards, you are eligible to receive rewards proportional to your stake, which is typically expected to occur daily.", - "earn.withdraw_token": "Withdraw {token}", - "earn.withdrawal_process_desc": "The withdrawal process is simple and will be divided into the following steps:", - "earn.withdrawal_processed_immediately": "Withdrawal will be processed immediately, and your staked assets will be returned right away.", - "earn.withdrawal_requested": "Withdrawal requested", - "earn.withdrawal_take_up_to_number_days": "Take {number} days after issuing a withdrawal request", - "earn.withdrawal_up_to_number_days": "Withdrawal can take up to {number} days, and then your staked assets will be available", - "earn.withdrawn": "Withdrawn", - "energy_consumed": "Energy consumed", - "enter_passcode": "Enter passcode", - "enter_password": "Enter password", - "enter_pin.desc": "Check device screen for keypad layout.", - "enter_pin.enter_on_device": "Enter PIN on device", - "enter_pin.invalid_pin": "Invalid PIN code", - "enter_pin.title": "Enter PIN code", - "enter_pin_on_app": "Enter PIN on app", - "explore.add_bookmark": "Add Bookmark", - "explore.add_to_whitelist": "add to whitelist", - "explore.addresses_count": "{number} addresses", - "explore.all_chains": "All Chains", - "explore.back_to_home": "Back to Home", - "explore.badge_airdrop": "Airdrop", - "explore.badge_hot": "Hot", - "explore.badge_new": "New", - "explore.bookmark_at_least": "Bookmark must be at least 1 characters", - "explore.bookmark_exceed": "Bookmark cannot exceed 24 characters", - "explore.bookmark_renamed": "Bookmark Renamed", - "explore.bookmarks": "Bookmarks", - "explore.camera_permission": "Camera: For taking photos or video calls.", - "explore.cancel_default": "Cancel the default on this dApp", - "explore.categories": "Categories", - "explore.category_exchanges": "Exchanges", - "explore.category_games": "Games", - "explore.category_marketplaces": "Marketplaces", - "explore.category_new": "New", - "explore.clear_history_message": "Are you sure you want to clear your browser history?", - "explore.clear_history_prompt": "Clear history?", - "explore.close_all": "Close all", - "explore.close_pin_tab": "Close Pin Tab", - "explore.close_tab": "Close Tab", - "explore.connected_accounts": "Connected Accounts", - "explore.connection_is_not_private": "Connection is not private", - "explore.connection_is_not_private_warning": "Only supports HTTPS protocol, unsafe website is vulnerable to attacks and forgerly.", - "explore.dapp_connections": "dApp connections", - "explore.date_format_short": "{month_abbr} {day} {year}", - "explore.date_today": "Today", - "explore.date_yesterday": "Yesterday", - "explore.default_wallet_canceled": "OneKey Default Canceled", - "explore.default_wallet_canceled_desc": "Refresh the page to retry with a different wallet.", - "explore.default_wallet_set": "OneKey is your default wallet now.", - "explore.default_wallet_settings": "Default Wallet Settings", - "explore.disconnect": "Disconnect", - "explore.dismiss": "Dismiss", - "explore.enter_bookmark_name": "Please enter the bookmark name", - "explore.excluded_dapps": "Excluded dApps", - "explore.excluded_dapps_description": "Right-click blank space, select the option below to exclude.", - "explore.explore": "Explore", - "explore.got_it": "Got it!", - "explore.history": "History", - "explore.location_permission": "Location: For providing location-based services.", - "explore.malicious_dapp": "Malicious dApp", - "explore.malicious_dapp_warning": "The current website may be malicious, continue visiting could result in loss of assets. If you understand the risks and want to proceed, you can dismiss or add to whitelist.", - "explore.malicious_dapp_warning_addToWhiteListLink": "add to whitelist", - "explore.malicious_dapp_warning_continueLink": "dismiss", - "explore.malicious_dapp_warning_continueMessage": "If you understand the risks and want to proceed, you can", - "explore.malicious_dapp_warning_description": "The current website may be malicious. Continue visiting could result in loss of assets.", - "explore.malicious_dapp_warning_sourceMessage": "Powered by", - "explore.manage_dapp_connections": "Manage dApp connections", - "explore.microphone_permission": "Microphone: For voice input or calls.", - "explore.network_issue_detected": "Network issue detected. Please verify your connection and refresh the page.", - "explore.new_tab": "New Tab", - "explore.no_boomark": "No Bookmarks Yet", - "explore.no_dapps_connected": "No dApps connected", - "explore.no_dapps_connected_message": "You haven't connected to any dApps yet.", - "explore.no_history": "No History Yet", - "explore.open_in_browser": "Open in Browser", - "explore.options": "Options", - "explore.permission_restriction_alert": "Permission restriction alert", - "explore.permission_restriction_message": "For your safety, the following permissions will be disabled on this site:", - "explore.pin": "Pin", - "explore.refresh_page": "Please refresh the page and retry", - "explore.refresh_page_link": "refresh the page", - "explore.reload": "Reload", - "explore.remove_all": "Remove all", - "explore.remove_bookmark": "Remove Bookmark", - "explore.removed_success": "Removed success", - "explore.rename": "Rename", - "explore.risky_domain": "Risky domain", - "explore.risky_domain_warning": "Possibly a fake website. Attackers sometimes make subtle, undetectable changes to URLs to impersonate websites.", - "explore.search_dapps": "Search dApps", - "explore.search_placeholder": "Search", - "explore.see_all": "See all", - "explore.set_default": "Set OneKey as Default Wallet", - "explore.set_default_wallet": "Set OneKey as default wallet", - "explore.set_default_wallet_description": "Use OneKey as the default wallet to connect to dApps.", - "explore.share": "Share", - "explore.suggested": "Suggested", - "explore.tab_prompt": "You can touch and hold to pin this tab for quick access.", - "explore.tabs_count": "{number} Tabs", - "explore.toast_bookmark_added": "Bookmark added", - "explore.toast_bookmark_removed": "Bookmark removed", - "explore.toast_pinned": "Pinned", - "explore.toast_tab_limit_reached": "Tabs has reached the maximum limit of {number}.", - "explore.toast_unpinned": "Unpinned", - "explore.unable_to_connect": "Unable to connect", - "explore.unpin": "Unpin", - "explore.unsupported_chain": "Unsupported yet", - "faq.private_key": "What is a private key?", - "faq.private_key_desc": "A unique alphanumeric code to control your assets.", - "faq.private_key_keep": "Keep your private key safe", - "faq.private_key_keep_desc": "Never disclose this key. Anyone with your private keys can steal any assets held in your account.", - "faq.recovery_phrase": "What is a recovery phrase?", - "faq.recovery_phrase_explaination": "A series of 12, 18, or 24 words to restore your wallet.", - "faq.recovery_phrase_safe_store": "Is it safe to enter it into OneKey?", - "faq.recovery_phrase_safe_store_desc": "Yes, it’s stored locally and never leave your device without your explicit permission.", - "faq.watched_account": "Watched account", - "faq.watched_account_desc": "Watched account in OneKey allows monitoring of a specific address but cannot send or receive funds. It's useful for tracking transactions or monitoring holdings.", - "fee.expected_fee": "Expected fee", - "fee.fee": "Fee", - "fee.fee_rate": "Fee rate", - "fee.fee_rate_too_high": "{something} is higher than necessary", - "fee.fee_rate_too_low": "{feeParam} is low for current network conditions", - "fee.l1_base_fee": "L1 base fee", - "fee.max_fee": "Max fee", - "fee.new_fee": "New fee", - "fee.original_fee": "Original fee", - "fee_alert_dialog_checkbox_label": "I still want to proceed with the transaction.", - "fee_alert_dialog_description": "The network fee is currently too high. Please reduce the fee or try again later.", - "fee_alert_dialog_title": "Network fee alert", - "feedback.account_balance_not_equal_to_utxos": "Available balance cannot be less than 0, input amount: {amount}, dust: {dust}", - "feedback.address_mismatch": "Address mismatch", - "feedback.address_mismatch_desc": "The address doesn’t match the hardware wallet. Stop using this address immediately and contact us.", - "feedback.address_not_activated_message": "Address not activated yet", - "feedback.address_not_matched": "Address not matched", - "feedback.address_pasted_text": "Address pasted", - "feedback.address_type_does_not_support_sign_method": "Only {type} addresses support this signature method", - "feedback.bluetooth_issue": "Bluetooth issue", - "feedback.bluetooth_pairing_failed": "Bluetooth pairing failed", - "feedback.bluetooth_unparied": "Bluetooth unpaired", - "feedback.chainid_unsupported_yet": "{chainId} unsupported yet", - "feedback.change_saved": "Change saved", - "feedback.connected_accounts_speed_up_or_cancel": "The connected account cannot alter a transaction. To override, submit a new transaction with the same nonce via your external wallet.", - "feedback.connection_request_denied": "Connection request denied", - "feedback.copied": "Copied", - "feedback.current_network_message": "{network} is the current network", - "feedback.dapp_connected_account": "{dapp} connected {account}", - "feedback.derivation_path_restriction": "Derivation path restriction", - "feedback.device_psbt_signature_utxo_reached_limit_desc": "The number of UTXOs exceeds the device limit of {count} UTXOs per signature for this device. You can try to send required funds to this address first to create a single UTXO, then try again.", - "feedback.device_psbt_signature_utxo_reached_limit_title": "PSBT Signature Failed - UTXO Limit Exceeded", - "feedback.edited_network_fee_still_too_low_message": "The edited network costs were less than required, so we’ve adjusted them automatically for you.", - "feedback.error_dot_account_retention_prompt": "Transfers may reduce the balance below {0}, resulting in account deactivation and clearing balance due to Polkadot on-chain mechanism. Confirm before proceeding.", - "feedback.external_wallet_does_not_approve_network": "The external wallet does not approve this network", - "feedback.external_wallet_doesn_not_approve_address": "The external wallet does not approve this address", - "feedback.failed_to_fet_fee_rate": "Failed to get fee rate, please try again", - "feedback.failed_to_fetch_network_fee": "Failed to fetch network fee", - "feedback.failed_to_get_utxos": "No available UTXO. Please wait or try a smaller amount.", - "feedback.failed_to_parse_transaction": "Failed to parse transaction", - "feedback.failed_to_sign_transaction": "Failed to sign transaction", - "feedback.forbidden_key_path_error": "You may encounter a forbidden key path error. Disable hardware “Security Check” to resolve.", - "feedback.hardware_is_busy": "Hardware is currently busy. Please try again later", - "feedback.hardware_unsupported_current_address_type": "This device does not support this type of address", - "feedback.hw_polling_time_out": "Connection timeout", - "feedback.invalid_phrases": "Invalid phrases", - "feedback.invalid_qr_code": "Invalid QR code", - "feedback.invalid_words_title": "Invalid words", - "feedback.invalid_words_title_message": "Double-check and retry", - "feedback.kaspa_utxo_limit_exceeded_text": "Transfer failed. UTXO limit exceeded. Please consolidate UTXOs or reduce transfer amount to {amount} {symbol}.", - "feedback.network_hidden_from_all_networks_toast_title": "{network} assets now hidden from 'All networks' view", - "feedback.network_shown_in_all_networks_toast_title": "{network} assets now shown in 'All networks' view", - "feedback.no_connected_account": "No connected account", - "feedback.onekey_bridge_installation_required": "Please install OneKey Bridge first. OneKey Bridge facilitates seamless communication between OneKey and your browser, ensuring an enhanced user experience.", - "feedback.passcode_set_failed": "Passcode setup failed", - "feedback.passphrase_disabled": "Passphrase disabled", - "feedback.passphrase_not_matched": "Passphrase not matched", - "feedback.passphrase_verification_cancelled": "Passphrase verification cancelled", - "feedback.password_set_failed": "Password setup failed", - "feedback.pasted_and_cleared": "Pasted and clipboard cleared", - "feedback.pin_verification_cancelled": "PIN verification cancelled", - "feedback.polkadot_supported_recover_phrases_type": "Only wallets with 12/24-word recovery phrases can create addresses for this network", - "feedback.psbt_inputs_mismatch": "PSBT input mismatch detected", - "feedback.psbt_not_found": "PSBT could not be located", - "feedback.psbt_outputs_mismatch": "PSBT output mismatch detected", - "feedback.psbt_uuid_mismatch": "PSBT UUID mismatch detected", - "feedback.remove": "Removed", - "feedback.request_failed": "Request failed", - "feedback.risk_detection_timed_out": "Risk detection information retrieval failed.", - "feedback.sign_success": "تم التوقيع بنجاح", - "feedback.sol_sign_unupported_message": "Signing Solana message is not supported yet", - "feedback.transaction_ckb_error_convert": "Failed to convert transaction, please try again.", - "feedback.transaction_ckb_error_less": "The balance after the transaction must not be less than {miniAmount}.", - "feedback.transaction_submitted": "Transaction submitted", - "feedback.transfer_cause_balance_lower_1_dot": "The balance will be below {amount} {symbol} after the transfer, and the remaining balance will be cleared", - "feedback.try_repairing_device_in_settings": "Try re-pairing the device in settings.", - "feedback.try_toggling_bluetooth": "Try toggling Bluetooth off and on.", - "feedback.unable_to_send_frozen_balance": "Unable to send frozen balance. Please check the Balance Details.", - "feedback.unsupported_address_or_network": "Unsupported address or network: {routeAddress}", - "feedback.unsupported_chains": "Unsupported chains", - "feedback.unsupported_methods": "Unsupported methods", - "feedback.user_rejected": "User rejected", - "feedback.walletconnect_session_discconected": "WalletConnect session disconnected", - "feedback.you_are_offline": "You are offline. Please check your network.", - "for_reference_only": "Reference only", - "form.address_error_invalid": "Invalid address", - "form.address_placeholder": "Address or domain", - "form.amount_placeholder": "Enter amount", - "form.amount_recipient_activate": "Recipient requires reserve {amount} {unit} to activate", - "form.block_explorer_url_label": "Block explorer URL", - "form.confirm_passphrase": "Confirm passphrase", - "form.confirm_passphrase_placeholder": "Re-enter your passphrase", - "form.custom_rpc_error_invalid": "Invalid RPC", - "form.enter_account_name": "Name (optional)", - "form.enter_account_name_placeholder": "Account name", - "form.enter_private_key_placeholder": "Enter your private key", - "form.gas_limit_error_range": "Gas limit must between {min} and {max}", - "form.global_error_something_higher_then_necessary": "{something} is higher than necessary", - "form.keep_hidden_wallet_label": "Keep accessible", - "form.keep_hidden_wallet_label_desc": "Hidden wallets clear on app close. Toggle to preserve.", - "form.lighting_invoice_amount_error_max": "Amount must not exceed {amount} sats", - "form.lighting_invoice_error_positive_integer_only": "Only positive integers allowed", - "form.lighting_invoice_placeholder": "e.g., Coffee purchase, Invoice #12345", - "form.max_base_fee_description": "Base fee required", - "form.must_greater_then_value": "Must be greater than {value}", - "form.network_name_label": "Network name", - "form.optional_indicator": "Optional", - "form.payment_id_error_text": "Payment ID must be a 64-char hex string", - "form.private_key_error_invalid": "Invalid private key", - "form.public_key_error_invalid": "Invalid public key", - "form.public_key_placeholder": "Enter your public key", - "form.public_key_title": "Public key", - "form.recipient_ln_placeholder": "Enter invoice, Lighting Address or LNURL", - "form.ree_rate_error_out_of_range": "Fee rate must be between {min} and {max}", - "form.rename_error_empty": "Name is required", - "form.rename_error_exist": "The name already exists", - "form.rpc_url_invalid": "Invalid URL", - "form.rpc_url_prefix_required": "http/https prefix required", - "form.search_address_placeholder": "Search address", - "form.search_network_placeholder": "Search network", - "form.symbol_recommend_text": "Chain ID {chainID} usually uses {symbol}. Check the symbol entered.", - "form__approve_str": "Approve {amount} {symbol}", - "form__priority_fee": "Priority fee", - "form__sats__units": "sats", - "global.404_message": "Sorry, something went wrong!", - "global.Note": "Note", - "global.about": "About", - "global.about_device": "About device", - "global.account": "Account", - "global.account_name": "Account name", - "global.accounts": "Accounts", - "global.acknowledged": "Acknowledged", - "global.add_account": "Add account", - "global.add_hidden_wallet": "Add hidden wallet", - "global.add_new_device": "Add new device", - "global.add_wallet": "Add wallet", - "global.address": "Address", - "global.advance": "Advance", - "global.advanced": "Advanced", - "global.advanced_settings": "Advanced settings", - "global.advantage_settings": "Advanced settings", - "global.age": "Age", - "global.all": "ALL", - "global.all_networks": "All networks", - "global.allow": "Allow", - "global.always": "Always", - "global.an_error_occurred": "An error occurred", - "global.an_error_occurred_desc": "We’re unable to complete your request. Please reload the page.", - "global.app_wallet": "App wallet", - "global.approve": "Approve", - "global.apr": "APR", - "global.asset": "Asset", - "global.auto": "Auto", - "global.available": "Available", - "global.backed_up": "Backed up", - "global.backup": "Backup", - "global.backup_recovery_phrase": "Backup recovery phrase", - "global.balance": "Balance", - "global.bandwidth": "Bandwidth", - "global.best": "Best", - "global.biometric": "Biometric", - "global.block_height": "Block height", - "global.bluetooth": "Bluetooth", - "global.bluetooth_firmware": "Bluetooth firmware", - "global.bootloader": "Bootloader", - "global.browser": "Browser", - "global.bulk_accounts_advance": "Advance", - "global.bulk_accounts_loading": "{amount} address(es) added", - "global.bulk_accounts_loading_error": "Bulk add accounts have been canceled", - "global.bulk_accounts_loading_subtitle": "({amount} accounts)", - "global.bulk_accounts_page_number": "Page number", - "global.bulk_accounts_page_number_error": "Invalid number", - "global.bulk_accounts_preview": "Preview", - "global.bulk_add_account_dnx_error": "Bulk add accounts error, please connect OneKey Classic", - "global.bulk_add_accounts": "Bulk add accounts", - "global.bulk_add_accounts_error": "You can add a maximum of {amount} accounts", - "global.buy": "Buy", - "global.buy_one": "Buy one", - "global.cancel": "Cancel", - "global.cancel_confirm_on_device_feedback": "Device unconfirmed", - "global.cancel_copy": "Cancel copy", - "global.cancelling": "Cancelling", - "global.cash_out": "Cash out", - "global.certifications": "Certifications", - "global.chain": "Chain", - "global.change_passcode": "Change passcode", - "global.change_password": "Change password", - "global.check_for_updates": "Check for updates", - "global.checking_device": "Checking device", - "global.circulating_supply": "Circulating supply", - "global.clear": "Clear", - "global.close": "Close", - "global.collect_to_device": "Collect to device", - "global.collect_to_device_canceled": "Canceled on device", - "global.collect_to_device_failed": "Failed to collect, please try again", - "global.community": "Community", - "global.confirm": "Confirm", - "global.confirm_on_device": "Confirm on device", - "global.confirmations": "Confirmations", - "global.connect": "Connect", - "global.connect_hardware_wallet": "Connect hardware wallet", - "global.connect_to_wallet": "Connect to {wallet}", - "global.connect_to_wallet_confirm_to_proceed": "Confirm on your wallet to proceed", - "global.connect_to_wallet_no_confirmation": "We didn’t receive the confirmation. Please try again.", - "global.connect_wallet": "Connect wallet", - "global.connected": "Connected", - "global.connected_account": "Connected", - "global.connection_failed": "Connection failed", - "global.connection_failed_help_text": "Please reconnect the device and try again", - "global.connection_failed_usb_help_text": "Please reconnect the USB and try again", - "global.contact": "اتصل", - "global.contact_us": "Contact us", - "global.continue": "Continue", - "global.continue_anyway": "Continue anyway", - "global.contract": "Contract", - "global.contract_call": "Contract call", - "global.copied": "Copied", - "global.copy": "Copy", - "global.copy_address": "Copy address", - "global.copy_recovery_phrase": "Copy recovery phrase", - "global.copy_token_contract": "Copy token contract", - "global.copy_url": "Copy URL", - "global.count_accounts": "{count, plural, one {# account} other {# accounts}}", - "global.count_addresses": "{count, plural, one {# address} other {# addresses}}", - "global.create": "Create", - "global.create_address": "Create address", - "global.create_invoice": "Create invoice", - "global.create_wallet": "Create wallet", - "global.creating_address": "Creating address", - "global.crop_image": "Crop image", - "global.crypto": "Crypto", - "global.current": "Current", - "global.customize_nonce": "Customize nonce", - "global.customize_nonce_desc": "Turn this on to change the nonce (transaction number) and control your transaction order on confirmation > advance settings. This is an advanced feature, use cautiously.", - "global.customize_transaction": "Customize transaction", - "global.dapp_interaction": "dApp Interaction", - "global.dark": "Dark", - "global.date": "Date", - "global.date_today": "Today", - "global.date_yesterday": "Yesterday", - "global.default": "Default", - "global.delete": "Delete", - "global.deny": "Deny", - "global.derivation_path": "Derivation path", - "global.description": "Description", - "global.details": "Details", - "global.dev_mode": "Dev mode", - "global.device_info": "Device info", - "global.device_management": "Device management", - "global.dex": "DEX", - "global.disabled": "عاجز", - "global.discord": "Discord", - "global.done": "Done", - "global.download": "Download", - "global.download_and_install": "Download and install", - "global.earn": "Earn", - "global.edit": "Edit", - "global.edit_avatar": "Edit avatar", - "global.enable": "Enable", - "global.enabled": "مُمَكَّن", - "global.energy": "Energy", - "global.energy_bandwidth": "Energy & Bandwidth", - "global.energy_bandwidth_desc": "Transfers and smart contract calls prioritize using energy and bandwidth, which recover over time. If insufficient, TRX is consumed. You can stake TRX for bandwidth and buy or lease energy to reduce transaction fees.", - "global.energy_bandwidth_learn": "How to get energy & bandwidth", - "global.energy_bandwidth_num": "{num_1} Energy + {num_2} Bandwidth", - "global.energy_bandwidth_transaction_desc": "The fee required for this transaction will be automatically deducted", - "global.enter_on_device": "Enter on device", - "global.enter_passphrase": "Enter passphrase", - "global.enter_passphrase_alert": "Remember your passphrase: Irrecoverable if lost.", - "global.enter_recovery_phrase": "Enter recovery phrase", - "global.est_network_fee": "Est. network fee", - "global.estimated_results": "Estimated results", - "global.exit": "Exit", - "global.expand_view": "Expand view", - "global.explore_now": "Explore now", - "global.explorers": "Explorers", - "global.export": "Export", - "global.export_private_key": "Export private key", - "global.face_id": "Face ID", - "global.failed": "Failed", - "global.faqs": "FAQs", - "global.fcc_id": "FCC ID", - "global.fdv": "FDV", - "global.firmware": "Firmware", - "global.follow_the_system": "Follow the system", - "global.for": "For", - "global.forever": "للأبد", - "global.from": "From", - "global.from_provider": "From {provider}", - "global.gas_price": "Gas price", - "global.general": "General", - "global.generate_amount": "Generate amount", - "global.generate_amount_address": "Address", - "global.generate_amount_balance": "Balance", - "global.generate_amount_confirm": "Confirm ({amount})", - "global.generate_amount_error": "You can add up to {amount} more.", - "global.generate_amount_information": "The maximum number of generated accounts is {max}.", - "global.generate_amount_number": "No.", - "global.generate_amount_select": "Select all", - "global.generate_amount_select_path": "If your default address isn't visible, check Settings > Account derivation path.", - "global.generate_max": "Max", - "global.get_one": "Get one", - "global.github": "GitHub", - "global.go_settings": "Go settings", - "global.go_to_settings": "Go to Settings", - "global.google_drive": "Google Drive", - "global.got_it": "Got it", - "global.hardware_label": "Labeling", - "global.hardware_label_desc": "Labels are applied on your device’s homescreen.", - "global.hardware_label_input_error": "Invalid device labeling", - "global.hardware_label_title": "Device labeling", - "global.hardware_name_desc": "Simultaneously change the device's name.", - "global.hardware_name_input_error": "Invalid name", - "global.hardware_name_input_max": "Exceeding the maximum word limit", - "global.hex_data": "Message", - "global.hex_data_default": "Hex data", - "global.hex_data_default_faq": "What’s hex data?", - "global.hex_data_error": "Input formatting error", - "global.hex_data_faq": "What’s message?", - "global.hex_data_faq_desc": "Additional data included for this transaction. Commonly used as part of contract interaction or as a message sent to the recipient.", - "global.hex_data_input_default": "Enter message", - "global.hex_data_input_desc_hex": "The current input is original data. UTF-8 is: {utf}.", - "global.hex_data_input_desc_utf": "The current input is UTF-8. Original data is: {data}.", - "global.hex_data_title": "Show message (hex data)", - "global.hide": "Hide", - "global.history": "History", - "global.homescreen": "Homescreen", - "global.i_got_it": "I got it", - "global.i_saved_the_phrase": "I've saved the phrase", - "global.i_understand": "I understand", - "global.icloud": "iCloud", - "global.ignore": "Ignore", - "global.import": "Import", - "global.import_address": "Import address", - "global.import_private_key": "Import private key", - "global.import_recovery_phrase": "Import recovery phrase", - "global.import_ton": "Importing TON wallet", - "global.import_ton_desc": "This wallet uses the TON network for backup recovery phrases, supports only TON assets, and exists as a private key account, so sub-accounts can't be added.", - "global.import_wallet": "Import wallet", - "global.info": "Info", - "global.inputs": "Inputs", - "global.install": "Install", - "global.language": "Language", - "global.later": "Later", - "global.layout": "Layout", - "global.learn_more": "Learn more", - "global.light": "Light", - "global.link_copied": "Link copied", - "global.links": "Links", - "global.liquidity": "Liquidity", - "global.manage": "Manage", - "global.mark_all_as_confirmation_desc": "This can’t be undone.", - "global.mark_all_as_confirmation_title": "Mark all as read?", - "global.market": "Market", - "global.market_cap": "Market cap", - "global.max": "Max", - "global.max_est_network_fee": "Max est. network fee", - "global.max_supply": "Max supply", - "global.model": "Model", - "global.month_date": "{month} {date}", - "global.more": "More", - "global.move_to_top": "Move to top", - "global.multi_chain_wallet": "Multi-chain wallet", - "global.multi_networks": "Multi-networks", - "global.my_onekey": "My OneKey", - "global.name": "Name", - "global.names_of_wallets_and_accounts": "Names of wallets and accounts", - "global.network": "Network", - "global.network_error": "Network error", - "global.network_error_help_text": "Check your connection and retry", - "global.network_not_matched": "Network not matched", - "global.network_type": "Network type", - "global.networks": "Networks", - "global.networks_information": "All networks may cause slow loading, Bitcoin and EVM networks will be added first. We recommend that you choose a single network.", - "global.never": "Never", - "global.next": "Next", - "global.nft": "NFT", - "global.no_data": "No data", - "global.no_device_connected": "No device connected", - "global.no_device_connected_desc": "Connect your OneKey hardware wallet to view device info, verify authenticity, check firmware updates, and manage security settings.", - "global.no_network_address": "No {network} address", - "global.no_results": "No results", - "global.no_transactions_yet": "No Transactions Yet", - "global.no_transactions_yet_desc": "Your transactions will appear here", - "global.no_wallet": "No wallet", - "global.no_wallet_desc": "Add wallet to start managing your cryptocurrency safely and efficiently", - "global.nonce": "Nonce", - "global.nonce_desc": "Current: {amount}", - "global.nonce_error_higher": "Nonce is higher, it means that the transaction will be queued until the transactions in front of it are confirmed", - "global.nonce_error_lower": "Nonce has been used and may cause this transaction to fail", - "global.nonce_faq": "What’s Nonce?", - "global.nonce_faq_desc": "You have enabled the display of transaction serial numbers (nonce). You can edit the serial numbers to adjust the transaction order of your current account. This is an advanced feature, use cautiously.", - "global.not_available": "Not available", - "global.notifications": "Notifications", - "global.number_accounts": "{number} Accounts", - "global.number_items": "{number} Items", - "global.off": "Off", - "global.official_links": "Official links", - "global.official_website": "Official website", - "global.ok": "OK", - "global.on": "On", - "global.onekey_keytag": "OneKey KeyTag", - "global.onekey_lite": "OneKey Lite", - "global.onekey_prompt_dont_have_yet": "Don't have OneKey yet?", - "global.onekey_wallet": "OneKey wallet", - "global.other_wallet": "Other wallet", - "global.others": "Others", - "global.outputs": "Outputs", - "global.overview": "Overview", - "global.overwritten": "Overwritten", - "global.pair": "Pair", - "global.pair_contract": "Pair contract", - "global.passphrase": "Passphrase", - "global.passphrase_desc": "Passphrase adds a custom phrase to your recovery phrase to create a hidden wallet. Each hidden wallet has its passphrase. Do not forget it, as it can't be retrieved & funds will be lost permanently.", - "global.pay": "Pay", - "global.pct_complete": "{ptc}% complete", - "global.pending": "Pending", - "global.pin_to_top": "Pin", - "global.pools": "Pools", - "global.popular": "Popular", - "global.portfolio": "مَلَفّ", - "global.preferences": "Preferences", - "global.preparing": "Preparing...", - "global.price": "Price", - "global.private_key": "Private key", - "global.private_key_copy": "Copy Private Key?", - "global.private_key_copy_check": "I’ve known my private key provides full access to my assets", - "global.private_key_copy_information": "Never disclose this key. Anyone with your private keys can steal any assets held in your account.", - "global.private_key_error": "This account does not have a {network} {path} address yet. Please create one to continue.", - "global.processing": "Processing", - "global.profit": "Profit", - "global.protocol": "Protocol", - "global.public_key": "Public key", - "global.public_key_export": "Export public key", - "global.qr_code": "QR code", - "global.quit": "Quit", - "global.receive": "Receive", - "global.receive_address_confirmation": "Address confirmation", - "global.receive_address_confirmation_button": "I’ll take the risk", - "global.receive_address_confirmation_desc": "Unverified actions may result in assets being sent to the wrong address, especially if the OneKey App is not reconnected after local data tampering or reset.", - "global.recent_searched": "Recent searched", - "global.recents": "Recents", - "global.recipient": "Recipient", - "global.recommend": "Recommend", - "global.recovery_phrase": "Recovery phrase", - "global.refresh": "Refresh", - "global.remove": "Remove", - "global.remove_account_desc": "You can restore this account later in this wallet by using \"Add account\" or \"Bulk add accounts\".", - "global.remove_account_name": "Remove {account}", - "global.rename": "Rename", - "global.reset": "Reset", - "global.resources": "Resources", - "global.retry": "Retry", - "global.review_again": "Review again", - "global.revoke": "Revoke", - "global.revoke_approve": "Revoke {symbol} allowance", - "global.sats": "sats", - "global.saved_the_phrases": "I've saved the phrases", - "global.saved_the_private_key": "I've saved the private key", - "global.scan_to_connect": "Scan to connect", - "global.search": "Search", - "global.search_account_selector": "Search account name", - "global.search_address": "Search address", - "global.search_asset": "Search asset", - "global.search_no_results_desc": "Try to change the search keyword", - "global.search_no_results_title": "No results", - "global.search_tokens": "Search token", - "global.security": "Security", - "global.select_crypto": "Select crypto", - "global.select_network": "Select network", - "global.select_wallet": "Select wallet", - "global.sell": "Sell", - "global.send": "Send", - "global.serial_number": "Serial number", - "global.serial_number_start": "Serial number of addresses to start", - "global.serial_number_start_desc": "Adding address from {from} to {to}.", - "global.set_passcode": "Set passcode", - "global.set_password": "Set password", - "global.setings_up": "Setting up", - "global.settings": "Settings", - "global.show_less": "Show less", - "global.show_more": "Show more", - "global.show_recovery_phrase": "Show recovery phrase", - "global.sign": "Sign", - "global.single_chain_account": "Single-chain account", - "global.sped_up": "Sped up", - "global.speed_up": "Speed up", - "global.start_connection": "Start connection", - "global.start_migration": "Start migration", - "global.status": "Status", - "global.step_str": "Step {step}", - "global.storage_used": "Storage used", - "global.success": "Success", - "global.support": "Support", - "global.swap": "Swap", - "global.switch": "Switch", - "global.switch_address": "Switch address", - "global.switch_supported_accounts_wallets": "Please switch to supported accounts or wallets.", - "global.sync_error": "Sync error", - "global.synced": "Synced", - "global.syncing": "Syncing...", - "global.test": "Test", - "global.testnet": "Testnet", - "global.time": "Time", - "global.to": "To", - "global.total_in": "Total in", - "global.total_out_include_fee": "Total out (Include fee)", - "global.total_supply": "Total supply", - "global.touch_id": "Touch ID", - "global.touch_id_set_error": "Set biology auth fail", - "global.track_any_address": "Track any address", - "global.trade": "Trade", - "global.transaction_id": "Transaction hash", - "global.unhide": "Unhide", - "global.unknown": "Unknown", - "global.unknown_error": "Unknown error", - "global.unknown_error_retry_message": "An unexpected error occurred. Please try again.", - "global.unlock": "Unlock", - "global.unofficial": "Unofficial", - "global.unpin_from_top": "Unpin", - "global.update_failed": "Update Failed", - "global.updating": "Updating...", - "global.updating_type": "Updating {type}...", - "global.upgrade": "Upgrade", - "global.url": "URL", - "global.value": "Value", - "global.verified": "Verified", - "global.verify": "Verify", - "global.verify_on_device": "Verify on device", - "global.version_is_available": "{version} is available", - "global.view": "View", - "global.view_in_blockchain_explorer": "View in explorer", - "global.view_less": "View less", - "global.view_more": "View more", - "global.view_tutorial": "View tutorial", - "global.visit_website": "Visit website", - "global.wallet": "Wallet", - "global.wallet_avatar": "Wallet avatar", - "global.wallets": "Wallets", - "global.warning": "Warning", - "global.watched": "Watched", - "global.watchlist": "Watchlist", - "global.website": "Website", - "global.white_paper": "White paper", - "global.windows_hello": "Windows Hello", - "global.windows_hello_set_error": "Set Windows Hello fail", - "global.withdraw": "Withdraw", - "global.x": "X", - "hardware.backup_completed": "Backup completed!", - "hardware.bluetooth_need_turned_on_error": "Bluetooth is off", - "hardware.bluetooth_not_paired_error": "Bluetooth not paired", - "hardware.bluetooth_pairing_failed": "Bluetooth pairing failed", - "hardware.bluetooth_requires_permission_error": "Bluetooth permission required", - "hardware.bridge_network_error": "Unable to connect to Bridge, please check your network connection and try again", - "hardware.bridge_timeout": "Bridge connection timeout, please check your network connection and try again", - "hardware.bridge_timeout_for_desktop": "Bridge connection timeout, please check your network connection and try again", - "hardware.confirm_onekey_lite_pin": "Confirm OneKey Lite PIN", - "hardware.confirm_onekey_lite_pin_desc": "Please re-enter the OneKey Lite PIN you just set.", - "hardware.connect_failed": "Connect failed", - "hardware.connect_timeout_error": "Connection timeout", - "hardware.connect_unknown_device_error": "Unknown device, the current version App does not support connection.", - "hardware.data_erased_use_as_new": "The data on this OneKey Lite has been completely erased, and you can use it as a new OneKey Lite.", - "hardware.default_error": "Hardware communication failed, please try again", - "hardware.device_ble_already_connected": "Device already connected elsewhere, please disconnect and try again", - "hardware.device_ble_location_disabled": "Location services unavailable, please enable and try again", - "hardware.device_ble_scan_error": "Bluetooth scan failed, please try again", - "hardware.device_ble_scan_throttle": "Bluetooth scan too frequent, please try again later", - "hardware.device_connected_keep_card_in_place": "The device is connected, please keep the card in place and do not move it.", - "hardware.device_contains_backup": "This device contains backup", - "hardware.device_contains_backup_desc": "If you continue, your previous backup will be fully overwritten and will be lost forever.", - "hardware.device_information_is_inconsistent_it_may_caused_by_device_reset": "Device information is inconsistent. This may be caused by a device reset. You can re-add your device to resolve this issue.", - "hardware.device_need_restart": "Hardware communication failed, please restart the device and try again", - "hardware.device_not_find_error": "Device not found. Please try reconnecting the device (unplug and plug the USB or turn Bluetooth off and on), then try again.", - "hardware.device_passphrase_state_error": "Passphrase does not match the current wallet, please try again", - "hardware.ensure_device_close_to_nfc": "Make sure the device is close to the phone's NFC module, then try again.", - "hardware.enter_boot_failure": "Failed to enter update mode", - "hardware.enter_onekey_lite_pin": "Enter OneKey Lite PIN", - "hardware.enter_onekey_lite_pin_desc": "OneKey Lite PIN is a 6-digit number and cannot be retrieved if forgotten, as we do not store any user information.", - "hardware.enter_passphrase_on_device": "Enter Passphrase on Device", - "hardware.failed_to_search_devices": "Search failed", - "hardware.file_already_exists": "File already exists", - "hardware.firmware_download_error": "Firmware download failed", - "hardware.hardware_device_not_find_error": "Device not found", - "hardware.hardware_params_bytes_overload": "The data length exceeds the hardware's processing capacity", - "hardware.incomplete_file": "Incomplete file", - "hardware.init_iframe_load_error": "Hardware SDK initialization failed. Please check your network or switch the proxy and try again.", - "hardware.invalid_pin_error": "Invalid PIN", - "hardware.keep_lite_placed_until_found": "Please keep Lite placed with the phone until the device is found.", - "hardware.manually_enter_boot": "Manual boot entry required", - "hardware.need_force_upgrade_firmware": "Firmware needs to be upgraded", - "hardware.no_backup_inside": "No backup inside", - "hardware.no_backup_inside_desc": "No backup in this OneKey Lite. Replace with another OneKey Lite and retry.", - "hardware.no_connection_desc": "Please try again or check your network", - "hardware.no_pin_change_needed": "No need to change the PIN code on this new OneKey Lite card.", - "hardware.not_opened_passphrase": "Please enable Passphrase on the device to use the hidden wallet", - "hardware.not_same": "Mismatch, please connect the correct device", - "hardware.not_support": "This method has security risks and is not supported by the hardware", - "hardware.not_support_passphrase_need_upgrade": "Using Passphrase requires upgrading the firmware to version {version} or higher.", - "hardware.onekey_lite_pin_changed": "OneKey Lite PIN changed!", - "hardware.onekey_lite_pin_changed_desc": "This OneKey Lite's PIN has been changed.\nRemember this PIN as it cannot be recovered if lost, as we do not store any user information.", - "hardware.onekey_lite_pin_error": "OneKey Lite PIN error", - "hardware.onekey_lite_pin_error_desc": "After {number} more wrong tries, the data on this OneKey Lite will be erased.", - "hardware.onekey_lite_reset": "OneKey Lite has been reset", - "hardware.only_one_device_can_be_connected_desc": "Please connect only one device for the upgrade.", - "hardware.open_blind_sign_error": "Unknown signature format, please go to Security/Blind Signing to enable SOL advanced signing", - "hardware.opened_passphrase": "Please disable Passphrase on the device to use the standard wallet", - "hardware.params_bytes_overload": "Data size exceeds hardware limit. Please update the firmware and try again or contact customer support", - "hardware.passphrase_enter_too_long": "passphrase supports a maximum of {0} characters", - "hardware.pin_change_failed": "PIN change failed", - "hardware.pin_incorrect_data_erased": "The PIN code has been entered incorrectly over 10 times. To prevent unauthorized access to the backup data, the data on this device has been erased.", - "hardware.pins_do_not_match": "The entered PINs do not match. Please reconfirm.", - "hardware.place_onekey_lite_close_to_phone": "Place OneKey Lite close to the phone", - "hardware.place_onekey_lite_close_to_phone_desc": "Place the Lite and phone as shown in the figure below, then click \"connect.”", - "hardware.polling_connect_timeout_error": "Connection timeout. Please check the OneKey Bridge status and restart the hardware", - "hardware.recover_wallet_with_card_and_pin": "You can recover your wallet using this card and PIN at all times.\nRemember this PIN as it cannot be recovered if lost, as we do not store any user information.", - "hardware.recovery_interrupted": "Recovery interrupted", - "hardware.reset_failed": "Reset failed", - "hardware.reset_failed_desc": "This is a brand new OneKey Lite that does not require resetting.", - "hardware.reset_onekey_lite": "Reset OneKey Lite", - "hardware.reset_onekey_lite_desc": "Please ensure that you have backed up the recovery phrase before entering \"RESET\" to confirm, as it will be erased from this OneKey Lite device.", - "hardware.searching_for_device": "Searching for device...", - "hardware.set_onekey_lite_pin": "Set OneKey Lite PIN", - "hardware.set_onekey_lite_pin_desc": "Set a 6-digit PIN for your OneKey Lite.", - "hardware.software_cannot_be_upgrade": "The client cannot update the hardware. You need to go to https://firmware.onekey.so](https://firmware.onekey.so/) to update", - "hardware.status_connected": "Connected", - "hardware.status_update_available": "Update available", - "hardware.str_not_supported_by_hardware_wallets": "Waiting for firmware update, hardware wallets are not supported at this time.", - "hardware.transaction_signing_error_not_in_signing_mode": "Transaction signing error: Not in signing mode", - "hardware.transferring_data": "Transferring data...", - "hardware.two_onekey_lite_not_same": "The two OneKey Lite used for connection are not the same.", - "hardware.unknown_message_error": "Current firmware not supported, please try upgrading", - "hardware.unsupported_passphrase_characters": "Contains unsupported characters", - "hardware.user_cancel_error": "Action canceled", - "hardware.verify_success": "Official firmware", - "hardware.version_need_upgrade_error": "Please upgrade the firmware to version {version} or higher to use this feature", - "hardware.version_to_low_error": "Current firmware version is too low, please update the firmware", - "hardware.wallet_connection_is_not_currently_supported_but_we_are_working_on_it_stay_tuned": "Hardware wallet connection is not currently supported, but we are working on it. Stay tuned!", - "hardware.wallet_connection_is_only_available_on_the_official_app": "Hardware wallet connection is only available on the official app", - "hardware.wallet_connection_is_only_available_on_the_third_party_apps": "Hardware wallet connection is only available on third-party apps", - "hidden_assets": "Hidden assets", - "history.notification_receiver_label": "Notification received by", - "history.switch_account_dialog_title": "Switch primary account to {account}?", - "hw_banner_description": "Secure your crypto with the most powerful hardware wallet", - "insufficient_fee_append_desc": "based on max est. fee: {amount} {symbol}", - "interact_with_contract": "Interact with (To)", - "lighting_invoice": "Lightning Invoice", - "list_section_unavailable_networks_text": "Unavailable networks for selected account", - "litecoin_legacy_desc": "Starts with \"L\". BIP44, P2PKH, Base58", - "litecoin_native_segwit_desc": "Starts with \"ltc1\". BIP84, P2WPKH, Bech32", - "litecoin_nested_segwit_desc": "Starts with \"M\". BIP49, P2SH-P2WPKH, Base58", - "ln.authorize_access": "Authorize access", - "ln.authorize_access_desc": "Connecting your hardware wallet to access the Lightning account", - "ln.authorize_access_network_error": "Authentication failed, check your network connection and try again", - "ln.payment_received_label": "Payment received", - "login.forgot_passcode": "Forgot passcode?", - "login.forgot_password": "Forgot password?", - "login.welcome_message": "Welcome back", - "low_value_assets": "Low-value assets", - "low_value_assets_desc": "Assets valued below 0.1% of your total holdings and less than $1,000 fall into this category.", - "low_value_assets_desc_out_of_range": "Assets ranked below the top 50 in total value when owning multiple assets.", - "manage_token.account_no_found": "Insufficient {token} to cover network fee. Please add more {token} and retry.", - "manage_token.added_token": "Added token", - "manage_token.custom_token_add": "2. Add", - "manage_token.custom_token_add_btn": "Add", - "manage_token.custom_token_button": "Add custom token", - "manage_token.custom_token_chain_input": "Chain", - "manage_token.custom_token_contract_address": "Contract address", - "manage_token.custom_token_create_address": "1. Create address", - "manage_token.custom_token_decimal": "Decimal", - "manage_token.custom_token_symbol": "Symbol", - "manage_token.custom_token_title": "Custom token", - "manage_token.empty_msg": "Cannot find the token?", - "manage_token.native_token_cannot_removed": "Native token cannot be removed", - "manage_token.native_token_cant_remove": "Native token can't be removed", - "manage_token.popular_token": "Common token", - "manage_token.title": "Manage token", - "manage_token.token_required": "Symbol is required.", - "manger_token.custom_token_address_required": "Contract address required.", - "manual_backup": "Manual backup", - "market.1d": "1D", - "market.1h": "1H", - "market.1m": "1M", - "market.1w": "1W", - "market.1y": "1Y", - "market.24h": "24H", - "market.24h_price_range": "24H price range", - "market.24h_txns": "24H txns", - "market.24h_vol_usd": "24H VOL(USD)", - "market.30d": "30D", - "market.7d": "7D", - "market.add_number_tokens": "Add {number} tokens", - "market.add_to_watchlist": "Add to watchlist", - "market.added_to_watchlist": "Added to watchlist", - "market.all_time_high": "All-time high", - "market.all_time_low": "All-time low", - "market.ath_desc": "{token}’s all-time high was on {time}, at {price}, and the current price is down by {percent} from that high.", - "market.atl_desc": "{token}’s all-time low was on {time}, at {price}, and the current price is up by {percent} from that low.", - "market.cex": "CEX", - "market.chart": "Chart", - "market.days_since_launch": "Days since launch", - "market.empty_watchlist_desc": "Add your favorite tokens to watchlist", - "market.empty_watchlist_title": "Your watchlist is empty", - "market.high": "High", - "market.last_price": "Last price", - "market.last_seven_days": "Last 7 days", - "market.last_updated": "Last updated", - "market.lite_chart": "Lite chart", - "market.low": "Low", - "market.minus_2_percent_depth": "-2% depth", - "market.most_24h_volume": "Most 24h volume", - "market.most_market_cap": "Most market cap", - "market.move_to_top": "Move to top", - "market.number_of_days": "{number} days", - "market.one_hour_percentage": "1h%", - "market.pair": "Pair", - "market.pair_link": "Pair link:", - "market.plus_2_percent_depth": "+2% depth", - "market.pool_details": "Pool details", - "market.price_change_down": "Price change down", - "market.price_change_up": "Price change up", - "market.remove_from_watchlist": "Remove from watchlist", - "market.seven_day_percentage": "7d%", - "market.sort_by": "Sort by", - "market.spread": "Spread", - "market.trending": "Trending", - "market.trust_score": "Trust core", - "market.twenty_four_hour_percentage": "24h%", - "market.twenty_four_hour_volume": "24h volume", - "market.volume_percentage": "Volume %", - "max_base_fee_lower_then_base_fee_alert_message": "The max base fee is lower than the base fee, which may cause a delay in the transaction.", - "menu.about_onekey_wallet": "About OneKey Wallet", - "menu.actual_size": "Actual Size", - "menu.bring_all_to_front": "Bring All to Front", - "menu.check_for_updates": "Check for Updates...", - "menu.cut": "Cut", - "menu.help": "Help", - "menu.hide_onekey_wallet": "Hide OneKey Wallet", - "menu.lock_now": "Lock Now", - "menu.minimize": "Minimize", - "menu.official_website": "Official Website", - "menu.paste": "Paste", - "menu.preferences": "Preferences..", - "menu.quit_onekey_wallet": "Quit OneKey Wallet", - "menu.redo": "Redo", - "menu.select_all": "Select All", - "menu.show_all": "Show All", - "menu.toggle_full_screen": "Toggle Full Screen", - "menu.undo": "Undo", - "menu.view": "View", - "menu.visit_help_center": "Visit Help Center", - "menu.window": "Window", - "menu.zoom": "Zoom", - "menu.zoom_in": "Zoom In", - "menu.zoom_out": "Zoom Out", - "menu__copy_image": "Copy image", - "menu__save_image_as": "Save image as…", - "msg__str_is_required_for_network_fees_top_up_str_to_make_tx": "Insufficient {symbol} for network fees. Add at least {amount} {symbol}", - "msg__transaction_with_the_same_nonce_already_exist_please_pay_a_higher_network_fee_otherwise_the_transaction_may_fail": "Transactions with the same nonce already exist, please pay a higher network fee, otherwise the transaction may fail.", - "native_token_tooltip": "This is the cryptocurrency used to pay for network fees", - "network__network": "Network", - "network_invisible_in_all_network_tooltip_title": "Hidden in 'All networks' view", - "network_selector.unavailable_networks": "Unavailable networks for selected account", - "network_visible_in_all_network_tooltip_title": "Shown in 'All networks' view", - "nft.already_collected": "This NFT has already been collected.", - "nft.attributes": "Attributes", - "nft.collect_failed": "NFT collect failed, please try again.", - "nft.collect_to_touch": "Collect to {device}", - "nft.collection": "Collection", - "nft.contract_address": "Contract Address", - "nft.floor_price": "Floor price", - "nft.highest_floor": "Highest floor", - "nft.last_sale": "Last sale", - "nft.mint_address": "Mint Address", - "nft.more": "More", - "nft.nft_standard": "NFT Standard", - "nft.no_attributes_found": "We haven't found any attributes for this NFT.", - "nft.no_nfts": "No NFTs", - "nft.no_nfts_found": "No NFTs found at this address", - "nft.no_results": "No Results", - "nft.owner_program": "Owner Program", - "nft.recently_received": "Recently received", - "nft.search_result_count": " {number} Results", - "nft.sort": "Sort", - "nft.token_address": "Token Address", - "nft.token_id": "Token ID", - "no_account": "No account", - "no_external_wallet_message": "No external wallets are connected. Link a third-party wallet to view here.", - "no_private_key_account_message": "No private key accounts. Add a new account to manage your assets.", - "no_transaction_desc": "Your transactions will appear here", - "no_transaction_title": "No transactions yet", - "no_watched_account_message": "No watched accounts. Import an address to start monitoring.", - "notifications.account_activity_manage_count_alert_title": "{totalEnabledAccountsCount}/{maxAccountCount} accounts enabled", - "notifications.account_reached_limit_alert_desc": "New accounts may not get notifications.", - "notifications.account_reached_limit_alert_title": "{count} accounts limit reached", - "notifications.account_reached_limit_dialog_desc": "You've reached the maximum of {maxAccountCount} accounts.", - "notifications.account_reached_limit_dialog_title": "Account limit reached", - "notifications.empty_desc": "You have not received any notifications yet", - "notifications.empty_title": "No notifications", - "notifications.intro_desc": "Allow push notifications to receive alerts for account activity directly on your device", - "notifications.intro_mac_desc": "Click 'Enable,' then turn on the switch", - "notifications.intro_title": "Enable push notifications", - "notifications.mac_permission_title": "Allow notifications", - "notifications.notifications_account_activity_desc": "Get notified when receiving, sending, trading, and more.", - "notifications.notifications_account_activity_label": "Account activity", - "notifications.notifications_account_manage_desc": "Choose the account for notifications.", - "notifications.notifications_account_manage_label": "Manage", - "notifications.notifications_price_alert_desc": "Get notified when the watched cryptos increase or drop more than 10% in 24 hours.", - "notifications.notifications_price_alert_label": "Price alert", - "notifications.notifications_switch_label": "Allow notifications", - "notifications.permission_instruction": "Click 'Enable,' then allow notifications for OneKey.", - "notifications.settings_helper_desc": "Besides receiving notifications directly in the app, OneKey also supports system push notifications.", - "notifications.settings_helper_title": "Push notifications", - "notifications.test_action_desc": "Click \"Test\" to preview. For help, visit the help center.", - "notifications.test_message_desc": "You’ll receive real-time account updates, security alerts, and more important info.", - "notifications.test_message_title": "Push notifications are ready!", - "notifications.windows_notifications_permission_desc": "Get notifications from apps and other senders", - "onboarding.activate_device": "Activate your device", - "onboarding.activate_device_all_set": "All set!", - "onboarding.activate_device_by_restore": "Restore wallet", - "onboarding.activate_device_by_restore_help_text": "Restore your wallet using an existing recovery phrase.", - "onboarding.activate_device_by_restore_warning": "Package security check", - "onboarding.activate_device_by_restore_warning_help_text": "Your package should not contain any pre-set PINs or Recovery Phrases. If such items are found, stop using the device and immediately contact OneKey Support for assistance.", - "onboarding.activate_device_by_set_up_new_wallet": "Set up new wallet", - "onboarding.activate_device_by_set_up_new_wallet_help_text": "Configure your device to create a new wallet.", - "onboarding.activate_device_choosing_language_message": "After choosing a language on your device and reviewing the basic guide:", - "onboarding.activate_device_help_text": "Set up your hardware wallet to get started.", - "onboarding.backup_recovery_phrase_help_text": "Write down each phrase in order and store them in a secure location", - "onboarding.backup_recovery_phrase_title": "Backup recovery phrases", - "onboarding.before_reveal_message": "Before you proceed", - "onboarding.bluetooth_connect_help_text": "Looking for devices", - "onboarding.bluetooth_permission_needed": "Bluetooth permission needed", - "onboarding.bluetooth_permission_needed_help_text": "To connect via Bluetooth, please enable access in Settings.", - "onboarding.bluetooth_prepare_to_connect": "Keep the device nearby", - "onboarding.bluetooth_prepare_to_connect_help_text": "Ensure the device is powered on and within range, then press \"Start connection\" below to start the connection", - "onboarding.bullet_forgot_passcode_use_recovery": "If you forget your passcode, you can use the recovery phrase to get back into your wallet.", - "onboarding.bullet_forgot_password_use_recovery": "If you forget your password, you can use the recovery phrase to get back into your wallet.", - "onboarding.bullet_never_share_recovery_phrase": "Never share it with anyone or enter it into any form.", - "onboarding.bullet_onekey_support_no_recovery_phrase": "OneKey Support will never ask for your recovery phrase.", - "onboarding.bullet_recovery_phrase_full_access": "The recovery phrase alone gives you full access to your wallets and funds.", - "onboarding.choose_import_method": "Choose import method", - "onboarding.connect_your_device": "Connect your device", - "onboarding.create_qr_wallet_scan_qr_code_desc": "Back to here, click the button below to scan the QR code", - "onboarding.create_qr_wallet_show_qr_code_desc": "Go to \"Connect App Wallet\" > \"QR Code\" > \"OneKey Wallet\" to view the QR code", - "onboarding.create_qr_wallet_title": "Create QR-based wallet", - "onboarding.create_qr_wallet_unlock_device_desc": "Unlock your OneKey Pro", - "onboarding.device_mini_set_up_import": "Select \"Restore Wallet\"", - "onboarding.device_set_up_backup": "Write down all recovery phrase", - "onboarding.device_set_up_backup_desc": "Securely record your recovery phrase and complete the check. It's crucial for accessing your wallet if you forget your PIN or lose your device.", - "onboarding.device_set_up_create_new_wallet": "Select \"Create New Wallet\"", - "onboarding.device_set_up_create_new_wallet_desc": "Initiate your wallet setup by selecting \"Create New Wallet\". You will be guided through creating a unique recovery phrase and setting a secure PIN.", - "onboarding.device_set_up_enter_recovery_phrase": "Enter recovery phrase", - "onboarding.device_set_up_enter_recovery_phrase_desc": "Carefully enter your recovery phrase word by word. This unique phrase is essential for the security and recovery of your wallet.", - "onboarding.device_set_up_import": "Select \"Import Wallet\"", - "onboarding.device_set_up_import_desc": "Follow the prompts to secure your wallet with a PIN and enter your recovery phrase to complete the process.", - "onboarding.device_set_up_pin": "Set PIN", - "onboarding.device_set_up_pin_desc": "Create a strong PIN to protect your wallet just like you would with a bank card. Avoid easy sequences or repeated numbers.", - "onboarding.enable_bluetooth": "Enable Bluetooth", - "onboarding.enable_bluetooth_help_text": "Bluetooth needs to be turned on to proceed.", - "onboarding.finalize_creating_wallet": "Creating your wallet", - "onboarding.finalize_encrypting_data": "Encrypting your data", - "onboarding.finalize_generating_accounts": "Generating your accounts", - "onboarding.finalize_ready": "Your wallet is now ready", - "onboarding.finalize_wallet_setup": "Finalize wallet setup", - "onboarding.import_recovery_phrase_warning": "Security alert", - "onboarding.import_recovery_phrase_warning_help_text": "For your asset safety, avoid importing the recovery phrase of your hardware wallet and use \"Connect Hardware Wallet\" for optimal security.", - "onboarding.install_onekey_bridge": "Install OneKey Bridge", - "onboarding.install_onekey_bridge_help_text": "OneKey Bridge facilitates seamless communication between OneKey and your browser for a better experience.\n\nIf you encounter issues during the installation of OneKey Bridge, please refer to the online tutorial for assistance.", - "onboarding.migrate_from_v4": "Migrate from OneKey v4", - "onboarding.onekey_hw": "OneKey Hardware Wallet", - "onboarding.onekey_hw_intro_desc": "OneKey Hardware Wallet, a secure and user-friendly solution for crypto management. It supports multiple cryptocurrencies and ensures robust encryption for safe transactions.", - "onboarding.onekey_hw_intro_title": "Your secure crypto solution", - "onboarding.save_phrase_securely_instruction": "Read the following, then save the phrase securely.", - "onboarding.usb_connect_help_text": "Connect your device via USB", - "onboarding.verify_recovery_phrase_title": "Verify your recovery phrase", - "onboarding.welcome_description": "Simple, secure crypto management", - "onboarding.welcome_message": "Welcome to OneKey", - "open_as_popup": "Open as popup", - "open_as_sidebar": "Open as side panel", - "open_in_mobile_app": "Open in Mobile App", - "open_ordinals_transfer_tutorial_url_message": "How to transfer Ordinals assets?", - "p2pkh_desc": "Starts with \"1\". P2PKH (m/44'/0'/0')", - "p2sh_p2wpkh_desc": "Starts with \"bc1q\". P2SH-P2WPKH (m/84'/0'/0')", - "p2tr_desc": "Starts with \"bc1p\". P2TR (m/86'/0'/0')", - "p2wpkh_desc": "Starts with \"3\". P2WPKH (m/49'/0'/0')", - "prime.agree_to_terms": "Continuing means you agree to OneKey Prime Terms.", - "prime.change_email": "Change email", - "prime.change_password": "Change password", - "prime.code_resend": "Resend", - "prime.confirm_password": "Confirm password", - "prime.confirm_password_description": "Before you change password. We need to verify the current password of OneKey ID.", - "prime.currently_email": "Currently: {currentlyemail}", - "prime.description": "Unlock advanced features to enhance your crypto asset management experience.", - "prime.email_changed": "Email changed", - "prime.end_date": "Ends on {data}", - "prime.enter_verification_code": "Enter verification code", - "prime.forget_password": "Forget password?", - "prime.incorrect_password": "Incorrect password", - "prime.invalid_verification_code": "Invalid verification code", - "prime.log_out": "Log out", - "prime.manage_subscription": "Manage subscription", - "prime.manage_your_onekeyid": "Manage your OneKey ID.", - "prime.monthly": "Monthly", - "prime.new_email_code": "Please enter your new email address. We'll send you a verification code to confirm it.", - "prime.new_password": "New Password", - "prime.new_password_description": "You are resetting new password for: {email}", - "prime.onekeyid_continue": "Continue with OneKey ID", - "prime.onekeyid_continue_description": "OneKey ID is all you need to access all Prime benefits.", - "prime.onekeyid_email_error": "Incorrect email address", - "prime.onekeyid_log_out": "OneKey ID log out", - "prime.onekeyid_log_out_decription": "Due to OneKey ID password change, this device has been logged out. Please log in again.", - "prime.onekeyid_signup": "Sign up OneKey ID", - "prime.onekeyid_signup_description": "{email} is not registered yet, we will create a new account for you.", - "prime.password": "Password", - "prime.password_characters": "At least 8 characters", - "prime.password_letter": "At least 1 letter", - "prime.password_number": "At least 1 number", - "prime.password_placeholder": "Password", - "prime.password_special_characters": "At least 1 special character", - "prime.payment_cancelled": "Payment cancelled", - "prime.payment_successful": "Payment successful", - "prime.payment_successful_description": "Thank you for your purchase, May OneKey Prime helps you achieve a safer and more premium experience.", - "prime.per_month": "Month", - "prime.save_discount": "Save {discount%}", - "prime.send_code": "Send code", - "prime.sent_to": "Sent to {email}", - "prime.signup_login": "Sign up / Login", - "prime.status_free": "Free", - "prime.status_prime": "Prime", - "prime.subscribe": "Subscribe", - "prime.update_email_address": "Update Email address", - "prime.update_email_address_description": "To update your email address, please verify the currently Email first.", - "prime.welcome_back": "Welcome back", - "prime.yearly": "Yearly", - "protection_passwordless_nostr_signing_text": "Nostr signing without passcode", - "provider.amount_received": "{amount} {token}", - "provider.amount_required": "Insufficient input amount", - "provider.approval_require": "Need to approve token before swap", - "provider.cow_route": "CoW Swap is a meta DEX aggregator that uses intents and batch auctions to provide users with the best prices for their trades while protecting them from maximal extractable value (MEV).", - "provider.fee": "$0.16 ", - "provider.ios_popover.approval_require_msg": "Need to approve token before swap", - "provider.ios_popover.approval_require_title": "Approval Required", - "provider.ios_popover.onekey_fee": "OneKey fee", - "provider.ios_popover.onekey_fee_content": "OneKey charges a {num} fee (limited-time discount), which is already included in the quote, supporting us in providing a high-quality, seamless experience.", - "provider.ios_popover.onekey_fee_content_2": "Please note that slippage or network fees may affect the actual amount you receive. If you have any concerns or questions, please contact us.", - "provider.ios_popover.onekey_fee_content_sub": "Please note that bridge fees, slippage, and floating rates may affect the final amount received. If you have any concerns about the fee, please contact us.", - "provider.ios_popover.order_info_title": "Order Info", - "provider.ios_popover.title": "Information", - "provider.label_anti_mev": "Anti-MEV", - "provider.label_approved": "Approved", - "provider.label_fastest": "Fastest", - "provider.label_max_received": "Max received", - "provider.label_min_fee": "Min gas", - "provider.label_overall_best": "Overall best", - "provider.max_amount_required": "Max swap amount is {amount} {token}", - "provider.min_amount_required": "Min amount requires {amount} {token}", - "provider.network_fee": "Est. network fee", - "provider.popover_fee_rate": "Fee rate", - "provider.popover_order_info_content": "OneKey aggregates the best offers. Here’s what you should know before trading", - "provider.popover_wallet": "Wallet", - "provider.protocol_fee": "Fee charged by the provider", - "provider.recommend": "Recommend", - "provider.route": "Route", - "provider.route_changelly_fix": "Please note that with the fixed rate, the expected received amount (excluding fees) will match the amount shown on the screen.", - "provider.route_changelly_float": "Please be aware that the floating rate can change at any point due to market conditions, so you might receive more or less crypto than expected.", - "provider.route_no_information": "The provider has temporarily not provided route information.", - "provider.route_swft": "Please be aware that this transaction is utilizing a third-party SWFT_BRIDGE cross-chain bridge, which involves centralized execution and carries associated risks.", - "provider.route_unable_fetch_price": "Failed to fetch the quote", - "provider.sort_item_gas": "Gas Fee", - "provider.sort_item_received": "Est. Recevied", - "provider.sort_item_swap_duration": "Swap Duration", - "provider.sort_title": "Sort", - "provider.swap_duration": "Est. swap duration", - "provider.time": "< 1min", - "provider.title": "Select provider", - "provider.token_not_supported": "Token not supported", - "provider.unavailable": "Unavailable", - "qr_wallet_address_creation_failed_dialog_title": "Address creation failed", - "qr_wallet_address_creation_failed_firmware_update_desc": "If you can't create addresses for some EVM networks, update your firmware via our update tool and disable Air-gap mode if it's on.", - "qr_wallet_address_creation_failed_supports_network_desc": "QR wallet supports BTC and EVM-compatible networks, with BIP44 as the only standard for EVM networks.", - "receive.address_unconfimed_alert_message": "Address unconfirmed", - "receive.hide_unverified_address": "Hide unverified address", - "receive.send_asset_warning_message": "Send only {network} network assets to this address", - "receive.show_address_any": "Show address anyway", - "receive_token_list_footer_text": "Can't find token? Try searching", - "remove_account_desc": "This account will be removed.", - "remove_device": "Remove device", - "remove_device_desc": "This will permanently delete your data. But you still can restore it from the hardware wallet which is loaded the recovery phrase of this wallet.", - "remove_hidden_wallet_desc": "This will permanently delete your data. Ensure you have saved the passphrase of this hidden wallet.", - "remove_private_key_account_desc": "You can restore the account using its private key after removal. Ensure it's backed up to avoid permanent loss of access.", - "remove_wallet": "Remove wallet", - "remove_wallet_desc": "Make sure you've written down the recovery phrase before removing the wallet. Otherwise, you won't be able to recover the wallet.", - "remove_wallet_double_confirm_message": "I've written down the recovery phrase", - "reset_app_desc": "This will delete all the data you have created on OneKey. After making sure that you have a proper backup, enter \"RESET\" to reset the App", - "san_qr_code_to_verify_details": "Scan the QR code with your device to verify the details.", - "scan.camera_access_denied": "Camera access denied", - "scan.enable_camera_permissions": "OneKey requires camera access to scan QR codes. Please go to “Settings” and enable camera permissions to use this feature.", - "scan.grant_camera_access_in_expand_view": "Please grant camera access in the expand view.", - "scan.move_closer_if_scan_fails": "If the scan fails, adjust the device-camera distance and retry", - "scan.no_recognizable_qr_code_found": "No recognizable QR code found.", - "scan.qr_wallet_detected": "QR wallet detected. Go to connect this wallet?", - "scan.scan_address_codes_to_copy_address": "Scan address codes to copy address", - "scan.scan_qr_code": "Scan QR code", - "scan.scan_qr_code_on_device": "Scan QR code on device", - "scan.scan_walletconnect_code_to_connect_to_sites": "Scan WalletConnect code to connect to sites", - "scan.screen_blurred_for_security": "We've blurred your screen for security, but it won't affect your scan", - "scan.select_a_photo": "Select a photo", - "scan.show_qr_code_steps": "To show your QR code, go to Connect App Wallet > QR Code > OneKey Wallet on your device", - "scanning_text": "Scanning", - "secure_qr_toast_scan_qr_code_on_device_text": "Return when the QR code shows, click 'Next', then scan it.", - "select_recovery_phrase_length": "Select a length", - "selected_network_only_supports_device": "The selected network currently only supports {deviceType}", - "send.address_exists": "The address already exists", - "send.address_invalid": "Invalid address. Please check and re-enter.", - "send.address_not_allowlist_error": "تمكين قائمة السماح بالنقل. العنوان غير موجود في قائمة السماح. يرجى محاولة to_edit_address_book_pageإضافته.", - "send.amount": "Amount", - "send.amount_invalid": "Insufficient balance. Please try a smaller amount", - "send.amount_too_small": "Transfer amount too small.", - "send.authentication_failed_verify_again": "Authentication failed, please check your network connection and try again.", - "send.available": "Available: {number}", - "send.balance": "Balance: {number}", - "send.cannot_send_amount_zero": "Cannot send 0 amount", - "send.cannot_send_to_self": "Cannot send to yourself", - "send.check_request_error": "Check request error, please refresh again", - "send.description_balance_info": "Balance does not include locked or small UTXOs", - "send.description_frozen_funds_info": "Balance does not include frozen funds", - "send.engine_account_not_activated": "Account not activated.", - "send.engine_failed_to_transfer": "Transfer failed.", - "send.engine_incorrect_address": "Incorrect address.", - "send.engine_incorrect_passcode": "Incorrect passcode", - "send.engine_incorrect_password": "Incorrect password.", - "send.engine_incorrect_token_address": "Incorrect token address.", - "send.engine_incorrect_transfer_value": "Incorrect transfer amount.", - "send.engine_internal_error": "Service error.", - "send.engine_not_implemented": "Function not yet implemented.", - "send.engine_passcode_not_set": "Passcode not set", - "send.engine_password_not_set": "Password not set.", - "send.engine_pending_queue_too_long": "Too many pending transactions in the queue.", - "send.engine_too_many_derived_accounts": "Number of accounts exceeds the limit.", - "send.ens_choose_address_title": "Choose an Address", - "send.error_insufficient_balance": "Insufficient {token} balance", - "send.error_minimum_amount": "Minimum amount {amount} {token}", - "send.error_recipient_requires_activation": "Recipient requires {amount} {token} to activate", - "send.estimated_gas_failure": "Gas estimation failed.", - "send.field_large_than": "Must be greater than {0}.", - "send.field_only_integer": "Must be a positive integer.", - "send.field_too_large": "Cannot be greater than {0}.", - "send.field_too_small": "Must not be less than {0}.", - "send.insufficient_liquidity_of_lightning_node_channels": "Insufficient liquidity in Lightning node channels.", - "send.invalid_address_ordinal_can_only_be_sent_to_taproot_address": "Invalid address! Ordinal assets can only be sent to Taproot addresses.", - "send.invalid_lightning_payment_request": "Invalid Lightning payment request.", - "send.invoice_is_already_paid": "Invoice is already paid.", - "send.label_cex": "You are depositing to a centralized exchange address. Please double-check the selected network and address.", - "send.label_cex_title": "CEX", - "send.label_contract_address": "The contract address is labeled {name}.", - "send.label_contract_address_title": "Contract address", - "send.label_first_transfer": "Initial transfer", - "send.label_scam": "You are sending to a scam address, which could result in a loss of your assets. Please double-check the address and be aware of any risks.", - "send.label_scam_title": "Scam address", - "send.label_transferred": "Transferred", - "send.label_wallet_name": "Wallet name / Account name", - "send.max": "Max", - "send.memo_up_to_length": "Up to {number} characters", - "send.nft_amount": "كمية", - "send.nft_does_not_exist": "NFT does not exist.", - "send.no_route_found": "No route found.", - "send.no_token_message": "No tokens were found at this address", - "send.passcode_validation": "Passcode must be between 8 and 128 characters.", - "send.password_validation": "Password must be between 8 and 128 characters.", - "send.preview_button": "Preview", - "send.recipient_invalid": "Invalid recipient. Please check and re-enter", - "send.sending_str_requires_an_account_balance_of_at_least_str_str": "Sending {0} requires an account balance of at least {1} {2}.", - "send.str_minimum_balance_is_str": "Sending failed. Minimum balance for {token} is {amount}.", - "send.str_minimum_transfer": "Minimum transfer amount is {0}.", - "send.suggest_reserving_str_as_gas_fee": "Suggest reserving {0} as a network fee.", - "send.tag": "Tag", - "send.tag_placeholder": "Comment, tag, memo or note", - "send.the_invoice_has_expired": "Invoice has expired.", - "send.the_minimum_value_for_transffering_to_a_new_account_is_str_str": "The minimum value for transferring to a new account is {amount} {symbol}.", - "send.title": "Send", - "send.to": "To", - "send.to_contacts_selecor_account": "My account", - "send.to_contacts_selecor_account_title": "Select", - "send.to_contacts_selecor_address_book": "Address book", - "send.to_contacts_tooltip": "Contacts", - "send.to_ln_placeholder": "Enter Invoice, Lightning Address, LNURL or Node ID", - "send.to_paste_tooltip": "Paste", - "send.to_placeholder": "Enter address or domain name", - "send.to_scan_tooltip": "Scan", - "send.toast_btc_fork_insufficient_fund": "Insufficient balance. Please try a smaller amount", - "send.verification_failure": "Verification failed.", - "send_token_selector.no_match_found": "No match found for your search.", - "send_token_selector.no_results": "No Results", - "send_token_selector.search_placeholder": "Search symbol or contract address", - "send_token_selector.select_token": "Select Token", - "setting.floating_icon": "Floating icon", - "setting.floating_icon_always_display": "Always display", - "setting.floating_icon_always_display_description": "When enabled, OneKey will activate a floating icon in the bottom right corner of the webpage, which can help you check the security information of dApps.", - "settings.account_derivation_path": "Account derivation path", - "settings.account_derivation_path_desc": "If you don’t see the accounts you expect, try switching the derivation path.", - "settings.account_sync_dapp_to_wallet_mode_description": "Automatically syncs your dApp account and network settings to your wallet when switching back from a dApp.", - "settings.account_sync_dapp_to_wallet_mode_title": "Align dApp account to wallet", - "settings.account_sync_independent_mode_description": "Wallet and dApp accounts operate independently, without interfering with each other.", - "settings.account_sync_independent_mode_title": "Independent mode", - "settings.account_sync_modal_title": "Align primary account", - "settings.account_sync_wallet_to_all_mode_description": "Your current wallet account will be used for all dApp interactions.", - "settings.account_sync_wallet_to_all_mode_title": "Always use wallet account", - "settings.address_book": "Address book", - "settings.app_update_available": "App update available", - "settings.app_update_cache": "App update cache", - "settings.auto_lock": "Auto-lock", - "settings.backup_recovery_phrase_to_onekey_keytag": "Backup your recovery phrase to OneKey KeyTag", - "settings.backup_recovery_phrase_to_onekey_lite": "Backup your recovery phrase to OneKey Lite", - "settings.backup_with_onekey_keytag": "Back up with OneKey KeyTag", - "settings.browser_cache": "Browser cache", - "settings.browser_history_bookmarks_pins_risk_dapp_whitelist": "Browser history, bookmarks, pins, risk dApp whitelist", - "settings.change_pin": "Change PIN", - "settings.clear_browser_cache": "Clear browser cache", - "settings.clear_browser_cache_desc": "Open this link in your browser to clear the cache: {url}", - "settings.clear_browser_cache_desc2": "Please go to the browser settings page to continue clearing.", - "settings.clear_cache_on_app": "Clear cache on App", - "settings.clear_data": "Clear data", - "settings.clear_pending_transactions": "Clear pending transactions", - "settings.clear_pending_transactions_desc": "Clear the pending data in the local history record.", - "settings.clear_successful": "Clear successful", - "settings.connected_sites": "Connected sites", - "settings.create_remove_wallets": "Create / remove wallets without passcode", - "settings.create_remove_wallets_desc": "No passcode needed for creating/removing wallets", - "settings.create_transactions": "Create transaction without passwcode", - "settings.create_transactions_desc": "No passcode needed for transactions", - "settings.cryptocurrency": "Cryptocurrency", - "settings.default_currency": "Default currency", - "settings.default_wallet_settings": "Default wallet settings", - "settings.export_network_config_custom_network_label": "EVM networks and tokens", - "settings.export_network_config_desc": "Export your custom network configurations from OneKey 4.0.", - "settings.export_network_config_label": "Export custom network config", - "settings.export_state_logs": "Export state logs", - "settings.export_state_logs_desc": "This will help us debug any issue you might encounter. Please send to {email} to contact OneKey support.", - "settings.fiat": "Fiat", - "settings.go_to_settings_page_now": "Go to the Settings Page Now?", - "settings.google_drive_backup": "Google Drive backup", - "settings.hardware_bridge_status": "Hardware bridge status", - "settings.hardware_wallets_not_appear": "Hardware wallets will not appear here.", - "settings.help_center": "Help center", - "settings.how_to_import_from_onekey_keytag": "How to import from OneKey KeyTag?", - "settings.how_to_import_from_onekey_keytag_desc": "Sum the numbers in each row. This sum represents the word's position in the word list.\nThen, visit the {dotmap} website to find the corresponding word for this position.", - "settings.icloud_backup": "iCloud backup", - "settings.if_away_for_1_hr": "If away for 1 hr", - "settings.if_away_for_1_min": "If away for 1 min", - "settings.if_away_for_30_mins": "If away for 30 mins", - "settings.if_away_for_4_hrs": "If away for 4 hrs", - "settings.if_away_for_5_mins": "If away for 5 mins", - "settings.import_recovery_phrase_from_onekey_keytag": "Import recovery phrase from your OneKey KeyTag", - "settings.import_recovery_phrase_from_onekey_lite": "Import recovery phrase from your OneKey Lite", - "settings.lock_now": "Lock now", - "settings.logs_do_not_include_sensitive_data": "Logs do not include sensitive data like recovery phrases or private keys. They only contain local data, crash reports, and public wallet addresses.", - "settings.migration": "Migration", - "settings.nfc_not_supported": "Your current device does not support NFC, replace it with an NFC-enabled device and try again.", - "settings.no_connected_sites": "No connected sites", - "settings.no_connected_sites_desc": "All sites connected through OneKey will appear here.", - "settings.no_signed_text": "No signed text", - "settings.no_signed_text_desc": "All text signed through OneKey will appear here.", - "settings.no_signed_transactions": "No signed transactions", - "settings.no_signed_transactions_desc": "All transactions signed through OneKey will appear here.", - "settings.onekey_keytag_desc": "Powerful wallet backup kit made of titanium alloy", - "settings.onekey_lite_desc": "Restore your wallet without typing one word.", - "settings.onekey_wants_to_use_nfc": "\"OneKey\" wants to use NFC", - "settings.onekey_wants_to_use_nfc_desc": "To connect to OneKey Lite, NFC permissions are required.", - "settings.passcode_bypass": "Passcode bypass", - "settings.passcode_bypass_desc": "When exceeding the allowed time of 2 hours, passcode verification is still required to ensure security.", - "settings.passkey": "PassKey", - "settings.password_bypass": "Password bypass", - "settings.password_bypass_desc": "When exceeding the allowed time of 2 hours, password verification is still required to ensure security.", - "settings.privacy_policy": "Privacy policy", - "settings.protection": "Protection", - "settings.protection_passcode_section_title": "Passcode protection", - "settings.rate_app": "Rate the App", - "settings.reset": "Reset", - "settings.reset_app": "Reset App", - "settings.reset_app_desc": "This will delete all data on OneKey. Ensure you have a backup, then enter \"RESET\" to proceed.", - "settings.resources": "Resources", - "settings.select_wallet": "Select wallet", - "settings.set_auto_lock_duration_desktop": "When the app runs in the background without exiting or when the device screen is locked, it will automatically lock after a specified period of time.", - "settings.set_auto_lock_duration_extension": "When closing the plugin window or when in full-screen mode with unused tabs, it will automatically lock after a specified period of time.", - "settings.set_auto_lock_duration_mobile": "When the app runs in the background without exiting or when the device screen is locked, it will automatically lock after a specified period of time.", - "settings.set_auto_lock_duration_web": "When the app is in an unused tab or minimized window, it will automatically lock after a specified period of time.", - "settings.settings": "Settings", - "settings.shortcuts": "Shortcuts", - "settings.sign_text": "Sign text", - "settings.signature_record": "Signature record", - "settings.spend_dust_utxo": "Spend dust UTXO", - "settings.spend_dust_utxo_desc": "Using dust UTXO increases transaction fees and reduces privacy. It's recommended to disable this feature to avoid malicious tracking.", - "settings.step1_get_bip39_dotmap": "Step 1: get your BIP39 dotmap", - "settings.step1_get_bip39_dotmap_desc": "Visit the {dotmap} online or refer to the physical map in your KeyTag starter guide.", - "settings.step2_match_recovery_phrase_dots": "Step 2: match recovery phrase dots", - "settings.step2_match_recovery_phrase_dots_desc": "Locate the dot pattern for each word of your recovery phrase on the {dotmap} .", - "settings.step3_align_and_punch": "Step 3: align and punch", - "settings.step3_align_and_punch_desc": "Each line of KeyTag represents a word. Use a center punch tool for accurate punching based on the black circle's position.\nFor Passphrase backup, punch on the line marked with '*'.", - "settings.submit_request": "Submit a request", - "settings.swap_history": "Swap history", - "settings.system_idle_lock": "System idle lock", - "settings.system_idle_lock_desc": "When enabled, starts timing when there is no user activity, even if the app is in the foreground", - "settings.theme": "Theme", - "settings.token_nft_data": "Token & NFT data", - "settings.token_risk_protection": "Risk protection", - "settings.token_risk_reminder": "Token risk reminder", - "settings.token_risk_reminder_desc": "When enabled, you'll be reminded when selecting non-verified tokens.", - "settings.transaction_history": "Transaction history", - "settings.transactions": "Transactions", - "settings.turn_on_nfc": "Turn on NFC and Let \"OneKey\" Connect Your Hardware Devices", - "settings.unable_to_connect": "Unable to connect", - "settings.user_agreement": "User agreement", - "settings.version_versionnum": "version {versionNum}", - "settings.view_address_in_explorer": "View address in explorer", - "settings.view_transaction_in_explorer": "View transaction in explorer", - "settings.whats_new": "What’s new", - "settings_protection.allowlist_content": "عند التمكين، يمكنك فقط إرسال الأموال إلى الحسابات داخل المحفظة أو إلى العناوين المدرجة في القائمة البيضاء في دفتر العناوين.", - "settings_protection.allowlist_title": "Transfer allowlist", - "shortcut.go_back": "Go back", - "shortcut.go_forward": "Go forward", - "shortcut.hide_sidebar": "Hide sidebar", - "shortcut.show_sidebar": "Show sidebar", - "shortcuts.account_selector": "Account selector", - "shortcuts.close_current_tab": "Close current tab", - "shortcuts.go_to_browser_tab": "Go to browser tab", - "shortcuts.go_to_earn_tab": "Go to earn tab", - "shortcuts.go_to_market_tab": "Go to market tab", - "shortcuts.go_to_swap_tab": "Go to swap tab", - "shortcuts.go_to_wallet_tab": "Go to wallet tab", - "shortcuts.network_selector": "Network selector", - "sig.account_rent_label": "Account rent", - "sig.approval_label": "Approval", - "sig.approve_to_label": "Approve to", - "sig.interact_contract_label": "تفاعل العقد", - "sig.revoke_approval_label": "Revoke approval", - "sig.revoke_from_label": "Revoke from", - "sig.sigature_request_label": "Signature request", - "sign.swap_estimate_receive": "التقدير المستلم", - "skip_verify_text": "I don't have my device with me", - "slippage_tolerance.button_save": "Save", - "slippage_tolerance.description": "Auto slippage optimizes slippage based on pool liquidity and trading volume, reducing transaction failures and MEV attack risks.", - "slippage_tolerance.error_message": "Slippage Tolerance must be between 0 to 50%.", - "slippage_tolerance.input_placeholder": "0.005", - "slippage_tolerance.popover": "Slippage tolerance is a setting for the amount of price slippage you are willing to accept for a trade.", - "slippage_tolerance.switch_auto": "Auto", - "slippage_tolerance.switch_custom": "Custom", - "slippage_tolerance.title": "Slippage tolerance", - "slippage_tolerance.warning_message_1": "High slippage tolerance may cause your asset loss.", - "slippage_tolerance.warning_message_2": "Slippage under {number}% may cause trade failure.", - "speed_up_cancellation": "Speed up cancellation", - "spotlight.account_alignment_desc": "OneKey now defaults to automatically switching to your last used dApp account. To change this setting, go to Settings > Align primary account.", - "spotlight.enable_account_asset_message": "If balances are missing, go to \"Networks\" on the homepage and select \"All networks\" first.", - "spotlight.enable_network_message": "Manage network visibility and quickly copy addresses for any network in 'All networks' view.", - "swap_account.from_address": "{addrss}", - "swap_account.to_address": "{addrss}", - "swap_account.to_address_edit": "(edited)", - "swap_account.to_address_edit_button": "Reset", - "swap_history.all_history": "All history", - "swap_history.all_history_content": "This will clear all history in the local history record.", - "swap_history.all_history_title": "Clear all history", - "swap_history.amount_received": "+{amount} {token}", - "swap_history.amount_sent": "-{amount} {token}", - "swap_history.date_time_format": "{date} {time}", - "swap_history.pending_history": "Pending history", - "swap_history.pending_history_content": "This will clear all pending data in the local history record, but it will not affect the status of this transaction on the blockchain.", - "swap_history.pending_history_title": "Clear pending history", - "swap_history.status_canceled": "Canceled", - "swap_history.status_cancelling": "Cancelling", - "swap_history.status_discard": "Timeout", - "swap_history.status_failed": "Failed", - "swap_history.status_pending": "Pending", - "swap_history.status_success": "Success", - "swap_history.title": "History", - "swap_history.transaction_format": "{token_from} → {token_to}", - "swap_history_detail.badge_bridge_failed": "فشلت معاملة الجسر", - "swap_history_detail.badge_bridge_pending": "معاملة الجسر معلقة", - "swap_history_detail.badge_bridge_success": "تمت معاملة الجسر بنجاح", - "swap_history_detail.badge_expired": "انتهت صلاحية الطلب", - "swap_history_detail.badge_from_failed": "فشلت معاملة سلسلة المصدر", - "swap_history_detail.badge_from_pending": "معاملة سلسلة المصدر معلقة", - "swap_history_detail.badge_from_success": "تمت معاملة سلسلة المصدر بنجاح", - "swap_history_detail.badge_provider_error": "خطأ مقدم الخدمة", - "swap_history_detail.badge_refund_failed": "فشل استرداد المبلغ", - "swap_history_detail.badge_refunded": "تم استرداد المبلغ", - "swap_history_detail.badge_refunding": "استرداد الأموال", - "swap_history_detail.badge_to_failed": "فشلت معاملة السلسلة المستهدفة", - "swap_history_detail.badge_to_pending": "معاملة سلسلة الهدف معلقة", - "swap_history_detail.badge_to_success": "تمت معاملة سلسلة الهدف بنجاح", - "swap_history_detail.clear_content": "This will clear clear the data in the local history record.", - "swap_history_detail.clear_title": "Clear history", - "swap_history_detail.date": "Time", - "swap_history_detail.delete_confirm": "Delete", - "swap_history_detail.delete_title": "Are you sure to delete all history?", - "swap_history_detail.from": "Pay network", - "swap_history_detail.network_fee": "Network fee", - "swap_history_detail.order_detail": "تفاصيل الحالة", - "swap_history_detail.order_status": "Order status", - "swap_history_detail.pay_address": "Pay address", - "swap_history_detail.protocol_fee": "Provider Fee", - "swap_history_detail.provider": "Provider", - "swap_history_detail.rate": "Rate", - "swap_history_detail.receive_amount": "+Receive Amount", - "swap_history_detail.received_address": "Received address", - "swap_history_detail.send_amount": "-Send Amount", - "swap_history_detail.service_fee": "Service Fee", - "swap_history_detail.status_pending": "Pending", - "swap_history_detail.surplus": "فائض", - "swap_history_detail.swap_duration": "Swap duration", - "swap_history_detail.title": "Transaction", - "swap_history_detail.to": "Received nework", - "swap_history_detail.toast_copy": "Copied", - "swap_history_detail.transaction_hash": "Transaction hash", - "swap_history_detail.transaction_price": "Transaction Price", - "swap_history_detail.view_in_browser": "View on Explorer", - "swap_page.account": "Account {number}", - "swap_page.account_to_address_title": "Edit address", - "swap_page.alert.account_does_not_support_swap": "Connected account doesn't support swap. Try another.", - "swap_page.alert.fee_exceeds_amount": "Est network fee exceeds swap amount, proceed with caution.", - "swap_page.alert.fee_exceeds_amount_title": "Network fee alert", - "swap_page.alert.maximum_amount": "Max amount {number} {symbol}", - "swap_page.alert.minimum_amount": "Minimum amount {number} {symbol}", - "swap_page.alert.network_fee_deducted": "Network fee in ETH deducted automatically in the next step.", - "swap_page.alert.no_provider_supports_trade": "No provider supports this trade", - "swap_page.alert.not_best_rate": "The current provider does not offer the best rate for this trade.", - "swap_page.alert.require_native_token_content": "Some bridges charge extra source chain native tokens as a bridge fee.", - "swap_page.alert.require_native_token_title": "Require {n} {token}", - "swap_page.alert.tax_detected": "The tax for the token goes to the token project, not OneKey.", - "swap_page.alert.tax_detected_buy": "buy", - "swap_page.alert.tax_detected_sell": "sell", - "swap_page.alert.tax_detected_title": "{percentage} {token} {action} tax detected", - "swap_page.alert.value_drop": "High price impact may cause your asset loss.", - "swap_page.alert.value_drop_title": "{number} value drop", - "swap_page.amount": "{number}", - "swap_page.approve_and_swap": "Approve and Swap", - "swap_page.approve_button": "Approve {token} to {target}", - "swap_page.balance": "Balance: {number}", - "swap_page.bridge": "Bridge", - "swap_page.button_approve_amount": "Approve {number}", - "swap_page.button_approve_unlimited": "Approve unlimited", - "swap_page.button_cross_chain": "Bridge", - "swap_page.button_enter_a_recipient": "Enter a recipient", - "swap_page.button_enter_amount": "Enter amount", - "swap_page.button_fetching_quotes": "Fetching quotes", - "swap_page.button_insufficient_balance": "Insufficient balance", - "swap_page.button_no_connected_wallet": "No wallet connected", - "swap_page.button_no_enough_fee": "Not enough to cover network fee", - "swap_page.button_no_liquidity": "No liquidity for this trade", - "swap_page.button_refresh_quotes": "Refresh quotes", - "swap_page.button_select_token": "Select token", - "swap_page.button_wrap": "Swap via Wrap Contract", - "swap_page.buy_sell_tax": "{token} token tax", - "swap_page.create_to_enable_network": "Create to enable the network", - "swap_page.from": "From", - "swap_page.limit": "Limit", - "swap_page.limit_dialog_button": "Confirm", - "swap_page.limit_dialog_content": "Limit order will be available soon. If you have old orders on OneKey V4, you can visit Matcha (https://matcha.xyz) to view or manage your orders.", - "swap_page.limit_dialog_title": "Limit order", - "swap_page.max": "Max", - "swap_page.no_address": "No {network} address", - "swap_page.percentage_change": "(+{number}%)", - "swap_page.price_impact_content_1": "فرق القيمة = (القيمة المستلمة - القيمة المدفوعة) / القيمة المدفوعة", - "swap_page.price_impact_content_2": "عندما يكون لدى المجمع سيولة منخفضة، قد تواجه تجارتك تأثيرًا أكبر على السعر. سيقوم OneKey Swap بإطلاق تحذير من تأثير السعر لتنبيهك إلى إمكانية حدوث خسارة كبيرة.", - "swap_page.price_impact_title": "فرق القيمة", - "swap_page.provider.approve": "Approve", - "swap_page.provider.approve_amount": "Approve amount", - "swap_page.provider.approve_amount_limit": "{value} {token}", - "swap_page.provider.approve_amount_un_limit": "Unlimited", - "swap_page.provider.approve_usdt_dialog_content": "Due to the current USDT approved amount being lower than the intended swap amount. You must first revoke the existing one before setting a new allowance.", - "swap_page.provider.approve_usdt_dialog_title": "Insufficient approved amount", - "swap_page.provider.custom": "Custom ({number}%)", - "swap_page.provider.est_network_fee": "Est network fee", - "swap_page.provider.exchange_rate": "1 ETH = {number} USDC", - "swap_page.provider.fee_amount": "${number}", - "swap_page.provider.provider": "Provider", - "swap_page.provider.provider_insufficient_liquidity": "No provider support", - "swap_page.provider.rate_unavailable": "Failed to fetch the quote", - "swap_page.provider.slippage_auto": "Auto ({number}%)", - "swap_page.provider.slippage_tolerance": "Slippage", - "swap_page.recent_trade": "Recent trade", - "swap_page.recipient_add": "Add recipient address", - "swap_page.recipient_edit": "Edit recipient", - "swap_page.recipient_external_account": "External account", - "swap_page.recipient_modal_do_not": "Do not send to centralized exchange. Tokens sent to the wrong address are irretrievable", - "swap_page.recipient_modal_verify": "Verify the address is accurate and fully compatible with the target network", - "swap_page.recipient_send_to": "Sent to", - "swap_page.settings": "Advanced settings", - "swap_page.settings_recipient_content": "Allows you to choose a destination address for the swap other than the connected one", - "swap_page.settings_recipient_title": "Custom recipient", - "swap_page.settings_simple_mode": "Smart mode", - "swap_page.settings_simple_mode_content": "Provide a better trading experience and ensure the security of your approval", - "swap_page.swap": "Swap", - "swap_page.swap_button": "Swap", - "swap_page.swap_steps_1": "1. Approve {tokenSymbol}", - "swap_page.swap_steps_1_approve_dialog": "Give the provider permission to swap that token from your wallet. ", - "swap_page.swap_steps_2": "2. Swap", - "swap_page.to": "To", - "swap_page.toast.address_generated": "Address created", - "swap_page.toast.address_generated_fail": "Address creation failed", - "swap_page.toast.approve_canceled": "Approve cancel", - "swap_page.toast.approve_canceled_detail": "{token}", - "swap_page.toast.approve_discarded": "Approve discarded", - "swap_page.toast.approve_discarded_detail": "{token}", - "swap_page.toast.approve_failed": "Approve failed", - "swap_page.toast.approve_failed_detail": "{token}", - "swap_page.toast.approve_successful": "Approve successful", - "swap_page.toast.approve_successful_detail": "{token}", - "swap_page.toast.insufficient_balance_content": "You should reserve at least {number} {token} to cover the network fee.", - "swap_page.toast.insufficient_balance_title": "Insufficient {token} balance", - "swap_page.toast.insufficient_input_amount": "Insufficient input amount", - "swap_page.toast.swap_failed": "Swap failed", - "swap_page.toast.swap_failed_detail": "{number} {tokenSymbol} → {number} {tokenSymbol}", - "swap_page.toast.swap_successful": "Swap successful", - "swap_page.toast.swap_successful_detail": "{number} {symbol} → {number} {symbol}", - "swap_page.toast.taproot_unspported": "ThorSwap does not currently support Taproot-format BTC address.", - "swap_page.toast.token_not_supported": "Token is not supported", - "swap_page.usd_value": "${number}", - "swap_token_selector.all_token": "All token", - "swap_token_selector.contract_info": "View in explorer", - "swap_token_selector.popular_token": "Popular token", - "swap_token_selector.trending_token": "Trending token", - "symbol_and_more": "{symbol} and more", - "terms_privacy": "Use implies consent to our Terms & Privacy", - "title_403": "403 Forbidden", - "title__edit_fee": "Edit Fee", - "title__invoice_description": "Invoice description", - "title__lnurl_pay": "LNURL Pay", - "token_hidden_message": "This token is currently hidden and won't appear in the list", - "token_no_search_results_desc": "No match found for your search. Please re-enter.", - "token_selector.empty_content": "The token selected does not support cross-chain to this network.", - "token_selector.empty_title": "Unsupported", - "token_selector.network": "Network:", - "token_selector.risk_reminder.button_cancel": "Cancel", - "token_selector.risk_reminder.button_ok": "OK", - "token_selector.risk_reminder.checkbox": "Don't show this alert for all non-verified tokens", - "token_selector.risk_reminder.malicious_token_alert": "Caution! Malicious token.", - "token_selector.risk_reminder.message": "Anyone can issue tokens, including counterfeit tokens under valid projects. User who bought counterfeit tokens might not be able to sell them, resulting in asset loss. If you proceed to trade this custom token, you’ll be liable to all potential risk and responsibilities.", - "token_selector.risk_reminder.spam_token_alert": "Suspected spam token", - "token_selector.risk_reminder.title": "Risk reminder", - "token_selector.risk_reminder.token_address": "{token_address}", - "token_selector.risk_reminder.token_name": "{token_name}", - "token_selector.risk_reminder.token_symbol": "{token_symbol}", - "token_selector.search_placeholder": "Search symbol or contract address", - "token_selector.title": "Select token", - "token_selector.unverified_token_warning": "Unverified Token below. Proceed with caution.", - "touch_id_unlock_desc": "OneKey is trying to Unlock.", - "transaction.advanced": "Advanced", - "transaction.application": "dApp", - "transaction.cancel": "Cancel", - "transaction.confirm": "Confirm", - "transaction.current_gwei": "Current: {amount} Gwei", - "transaction.custom": "Custom", - "transaction.data": "Data", - "transaction.estimate_gas_limit": "Estimate gas limit is {amount}, recommend {amount}", - "transaction.expected_fee": "Expected Fee", - "transaction.fast": "Fast", - "transaction.fee_estimate": "Fee Estimate", - "transaction.layer_base_fee": "L1 Base Fee", - "transaction.max_base_fee": "Max base fee", - "transaction.max_fee": "Max Fee", - "transaction.network": "Network", - "transaction.normal": "Normal", - "transaction.slow": "Slow", - "transaction.to_contract": "To contract", - "transaction__contract_interaction": "Contract interaction", - "transaction__transaction_confirm": "Transaction confirm", - "transaction_confirm.batch_swap_tip": "By submitting this order, you are approving {token} for trading confirming a swap on {chain} powered by {provider} API. If you have any concerns about the order, please contact us.", - "transaction_confirm.single_swap_tip": "By submitting this order, you are confirming a swap on {chain} powered by {provider} API. If you have any concerns about the order, please contact us.", - "troubleshooting.change_usb_port": "Change the USB port used on your computer.", - "troubleshooting.check_bluetooth": "Ensure Bluetooth is enabled on your OneKey device (disable AirGap if using OneKey Pro).", - "troubleshooting.check_bridge": "Check if the Bridge is installed correctly. See details here.", - "troubleshooting.close_other_onekey_app": "Close any other OneKey apps, extensions, or web pages.", - "troubleshooting.connect_and_unlock": "Connect and unlock your device to see if it's detected.", - "troubleshooting.fallback_solution_label": "Still can't connect?", - "troubleshooting.help_center": "Visit our Help Center where we’ve pre-entered the specific keyword to assist you in finding the information you need.", - "troubleshooting.reconnect_and_pair": "Reconnect and pair your OneKey device.", - "troubleshooting.remove_device_from_bluetooth_list": "Go to your phone or tablet's Bluetooth settings and remove the OneKey device from the list of paired devices.", - "troubleshooting.remove_usb_dongles": "Remove any USB dongles.", - "troubleshooting.replug_usb_cable": "Replug the USB cable.", - "troubleshooting.request": "If you still can’t find a solution, click here to contact our support team for further assistance.", - "troubleshooting.restart_app": "Restart the OneKey app.", - "troubleshooting.show_helper_cta_label": "Having trouble connecting your device?", - "troubleshooting.solution_x": "Solution {number}", - "troubleshooting.try_different_usb_cable": "Try a different USB cable, making sure it supports data transfer.", - "troubleshooting.unlock_device": "Unlock your device to see if it's detected.", - "troubleshooting.use_original_usb_cable": "Use the original USB cable if possible.", - "trx_consumed": "TRX consumed", - "tx_accelerate.accelerator_selector_item_label": "{name} accelerator", - "tx_accelerate.order_inquiry_label": "Order inquiry", - "tx_accelerate.speed_up_with_accelerator_dialog_desc": "Your transaction ID will be automatically filled in for a seamless experience.", - "tx_accelerate.speed_up_with_accelerator_dialog_fee_refund": "Fees are non-refundable", - "tx_accelerate.speed_up_with_accelerator_dialog_note_fee_cal": "Additional fees will be calculated by {accelerator}", - "tx_accelerate.speed_up_with_accelerator_dialog_note_service_provide_by": "Service provided by {accelerator}", - "tx_accelerate.speed_up_with_accelerator_dialog_note_title": "Note", - "tx_accelerate.speed_up_with_accelerator_dialog_title": "Speed up with {accelerator}", - "update.all_other_apps_closed": "All other OneKey Apps and web upgrade tools are closed.", - "update.all_other_apps_closed_emoji": "All other OneKey Apps and web upgrade tools are closed. 🆗", - "update.all_updates_complete": "All updates complete 👏🏻", - "update.app_up_to_date": "You’ve got the latest version of OneKey, thanks for staying on the ball.", - "update.app_update": "App update", - "update.app_update_latest_version": "You’re all good", - "update.app_version_ready_for_update": "App {version} ready for update", - "update.bluetooth_version_available": "Bluetooth {version} is available", - "update.bridge_network_error": "Bridge network error", - "update.bridge_not_installed": "Bridge not installed", - "update.bridge_timeout_error": "Bridge timeout error", - "update.check_connection_try_again": "Check your device's connection and try again.", - "update.checking_device": "Checking device...", - "update.checking_device_if_no_restart": "Checking device... If it doesn't restart automatically after installation, manually restart to continue.", - "update.checking_for_updates": "Checking for updates...", - "update.checking_latest_ui_resources": "Checking latest UI resources...", - "update.connection_interrupted": "Connection interrupted", - "update.connection_interrupted_desc": "The connection has been lost. Please check your network settings and try again.", - "update.connection_to_bridge_timed_out": "The connection to the bridge has timed out. Please check your internet connection and try again.", - "update.device_connected_via_bluetooth": "My device is connected via Bluetooth and the connection is stable.", - "update.device_connected_via_bluetooth_emoji": "My device is connected via Bluetooth and the connection is stable. 📲", - "update.device_connected_via_usb": "My device is connected via USB cable.", - "update.device_connected_via_usb_emoji": "My device is connected via USB cable. 🔌", - "update.device_disconnected": "Device disconnected", - "update.device_disconnected_desc": "The device has been disconnected. Please reconnect the device and try again.", - "update.device_fully_charged": "The device battery is fully charged and connected to power.", - "update.device_fully_charged_emoji": "The device battery is fully charged and connected to power. 🔋", - "update.device_in_bootloader_mode": "Device in bootloader mode", - "update.device_mismatch_detected": "Device mismatch detected", - "update.device_mismatch_detected_desc": "A different device has been detected. Please connect the original device intended for this operation.", - "update.download_failed": "Download failed", - "update.download_on_github": "Download on Github", - "update.download_success": "Download success", - "update.download_timed_out_check_connection": "Download timed out, please check your internet connection.", - "update.downloading": "Downloading...", - "update.downloading_latest_ui_resources": "Downloading latest UI resources...", - "update.downloading_package": "Downloading package... {progress}%", - "update.ensure_one_usb_device_connected": "Please ensure only one USB device is connected to proceed with the upgrade. If multiple devices are connected, disconnect the others and try again.", - "update.failed_to_enter_bootloader_mode": "Failed to enter bootloader mode", - "update.firmware_version_available": "Firmware {version} is available", - "update.follow_online_tutorial_to_proceed_manually": "Follow the online tutorial to proceed manually, then click \"Retry\".", - "update.hardware_sdk_initialization_failed": "Hardware SDK initialization failed. Please check your network or switch the proxy and try again.", - "update.hardware_update": "Hardware update", - "update.hardware_update_requires_bridge": "Hardware update requires the latest bridge software. Please visit our online tutorial [Download and update OneKey Bridge] for detailed installation instructions.", - "update.hardware_wallet_in_bootloader_mode": "Your hardware wallet is in bootloader mode, which is used for software updates. Would you like to update now?\nIf you prefer not to update, please manually restart the device to return to normal mode.", - "update.hardware_wallet_in_bootloader_mode_restart": "Your hardware wallet is currently in boot mode, which is used for hardware updates.\nDetected existing firmware on the device. Please restart the device to normal mode before connecting to the app.", - "update.i_have_backed_up_my_recovery_phrase": "I’ve backed up my recovery phrase.", - "update.i_have_backed_up_my_recovery_phrase_emoji": "I’ve backed up my recovery phrase. ✅", - "update.init_iframe_load_fail": "Init iframe load fail", - "update.install_and_restart": "Install and restart", - "update.install_now": "Install now", - "update.installation_failed": "Installation failed", - "update.installation_package_possibly_compromised": "Installation package verification failed.", - "update.installing": "Installing...", - "update.insufficient_battery_power": "Insufficient battery power", - "update.insufficient_battery_power_desc": "The connected hardware device has insufficient battery power and cannot proceed with the upgrade. Please charge the device before trying again.", - "update.insufficient_disk_space_clear_retry": "Insufficient disk space, please clear and retry.", - "update.keep_bluetooth_connected_and_app_active": "Keep bluetooth connected and app active during the upgrade.", - "update.keep_usb_connected_and_app_active": "Keep USB connected and app active during the upgrade.", - "update.latest_version": "You are on the latest version", - "update.manual_update": "Manual update", - "update.manually_entering_bootloader_mode": "Manually entering bootloader mode", - "update.manually_entering_bootloader_mode_desc": "To enter bootloader mode on your OneKey Mini, press and hold the lock screen button while inserting the data cable into the computer, then click 'Verify status and continue'.", - "update.network_exception_check_connection": "Network exception, please check your internet connection.", - "update.network_instability_check_connection": "Network instability, please check your internet connection.", - "update.new_app_version": "New App version 🎉", - "update.new_hardware_updates": "New hardware updates 🎉", - "update.new_update_downloaded": "A new update has been downloaded. Would you like to install and restart the app now?", - "update.only_one_device_connected": "Only one device is connected.", - "update.only_one_device_connected_emoji": "Only one device is connected. 📱", - "update.only_one_usb_device_supported_for_upgrade": "Only One USB Device Supported for Upgrade", - "update.operation_canceled": "Operation canceled", - "update.operation_canceled_desc": "The operation has been canceled. Please try again.", - "update.outdated_version_detected": "Outdated version detected", - "update.outdated_version_detected_desc": "Your current firmware version is too low. Please visit our online tutorial [Solution for failed firmware upgrade on Touch] and follow the step-by-step instructions to complete the update.", - "update.package_name_mismatch": "Installation package name mismatch", - "update.progress_downloading": "{progress}% downloading...", - "update.quit_update": "Quit update", - "update.quit_update_desc": "The firmware is being updated. Exiting may interrupt the upgrade. Are you sure you want to cancel the update?", - "update.ready_to_upgrade_checklist": "Ready to upgrade? let’s check you're all set 📝", - "update.reboot_success": "Reboot success", - "update.reboot_to_bootloader_mode": "Reboot to bootloader mode", - "update.recommend_regular_check_and_update_plugin": "To ensure you get the best experience, we recommend that you regularly check for and manually update the plugin.", - "update.restart_to_update": "Restart to update", - "update.server_not_responding_try_later": "Server not responding, please try again later.", - "update.transferring_data": "Transferring data...", - "update.troubleshoot_connection_issues": "To troubleshoot connection issues:\n\n1. Ensure OneKey Bridge is installed and running.\n2. Refresh or switch your browser, then try again.\n3. Use a different cable and port.\n\nIf this doesn’t help, contact OneKey support.", - "update.troubleshoot_connection_issues_desktop": "To troubleshoot connection issues, follow these steps:\n\n1. Reconnect your device and try again.\n2. Restart the app and your device, then try again.\n3. Use a different cable and port, then try again.\n\nIf this doesn’t help, contact OneKey support.", - "update.troubleshoot_connection_issues_mobile": "To troubleshoot connection issues:\n\n1. Ensure Bluetooth is enabled.\n2. Reconnect your device and try again.\n3. Restart the App and your device, then try again.\n\nIf this doesn’t help, contact OneKey support.", - "update.unable_to_connect_to_bridge": "Unable to connect to the bridge. Please check your internet connection and try again.", - "update.update_app_available": "Update App to {version} is available", - "update.update_completed": "Update Completed", - "update.update_history": "Update history", - "update.update_in_official_web_tool": "Update in official web tool", - "update.update_in_official_web_tool_desc": "Your hardware wallet firmware requires an update.\nPlease visit firmware.onekey.so on your computer to proceed with the upgrade.", - "update.update_in_official_web_tool_desc_copy": "Your hardware wallet firmware requires an update.\nPlease visit firmware.onekey.so on your computer to proceed with the upgrade.", - "update.update_now": "Update now", - "update.update_required": "Update required", - "update.update_required_desc": "Your hardware wallet's version is outdated and must be updated to continue.", - "update.update_resource_failed": "Update resource failed", - "update.update_ui_resources_success": "Update UI resources success", - "update.updated_to_latest_version": "Updated to the latest version {version}", - "update.updating_bootloader": "Updating bootloader", - "update.updating_ui_resources": "Updating UI resources...", - "update.verify_file_signature": "Verify file signature...", - "update.verify_status_and_continue": "Verify status and continue", - "update.verifying": "Verifying...", - "update.verifying_sha256_and_package_name": "Verifying SHA256 and package name…", - "update.whats_new_in_onekey_version": "What’s new\nin OneKey {version} 👋🏻", - "v4.select_account_name_label": "Name from OneKey v4", - "v4_migration.backed_up_warning": "Have you backed up everything?", - "v4_migration.backed_up_warning_desc": "Ensure you’ve backed up all your recovery phrases and private keys to prevent any loss of assets due to unexpected issues during data migration.", - "v4_migration.backup_alert_desc": "Before you proceed, make sure you've backed up the all recovery phrases or private keys.", - "v4_migration.backup_alert_title": "IMPORTANT: Back up all of your data", - "v4_migration.backup_primary_action": "I backed them up", - "v4_migration.backup_private_key_reveal_alert": "Click to view the private key, make sure no one is looking your screen", - "v4_migration.backup_recovery_phrase_reveal_alert": "Click to view the recovery phrase, make sure no one is looking your screen", - "v4_migration.backup_title": "Backup your data", - "v4_migration.completed_desc": "Explore the exciting new features of OneKey v5 now!", - "v4_migration.completed_title": "Migration completed", - "v4_migration.confirm_password_description": "Please enter the unlock password for OneKey App v4", - "v4_migration.exit_migration_checkbox_label": "Don't ask me to migrate when the App starts", - "v4_migration.update_in_progress": "Update in progress", - "v4_migration.update_in_progress_alert_description": "Migration may take longer with more wallets. Please be patient.", - "v4_migration.update_in_progress_alert_title": "Don't close your App during update", - "v4_migration.welcome_message": "OneKey 5.0 is here!", - "v4_migration.welcome_message_desc": "Here’s how to securely and quickly migrate your data. Ready to start?", - "wallet.buy_crypto_instruction": "Buy crypto to fund your wallet", - "wallet.currently_supports_up_to_str_all_networks_accounts": "Currently supports up to {0} accounts across all networks.", - "wallet.destination_tag": "Destination tag", - "wallet.engine_account_already_exists": "Account already exists.", - "wallet.engine_account_name_length_error": "Account name length exceeds the limit.", - "wallet.engine_too_many_hd_wallets": "Number of wallets exceeds the limit.", - "wallet.engine_too_many_hw_passphrase_wallets": "Number of passphrase wallets in the hardware wallet exceeds the limit.", - "wallet.engine_too_many_hw_wallets": "Number of hardware wallets exceeds the limit.", - "wallet.engine_too_many_imported_accounts": "Number of single-chain accounts exceeds the limit.", - "wallet.engine_too_many_watching_accounts": "Number of watched wallet accounts exceeds the limit.", - "wallet.engine_ttoo_many_external_accounts": "Number of external wallet accounts exceeds the limit.", - "wallet.engine_wallet_name_length_error": "Wallet name length exceeds the limit.", - "wallet.error_trade_with_watched_acocunt": "Cannot trade with a watched account.", - "wallet.generic_string_length_requirement": "Account name length exceeds the limit.", - "wallet.last_ledger_sequence": "Last ledger sequence", - "wallet.ledger_index": "Ledger index", - "wallet.no_address": "No address", - "wallet.no_address_desc": "Create address to enable network", - "wallet.receive_token_instruction": "Deposit from other wallets", - "wallet.unsupported_network_desc": "Switch networks in the top left or use a supported account", - "wallet.unsupported_network_desc_alt": "Switch networks on the previous page or use a supported account", - "wallet.unsupported_network_title": "This account doesn’t support {network}", - "wallet.you_need_str_accounts_on_any_network_to_create": "You need at least {0} accounts on any single network to create.", - "word": "Word" -} \ No newline at end of file diff --git a/packages/shared/src/locale/json/bn.json b/packages/shared/src/locale/json/bn.json index 9bdc0ce04b1..36cf8bad0bf 100644 --- a/packages/shared/src/locale/json/bn.json +++ b/packages/shared/src/locale/json/bn.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "পাসকোডগুলি মেলে না", "auth.error_passwcode_too_short": "পাসকোডটি কমপক্ষে {length} অক্ষর হতে হবে", "auth.error_password_empty": "দয়া করে একটি পাসওয়ার্ড প্রবেশ করান", - "auth.error_password_incorrect": "ভুল পাসওয়ার্ড", + "auth.error_password_incorrect": "ভুল পাসকোড", "auth.error_password_not_match": "পাসওয়ার্ডগুলি মিলছে না", "auth.error_password_too_short": "পাসওয়ার্ডটি অবশ্যই কমপক্ষে {length} অক্ষরের হতে হবে", "auth.new_passcode_form_label": "নতুন পাসকোড", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "একটি শক্তিশালী পাসওয়ার্ড তৈরি করুন", "auth.new_password_same_as_old": "নতুন পাসওয়ার্ডটি পুরানো পাসওয়ার্ড থেকে ভিন্ন হতে হবে", "auth.passcode_cooldown": "{cooldowntime} মিনিট পর আবার চেষ্টা করুন", - "auth.passcode_failed_alert": "{count} বার ব্যর্থ প্রচেষ্টা ডিভাইসটি রিসেট করবে", + "auth.passcode_failed_alert": "আরও {count} ব্যর্থ প্রচেষ্টা অ্যাপ রিসেট করবে", "auth.passcode_set": "পাসকোড সেট", "auth.password_set": "পাসওয়ার্ড সেট করা হয়েছে", "auth.set_passcode": "পাসকোড সেট করুন", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "লভ্য দাবি {number} দিনের মধ্যে", "earn.claim_limitations": "লিডোর সীমাবদ্ধতার কারণে, আপনাকে আপনার প্রতিটি রিডেমশনকে পৃথক পৃথক দাবি করতে হবে।", "earn.claim_rewards": "পুরস্কার দাবি করুন", - "earn.claim_rewards_morpho_desc": "সমস্ত মরফো স্টেকিং পজিশন থেকে পুরষ্কার গণনা করা হয় এবং প্রতি দুই সপ্তাহে আপডেট করা হয়।", + "earn.claim_rewards_morpho_desc": "সমস্ত মরফো স্টেকিং পজিশন থেকে পুরষ্কার গণনা করা হয় এবং প্রতি 2 সপ্তাহে নিষ্পত্তি করা হয়।", "earn.claim_together_tooltip": "প্রতিটি সম্পদ স্টেকিং বা উত্তোলনের অনুরোধের পরে স্বয়ংক্রিয়ভাবে আপনার ওয়ালেটে দাবি করা হয়।", "earn.claim_token": "{token} দাবি করুন", "earn.claim_token_desc": "উত্তোলন অনুরোধ প্রক্রিয়াজাত হওয়ার পরে আপনার {token} দাবি করুন।", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "টোকেন খুঁজে পাচ্ছেন না? খোঁজার চেষ্টা করুন", "remove_account_desc": "এই অ্যাকাউন্টটি মুছে ফেলা হবে।", "remove_device": "ডিভাইস মুছুন", - "remove_device_desc": "এটি আপনার ডাটা চিরতরে মুছে ফেলবে। তবে আপনি এখনও হার্ডওয়্যার ওয়ালেট থেকে এটি পুনরুদ্ধার করতে পারেন যা এই ওয়ালেটের পুনরুদ্ধার বাক্য লোড করেছে।", - "remove_hidden_wallet_desc": "এটি স্থায়ীভাবে আপনার ডাটা মুছে ফেলবে। নিশ্চিত করুন যে আপনি এই লুকানো ওয়ালেটের passphrase সংরক্ষণ করেছেন।", + "remove_device_desc": "এটি OneKey App থেকে এই হার্ডওয়্যার ওয়ালেটটি সংযোগ বিচ্ছিন্ন করবে। আপনি যখনই চান তখন এটি App এ পুনরায় সংযোগ করতে পারেন।", + "remove_hidden_wallet_desc": "এই লুকানো ওয়ালেটটি সরিয়ে ফেলবেন? নিশ্চিত করুন যে আপনি passphrase সংরক্ষণ করেছেন।", "remove_private_key_account_desc": "আপনি একাউন্টটি তার প্রাইভেট কী ব্যবহার করে মুছে ফেলার পরে পুনরুদ্ধার করতে পারেন। স্থায়ীভাবে অ্যাক্সেস হারানোর ঝুঁকিটি এড়াতে নিশ্চিত করুন যে এটি ব্যাকআপ করা আছে।", "remove_wallet": "ওয়ালেট মুছুন", "remove_wallet_desc": "আপনি যেন ওয়ালেট সরানোর আগে রিকভারি ফ্রেজটি লিখে রাখেন তা নিশ্চিত করুন। নতুবা, আপনি ওয়ালেটটি পুনরুদ্ধার করতে পারবেন না।", diff --git a/packages/shared/src/locale/json/de.json b/packages/shared/src/locale/json/de.json index d605912f023..990922011b5 100644 --- a/packages/shared/src/locale/json/de.json +++ b/packages/shared/src/locale/json/de.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "Passwörter stimmen nicht überein", "auth.error_passwcode_too_short": "Der Zugangscode muss mindestens {length} Zeichen lang sein", "auth.error_password_empty": "Bitte geben Sie ein Passwort ein", - "auth.error_password_incorrect": "Falsches Passwort", + "auth.error_password_incorrect": "Falscher Passcode", "auth.error_password_not_match": "Passwörter stimmen nicht überein", "auth.error_password_too_short": "Das Passwort muss mindestens {length} Zeichen lang sein", "auth.new_passcode_form_label": "Neuer Zugangscode", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Erstellen Sie ein starkes Passwort", "auth.new_password_same_as_old": "Das neue Passwort muss sich vom alten unterscheiden", "auth.passcode_cooldown": "Versuchen Sie es in {cooldowntime} Minuten erneut", - "auth.passcode_failed_alert": "{count} weitere fehlgeschlagene Versuche werden das Gerät zurücksetzen", + "auth.passcode_failed_alert": "{count} weitere fehlgeschlagene Versuche setzen die App zurück", "auth.passcode_set": "Passcode festgelegt", "auth.password_set": "Passwort festgelegt", "auth.set_passcode": "Passcode festlegen", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Anspruch verfügbar in {number} Tagen", "earn.claim_limitations": "Aufgrund der Einschränkungen von Lido müssen Sie jede Ihrer Einlösungen separat geltend machen.", "earn.claim_rewards": "Belohnungen einfordern", - "earn.claim_rewards_morpho_desc": "Die Belohnungen werden aus allen Morpho-Staking-Positionen berechnet und etwa alle zwei Wochen aktualisiert.", + "earn.claim_rewards_morpho_desc": "Die Belohnungen werden aus allen Morpho-Staking-Positionen berechnet und alle 2 Wochen abgerechnet.", "earn.claim_together_tooltip": "Automatisch auf Ihr Wallet gutgeschrieben nach jeder Asset-Staking- oder Abhebungsanforderung.", "earn.claim_token": "Fordern Sie {token} an", "earn.claim_token_desc": "Fordern Sie Ihren {token} an, nachdem die Auszahlungsanforderung bearbeitet wurde.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Token nicht gefunden? Suche weiter", "remove_account_desc": "Dieses Konto wird entfernt.", "remove_device": "Gerät entfernen", - "remove_device_desc": "Dies wird Ihre Daten dauerhaft löschen. Sie können sie jedoch noch von der Hardware-Wallet wiederherstellen, auf der der Wiederherstellungssatz dieser Wallet geladen ist.", - "remove_hidden_wallet_desc": "Dies wird Ihre Daten dauerhaft löschen. Stellen Sie sicher, dass Sie die Passphrase dieses versteckten Wallets gespeichert haben.", + "remove_device_desc": "Dies wird diese Hardware-Wallet von der OneKey App trennen. Sie können sie jederzeit wieder mit der App verbinden.", + "remove_hidden_wallet_desc": "Diesen versteckten Wallet entfernen? Stellen Sie sicher, dass Sie die Passphrase gespeichert haben.", "remove_private_key_account_desc": "Sie können das Konto nach der Entfernung mit seinem privaten Schlüssel wiederherstellen. Stellen Sie sicher, dass es gesichert ist, um einen dauerhaften Verlust des Zugangs zu vermeiden.", "remove_wallet": "Geldbörse entfernen", "remove_wallet_desc": "Stellen Sie sicher, dass Sie den Wiederherstellungscode aufgeschrieben haben, bevor Sie die Wallet entfernen. Andernfalls können Sie die Wallet nicht wiederherstellen.", diff --git a/packages/shared/src/locale/json/en.json b/packages/shared/src/locale/json/en.json deleted file mode 100644 index 7f542a43321..00000000000 --- a/packages/shared/src/locale/json/en.json +++ /dev/null @@ -1,2306 +0,0 @@ -{ - "Setting.Reset_app_description": "Reset the App on this device after 10 unsuccessful passcode attempts.", - "Toast.web_auth": "Set failed", - "Token_manage.custom_token_address_faild": "Failed to find the contract address. Try agian. ", - "Token_manage.hidden_token": "{num} Hidden token", - "account_model.watched": "Watched", - "action_save": "Save", - "address.verify_address_instruction": "Verify on device to prevent address replacement attacks", - "address_book.button_close": "Close", - "address_book.button_copy": "Copy", - "address_book.button_next": "Next", - "address_book.button_reset": "Reset", - "address_book.confirm_message": "Confirming this operation will reset your address book data. To avoid losing your data entirely, you can copy the data to the clipboard and save it.", - "address_book.confirm_title": "Confirm", - "address_book.data_anomaly": "Data anomaly", - "address_book.data_anomaly_content": "Your address book data may have undergone abnormal changes.", - "address_book.data_anomaly_description": "Your contact data may have undergone abnormal changes. To ensure the security of your assets, we strongly recommend resetting your address book.", - "address_book.data_anomaly_what_do": "What should I do?", - "address_book.data_anomaly_why_reset": "Why do I need to reset my address book?", - "address_book.data_anomaly_why_reset_description": "The best way to ensure security is to reset the address book information and recheck the data security. You can click \"Reset\" to start the reset process.", - "address_book.data_anomaly_why_risk": "Why is my data at risk?", - "address_book.data_anomaly_why_risk_description": "Your data is different from the last confirmation save. OneKey doesn't save your data, but ensures that the data will not be tampered with.", - "address_book.data_anomaly_will_lost": "Will address book data be lost?", - "address_book.data_anomaly_will_lost_description": "After the reset, your address book will be cleared. To avoid data loss, export it by clicking “Copy.” Please handle the exported data with caution.", - "address_book.dialog_subtitle": "Discover how the OneKey address book enhances the security of your contact addresses.", - "address_book.edit_added_on": "Added on", - "address_book.edit_last_edited": "Last edited", - "address_book.empty_add_button": "Add", - "address_book.empty_description": "You haven't added any address yet.", - "address_book.encrypted_storage_description": "OneKey ensures your information security. All your contact data is encrypted and hash-verified with each use to prevent tampering.", - "address_book.encrypted_storage_title": "Encrypted storage", - "address_book.menu_copy": "Copy", - "address_book.menu_edit": "Edit", - "address_book.menu_title": "Menu", - "address_book.no_results_description": "No match found for your search. Please re-enter.", - "address_book.no_results_title": "No Results", - "address_book.search_placeholder": "Search", - "address_book.title": "Address book", - "address_book_add_address.add_to_evm_chains": "Also add to additional EVM-compatible Chains", - "address_book_add_address.address": "Address", - "address_book_add_address.address_exists": "The address already exists.", - "address_book_add_address.address_invalid_error": "Invalid address. Please check and re-enter.", - "address_book_add_address.address_placeholder": "Address or domain", - "address_book_add_address.button_save": "Save", - "address_book_add_address.chain": "Network", - "address_book_add_address.name": "Name", - "address_book_add_address.name_empty_error": "Name cannot be empty.", - "address_book_add_address.name_exists": "The name already exists.", - "address_book_add_address.name_length_erro": "The maximum length is {num} characters.", - "address_book_add_address.name_required": "Required", - "address_book_add_address.title": "Add address", - "address_book_add_address.toast_add_success": "Add successful", - "address_book_add_address.toast_copy_success": "Copied", - "address_book_add_address.toast_delete_success": "Delete successful", - "address_book_add_address.toast_reset_success": "Reset successful", - "address_book_add_address.toast_save_success": "Save successful", - "address_book_edit_address.button_cancel": "Cancel", - "address_book_edit_address.button_confirm": "Confirm", - "address_book_edit_address.delete_contact_message": "Please confirm whether to delete this contact from the address book.", - "address_book_edit_address.delete_contact_title": "Delete Contact", - "address_book_edit_address.title": "Edit Address", - "address_book_select.title": "Select contact", - "address_input.contract_popover": "You are sending to a contract address, not a regular user address. Incorrect transfers to a contract address may result in asset loss. Double-check the address and watch for risks.", - "address_input.first_transfer_popover": "First transfer to this address on {network}. Double-check the address and watch for risks.", - "address_input.transferred_popover": "Previous transfers to this address have been detected. Don’t forget to double-check to ensure it is the intended address.", - "address_label.allowlist": "Allowlist", - "address_type": "Address type", - "adress_book.add_address_add_to_allowlist": "Add to allowlist", - "allowlist.enabled_popover_content": "You can only transfer funds to accounts within the wallet or to allowlisted addresses in the address book. If you understand the risks, you can disable it in https://1key.so/send/protectionSettings >> Protection", - "allowlist.enabled_popover_title": "Allowlist enabled", - "approve_edit.approve_amount": "Approve amount", - "approve_edit.less_than_swap": "Allowance can't be less than the swap amount", - "approve_edit.title": "Edit allowance", - "approve_edit.unlimited_amount": "Unlimited amount", - "auth.Numeric_Passcode": "6-Digit numeric passcode", - "auth.Passcode_protection": "Enable passcode protection?", - "auth.Passcode_protection_description": "Enable passcode protection: after 10 failed passcode attempts, the App will reset. You can change it anytime in Settings.", - "auth.alphanumeric_passcode ": "Alphanumeric passcode", - "auth.biometric_cancel": "User canceled {biometric} authentication", - "auth.biometric_failed": "Passcode required to enable {biometric}", - "auth.confirm_passcode_form_label": "Confirm passcode", - "auth.confirm_passcode_form_placeholder": "Re-enter your passcode", - "auth.confirm_password_form_label": "Confirm password", - "auth.confirm_password_form_placeholder": "Re-enter your password", - "auth.enter_your_passcode": "Enter your passcode", - "auth.enter_your_password": "Enter your password", - "auth.erro_passcode_too_long": "Passcode cannot exceed {length} characters", - "auth.erro_password_too_long": "Password cannot exceed {length} characters", - "auth.error_passcode_empty ": "Please enter a passcode", - "auth.error_passcode_incorrect": "Incorrect passcode", - "auth.error_passcode_not_match": "Passcodes do not match", - "auth.error_passwcode_too_short": "Passcode must be at least {length} characters", - "auth.error_password_empty": "Please enter a password", - "auth.error_password_incorrect": "Incorrect password", - "auth.error_password_not_match": "Passwords do not match", - "auth.error_password_too_short": "Password must be at least {length} characters", - "auth.new_passcode_form_label": "New passcode", - "auth.new_passcode_same_as_old": "New passcode must differ from the old one", - "auth.new_passwcode_form_placeholder": "Create a robust password", - "auth.new_password_form_label": "New password", - "auth.new_password_form_placeholder": "Create a strong password", - "auth.new_password_same_as_old": "New password must differ from the old one", - "auth.passcode_cooldown": "Try again in {cooldowntime} minutes", - "auth.passcode_failed_alert": "{count} more failed attempts will reset the device", - "auth.passcode_set": "Passcode set", - "auth.password_set": "Password set", - "auth.set_passcode": "Set passcode", - "auth.set_password": "Set password", - "auth.with_biometric": "Authentication with {biometric}", - "backup.address_book_labels": "Address book & labels", - "backup.all_devices": "All devices", - "backup.backup_deleted": "Backup deleted", - "backup.backup_imported": "Backup imported", - "backup.backup_now": "Backup now", - "backup.backup_to_google_drive": "Backup to Google Drive", - "backup.backup_to_icloud": "Backup to iCloud", - "backup.data_already_present": "All the data in this backup is already present on the current device.", - "backup.delete_this_backup": "Delete this backup?", - "backup.enable_feature_download_google_drive": "To enable this feature, please download Google Drive, log in, and ensure that OneKey has the necessary permissions.", - "backup.encrypted_backup_contents": "Encrypted backup contents", - "backup.file_permanently_deleted": "This file will be permanently deleted from iCloud. Make sure you have written down the recovery phrases as you won’t be able to restore the wallets otherwise.", - "backup.file_permanently_deleted_android": "This file will be permanently deleted from Google Drive. Make sure you have written down the recovery phrases as you won’t be able to restore the wallets otherwise.", - "backup.go_system_settings": "Go system settings", - "backup.google_drive_auto_backup_paused": "Google Drive auto-backup paused", - "backup.google_drive_securely_syncs_data": "Google Drive securely syncs your data across devices (excluding hardware wallets). Please authorize OneKey to access your Google Drive. Neither OneKey nor Google can access your wallets.", - "backup.google_drive_status": "Google Drive status", - "backup.icloud_auto_backup_paused": "iCloud auto-backup paused", - "backup.icloud_backup_securely_syncs_your_data": "iCloud backup securely syncs your data across devices (excluding hardware wallets), ensuring that both OneKey and Apple cannot access your wallets.", - "backup.icloud_status": "iCloud Status", - "backup.import_data": "Import data", - "backup.import_from_google_drive": "Import from Google Drive", - "backup.import_from_icloud": "Import from iCloud", - "backup.no_available_google_drive_backups_to_import": "You have no available Google Drive backups to import.", - "backup.no_available_icloud_backups_to_import": "You have no available iCloud backups to import.", - "backup.no_content_available_for_backup": "No content available for backup.", - "backup.no_data": "No Data", - "backup.number_wallets_number_accounts": "{number0} Wallets · {number1} Accounts", - "backup.off_device": "Off-device ({number})", - "backup.on_device": "On-device", - "backup.onekey_doesnt_back_up_hardware_wallets": "OneKey doesn't back up hardware wallets, please record and safeguard your recovery phrase.", - "backup.only_accounts_with_addresses_will_be_backed_up": "For the app wallet, only accounts with addresses will be backed up.", - "backup.please_log_in_to_your_apple_account_and_activate_icloud_drive": "Please log in to your Apple account and activate the iCloud Drive feature before proceeding.", - "backup.please_upgrade_app_to_import_data": "Please upgrade your app to import the data from a newer version.", - "backup.recovery_phrase_backed_up": "Recovery phrase backed up", - "backup.securely_store_recent_backups": "We'll securely store your most recent 30 daily backups plus the last monthly backup for each of the past 24 months, ready for restoration at any time.", - "backup.turn_off": "Turn off", - "backup.turn_on": "Turn on", - "backup.updated_time": "Updated: {time}", - "backup.upgrade_required": "Upgrade required", - "backup.verify_app_passcode_to_import_data": "Verify the App passcode during backup to import data.", - "backup.verify_app_password_to_import_data": "Verify the App password at the time of backup to Import data.", - "backup.verify_apple_account_and_icloud_drive_enabled": "Please verify your Apple account login and ensure iCloud Drive is enabled and authorized for OneKey.", - "backup.verify_google_account_and_google_drive_enabled": "Please verify your Google account login and ensure Google Drive is enabled and authorized for OneKey.", - "balance_detail.button_acknowledge": "Acknowledge", - "balance_detail.button_balance": "Balance Details", - "balance_detail.button_cancel": "Cancel", - "balance_detail.button_confirm": "Confirm", - "balance_detail.button_done": "Done", - "balance_detail.disable_protection_warning_description": "Disabling inscription protection may result in the accidental transfer of inscription tokens or NFTs. To migrate your inscription assets safely, please use an inscription-compatible wallet such as Unisat or OKX.", - "balance_detail.disable_protection_warning_title": "Disabling inscription protection may lead to loss of inscription assets", - "balance_detail.enable_protection_title": "Enabling Inscription Protection", - "balance_detail.enable_protection_warning": "Inscription assets (Ordinals NFT and BRC-20 tokens) are currently not supported.
To view the details of the protection, check \"Balance Details\".
\nTo migrate your inscription assets safely, please use an inscription-compatible wallet such as Unisat or OKX.", - "balance_detail.frozen": "Frozen", - "balance_detail.frozen_by_inscription": "Inscription Protection", - "balance_detail.how_to_migrate": "How to Migrate Ordinals NFT / BRC-20 Tokens?", - "balance_detail.spendable": "Spendable", - "balance_detail.total": "Total", - "balance_detail.what_is_frozen_balance": "What is Frozen Balance?", - "bandwidth_consumed": "Bandwidth consumed", - "bandwidth_energy.bandwidth": "Bandwidth", - "bandwidth_energy.description": "You can obtain free resources for covering transaction fees by staking TRX on the network. The resources used will dynamically recover to their original amount after a certain period.", - "bandwidth_energy.energy": "Energy", - "bandwidth_energy.get_resources": "Get Resources", - "bandwidth_energy.rent_energy": "Rent Energy", - "bandwidth_energy.title": "Bandwidth & Energy", - "bandwidth_energy.what_is_bandwidth_energy": "What is Bandwidth & Energy on Tron?", - "bip44__standard": "BIP44 standard", - "browser.bookmark": "Bookmark", - "browser.can_be_re_enabled_in_settings": "Can be turned back on in settings.", - "browser.copy_link": "Copy link", - "browser.dapp_listed_by": "dApp listed by", - "browser.disable": "Global Disable", - "browser.fetching_dapp_info": "Fetching dApp info...", - "browser.hide_on_this_site": "Hide on this site", - "browser.import": "Import", - "browser.invalid_url": "Invalid URL", - "browser.last_verified_at": "Last verified at", - "browser.risk_detection": "Risk detection", - "browser.search_dapp_or_enter_url": "Search dApps or enter URL", - "browser.switch_to_account": "Switch to {account}?", - "clear_build_in_networks_data": "Build-in networks", - "coming_soon": "Coming soon", - "coming_soon_desc": "We're currently developing this feature and will make it available soon.", - "confirm_exit_dialog_desc": "Are you sure you want to exit the data migration process?", - "confirm_exit_dialog_title": "Confirm exit", - "contact_us_instruction": "Need more help?", - "content__amount": "Amount", - "content__custom": "Custom", - "content__fast": "Fast", - "content__from": "From", - "content__gas_limit": "Gas Limit", - "content__gas_price": "Gas Price ({network})", - "content__normal": "Normal", - "content__slow": "Slow", - "content__to": "To", - "copy_address_modal_item_create_address_instruction": "Create address", - "copy_address_modal_title": "Account address", - "copy_anyway": "Copy anyway", - "copy_recovery_phrases_warning_desc": "Clipboard access can expose your recovery phrase to unauthorized apps.", - "copy_recovery_phrases_warning_title": "Copy recovery phrase?", - "count_assets": "{count} assets", - "count_hidden_assets": "{count} hidden assets", - "count_words": "{length} words", - "create_qr_based_hidden_wallet_dialog_title": "Create QR-based hidden wallet", - "create_qr_bassed_hidden_wallet_create_hidden_wallet_desc": "After the standard wallet is created, enter a passphrase to make a hidden wallet.", - "create_qr_bassed_hidden_wallet_create_hidden_wallet_title": "Create hidden wallet", - "create_qr_bassed_hidden_wallet_create_standard_wallet_desc": "No passphrase is needed before displaying the QR code. Tap the ✅ button, show the code, and scan it with the app to create a QR-based standard wallet.", - "create_qr_bassed_hidden_wallet_create_standard_wallet_title": "Create standard wallet", - "custom_network.add_custom_network_failed_toast_text": "Add custom network failed; please try again.", - "custom_network.add_custom_network_successfully_toast_text": "Add custom network successfully", - "custom_network.add_network_action_text": "Add custom network", - "custom_network.form_alert_text": "Untrusted networks can fake blockchain and track you. Use only trusted ones.", - "custom_network.network_exists_feedback_text": "Network already exists", - "custom_network.remove_network_dialog_description": "You will have to add it back to access your assets on this network.", - "custom_network.remove_network_dialog_title": "Remove this network?", - "custom_rpc_cta_label": "Add custom RPC", - "custom_rpc_desc": "The custom RPC will replace OneKey’s node. To revert, disable or delete the custom RPC. If not necessary, use OneKey's nodes for optimal service.", - "custom_rpc_edit_dialog_title": "Custom {network} RPC", - "custom_rpc_empty_title": "No custom RPC", - "custom_rpc_title": "Custom RPC", - "dapp_connect.allow_this_site_to_access": "Allow this site to access your {chain} address.", - "dapp_connect.allow_to_access_your_chain_auth": "Allow this site to access your {chain} auth.", - "dapp_connect.allow_to_access_your_chain_decrypted_message": "Allow to access your {chain} decrypted message", - "dapp_connect.allow_to_access_your_chain_encrypted_message": "Allow to access your {chain} encrypted message", - "dapp_connect.allow_to_access_your_chain_link": "Allow this site to access your {chain} link.", - "dapp_connect.allow_to_access_your_chain_login": "Allow this site to access your {chain} login.", - "dapp_connect.allow_to_access_your_chain_message_signature": "Allow to access your {chain} message signature.", - "dapp_connect.allow_to_access_your_chain_public_key": "Allow to access your {chain} public key.", - "dapp_connect.allow_to_access_your_chain_register": "Allow this site to access your {chain} register.", - "dapp_connect.amount": "Amount", - "dapp_connect.amount_should_be_at_least": "Amount should be at least {0}.", - "dapp_connect.amount_should_not_exceed": "Amount should not exceed {0}.", - "dapp_connect.attackers_disguise_sites_warning": "Attackers may disguise malicious sites as well-known Web3 sites by replacing with unusual characters. Check URL again before approving any requests.", - "dapp_connect.authorization_successful": "Authorization Successful", - "dapp_connect.confirm": "Confirm", - "dapp_connect.connect_to_website": "Connected to {url}", - "dapp_connect.connection_request": "Connection Request", - "dapp_connect.create": "Create", - "dapp_connect.create_invoice_request": "Create Invoice Request", - "dapp_connect.decrypted_request": "Decrypted request", - "dapp_connect.description_optional": "Description (Optional)", - "dapp_connect.detected_malicious_behavior_warning": "Detected malicious behavior on this site by multiple credible sources, it is strongly recommended to reject any request by this site.", - "dapp_connect.do_not_ask_again": "Don’t ask again.", - "dapp_connect.encrypted_request": "Encrypted request", - "dapp_connect.enter_amount": "Enter amount", - "dapp_connect.export": "Export", - "dapp_connect.export_public_key": "Export Public Key", - "dapp_connect.hardware_wallets_do_not_support_solana_message_signing": "Hardware wallets do not support Solana message signing.", - "dapp_connect.hide_full_message": "Hide raw message", - "dapp_connect.http_connection_not_secure": "Insecure HTTP", - "dapp_connect.initiate_message_signature_request": "Initiate message signature request", - "dapp_connect.invoice_created": "Invoice created.", - "dapp_connect.invoice_description": "Invoice description", - "dapp_connect.invoice_payment_request": "Invoice Payment Request", - "dapp_connect.link_successful": "Link Successful", - "dapp_connect.lnurl_approve_request": "LNURL Approve Request", - "dapp_connect.lnurl_connect_request": "LNURL Connect Request", - "dapp_connect.lnurl_login_request": "LNURL Login Request", - "dapp_connect.lnurl_pay_request": "LNURL Pay Request", - "dapp_connect.lnurl_register_request": "LNURL Register Request", - "dapp_connect.lnurl_withdraw_request": "LNURL Withdraw Request", - "dapp_connect.login_successful": "Login Successful", - "dapp_connect.malicious_site_detected": "Marked as malicious by multiple sources.", - "dapp_connect.malicious_site_warning": "Malicious site", - "dapp_connect.message": "Message", - "dapp_connect.message_to_the_payer": "A message to the payer", - "dapp_connect.msg_authentication_failed_verify_again": "Authentication failed, please verify again.", - "dapp_connect.msg_description_can_be_up_to_int_characters": "Description can be up to {number} characters.", - "dapp_connect.msg_invalid_lightning_payment_request": "Invalid lightning payment request.", - "dapp_connect.msg_no_content": "No content.", - "dapp_connect.nostr_event_kind_0": "Metadata", - "dapp_connect.nostr_event_kind_1": "Short Text Note", - "dapp_connect.nostr_event_kind_10002": "Relay List Metadata", - "dapp_connect.nostr_event_kind_1984": "Reporting", - "dapp_connect.nostr_event_kind_2": "Recommend Relay", - "dapp_connect.nostr_event_kind_22242": "Client Authentication", - "dapp_connect.nostr_event_kind_24133": "Nostr Connect", - "dapp_connect.nostr_event_kind_3": "Follows", - "dapp_connect.nostr_event_kind_30008": "Profile Badges", - "dapp_connect.nostr_event_kind_30009": "Badge Definition", - "dapp_connect.nostr_event_kind_30023": "Long-form Content", - "dapp_connect.nostr_event_kind_30078": "Application-specific Data", - "dapp_connect.nostr_event_kind_4": "Encrypted Direct Messages", - "dapp_connect.nostr_event_kind_40": "Channel Creation", - "dapp_connect.nostr_event_kind_41": "Channel Metadata", - "dapp_connect.nostr_event_kind_42": "Channel Message", - "dapp_connect.nostr_event_kind_43": "Channel Hide Message", - "dapp_connect.nostr_event_kind_44": "Channel Mute User", - "dapp_connect.nostr_event_kind_5": "Event Deletion", - "dapp_connect.nostr_event_kind_7": "Reaction", - "dapp_connect.nostr_event_kind_8": "Badge Award", - "dapp_connect.nostr_event_kind_9734": "Zap Request", - "dapp_connect.nostr_event_kind_9735": "Zap", - "dapp_connect.nostr_event_kind_unknown": "Nostr {kind} event", - "dapp_connect.nostr_plaintext": "Plaintext", - "dapp_connect.order_alert": "You are using order authorization, ensure the dApp is trustworthy to avoid asset loss.", - "dapp_connect.pay_to_node": "Pay to Lightning Node", - "dapp_connect.permit_sign_alert": "You’re using {type} authorization, ensure the dApp is trustworthy to avoid asset loss.", - "dapp_connect.proceed_at_my_own_risk": "Proceed at my own risk", - "dapp_connect.registration_successful": "Registration Successful", - "dapp_connect.request_for_lnurl_linking_key": "Request for LNURL linking key", - "dapp_connect.request_invoices_and_lightning_information": "Request invoices and lightning information", - "dapp_connect.requested_permissions": "Requested permissions", - "dapp_connect.retrieve_your_encryption_public_key": "Retrieve your encryption public key", - "dapp_connect.risk_sign": "This type of signature request can sometimes be used for malicious purposes. Only sign it if you fully trust the website.", - "dapp_connect.sats_between": "between {min} and {max} sats", - "dapp_connect.send_approval_requests": "Send approval requests", - "dapp_connect.signature_request": "Signature request", - "dapp_connect.site_not_using_private_connection_warning": "The site does not use a private connection, attackers may be able to view and change the information you send and get through this site.", - "dapp_connect.site_suspected_of_malicious_behavior_warning": "This site is suspected of malicious behavior, continuing to approve requests may pose security risks.", - "dapp_connect.suspected_malicious_behavior": "Suspected malicious behavior", - "dapp_connect.suspected_malicious_behavior_on_this_site": "Suspected malicious behavior", - "dapp_connect.the_sites_connection_is_not_secure": "The site's connection is not secure.", - "dapp_connect.url_contains_unusual_characters": "Suspicious URL", - "dapp_connect.url_contains_unusual_characters_warning": "URL contains unusual characters.", - "dapp_connect.verified_site": "Verified", - "dapp_connect.verified_site_warning": "Verified site.", - "dapp_connect.verified_web3_site_warning": "Verified Web3 site by multiple credible sources, can be used with confidence.", - "dapp_connect.view_decrypted_message": "View decrypted message", - "dapp_connect.view_encrypted_message": "View encrypted message", - "dapp_connect.view_full_message": "View raw message", - "dapp_connect.view_your_balance_and_activity": "View your balance and activity", - "dapp_connect.watch_your_account_balance_and_activity": "Watch your account balance and activity", - "dapp_connect.withdraw_request_sent": "Withdraw Request Sent", - "date.today": "Today", - "date.yesterday": "Yesterday", - "derivation_path": "Derivation path", - "description_403": "Our services are not available in your region.", - "device_auth.certificate": "Certificate", - "device_auth.continue_anyway_warning_message": "We're currently unable to verify your device. Continuing may pose security risks.", - "device_auth.request_desc": "Confirm on your device to verify its authenticity and secure your connection.", - "device_auth.request_title": "Device authentication", - "device_auth.successful_desc": "Your device is now officially verified! You're all set to enjoy a secure and seamless experience.", - "device_auth.successful_title": "Verification successful", - "device_auth.temporarily_unavailable": "Verification temporarily unavailable", - "device_auth.temporarily_unavailable_help_text": "Currently, we're unable to verify your device due to server issues. Please try again later.", - "device_auth.unofficial_device_detected": "Unofficial device detected", - "device_auth.unofficial_device_detected_help_text": "Your device could not be verified as official. Please contact us immediately.", - "device_auth.verifying_component_label": "In progress", - "device_auth.verifying_desc": "Please wait...", - "device_auth.verifying_title": "Verifying device", - "dont_have_mobile_app_yet": "Don’t have the mobile App yet?", - "downgrade_warning_checkbox_label": "I will NOT downgrade to OneKey v4", - "downgrade_warning_description": "Do NOT downgrade to OneKey v4. Downgrading will lead to irreversible data loss.", - "downgrade_warning_title": "Important: Do not downgrade", - "earn.24h_earnings": "24h earnings", - "earn.24h_earnings_tooltip": "Estimated 24 hours earnings based on your activated amount.", - "earn.active": "Active", - "earn.annually": "Annually", - "earn.approaching_staking_cap": "As we’re approaching the staking cap, please check your staking results. You’ll need to restake if marked as overflow.", - "earn.auto_risk_control": "Auto risk control", - "earn.auto_risk_control_desc_1": "In extreme situations, such as a protocol hack or a price depeg, the vault managers will proactively withdraw investments from the pool.", - "earn.auto_risk_control_desc_2": "The funds will remain in the vault’s idle portion for your withdrawal, prioritizing principal safety.", - "earn.auto_risk_control_desc_3": "When risk control is triggered, idle funds in the pool increase, leading to lower yields.", - "earn.auto_risk_control_disclaimer": "“Auto Risk Control” provide an additional layer of protection for your investment. The timeliness and accuracy of these features rely on third-party support. We will make every effort to ensure normal operation, but there may be technical or operational constraints in certain situations. Therefore, we assume no legal responsibility if “Auto Risk Control” does not function as intended.", - "earn.auto_risk_control_subtitle": "Protecting your funds in extreme situations", - "earn.automatically": "automatically", - "earn.available_assets": "All assets", - "earn.available_assets_desc": "Increase your holdings by staking assets.", - "earn.banner_stake_in_babylon_ecosystem": "Stake Your BTC with Babylon", - "earn.check_staking_results_overflow": "Check your staking results. If marked as overflow, need to be withdrawn and claimed", - "earn.claim": "Claim", - "earn.claim_assets_after_processing": "Claim your assets once the processing is complete", - "earn.claim_available_in_number_days": "Claim available in {number} days", - "earn.claim_limitations": "Due to the limitations of Lido, you must claim each of your withdrawals separately.", - "earn.claim_rewards": "Claim rewards", - "earn.claim_rewards_morpho_desc": "Rewards are calculated from all Morpho staking positions and are updated about every 2 weeks.", - "earn.claim_together_tooltip": "Automatically claimed to your wallet after each asset staking or withdrawal request.", - "earn.claim_token": "Claim {token}", - "earn.claim_token_desc": "Claim your {token} after the withdrawal request has been processed.", - "earn.claimable": "Claimable", - "earn.claimable_in_future": "{value} {symbol} ({fiatValue}) claimable in future", - "earn.claimed": "Claimed", - "earn.commission": "Commission", - "earn.commission_tooltip": "A specific percentage of your rewards or points is deducted as a commission for the provider.", - "earn.confirmed_cap": "Confirmed cap", - "earn.currently_staking": "Currently staking", - "earn.daily": "Daily", - "earn.disclaimer": "Disclaimer", - "earn.early_withdraw_stake_unstaking_period": "Early withdraw your stake anytime with a unstaking period of {number} days", - "earn.earn_during_unstaking_tooltip": "Assets will continue to earn rewards during the unstaking period after withdrawal.", - "earn.earn_points": "Earn points", - "earn.earn_points_desc": "OneKey partners with Babylon, enabling you to stake and complete Babylon’s tasks to earn points.", - "earn.earn_symbol": "Earn {symbol}", - "earn.earn_up_to_number_per_year": "Earn up to {number} per year", - "earn.earn_up_to_number_per_year_desc": "The APR is updated hourly and adjusted according to changes in TVL.", - "earn.earnings_start": "Earnings start", - "earn.est_annual_rewards": "Est. annual rewards", - "earn.est_receive": "Est. receive", - "earn.feature_1_desc": "Stake your assets and earn passive returns effortlessly", - "earn.feature_1_title": "Activate idle assets", - "earn.feature_2_desc": "Secure staking with the freedom to withdraw anytime", - "earn.feature_2_title": "Enjoy flexible staking", - "earn.feature_3_desc": "Boost your earnings with optimized staking at peak profitability", - "earn.feature_3_title": "Maximize your rewards", - "earn.feature_list_title": "Watch your holdings grow", - "earn.finality_provider": "Finality provider", - "earn.how_does_the_lido_protocol_work": "How does the Lido protocol work?", - "earn.how_does_the_lido_protocol_work_desc": "Lido provides an innovative solution to the hurdles presented by traditional PoS staking by effectively lowering barriers to entry and the costs associated with locking up one's assets in a single protocol. When a user deposits their assets to Lido, the tokens are staked on the Lido blockchain via the protocol.", - "earn.in_number": "In {number}", - "earn.insufficient_balance": "Insufficient balance", - "earn.insufficient_claimable_balance": "Insufficient claimable balance.", - "earn.insufficient_staked_balance": "Insufficient staked balance", - "earn.investment_details": "Investment details", - "earn.last_day": "Last day", - "earn.last_month": "Last month", - "earn.last_week": "Last week", - "earn.lending": "Lending", - "earn.less_than_number_days": "< {number} days", - "earn.lido_token_redemption": "Lido {token} redemption", - "earn.lido_token_staking": "Lido {token} staking", - "earn.liquid_staking": "Liquid staking", - "earn.manually": "manually", - "earn.maximum_staking_alert": "The maximum staking amount is {number} {symbol}.", - "earn.min_max_staking": "Min./Max. staking", - "earn.min_staking": "Min. staking", - "earn.min_total_staking": "Min. total staking", - "earn.minimum_amount": "The minimum amount is {number}.", - "earn.minimum_claim_tooltip": "The minimum reward claim is {number} {symbol}, but rewards will be claimed to your wallet with each staking or withdrawal request, without limits.", - "earn.minimum_staking_alert": "The minimum staking amount is {number} {symbol}.", - "earn.minimum_total_staking_alert": "The minimum total staking amount must be above {number} {symbol}.", - "earn.minimum_withdrawal_alert": "The minimum withdrawal amount is {number} {symbol}.", - "earn.missing_rewards": "Missing rewards", - "earn.missing_rewards_tooltip": "Estimated yearly rewards you could earn if your assets were staked, based on the current value.", - "earn.monthly": "Monthly", - "earn.native_apy": "Native APY", - "earn.native_staking": "Native staking", - "earn.no_orders": "No orders", - "earn.no_orders_desc": "You haven’t staked any assets yet.", - "earn.not_enough_token": "Not enough {token}?", - "earn.number_day": "{number} day", - "earn.number_days": "{number} day(s)", - "earn.number_days_left": "{number} days left", - "earn.number_days_number_block": "{number_days} days ({number} block)", - "earn.number_hours": "{number} hours", - "earn.number_minutes": "{number} minutes", - "earn.number_seconds": "{number} seconds", - "earn.number_symbol_left": "{number} {symbol} left", - "earn.overflow": "Overflow", - "earn.overflow_alert": "Overflow stake should be withdrawn and claimed.", - "earn.overflow_number_alert": "{number} BTC is in overflow and should be withdrawn and claimed.", - "earn.pay_with": "Pay with", - "earn.pending_activation": "Pending activation", - "earn.pending_activation_tooltip": "New staking needs to wait around {number} before becoming active and starting to earn rewards.", - "earn.pending_activation_tooltip_eth": "Your staked ETH becomes active once the validator reaches the 32 ETH requirement.", - "earn.pending_transactions_data_out_of_sync": "Data may take time to sync after the successful transaction.", - "earn.portfolio": "Portfolio", - "earn.portfolio_details": "Portfolio details", - "earn.protection": "Protection", - "earn.protocol_rewards": "Protocol rewards", - "earn.provider_asset_staking": "{provider} {asset} staking", - "earn.provider_asset_withdrawal": "{provider} {asset} withdrawal", - "earn.provider_staked": "Provider staked", - "earn.reaching_staking_cap": "Staking is temporarily unavailable due to hitting the cap or passing the deadline.", - "earn.receive": "Receive", - "earn.receive_lido_nft": "Receive Lido NFT", - "earn.receive_lido_nft_desc": "Each withdrawal request generates a Lido NFT, and its appearance changes when your {token} becomes available for withdrawal.", - "earn.receive_steth_desc": "When you stake ETH you receive 1:1 stETH. You can unstake and trade this liquid asset at any time.", - "earn.receive_stmatic_desc": "When you stake MATIC you receive stMATIC. You can unstake and trade this liquid asset at any time.", - "earn.receive_token": "Receive {token}", - "earn.receive_token_trade_anytime": "Receive {token} and trade it at any time", - "earn.recommended": "Recommended", - "earn.redeem": "Redeem", - "earn.request_withdrawal": "Request withdrawal", - "earn.request_withdrawal_steth_desc": "Lock your stETH/wstETH by issuing a withdrawal request. After 1-4 days, the locked stETH will be destroyed and your ETH will become available for withdrawal.", - "earn.request_withdrawal_stmatic_desc": "1-4 days after issuing a withdrawal request, the locked stMATIC will be destroyed and your MATIC will become available for withdrawal.", - "earn.reward_tokens": "Reward tokens", - "earn.reward_value": "Reward value", - "earn.rewards": "Rewards", - "earn.rewards_automatically_restaked": "Rewards are {automatically} restaked, increasing your staked body", - "earn.rewards_dynamic_real_time": "Rewards are dynamic and update in real time based on market supply and demand", - "earn.rewards_manually_restaked": "Rewards need to be {manually} withdrawn and restaked", - "earn.rewards_percentage": "Rewards (%)", - "earn.rewards_updated_around_time": "Rewards updated around {time}", - "earn.rewards_updated_daily": "Rewards updated {daily}", - "earn.rewards_updated_daily_steth_desc": "There’ll be a daily update on your stETH balances, which includes the staking rewards.", - "earn.rewards_updated_daily_stmatic_desc": "During the staking period, the value of stMATIC changes to reflect earnings.", - "earn.select_a_claimable_order": "Select a claimable order", - "earn.select_an_order_to_withdraw": "Select an order to withdraw", - "earn.select_for_early_withdrawal": "Select for early withdrawal", - "earn.select_for_early_withdrawal_desc": "Unstake your assets before their expiration", - "earn.stake": "Stake", - "earn.stake_and_earn": "Stake and earn", - "earn.stake_in_babylon_ecosystem": "Stake in Babylon ecosystem", - "earn.stake_release_period": "Stake release period", - "earn.stake_release_period_desc": "After issuing a withdrawal request, you'll get an NFT certificate to claim funds. It'll take about 1-4 days before you can claim.", - "earn.stake_through_onekey_earn_points": "Stake through OneKey and earn the same points as on the official website", - "earn.stake_token": "Stake {token}", - "earn.staked": "Staked", - "earn.staked_assets_available_after_period": "After the above time period, then your staked assets will be available to claim.", - "earn.staked_value": "Staked value", - "earn.staking_cap": "Staking cap", - "earn.staking_methods": "Staking methods", - "earn.symbol_staking_provider": "{symbol} staking provider", - "earn.term": "Term", - "earn.term_tooltip": "BTC can be claimed at the end of the staking term.", - "earn.token_available_to_stake": "{token} available to stake", - "earn.token_is_claimable": "{token} is claimable", - "earn.token_is_pending": "{token} is pending", - "earn.token_is_staked": "{token} is staked", - "earn.total_apy": "Total APY", - "earn.total_staked_value": "Total staked value", - "earn.transaction_loss": "Transaction loss", - "earn.transaction_loss_when_claim": "Due to the est network fee exceeding your rewards, this transaction will result in a loss of {number}.", - "earn.transaction_loss_when_stake": "Based on the current estimated rate, it will take about {number} days for your earnings to cover the losses.", - "earn.tvl": "TVL", - "earn.unlock_time": "Unlock time", - "earn.unstake_all_due_to_min_withdrawal": "Due to the minimum withdrawal amount of {number} {symbol}, this transaction will unstake all assets to avoid insufficient funds for the next withdrawal.", - "earn.unstaking_period": "Unstaking period", - "earn.unstaking_period_tooltip": "The estimated period from requesting withdrawal to when tokens can be claimed.", - "earn.unsupported_path_desc": "Switch the derivation path to Taproot", - "earn.unsupported_path_title": "This stake doesn’t support {path}", - "earn.unsupported_token": "Unsupported token", - "earn.unsupported_token_desc": "This token is not currently supported for Buy service.", - "earn.until_next_launch": "Until next launch", - "earn.until_next_launch_tooltip": "A minimum of 32 ETH is required for a pool to begin producing rewards for users.", - "earn.up_to_number_days": "Up to {number} days", - "earn.up_to_number_in_annual_rewards": "Up to {number} in annual rewards", - "earn.update_frequency": "Update frequency", - "earn.updated_daily": "Updated daily", - "earn.validator": "Validator", - "earn.wallet_not_support_stake": "The connected wallet do not support stake. Try switch to another one.", - "earn.weekly": "Weekly", - "earn.what_is_lending": "What is lending?", - "earn.what_is_lending_desc": "Lending lets you earn passive income by supplying assets to a lending protocol’s liquidity pool. Borrowers pay interest on borrowed funds, and you receive a portion as interest, growing your holdings over time.", - "earn.what_is_liquid_staking": "What is liquid staking?", - "earn.what_is_liquid_staking_desc": "Liquid staking lets you earn rewards while keeping your tokens liquid. You can trade or lend them, giving you more flexibility to explore other DeFi opportunities for higher returns.", - "earn.what_is_native_staking": "What is native staking?", - "earn.what_is_native_staking_desc": "Native staking allows you to earn passive income by locking your tokens to secure a Proof-of-Stake blockchain. In return, you receive rewards in the same tokens, offering a low-risk way to grow your assets.", - "earn.what_is_the_possible_risk_of_lido": "What is the possible risk of Lido?", - "earn.what_is_the_possible_risk_of_lido_desc": "There is a certain risk in using Lido for staking, such as network or validator failures that may result in the loss of staked assets (penalties), or Lido smart contract vulnerabilities or errors. Although the code has been open-sourced, audited and widely covered, any cryptocurrency investment carries risks and needs to be evaluated independently.", - "earn.why_do_you_receive_steth": "Why do you receive stETH?", - "earn.why_do_you_receive_steth_desc": "When you deposit ETH into Lido, you receive Lido's liquid staking token, stETH, which represents your proportional claim to ETH in Lido. As validators operating on Lido receive rewards, you are eligible to receive rewards proportional to your stake, which is typically expected to occur daily.", - "earn.why_do_you_receive_stmatic": "Why do you receive stMATIC?", - "earn.why_do_you_receive_stmatic_desc": "When you deposit MATIC into Lido, you receive Lido's liquid staking token, stMATIC, which represents your proportional claim to MATIC in Lido. As validators operating on Lido receive rewards, you are eligible to receive rewards proportional to your stake, which is typically expected to occur daily.", - "earn.withdraw_token": "Withdraw {token}", - "earn.withdrawal_process_desc": "The withdrawal process is simple and will be divided into the following steps:", - "earn.withdrawal_processed_immediately": "Withdrawal will be processed immediately, and your staked assets will be returned right away.", - "earn.withdrawal_requested": "Withdrawal requested", - "earn.withdrawal_take_up_to_number_days": "Take {number} days after issuing a withdrawal request", - "earn.withdrawal_up_to_number_days": "Withdrawal can take up to {number} days, and then your staked assets will be available", - "earn.withdrawn": "Withdrawn", - "energy_consumed": "Energy consumed", - "enter_passcode": "Enter passcode", - "enter_password": "Enter password", - "enter_pin.desc": "Check device screen for keypad layout.", - "enter_pin.enter_on_device": "Enter PIN on device", - "enter_pin.invalid_pin": "Invalid PIN code", - "enter_pin.title": "Enter PIN code", - "enter_pin_on_app": "Enter PIN on app", - "explore.add_bookmark": "Add Bookmark", - "explore.add_to_whitelist": "add to whitelist", - "explore.addresses_count": "{number} addresses", - "explore.all_chains": "All Chains", - "explore.back_to_home": "Back to Home", - "explore.badge_airdrop": "Airdrop", - "explore.badge_hot": "Hot", - "explore.badge_new": "New", - "explore.bookmark_at_least": "Bookmark must be at least 1 characters", - "explore.bookmark_exceed": "Bookmark cannot exceed 24 characters", - "explore.bookmark_renamed": "Bookmark Renamed", - "explore.bookmarks": "Bookmarks", - "explore.camera_permission": "Camera: For taking photos or video calls.", - "explore.cancel_default": "Cancel the default on this dApp", - "explore.categories": "Categories", - "explore.category_exchanges": "Exchanges", - "explore.category_games": "Games", - "explore.category_marketplaces": "Marketplaces", - "explore.category_new": "New", - "explore.clear_history_message": "Are you sure you want to clear your browser history?", - "explore.clear_history_prompt": "Clear history?", - "explore.close_all": "Close all", - "explore.close_pin_tab": "Close Pin Tab", - "explore.close_tab": "Close Tab", - "explore.connected_accounts": "Connected Accounts", - "explore.connection_is_not_private": "Connection is not private", - "explore.connection_is_not_private_warning": "Only supports HTTPS protocol, unsafe website is vulnerable to attacks and forgerly.", - "explore.dapp_connections": "dApp connections", - "explore.date_format_short": "{month_abbr} {day} {year}", - "explore.date_today": "Today", - "explore.date_yesterday": "Yesterday", - "explore.default_wallet_canceled": "OneKey Default Canceled", - "explore.default_wallet_canceled_desc": "Refresh the page to retry with a different wallet.", - "explore.default_wallet_set": "OneKey is your default wallet now.", - "explore.default_wallet_settings": "Default Wallet Settings", - "explore.disconnect": "Disconnect", - "explore.dismiss": "Dismiss", - "explore.enter_bookmark_name": "Please enter the bookmark name", - "explore.excluded_dapps": "Excluded dApps", - "explore.excluded_dapps_description": "Right-click blank space, select the option below to exclude.", - "explore.explore": "Explore", - "explore.got_it": "Got it!", - "explore.history": "History", - "explore.location_permission": "Location: For providing location-based services.", - "explore.malicious_dapp": "Malicious dApp", - "explore.malicious_dapp_warning": "The current website may be malicious, continue visiting could result in loss of assets. If you understand the risks and want to proceed, you can dismiss or add to whitelist.", - "explore.malicious_dapp_warning_addToWhiteListLink": "add to whitelist", - "explore.malicious_dapp_warning_continueLink": "dismiss", - "explore.malicious_dapp_warning_continueMessage": "If you understand the risks and want to proceed, you can", - "explore.malicious_dapp_warning_description": "The current website may be malicious. Continue visiting could result in loss of assets.", - "explore.malicious_dapp_warning_sourceMessage": "Powered by", - "explore.manage_dapp_connections": "Manage dApp connections", - "explore.microphone_permission": "Microphone: For voice input or calls.", - "explore.network_issue_detected": "Network issue detected. Please verify your connection and refresh the page.", - "explore.new_tab": "New Tab", - "explore.no_boomark": "No Bookmarks Yet", - "explore.no_dapps_connected": "No dApps connected", - "explore.no_dapps_connected_message": "You haven't connected to any dApps yet.", - "explore.no_history": "No History Yet", - "explore.open_in_browser": "Open in Browser", - "explore.options": "Options", - "explore.permission_restriction_alert": "Permission restriction alert", - "explore.permission_restriction_message": "For your safety, the following permissions will be disabled on this site:", - "explore.pin": "Pin", - "explore.refresh_page": "Please refresh the page and retry", - "explore.refresh_page_link": "refresh the page", - "explore.reload": "Reload", - "explore.remove_all": "Remove all", - "explore.remove_bookmark": "Remove Bookmark", - "explore.removed_success": "Removed success", - "explore.rename": "Rename", - "explore.risky_domain": "Risky domain", - "explore.risky_domain_warning": "Possibly a fake website. Attackers sometimes make subtle, undetectable changes to URLs to impersonate websites.", - "explore.search_dapps": "Search dApps", - "explore.search_placeholder": "Search", - "explore.see_all": "See all", - "explore.set_default": "Set OneKey as Default Wallet", - "explore.set_default_wallet": "Set OneKey as default wallet", - "explore.set_default_wallet_description": "Use OneKey as the default wallet to connect to dApps.", - "explore.share": "Share", - "explore.suggested": "Suggested", - "explore.tab_prompt": "You can touch and hold to pin this tab for quick access.", - "explore.tabs_count": "{number} Tabs", - "explore.toast_bookmark_added": "Bookmark added", - "explore.toast_bookmark_removed": "Bookmark removed", - "explore.toast_pinned": "Pinned", - "explore.toast_tab_limit_reached": "Tabs has reached the maximum limit of {number}.", - "explore.toast_unpinned": "Unpinned", - "explore.unable_to_connect": "Unable to connect", - "explore.unpin": "Unpin", - "explore.unsupported_chain": "Unsupported yet", - "faq.private_key": "What is a private key?", - "faq.private_key_desc": "A unique alphanumeric code to control your assets.", - "faq.private_key_keep": "Keep your private key safe", - "faq.private_key_keep_desc": "Never disclose this key. Anyone with your private keys can steal any assets held in your account.", - "faq.recovery_phrase": "What is a recovery phrase?", - "faq.recovery_phrase_explaination": "A series of 12, 18, or 24 words to restore your wallet.", - "faq.recovery_phrase_safe_store": "Is it safe to enter it into OneKey?", - "faq.recovery_phrase_safe_store_desc": "Yes, it’s stored locally and never leave your device without your explicit permission.", - "faq.watched_account": "Watched account", - "faq.watched_account_desc": "Watched account in OneKey allows monitoring of a specific address but cannot send or receive funds. It's useful for tracking transactions or monitoring holdings.", - "fee.expected_fee": "Expected fee", - "fee.fee": "Fee", - "fee.fee_rate": "Fee rate", - "fee.fee_rate_too_high": "{something} is higher than necessary", - "fee.fee_rate_too_low": "{feeParam} is low for current network conditions", - "fee.l1_base_fee": "L1 base fee", - "fee.max_fee": "Max fee", - "fee.new_fee": "New fee", - "fee.original_fee": "Original fee", - "fee_alert_dialog_checkbox_label": "I still want to proceed with the transaction.", - "fee_alert_dialog_description": "The network fee is currently too high. Please reduce the fee or try again later.", - "fee_alert_dialog_title": "Network fee alert", - "feedback.account_balance_not_equal_to_utxos": "Available balance cannot be less than 0, input amount: {amount}, dust: {dust}", - "feedback.address_mismatch": "Address mismatch", - "feedback.address_mismatch_desc": "The address doesn’t match the hardware wallet. Stop using this address immediately and contact us.", - "feedback.address_not_activated_message": "Address not activated yet", - "feedback.address_not_matched": "Address not matched", - "feedback.address_pasted_text": "Address pasted", - "feedback.address_type_does_not_support_sign_method": "Only {type} addresses support this signature method", - "feedback.bluetooth_issue": "Bluetooth issue", - "feedback.bluetooth_pairing_failed": "Bluetooth pairing failed", - "feedback.bluetooth_unparied": "Bluetooth unpaired", - "feedback.chainid_unsupported_yet": "{chainId} unsupported yet", - "feedback.change_saved": "Change saved", - "feedback.connected_accounts_speed_up_or_cancel": "The connected account cannot alter a transaction. To override, submit a new transaction with the same nonce via your external wallet.", - "feedback.connection_request_denied": "Connection request denied", - "feedback.copied": "Copied", - "feedback.current_network_message": "{network} is the current network", - "feedback.dapp_connected_account": "{dapp} connected {account}", - "feedback.derivation_path_restriction": "Derivation path restriction", - "feedback.device_psbt_signature_utxo_reached_limit_desc": "The number of UTXOs exceeds the device limit of {count} UTXOs per signature for this device. You can try to send required funds to this address first to create a single UTXO, then try again.", - "feedback.device_psbt_signature_utxo_reached_limit_title": "PSBT Signature Failed - UTXO Limit Exceeded", - "feedback.edited_network_fee_still_too_low_message": "The edited network costs were less than required, so we’ve adjusted them automatically for you.", - "feedback.error_dot_account_retention_prompt": "Transfers may reduce the balance below {0}, resulting in account deactivation and clearing balance due to Polkadot on-chain mechanism. Confirm before proceeding.", - "feedback.external_wallet_does_not_approve_network": "The external wallet does not approve this network", - "feedback.external_wallet_doesn_not_approve_address": "The external wallet does not approve this address", - "feedback.failed_to_fet_fee_rate": "Failed to get fee rate, please try again", - "feedback.failed_to_fetch_network_fee": "Failed to fetch network fee", - "feedback.failed_to_get_utxos": "No available UTXO. Please wait or try a smaller amount.", - "feedback.failed_to_parse_transaction": "Failed to parse transaction", - "feedback.failed_to_sign_transaction": "Failed to sign transaction", - "feedback.forbidden_key_path_error": "You may encounter a forbidden key path error. Disable hardware “Security Check” to resolve.", - "feedback.hardware_is_busy": "Hardware is currently busy. Please try again later", - "feedback.hardware_unsupported_current_address_type": "This device does not support this type of address", - "feedback.hw_polling_time_out": "Connection timeout", - "feedback.invalid_phrases": "Invalid phrases", - "feedback.invalid_qr_code": "Invalid QR code", - "feedback.invalid_words_title": "Invalid words", - "feedback.invalid_words_title_message": "Double-check and retry", - "feedback.kaspa_utxo_limit_exceeded_text": "Transfer failed. UTXO limit exceeded. Please consolidate UTXOs or reduce transfer amount to {amount} {symbol}.", - "feedback.network_hidden_from_all_networks_toast_title": "{network} assets now hidden from 'All networks' view", - "feedback.network_shown_in_all_networks_toast_title": "{network} assets now shown in 'All networks' view", - "feedback.no_connected_account": "No connected account", - "feedback.onekey_bridge_installation_required": "Please install OneKey Bridge first. OneKey Bridge facilitates seamless communication between OneKey and your browser, ensuring an enhanced user experience.", - "feedback.passcode_set_failed": "Passcode setup failed", - "feedback.passphrase_disabled": "Passphrase disabled", - "feedback.passphrase_not_matched": "Passphrase not matched", - "feedback.passphrase_verification_cancelled": "Passphrase verification cancelled", - "feedback.password_set_failed": "Password setup failed", - "feedback.pasted_and_cleared": "Pasted and clipboard cleared", - "feedback.pin_verification_cancelled": "PIN verification cancelled", - "feedback.polkadot_supported_recover_phrases_type": "Only wallets with 12/24-word recovery phrases can create addresses for this network", - "feedback.psbt_inputs_mismatch": "PSBT input mismatch detected", - "feedback.psbt_not_found": "PSBT could not be located", - "feedback.psbt_outputs_mismatch": "PSBT output mismatch detected", - "feedback.psbt_uuid_mismatch": "PSBT UUID mismatch detected", - "feedback.remove": "Removed", - "feedback.request_failed": "Request failed", - "feedback.risk_detection_timed_out": "Risk detection information retrieval failed.", - "feedback.sign_success": "Signed successfully", - "feedback.sol_sign_unupported_message": "Signing Solana message is not supported yet", - "feedback.transaction_ckb_error_convert": "Failed to convert transaction, please try again.", - "feedback.transaction_ckb_error_less": "The balance after the transaction must not be less than {miniAmount}.", - "feedback.transaction_submitted": "Transaction submitted", - "feedback.transfer_cause_balance_lower_1_dot": "The balance will be below {amount} {symbol} after the transfer, and the remaining balance will be cleared", - "feedback.try_repairing_device_in_settings": "Try re-pairing the device in settings.", - "feedback.try_toggling_bluetooth": "Try toggling Bluetooth off and on.", - "feedback.unable_to_send_frozen_balance": "Unable to send frozen balance. Please check the Balance Details.", - "feedback.unsupported_address_or_network": "Unsupported address or network: {routeAddress}", - "feedback.unsupported_chains": "Unsupported chains", - "feedback.unsupported_methods": "Unsupported methods", - "feedback.user_rejected": "User rejected", - "feedback.walletconnect_session_discconected": "WalletConnect session disconnected", - "feedback.you_are_offline": "You are offline. Please check your network.", - "for_reference_only": "Reference only", - "form.address_error_invalid": "Invalid address", - "form.address_placeholder": "Address or domain", - "form.amount_placeholder": "Enter amount", - "form.amount_recipient_activate": "Recipient requires reserve {amount} {unit} to activate", - "form.block_explorer_url_label": "Block explorer URL", - "form.confirm_passphrase": "Confirm passphrase", - "form.confirm_passphrase_placeholder": "Re-enter your passphrase", - "form.custom_rpc_error_invalid": "Invalid RPC", - "form.enter_account_name": "Name (optional)", - "form.enter_account_name_placeholder": "Account name", - "form.enter_private_key_placeholder": "Enter your private key", - "form.gas_limit_error_range": "Gas limit must between {min} and {max}", - "form.global_error_something_higher_then_necessary": "{something} is higher than necessary", - "form.keep_hidden_wallet_label": "Keep accessible", - "form.keep_hidden_wallet_label_desc": "Hidden wallets clear on app close. Toggle to preserve.", - "form.lighting_invoice_amount_error_max": "Amount must not exceed {amount} sats", - "form.lighting_invoice_error_positive_integer_only": "Only positive integers allowed", - "form.lighting_invoice_placeholder": "e.g., Coffee purchase, Invoice #12345", - "form.max_base_fee_description": "Base fee required", - "form.must_greater_then_value": "Must be greater than {value}", - "form.network_name_label": "Network name", - "form.optional_indicator": "Optional", - "form.payment_id_error_text": "Payment ID must be a 64-char hex string", - "form.private_key_error_invalid": "Invalid private key", - "form.public_key_error_invalid": "Invalid public key", - "form.public_key_placeholder": "Enter your public key", - "form.public_key_title": "Public key", - "form.recipient_ln_placeholder": "Enter invoice, Lighting Address or LNURL", - "form.ree_rate_error_out_of_range": "Fee rate must be between {min} and {max}", - "form.rename_error_empty": "Name is required", - "form.rename_error_exist": "The name already exists", - "form.rpc_url_invalid": "Invalid URL", - "form.rpc_url_prefix_required": "http/https prefix required", - "form.search_address_placeholder": "Search address", - "form.search_network_placeholder": "Search network", - "form.symbol_recommend_text": "Chain ID {chainID} usually uses {symbol}. Check the symbol entered.", - "form__approve_str": "Approve {amount} {symbol}", - "form__priority_fee": "Priority fee", - "form__sats__units": "sats", - "global.404_message": "Sorry, something went wrong!", - "global.Note": "Note", - "global.about": "About", - "global.about_device": "About device", - "global.account": "Account", - "global.account_name": "Account name", - "global.accounts": "Accounts", - "global.acknowledged": "Acknowledged", - "global.add_account": "Add account", - "global.add_hidden_wallet": "Add hidden wallet", - "global.add_new_device": "Add new device", - "global.add_wallet": "Add wallet", - "global.address": "Address", - "global.advance": "Advance", - "global.advanced": "Advanced", - "global.advanced_settings": "Advanced settings", - "global.advantage_settings": "Advanced settings", - "global.age": "Age", - "global.all": "ALL", - "global.all_networks": "All networks", - "global.allow": "Allow", - "global.always": "Always", - "global.an_error_occurred": "An error occurred", - "global.an_error_occurred_desc": "We’re unable to complete your request. Please reload the page.", - "global.app_wallet": "App wallet", - "global.approve": "Approve", - "global.apr": "APR", - "global.asset": "Asset", - "global.auto": "Auto", - "global.available": "Available", - "global.backed_up": "Backed up", - "global.backup": "Backup", - "global.backup_recovery_phrase": "Backup recovery phrase", - "global.balance": "Balance", - "global.bandwidth": "Bandwidth", - "global.best": "Best", - "global.biometric": "Biometric", - "global.block_height": "Block height", - "global.bluetooth": "Bluetooth", - "global.bluetooth_firmware": "Bluetooth firmware", - "global.bootloader": "Bootloader", - "global.browser": "Browser", - "global.bulk_accounts_advance": "Advance", - "global.bulk_accounts_loading": "{amount} address(es) added", - "global.bulk_accounts_loading_error": "Bulk add accounts have been canceled", - "global.bulk_accounts_loading_subtitle": "({amount} accounts)", - "global.bulk_accounts_page_number": "Page number", - "global.bulk_accounts_page_number_error": "Invalid number", - "global.bulk_accounts_preview": "Preview", - "global.bulk_add_account_dnx_error": "Bulk add accounts error, please connect OneKey Classic", - "global.bulk_add_accounts": "Bulk add accounts", - "global.bulk_add_accounts_error": "You can add a maximum of {amount} accounts", - "global.buy": "Buy", - "global.buy_one": "Buy one", - "global.cancel": "Cancel", - "global.cancel_confirm_on_device_feedback": "Device unconfirmed", - "global.cancel_copy": "Cancel copy", - "global.cancelling": "Cancelling", - "global.cash_out": "Cash out", - "global.certifications": "Certifications", - "global.chain": "Chain", - "global.change_passcode": "Change passcode", - "global.change_password": "Change password", - "global.check_for_updates": "Check for updates", - "global.checking_device": "Checking device", - "global.circulating_supply": "Circulating supply", - "global.clear": "Clear", - "global.close": "Close", - "global.collect_to_device": "Collect to device", - "global.collect_to_device_canceled": "Canceled on device", - "global.collect_to_device_failed": "Failed to collect, please try again", - "global.community": "Community", - "global.confirm": "Confirm", - "global.confirm_on_device": "Confirm on device", - "global.confirmations": "Confirmations", - "global.connect": "Connect", - "global.connect_hardware_wallet": "Connect hardware wallet", - "global.connect_to_wallet": "Connect to {wallet}", - "global.connect_to_wallet_confirm_to_proceed": "Confirm on your wallet to proceed", - "global.connect_to_wallet_no_confirmation": "We didn’t receive the confirmation. Please try again.", - "global.connect_wallet": "Connect wallet", - "global.connected": "Connected", - "global.connected_account": "Connected", - "global.connection_failed": "Connection failed", - "global.connection_failed_help_text": "Please reconnect the device and try again", - "global.connection_failed_usb_help_text": "Please reconnect the USB and try again", - "global.contact": "Contact", - "global.contact_us": "Contact us", - "global.continue": "Continue", - "global.continue_anyway": "Continue anyway", - "global.contract": "Contract", - "global.contract_call": "Contract call", - "global.copied": "Copied", - "global.copy": "Copy", - "global.copy_address": "Copy address", - "global.copy_recovery_phrase": "Copy recovery phrase", - "global.copy_token_contract": "Copy token contract", - "global.copy_url": "Copy URL", - "global.count_accounts": "{count, plural, one {# account} other {# accounts}}", - "global.count_addresses": "{count, plural, one {# address} other {# addresses}}", - "global.create": "Create", - "global.create_address": "Create address", - "global.create_invoice": "Create invoice", - "global.create_wallet": "Create wallet", - "global.creating_address": "Creating address", - "global.crop_image": "Crop image", - "global.crypto": "Crypto", - "global.current": "Current", - "global.customize_nonce": "Customize nonce", - "global.customize_nonce_desc": "Turn this on to change the nonce (transaction number) and control your transaction order on confirmation > advance settings. This is an advanced feature, use cautiously.", - "global.customize_transaction": "Customize transaction", - "global.dapp_interaction": "dApp Interaction", - "global.dark": "Dark", - "global.date": "Date", - "global.date_today": "Today", - "global.date_yesterday": "Yesterday", - "global.default": "Default", - "global.delete": "Delete", - "global.deny": "Deny", - "global.derivation_path": "Derivation path", - "global.description": "Description", - "global.details": "Details", - "global.dev_mode": "Dev mode", - "global.device_info": "Device info", - "global.device_management": "Device management", - "global.dex": "DEX", - "global.disabled": "Disabled", - "global.discord": "Discord", - "global.done": "Done", - "global.download": "Download", - "global.download_and_install": "Download and install", - "global.earn": "Earn", - "global.edit": "Edit", - "global.edit_avatar": "Edit avatar", - "global.enable": "Enable", - "global.enabled": "Enabled", - "global.energy": "Energy", - "global.energy_bandwidth": "Energy & Bandwidth", - "global.energy_bandwidth_desc": "Transfers and smart contract calls prioritize using energy and bandwidth, which recover over time. If insufficient, TRX is consumed. You can stake TRX for bandwidth and buy or lease energy to reduce transaction fees.", - "global.energy_bandwidth_learn": "How to get energy & bandwidth", - "global.energy_bandwidth_num": "{num_1} Energy + {num_2} Bandwidth", - "global.energy_bandwidth_transaction_desc": "The fee required for this transaction will be automatically deducted", - "global.enter_on_device": "Enter on device", - "global.enter_passphrase": "Enter passphrase", - "global.enter_passphrase_alert": "Remember your passphrase: Irrecoverable if lost.", - "global.enter_recovery_phrase": "Enter recovery phrase", - "global.est_network_fee": "Est. network fee", - "global.estimated_results": "Estimated results", - "global.exit": "Exit", - "global.expand_view": "Expand view", - "global.explore_now": "Explore now", - "global.explorers": "Explorers", - "global.export": "Export", - "global.export_private_key": "Export private key", - "global.face_id": "Face ID", - "global.failed": "Failed", - "global.faqs": "FAQs", - "global.fcc_id": "FCC ID", - "global.fdv": "FDV", - "global.firmware": "Firmware", - "global.follow_the_system": "Follow the system", - "global.for": "For", - "global.forever": "Forever", - "global.from": "From", - "global.from_provider": "From {provider}", - "global.gas_price": "Gas price", - "global.general": "General", - "global.generate_amount": "Generate amount", - "global.generate_amount_address": "Address", - "global.generate_amount_balance": "Balance", - "global.generate_amount_confirm": "Confirm ({amount})", - "global.generate_amount_error": "You can add up to {amount} more.", - "global.generate_amount_information": "The maximum number of generated accounts is {max}.", - "global.generate_amount_number": "No.", - "global.generate_amount_select": "Select all", - "global.generate_amount_select_path": "If your default address isn't visible, check Settings > Account derivation path.", - "global.generate_max": "Max", - "global.get_one": "Get one", - "global.github": "GitHub", - "global.go_settings": "Go settings", - "global.go_to_settings": "Go to Settings", - "global.google_drive": "Google Drive", - "global.got_it": "Got it", - "global.hardware_label": "Labeling", - "global.hardware_label_desc": "Labels are applied on your device’s homescreen.", - "global.hardware_label_input_error": "Invalid device labeling", - "global.hardware_label_title": "Device labeling", - "global.hardware_name_desc": "Simultaneously change the device's name.", - "global.hardware_name_input_error": "Invalid name", - "global.hardware_name_input_max": "Exceeding the maximum word limit", - "global.hex_data": "Message", - "global.hex_data_default": "Hex data", - "global.hex_data_default_faq": "What’s hex data?", - "global.hex_data_error": "Input formatting error", - "global.hex_data_faq": "What's the message?", - "global.hex_data_faq_desc": "Additional data included for this transaction. Commonly used as part of contract interaction or as a message sent to the recipient.", - "global.hex_data_input_default": "Enter message", - "global.hex_data_input_desc_hex": "The current input is original data. UTF-8 is: {utf}.", - "global.hex_data_input_desc_utf": "The current input is UTF-8. Original Data is: {data}.", - "global.hex_data_title": "Show message (hex data)", - "global.hide": "Hide", - "global.history": "History", - "global.homescreen": "Homescreen", - "global.i_got_it": "I got it", - "global.i_saved_the_phrase": "I've saved the phrase", - "global.i_understand": "I understand", - "global.icloud": "iCloud", - "global.ignore": "Ignore", - "global.import": "Import", - "global.import_address": "Import address", - "global.import_private_key": "Import private key", - "global.import_recovery_phrase": "Import recovery phrase", - "global.import_ton": "Importing TON wallet", - "global.import_ton_desc": "This wallet uses the TON network for backup recovery phrases, supports only TON assets, and exists as a private key account, so sub-accounts can't be added.", - "global.import_wallet": "Import wallet", - "global.info": "Info", - "global.inputs": "Inputs", - "global.install": "Install", - "global.language": "Language", - "global.later": "Later", - "global.layout": "Layout", - "global.learn_more": "Learn more", - "global.light": "Light", - "global.link_copied": "Link copied", - "global.links": "Links", - "global.liquidity": "Liquidity", - "global.manage": "Manage", - "global.mark_all_as_confirmation_desc": "This can’t be undone.", - "global.mark_all_as_confirmation_title": "Mark all as read?", - "global.market": "Market", - "global.market_cap": "Market cap", - "global.max": "Max", - "global.max_est_network_fee": "Max est. network fee", - "global.max_supply": "Max supply", - "global.model": "Model", - "global.month_date": "{month} {date}", - "global.more": "More", - "global.move_to_top": "Move to top", - "global.multi_chain_wallet": "Multi-chain wallet", - "global.multi_networks": "Multi-networks", - "global.my_onekey": "My OneKey", - "global.name": "Name", - "global.names_of_wallets_and_accounts": "Names of wallets and accounts", - "global.network": "Network", - "global.network_error": "Network error", - "global.network_error_help_text": "Check your connection and retry", - "global.network_not_matched": "Network not matched", - "global.network_type": "Network type", - "global.networks": "Networks", - "global.networks_information": "All networks may cause slow loading, Bitcoin and EVM networks will be added first. We recommend that you choose a single network.", - "global.never": "Never", - "global.next": "Next", - "global.nft": "NFT", - "global.no_data": "No data", - "global.no_device_connected": "No device connected", - "global.no_device_connected_desc": "Connect your OneKey hardware wallet to view device info, verify authenticity, check firmware updates, and manage security settings.", - "global.no_network_address": "No {network} address", - "global.no_results": "No results", - "global.no_transactions_yet": "No Transactions Yet", - "global.no_transactions_yet_desc": "Your transactions will appear here", - "global.no_wallet": "No wallet", - "global.no_wallet_desc": "Add wallet to start managing your cryptocurrency safely and efficiently", - "global.nonce": "Nonce", - "global.nonce_desc": "Current: {amount}", - "global.nonce_error_higher": "Nonce is higher, it means that the transaction will be queued until the transactions in front of it are confirmed", - "global.nonce_error_lower": "Nonce has been used and may cause this transaction to fail", - "global.nonce_faq": "What’s Nonce?", - "global.nonce_faq_desc": "You have enabled the display of transaction serial numbers (nonce). You can edit the serial numbers to adjust the transaction order of your current account. This is an advanced feature, use cautiously.", - "global.not_available": "Not available", - "global.notifications": "Notifications", - "global.number_accounts": "{number} Accounts", - "global.number_items": "{number} Items", - "global.off": "Off", - "global.official_links": "Official links", - "global.official_website": "Official website", - "global.ok": "OK", - "global.on": "On", - "global.onekey_keytag": "OneKey KeyTag", - "global.onekey_lite": "OneKey Lite", - "global.onekey_prompt_dont_have_yet": "Don't have OneKey yet?", - "global.onekey_wallet": "OneKey wallet", - "global.other_wallet": "Other wallet", - "global.others": "Others", - "global.outputs": "Outputs", - "global.overview": "Overview", - "global.overwritten": "Overwritten", - "global.pair": "Pair", - "global.pair_contract": "Pair contract", - "global.passphrase": "Passphrase", - "global.passphrase_desc": "Passphrase adds a custom phrase to your recovery phrase to create a hidden wallet. Each hidden wallet has its passphrase. Do not forget it, as it can't be retrieved & funds will be lost permanently.", - "global.pay": "Pay", - "global.pct_complete": "{ptc}% complete", - "global.pending": "Pending", - "global.pin_to_top": "Pin", - "global.pools": "Pools", - "global.popular": "Popular", - "global.portfolio": "Portfolio", - "global.preferences": "Preferences", - "global.preparing": "Preparing...", - "global.price": "Price", - "global.private_key": "Private key", - "global.private_key_copy": "Copy Private Key?", - "global.private_key_copy_check": "I’ve known my private key provides full access to my assets", - "global.private_key_copy_information": "Never disclose this key. Anyone with your private keys can steal any assets held in your account.", - "global.private_key_error": "This account does not have a {network} {path} address yet. Please create one to continue.", - "global.processing": "Processing", - "global.profit": "Profit", - "global.protocol": "Protocol", - "global.public_key": "Public key", - "global.public_key_export": "Export public key", - "global.qr_code": "QR code", - "global.quit": "Quit", - "global.receive": "Receive", - "global.receive_address_confirmation": "Address confirmation", - "global.receive_address_confirmation_button": "I’ll take the risk", - "global.receive_address_confirmation_desc": "Unverified actions may result in assets being sent to the wrong address, especially if the OneKey App is not reconnected after local data tampering or reset.", - "global.recent_searched": "Recent searched", - "global.recents": "Recents", - "global.recipient": "Recipient", - "global.recommend": "Recommend", - "global.recovery_phrase": "Recovery phrase", - "global.refresh": "Refresh", - "global.remove": "Remove", - "global.remove_account_desc": "You can restore this account later in this wallet by using \"Add account\" or \"Bulk add accounts\".", - "global.remove_account_name": "Remove {account}", - "global.rename": "Rename", - "global.reset": "Reset", - "global.resources": "Resources", - "global.retry": "Retry", - "global.review_again": "Review again", - "global.revoke": "Revoke", - "global.revoke_approve": "Revoke {symbol} allowance", - "global.sats": "sats", - "global.saved_the_phrases": "I've saved the phrases", - "global.saved_the_private_key": "I've saved the private key", - "global.scan_to_connect": "Scan to connect", - "global.search": "Search", - "global.search_account_selector": "Search account name", - "global.search_address": "Search address", - "global.search_asset": "Search asset", - "global.search_no_results_desc": "Try to change the search keyword", - "global.search_no_results_title": "No results", - "global.search_tokens": "Search token", - "global.security": "Security", - "global.select_crypto": "Select crypto", - "global.select_network": "Select network", - "global.select_wallet": "Select wallet", - "global.sell": "Sell", - "global.send": "Send", - "global.serial_number": "Serial number", - "global.serial_number_start": "Serial number of addresses to start", - "global.serial_number_start_desc": "Adding address from {from} to {to}.", - "global.set_passcode": "Set passcode", - "global.set_password": "Set password", - "global.setings_up": "Setting up", - "global.settings": "Settings", - "global.show_less": "Show less", - "global.show_more": "Show more", - "global.show_recovery_phrase": "Show recovery phrase", - "global.sign": "Sign", - "global.single_chain_account": "Single-chain account", - "global.sped_up": "Sped up", - "global.speed_up": "Speed up", - "global.start_connection": "Start connection", - "global.start_migration": "Start migration", - "global.status": "Status", - "global.step_str": "Step {step}", - "global.storage_used": "Storage used", - "global.success": "Success", - "global.support": "Support", - "global.swap": "Swap", - "global.switch": "Switch", - "global.switch_address": "Switch address", - "global.switch_supported_accounts_wallets": "Please switch to supported accounts or wallets.", - "global.sync_error": "Sync error", - "global.synced": "Synced", - "global.syncing": "Syncing...", - "global.test": "Test", - "global.testnet": "Testnet", - "global.time": "Time", - "global.to": "To", - "global.total_in": "Total in", - "global.total_out_include_fee": "Total out (Include fee)", - "global.total_supply": "Total supply", - "global.touch_id": "Touch ID", - "global.touch_id_set_error": "Set biology auth fail", - "global.track_any_address": "Track any address", - "global.trade": "Trade", - "global.transaction_id": "Transaction hash", - "global.unhide": "Unhide", - "global.unknown": "Unknown", - "global.unknown_error": "Unknown error", - "global.unknown_error_retry_message": "An unexpected error occurred. Please try again.", - "global.unlock": "Unlock", - "global.unofficial": "Unofficial", - "global.unpin_from_top": "Unpin", - "global.update_failed": "Update Failed", - "global.updating": "Updating...", - "global.updating_type": "Updating {type}...", - "global.upgrade": "Upgrade", - "global.url": "URL", - "global.value": "Value", - "global.verified": "Verified", - "global.verify": "Verify", - "global.verify_on_device": "Verify on device", - "global.version_is_available": "{version} is available", - "global.view": "View", - "global.view_in_blockchain_explorer": "View in explorer", - "global.view_less": "View less", - "global.view_more": "View more", - "global.view_tutorial": "View tutorial", - "global.visit_website": "Visit website", - "global.wallet": "Wallet", - "global.wallet_avatar": "Wallet avatar", - "global.wallets": "Wallets", - "global.warning": "Warning", - "global.watched": "Watched", - "global.watchlist": "Watchlist", - "global.website": "Website", - "global.white_paper": "White paper", - "global.windows_hello": "Windows Hello", - "global.windows_hello_set_error": "Set Windows Hello to fail", - "global.withdraw": "Withdraw", - "global.x": "X", - "hardware.backup_completed": "Backup completed!", - "hardware.bluetooth_need_turned_on_error": "Bluetooth is off", - "hardware.bluetooth_not_paired_error": "Bluetooth not paired", - "hardware.bluetooth_pairing_failed": "Bluetooth pairing failed", - "hardware.bluetooth_requires_permission_error": "Bluetooth permission required", - "hardware.bridge_network_error": "Unable to connect to Bridge, please check your network connection and try again", - "hardware.bridge_timeout": "Bridge connection timeout, please check your network connection and try again", - "hardware.bridge_timeout_for_desktop": "Bridge connection timeout, please check your network connection and try again", - "hardware.confirm_onekey_lite_pin": "Confirm OneKey Lite PIN", - "hardware.confirm_onekey_lite_pin_desc": "Please re-enter the OneKey Lite PIN you just set.", - "hardware.connect_failed": "Connect failed", - "hardware.connect_timeout_error": "Connection timeout", - "hardware.connect_unknown_device_error": "Unknown device, the current version App does not support connection.", - "hardware.data_erased_use_as_new": "The data on this OneKey Lite has been completely erased, and you can use it as a new OneKey Lite.", - "hardware.default_error": "Hardware communication failed, please try again", - "hardware.device_ble_already_connected": "Device already connected elsewhere, please disconnect and try again", - "hardware.device_ble_location_disabled": "Location services unavailable, please enable and try again", - "hardware.device_ble_scan_error": "Bluetooth scan failed, please try again", - "hardware.device_ble_scan_throttle": "Bluetooth scan too frequent, please try again later", - "hardware.device_connected_keep_card_in_place": "The device is connected, please keep the card in place and do not move it.", - "hardware.device_contains_backup": "This device contains backup", - "hardware.device_contains_backup_desc": "If you continue, your previous backup will be fully overwritten and will be lost forever.", - "hardware.device_information_is_inconsistent_it_may_caused_by_device_reset": "Device information is inconsistent. This may be caused by a device reset. You can re-add your device to resolve this issue.", - "hardware.device_need_restart": "Hardware communication failed, please restart the device and try again", - "hardware.device_not_find_error": "Device not found. Please try reconnecting the device (unplug and plug the USB or turn Bluetooth off and on), then try again.", - "hardware.device_passphrase_state_error": "Passphrase does not match the current wallet, please try again", - "hardware.ensure_device_close_to_nfc": "Make sure the device is close to the phone's NFC module, then try again.", - "hardware.enter_boot_failure": "Failed to enter update mode", - "hardware.enter_onekey_lite_pin": "Enter OneKey Lite PIN", - "hardware.enter_onekey_lite_pin_desc": "OneKey Lite PIN is a 6-digit number and cannot be retrieved if forgotten, as we do not store any user information.", - "hardware.enter_passphrase_on_device": "Enter Passphrase on Device", - "hardware.failed_to_search_devices": "Search failed", - "hardware.file_already_exists": "File already exists", - "hardware.firmware_download_error": "Firmware download failed", - "hardware.hardware_device_not_find_error": "Device not found", - "hardware.hardware_params_bytes_overload": "The data length exceeds the hardware's processing capacity", - "hardware.incomplete_file": "Incomplete file", - "hardware.init_iframe_load_error": "Hardware SDK initialization failed. Please check your network or switch the proxy and try again.", - "hardware.invalid_pin_error": "Invalid PIN", - "hardware.keep_lite_placed_until_found": "Please keep Lite placed with the phone until the device is found.", - "hardware.manually_enter_boot": "Manual boot entry required", - "hardware.need_force_upgrade_firmware": "Firmware needs to be upgraded", - "hardware.no_backup_inside": "No backup inside", - "hardware.no_backup_inside_desc": "No backup in this OneKey Lite. Replace with another OneKey Lite and retry.", - "hardware.no_connection_desc": "Please try again or check your network", - "hardware.no_pin_change_needed": "No need to change the PIN code on this new OneKey Lite card.", - "hardware.not_opened_passphrase": "Please enable Passphrase on the device to use the hidden wallet", - "hardware.not_same": "Mismatch, please connect the correct device", - "hardware.not_support": "This method has security risks and is not supported by the hardware", - "hardware.not_support_passphrase_need_upgrade": "Using Passphrase requires upgrading the firmware to version {version} or higher.", - "hardware.onekey_lite_pin_changed": "OneKey Lite PIN changed!", - "hardware.onekey_lite_pin_changed_desc": "This OneKey Lite's PIN has been changed.\nRemember this PIN as it cannot be recovered if lost, as we do not store any user information.", - "hardware.onekey_lite_pin_error": "OneKey Lite PIN error", - "hardware.onekey_lite_pin_error_desc": "After {number} more wrong tries, the data on this OneKey Lite will be erased.", - "hardware.onekey_lite_reset": "OneKey Lite has been reset", - "hardware.only_one_device_can_be_connected_desc": "Please connect only one device for the upgrade.", - "hardware.open_blind_sign_error": "Unknown signature format, please go to Security/Blind Signing to enable SOL advanced signing", - "hardware.opened_passphrase": "Please disable Passphrase on the device to use the standard wallet", - "hardware.params_bytes_overload": "Data size exceeds hardware limit. Please update the firmware and try again or contact customer support", - "hardware.passphrase_enter_too_long": "passphrase supports a maximum of {0} characters", - "hardware.pin_change_failed": "PIN change failed", - "hardware.pin_incorrect_data_erased": "The PIN code has been entered incorrectly over 10 times. To prevent unauthorized access to the backup data, the data on this device has been erased.", - "hardware.pins_do_not_match": "The entered PINs do not match. Please reconfirm.", - "hardware.place_onekey_lite_close_to_phone": "Place OneKey Lite close to the phone", - "hardware.place_onekey_lite_close_to_phone_desc": "Place the Lite and phone as shown in the figure below, then click \"connect.”", - "hardware.polling_connect_timeout_error": "Connection timeout. Please check the OneKey Bridge status and restart the hardware", - "hardware.recover_wallet_with_card_and_pin": "You can recover your wallet using this card and PIN at all times.\nRemember this PIN as it cannot be recovered if lost, as we do not store any user information.", - "hardware.recovery_interrupted": "Recovery interrupted", - "hardware.reset_failed": "Reset failed", - "hardware.reset_failed_desc": "This is a brand new OneKey Lite that does not require resetting.", - "hardware.reset_onekey_lite": "Reset OneKey Lite", - "hardware.reset_onekey_lite_desc": "Please ensure that you have backed up the recovery phrase before entering \"RESET\" to confirm, as it will be erased from this OneKey Lite device.", - "hardware.searching_for_device": "Searching for device...", - "hardware.set_onekey_lite_pin": "Set OneKey Lite PIN", - "hardware.set_onekey_lite_pin_desc": "Set a 6-digit PIN for your OneKey Lite.", - "hardware.software_cannot_be_upgrade": "The client cannot update the hardware. You need to go to https://firmware.onekey.so](https://firmware.onekey.so/) to update", - "hardware.status_connected": "Connected", - "hardware.status_update_available": "Update available", - "hardware.str_not_supported_by_hardware_wallets": "Waiting for firmware update, hardware wallets are not supported at this time.", - "hardware.transaction_signing_error_not_in_signing_mode": "Transaction signing error: Not in signing mode", - "hardware.transferring_data": "Transferring data...", - "hardware.two_onekey_lite_not_same": "The two OneKey Lite used for connection are not the same.", - "hardware.unknown_message_error": "Current firmware not supported, please try upgrading", - "hardware.unsupported_passphrase_characters": "Contains unsupported characters", - "hardware.user_cancel_error": "Action canceled", - "hardware.verify_success": "Official firmware", - "hardware.version_need_upgrade_error": "Please upgrade the firmware to version {version} or higher to use this feature", - "hardware.version_to_low_error": "Current firmware version is too low, please update the firmware", - "hardware.wallet_connection_is_not_currently_supported_but_we_are_working_on_it_stay_tuned": "Hardware wallet connection is not currently supported, but we are working on it. Stay tuned!", - "hardware.wallet_connection_is_only_available_on_the_official_app": "Hardware wallet connection is only available on the official app", - "hardware.wallet_connection_is_only_available_on_the_third_party_apps": "Hardware wallet connection is only available on third-party apps", - "hidden_assets": "Hidden assets", - "history.notification_receiver_label": "Notification received by", - "history.switch_account_dialog_title": "Switch primary account to {account}?", - "hw_banner_description": "Secure your crypto with the most powerful hardware wallet", - "insufficient_fee_append_desc": "based on max est. fee: {amount} {symbol}", - "interact_with_contract": "Interact with (To)", - "lighting_invoice": "Lightning Invoice", - "list_section_unavailable_networks_text": "Unavailable networks for selected account", - "litecoin_legacy_desc": "Starts with \"L\". BIP44, P2PKH, Base58", - "litecoin_native_segwit_desc": "Starts with \"ltc1\". BIP84, P2WPKH, Bech32", - "litecoin_nested_segwit_desc": "Starts with \"M\". BIP49, P2SH-P2WPKH, Base58", - "ln.authorize_access": "Authorize access", - "ln.authorize_access_desc": "Connecting your hardware wallet to access the Lightning account", - "ln.authorize_access_network_error": "Authentication failed, check your network connection and try again", - "ln.payment_received_label": "Payment received", - "login.forgot_passcode": "Forgot passcode?", - "login.forgot_password": "Forgot password?", - "login.welcome_message": "Welcome back", - "low_value_assets": "Low-value assets", - "low_value_assets_desc": "Assets valued below 0.1% of your total holdings and less than $1,000 fall into this category.", - "low_value_assets_desc_out_of_range": "Assets ranked below the top 50 in total value when owning multiple assets.", - "manage_token.account_no_found": "Insufficient {token} to cover network fee. Please add more {token} and retry.", - "manage_token.added_token": "Added token", - "manage_token.custom_token_add": "2. Add", - "manage_token.custom_token_add_btn": "Add", - "manage_token.custom_token_button": "Add custom token", - "manage_token.custom_token_chain_input": "Chain", - "manage_token.custom_token_contract_address": "Contract address", - "manage_token.custom_token_create_address": "1. Create address", - "manage_token.custom_token_decimal": "Decimal", - "manage_token.custom_token_symbol": "Symbol", - "manage_token.custom_token_title": "Custom token", - "manage_token.empty_msg": "Can't find the token?", - "manage_token.native_token_cannot_removed": "Native token cannot be removed", - "manage_token.native_token_cant_remove": "Native token can't be removed", - "manage_token.popular_token": "Common token", - "manage_token.title": "Manage token", - "manage_token.token_required": "Symbol is required.", - "manger_token.custom_token_address_required": "Contract address required.", - "manual_backup": "Manual backup", - "market.1d": "1D", - "market.1h": "1H", - "market.1m": "1M", - "market.1w": "1W", - "market.1y": "1Y", - "market.24h": "24H", - "market.24h_price_range": "24H price range", - "market.24h_txns": "24H txns", - "market.24h_vol_usd": "24H VOL(USD)", - "market.30d": "30D", - "market.7d": "7D", - "market.add_number_tokens": "Add {number} tokens", - "market.add_to_watchlist": "Add to watchlist", - "market.added_to_watchlist": "Added to watchlist", - "market.all_time_high": "All-time high", - "market.all_time_low": "All-time low", - "market.ath_desc": "{token}’s all-time high was on {time}, at {price}, and the current price is down by {percent} from that high.", - "market.atl_desc": "{token}’s all-time low was on {time}, at {price}, and the current price is up by {percent} from that low.", - "market.cex": "CEX", - "market.chart": "Chart", - "market.days_since_launch": "Days since launch", - "market.empty_watchlist_desc": "Add your favorite tokens to watchlist", - "market.empty_watchlist_title": "Your watchlist is empty", - "market.high": "High", - "market.last_price": "Last price", - "market.last_seven_days": "Last 7 days", - "market.last_updated": "Last updated", - "market.lite_chart": "Lite chart", - "market.low": "Low", - "market.minus_2_percent_depth": "-2% depth", - "market.most_24h_volume": "Most 24h volume", - "market.most_market_cap": "Most market cap", - "market.move_to_top": "Move to top", - "market.number_of_days": "{number} days", - "market.one_hour_percentage": "1h%", - "market.pair": "Trading pair", - "market.pair_link": "Pair link:", - "market.plus_2_percent_depth": "+2% depth", - "market.pool_details": "Pool details", - "market.price_change_down": "Price change down", - "market.price_change_up": "Price change up", - "market.remove_from_watchlist": "Remove from watchlist", - "market.seven_day_percentage": "7d%", - "market.sort_by": "Sort by", - "market.spread": "Spread", - "market.trending": "Trending", - "market.trust_score": "Credit score", - "market.twenty_four_hour_percentage": "24h%", - "market.twenty_four_hour_volume": "24h volume", - "market.volume_percentage": "Trading volume %", - "max_base_fee_lower_then_base_fee_alert_message": "The max base fee is lower than the base fee, which may cause a delay in the transaction.", - "menu.about_onekey_wallet": "About OneKey Wallet", - "menu.actual_size": "Actual Size", - "menu.bring_all_to_front": "Bring All to Front", - "menu.check_for_updates": "Check for Updates...", - "menu.cut": "Cut", - "menu.help": "Help", - "menu.hide_onekey_wallet": "Hide OneKey Wallet", - "menu.lock_now": "Lock Now", - "menu.minimize": "Minimize", - "menu.official_website": "Official Website", - "menu.paste": "Paste", - "menu.preferences": "Preferences..", - "menu.quit_onekey_wallet": "Quit OneKey Wallet", - "menu.redo": "Redo", - "menu.select_all": "Select All", - "menu.show_all": "Show All", - "menu.toggle_full_screen": "Toggle Full Screen", - "menu.undo": "Undo", - "menu.view": "View", - "menu.visit_help_center": "Visit Help Center", - "menu.window": "Window", - "menu.zoom": "Zoom", - "menu.zoom_in": "Zoom In", - "menu.zoom_out": "Zoom Out", - "menu__copy_image": "Copy image", - "menu__save_image_as": "Save image as…", - "msg__str_is_required_for_network_fees_top_up_str_to_make_tx": "Insufficient {symbol} for network fees. Add at least {amount} {symbol}", - "msg__transaction_with_the_same_nonce_already_exist_please_pay_a_higher_network_fee_otherwise_the_transaction_may_fail": "Transactions with the same nonce already exist, please pay a higher network fee, otherwise the transaction may fail.", - "native_token_tooltip": "This is the cryptocurrency used to pay for network fees", - "network__network": "Network", - "network_invisible_in_all_network_tooltip_title": "Hidden in 'All networks' view", - "network_selector.unavailable_networks": "Unavailable networks for selected account", - "network_visible_in_all_network_tooltip_title": "Shown in 'All networks' view", - "nft.already_collected": "This NFT has already been collected.", - "nft.attributes": "Attributes", - "nft.collect_failed": "NFT collect failed, please try again.", - "nft.collect_to_touch": "Collect to {device}", - "nft.collection": "Collection", - "nft.contract_address": "Contract Address", - "nft.floor_price": "Floor price", - "nft.highest_floor": "Highest floor", - "nft.last_sale": "Last sale", - "nft.mint_address": "Mint Address", - "nft.more": "More", - "nft.nft_standard": "NFT Standard", - "nft.no_attributes_found": "We haven't found any attributes for this NFT.", - "nft.no_nfts": "No NFTs", - "nft.no_nfts_found": "No NFTs found at this address", - "nft.no_results": "No Results", - "nft.owner_program": "Owner Program", - "nft.recently_received": "Recently received", - "nft.search_result_count": " {number} Results", - "nft.sort": "Sort", - "nft.token_address": "Token Address", - "nft.token_id": "Token ID", - "no_account": "No account", - "no_external_wallet_message": "No external wallets are connected. Link a third-party wallet to view here.", - "no_private_key_account_message": "No private key accounts. Add a new account to manage your assets.", - "no_transaction_desc": "Your transactions will appear here", - "no_transaction_title": "No transactions yet", - "no_watched_account_message": "No watched accounts. Import an address to start monitoring.", - "notifications.account_activity_manage_count_alert_title": "{totalEnabledAccountsCount}/{maxAccountCount} accounts enabled", - "notifications.account_reached_limit_alert_desc": "New accounts may not get notifications.", - "notifications.account_reached_limit_alert_title": "{count} accounts limit reached", - "notifications.account_reached_limit_dialog_desc": "You've reached the maximum of {maxAccountCount} accounts.", - "notifications.account_reached_limit_dialog_title": "Account limit reached", - "notifications.empty_desc": "You have not received any notifications yet", - "notifications.empty_title": "No notifications", - "notifications.intro_desc": "Allow push notifications to receive alerts for account activity directly on your device", - "notifications.intro_mac_desc": "Click 'Enable,' then turn on the switch", - "notifications.intro_title": "Enable push notifications", - "notifications.mac_permission_title": "Allow notifications", - "notifications.notifications_account_activity_desc": "Get notified when receiving, sending, trading, and more.", - "notifications.notifications_account_activity_label": "Account activity", - "notifications.notifications_account_manage_desc": "Choose the account for notifications.", - "notifications.notifications_account_manage_label": "Manage", - "notifications.notifications_price_alert_desc": "Get notified when the watched cryptos increase or drop more than 10% in 24 hours.", - "notifications.notifications_price_alert_label": "Price alert", - "notifications.notifications_switch_label": "Allow notifications", - "notifications.permission_instruction": "Click 'Enable,' then allow notifications for OneKey.", - "notifications.settings_helper_desc": "Besides receiving notifications directly in the app, OneKey also supports system push notifications.", - "notifications.settings_helper_title": "Push notifications", - "notifications.test_action_desc": "Click \"Test\" to preview. For help, visit the help center.", - "notifications.test_message_desc": "You’ll receive real-time account updates, security alerts, and more important info.", - "notifications.test_message_title": "Push notifications are ready!", - "notifications.windows_notifications_permission_desc": "Get notifications from apps and other senders", - "onboarding.activate_device": "Activate your device", - "onboarding.activate_device_all_set": "All set!", - "onboarding.activate_device_by_restore": "Restore wallet", - "onboarding.activate_device_by_restore_help_text": "Restore your wallet using an existing recovery phrase.", - "onboarding.activate_device_by_restore_warning": "Package security check", - "onboarding.activate_device_by_restore_warning_help_text": "Your package should not contain any pre-set PINs or Recovery Phrases. If such items are found, stop using the device and immediately contact OneKey Support for assistance.", - "onboarding.activate_device_by_set_up_new_wallet": "Set up new wallet", - "onboarding.activate_device_by_set_up_new_wallet_help_text": "Configure your device to create a new wallet.", - "onboarding.activate_device_choosing_language_message": "After choosing a language on your device and reviewing the basic guide:", - "onboarding.activate_device_help_text": "Set up your hardware wallet to get started.", - "onboarding.backup_recovery_phrase_help_text": "Write down each phrase in order and store them in a secure location", - "onboarding.backup_recovery_phrase_title": "Backup recovery phrases", - "onboarding.before_reveal_message": "Before you proceed", - "onboarding.bluetooth_connect_help_text": "Looking for devices", - "onboarding.bluetooth_permission_needed": "Bluetooth permission needed", - "onboarding.bluetooth_permission_needed_help_text": "To connect via Bluetooth, please enable access in Settings.", - "onboarding.bluetooth_prepare_to_connect": "Keep the device nearby", - "onboarding.bluetooth_prepare_to_connect_help_text": "Ensure the device is powered on and within range, then press \"Start connection\" below to start the connection", - "onboarding.bullet_forgot_passcode_use_recovery": "If you forget your passcode, you can use the recovery phrase to regain access to your wallet.", - "onboarding.bullet_forgot_password_use_recovery": "If you forget your password, you can use the recovery phrase to get back into your wallet.", - "onboarding.bullet_never_share_recovery_phrase": "Never share it with anyone or enter it into any form.", - "onboarding.bullet_onekey_support_no_recovery_phrase": "OneKey Support will never ask for your recovery phrase.", - "onboarding.bullet_recovery_phrase_full_access": "The recovery phrase alone gives you full access to your wallets and funds.", - "onboarding.choose_import_method": "Choose import method", - "onboarding.connect_your_device": "Connect your device", - "onboarding.create_qr_wallet_scan_qr_code_desc": "Back to here, click the button below to scan the QR code", - "onboarding.create_qr_wallet_show_qr_code_desc": "Go to \"Connect App Wallet\" > \"QR Code\" > \"OneKey Wallet\" to view the QR code", - "onboarding.create_qr_wallet_title": "Create QR-based wallet", - "onboarding.create_qr_wallet_unlock_device_desc": "Unlock your OneKey Pro", - "onboarding.device_mini_set_up_import": "Select \"Restore Wallet\"", - "onboarding.device_set_up_backup": "Write down all recovery phrase", - "onboarding.device_set_up_backup_desc": "Securely record your recovery phrase and complete the check. It's crucial for accessing your wallet if you forget your PIN or lose your device.", - "onboarding.device_set_up_create_new_wallet": "Select \"Create New Wallet\"", - "onboarding.device_set_up_create_new_wallet_desc": "Initiate your wallet setup by selecting \"Create New Wallet\". You will be guided through creating a unique recovery phrase and setting a secure PIN.", - "onboarding.device_set_up_enter_recovery_phrase": "Enter recovery phrase", - "onboarding.device_set_up_enter_recovery_phrase_desc": "Carefully enter your recovery phrase word by word. This unique phrase is essential for the security and recovery of your wallet.", - "onboarding.device_set_up_import": "Select \"Import Wallet\"", - "onboarding.device_set_up_import_desc": "Follow the prompts to secure your wallet with a PIN and enter your recovery phrase to complete the process.", - "onboarding.device_set_up_pin": "Set PIN", - "onboarding.device_set_up_pin_desc": "Create a strong PIN to protect your wallet just like you would with a bank card. Avoid easy sequences or repeated numbers.", - "onboarding.enable_bluetooth": "Enable Bluetooth", - "onboarding.enable_bluetooth_help_text": "Bluetooth needs to be turned on to proceed.", - "onboarding.finalize_creating_wallet": "Creating your wallet", - "onboarding.finalize_encrypting_data": "Encrypting your data", - "onboarding.finalize_generating_accounts": "Generating your accounts", - "onboarding.finalize_ready": "Your wallet is now ready", - "onboarding.finalize_wallet_setup": "Finalize wallet setup", - "onboarding.import_recovery_phrase_warning": "Security alert", - "onboarding.import_recovery_phrase_warning_help_text": "For your asset safety, avoid importing the recovery phrase of your hardware wallet and use \"Connect Hardware Wallet\" for optimal security.", - "onboarding.install_onekey_bridge": "Install OneKey Bridge", - "onboarding.install_onekey_bridge_help_text": "OneKey Bridge facilitates seamless communication between OneKey and your browser for a better experience.\n\nIf you encounter issues during the installation of OneKey Bridge, please refer to the online tutorial for assistance.", - "onboarding.migrate_from_v4": "Migrate from OneKey v4", - "onboarding.onekey_hw": "OneKey Hardware Wallet", - "onboarding.onekey_hw_intro_desc": "OneKey Hardware Wallet, a secure and user-friendly solution for crypto management. It supports multiple cryptocurrencies and ensures robust encryption for safe transactions.", - "onboarding.onekey_hw_intro_title": "Your secure crypto solution", - "onboarding.save_phrase_securely_instruction": "Read the following, then save the phrase securely.", - "onboarding.usb_connect_help_text": "Connect your device via USB", - "onboarding.verify_recovery_phrase_title": "Verify your recovery phrase", - "onboarding.welcome_description": "Simple, secure crypto management", - "onboarding.welcome_message": "Welcome to OneKey", - "open_as_popup": "Open as popup", - "open_as_sidebar": "Open as side panel", - "open_in_mobile_app": "Open in Mobile App", - "open_ordinals_transfer_tutorial_url_message": "How to transfer Ordinals assets?", - "p2pkh_desc": "Starts with \"1\". P2PKH (m/44'/0'/0')", - "p2sh_p2wpkh_desc": "Starts with \"bc1q\". P2SH-P2WPKH (m/84'/0'/0')", - "p2tr_desc": "Starts with \"bc1p\". P2TR (m/86'/0'/0')", - "p2wpkh_desc": "Starts with \"3\". P2WPKH (m/49'/0'/0')", - "prime.agree_to_terms": "By continuing, you accept the OneKey Prime Terms.", - "prime.change_email": "Change email", - "prime.change_password": "Change password", - "prime.code_resend": "Resend", - "prime.confirm_password": "Confirm password", - "prime.confirm_password_description": "Before you change your password, we need to verify the current password of your OneKey ID.", - "prime.currently_email": "Currently: {currentlyemail}", - "prime.description": "Unlock advanced features to enhance your crypto asset management experience.", - "prime.email_changed": "Email changed", - "prime.end_date": "Ends on {data}", - "prime.enter_verification_code": "Enter the verification code", - "prime.forget_password": "Forgot your password?", - "prime.incorrect_password": "Incorrect password", - "prime.invalid_verification_code": "Invalid verification code", - "prime.log_out": "Log out", - "prime.manage_subscription": "Manage subscription", - "prime.manage_your_onekeyid": "Manage your OneKey ID.", - "prime.monthly": "Monthly", - "prime.new_email_code": "Please enter your new email address. We'll send you a verification code to confirm it.", - "prime.new_password": "New Password", - "prime.new_password_description": "You are resetting new password for: {email}", - "prime.onekeyid_continue": "Continue with OneKey ID", - "prime.onekeyid_continue_description": "OneKey ID is all you need to access all Prime benefits.", - "prime.onekeyid_email_error": "Incorrect email address", - "prime.onekeyid_log_out": "OneKey ID log out", - "prime.onekeyid_log_out_decription": "Due to OneKey ID password change, this device has been logged out. Please log in again.", - "prime.onekeyid_signup": "Sign up for OneKey ID", - "prime.onekeyid_signup_description": "{email} is not registered yet, so we will create a new account for you.", - "prime.password": "Password", - "prime.password_characters": "At least 8 characters", - "prime.password_letter": "At least one letter", - "prime.password_number": "At least one number", - "prime.password_placeholder": "Password", - "prime.password_special_characters": "At least one special character", - "prime.payment_cancelled": "Payment has been cancelled", - "prime.payment_successful": "Payment successful", - "prime.payment_successful_description": "Thank you for your purchase. May OneKey Prime help you achieve a safer and more premium experience.", - "prime.per_month": "Per Month", - "prime.save_discount": "Save {discount%}", - "prime.send_code": "Send code", - "prime.sent_to": "Sent to {email}", - "prime.signup_login": "Sign up / Login", - "prime.status_free": "Free", - "prime.status_prime": "Prime", - "prime.subscribe": "Subscribe", - "prime.update_email_address": "Update email address", - "prime.update_email_address_description": "To update your email address, please verify the currently Email first.", - "prime.welcome_back": "Welcome back", - "prime.yearly": "Yearly", - "protection_passwordless_nostr_signing_text": "Nostr signing without passcode", - "provider.amount_received": "{amount} {token}", - "provider.amount_required": "Insufficient input amount", - "provider.approval_require": "Need to approve token before swap", - "provider.cow_route": "CoW Swap is a meta DEX aggregator that uses intents and batch auctions to provide users with the best prices for their trades while protecting them from maximal extractable value (MEV).", - "provider.fee": "$0.16 ", - "provider.ios_popover.approval_require_msg": "Need to approve token before swap", - "provider.ios_popover.approval_require_title": "Approval Required", - "provider.ios_popover.onekey_fee": "OneKey fee", - "provider.ios_popover.onekey_fee_content": "OneKey charges a {num} fee (limited-time discount), which is already included in the quote, supporting us in providing a high-quality, seamless experience.", - "provider.ios_popover.onekey_fee_content_2": "Please note that slippage or network fees may affect the actual amount you receive. If you have any concerns or questions, please contact us.", - "provider.ios_popover.onekey_fee_content_sub": "Please note that bridge fees, slippage, and floating rates may affect the final amount received. If you have any concerns about the fee, please contact us.", - "provider.ios_popover.order_info_title": "Order Info", - "provider.ios_popover.title": "Information", - "provider.label_anti_mev": "Anti-MEV", - "provider.label_approved": "Approved", - "provider.label_fastest": "Fastest", - "provider.label_max_received": "Max received", - "provider.label_min_fee": "Min gas", - "provider.label_overall_best": "Overall best", - "provider.max_amount_required": "Max swap amount is {amount} {token}", - "provider.min_amount_required": "Min amount requires {amount} {token}", - "provider.network_fee": "Est. network fee", - "provider.popover_fee_rate": "Fee rate", - "provider.popover_order_info_content": "OneKey aggregates the best offers. Here’s what you should know before trading", - "provider.popover_wallet": "Wallet", - "provider.protocol_fee": "Fee charged by the provider", - "provider.recommend": "Recommend", - "provider.route": "Route", - "provider.route_changelly_fix": "Please note that with the fixed rate, the expected received amount (excluding fees) will match the amount shown on the screen.", - "provider.route_changelly_float": "Please be aware that the floating rate can change at any point due to market conditions, so you might receive more or less crypto than expected.", - "provider.route_no_information": "The provider has temporarily not provided route information.", - "provider.route_swft": "Please be aware that this transaction is utilizing a third-party SWFT_BRIDGE cross-chain bridge, which involves centralized execution and carries associated risks.", - "provider.route_unable_fetch_price": "Failed to fetch the quote", - "provider.sort_item_gas": "Gas Fee", - "provider.sort_item_received": "Est. Recevied", - "provider.sort_item_swap_duration": "Swap Duration", - "provider.sort_title": "Sort", - "provider.swap_duration": "Est. swap duration", - "provider.time": "< 1min", - "provider.title": "Select provider", - "provider.token_not_supported": "Token not supported", - "provider.unavailable": "Unavailable", - "qr_wallet_address_creation_failed_dialog_title": "Address creation failed", - "qr_wallet_address_creation_failed_firmware_update_desc": "If you can't create addresses for some EVM networks, update your firmware via our update tool and disable Air-gap mode if it's on.", - "qr_wallet_address_creation_failed_supports_network_desc": "QR wallet supports BTC and EVM-compatible networks, with BIP44 as the only standard for EVM networks.", - "receive.address_unconfimed_alert_message": "Address unconfirmed", - "receive.hide_unverified_address": "Hide unverified address", - "receive.send_asset_warning_message": "Send only {network} network assets to this address", - "receive.show_address_any": "Show address anyway", - "receive_token_list_footer_text": "Can't find token? Try searching", - "remove_account_desc": "This account will be removed.", - "remove_device": "Remove device", - "remove_device_desc": "This will permanently delete your data. But you still can restore it from the hardware wallet which is loaded the recovery phrase of this wallet.", - "remove_hidden_wallet_desc": "This will permanently delete your data. Ensure you have saved the passphrase of this hidden wallet.", - "remove_private_key_account_desc": "You can restore the account using its private key after removal. Ensure it's backed up to avoid permanent loss of access.", - "remove_wallet": "Remove wallet", - "remove_wallet_desc": "Make sure you've written down the recovery phrase before removing the wallet. Otherwise, you won't be able to recover the wallet.", - "remove_wallet_double_confirm_message": "I've written down the recovery phrase", - "reset_app_desc": "This will delete all the data you have created on OneKey. After making sure that you have a proper backup, enter \"RESET\" to reset the App", - "san_qr_code_to_verify_details": "Scan the QR code with your device to verify the details.", - "scan.camera_access_denied": "Camera access denied", - "scan.enable_camera_permissions": "OneKey requires camera access to scan QR codes. Please go to “Settings” and enable camera permissions to use this feature.", - "scan.grant_camera_access_in_expand_view": "Please grant camera access in the expand view.", - "scan.move_closer_if_scan_fails": "If the scan fails, adjust the device-camera distance and retry", - "scan.no_recognizable_qr_code_found": "No recognizable QR code found.", - "scan.qr_wallet_detected": "QR wallet detected. Go to connect this wallet?", - "scan.scan_address_codes_to_copy_address": "Scan address codes to copy address", - "scan.scan_qr_code": "Scan QR code", - "scan.scan_qr_code_on_device": "Scan QR code on device", - "scan.scan_walletconnect_code_to_connect_to_sites": "Scan WalletConnect code to connect to sites", - "scan.screen_blurred_for_security": "We've blurred your screen for security, but it won't affect your scan", - "scan.select_a_photo": "Select a photo", - "scan.show_qr_code_steps": "To show your QR code, go to Connect App Wallet > QR Code > OneKey Wallet on your device", - "scanning_text": "Scanning", - "secure_qr_toast_scan_qr_code_on_device_text": "Return when the QR code shows, click 'Next', then scan it.", - "select_recovery_phrase_length": "Select a length", - "selected_network_only_supports_device": "The selected network currently only supports {deviceType}", - "send.address_exists": "The address already exists", - "send.address_invalid": "Invalid address. Please check and re-enter.", - "send.address_not_allowlist_error": "Transfer allowlist is enabled. The address is not on the allowlist. Please try to_edit_address_book_pageadding it.", - "send.amount": "Amount", - "send.amount_invalid": "Insufficient balance. Please try a smaller amount", - "send.amount_too_small": "Transfer amount too small.", - "send.authentication_failed_verify_again": "Authentication failed, please check your network connection and try again.", - "send.available": "Available: {number}", - "send.balance": "Balance: {number}", - "send.cannot_send_amount_zero": "Cannot send 0 amount", - "send.cannot_send_to_self": "Cannot send to yourself", - "send.check_request_error": "Check request error, please refresh again", - "send.description_balance_info": "Balance does not include locked or small UTXOs", - "send.description_frozen_funds_info": "Balance does not include frozen funds", - "send.engine_account_not_activated": "Account not activated.", - "send.engine_failed_to_transfer": "Transfer failed.", - "send.engine_incorrect_address": "Incorrect address.", - "send.engine_incorrect_passcode": "Incorrect passcode", - "send.engine_incorrect_password": "Incorrect password.", - "send.engine_incorrect_token_address": "Incorrect token address.", - "send.engine_incorrect_transfer_value": "Incorrect transfer amount.", - "send.engine_internal_error": "Service error.", - "send.engine_not_implemented": "Function not yet implemented.", - "send.engine_passcode_not_set": "Passcode not set", - "send.engine_password_not_set": "Password not set.", - "send.engine_pending_queue_too_long": "Too many pending transactions in the queue.", - "send.engine_too_many_derived_accounts": "Number of accounts exceeds the limit.", - "send.ens_choose_address_title": "Choose an Address", - "send.error_insufficient_balance": "Insufficient {token} balance", - "send.error_minimum_amount": "Minimum amount {amount} {token}", - "send.error_recipient_requires_activation": "Recipient requires {amount} {token} to activate", - "send.estimated_gas_failure": "Gas estimation failed.", - "send.field_large_than": "Must be greater than {0}.", - "send.field_only_integer": "Must be a positive integer.", - "send.field_too_large": "Cannot be greater than {0}.", - "send.field_too_small": "Must not be less than {0}.", - "send.insufficient_liquidity_of_lightning_node_channels": "Insufficient liquidity in Lightning node channels.", - "send.invalid_address_ordinal_can_only_be_sent_to_taproot_address": "Invalid address! Ordinal assets can only be sent to Taproot addresses.", - "send.invalid_lightning_payment_request": "Invalid Lightning payment request.", - "send.invoice_is_already_paid": "Invoice is already paid.", - "send.label_cex": "You are depositing to a centralized exchange address. Please double-check the selected network and address.", - "send.label_cex_title": "CEX", - "send.label_contract_address": "The contract address is labeled {name}.", - "send.label_contract_address_title": "Contract address", - "send.label_first_transfer": "Initial transfer", - "send.label_scam": "You are sending to a scam address, which could result in a loss of your assets. Please double-check the address and be aware of any risks.", - "send.label_scam_title": "Scam address", - "send.label_transferred": "Transferred", - "send.label_wallet_name": "Wallet name / Account name", - "send.max": "Max", - "send.memo_up_to_length": "Up to {number} characters", - "send.nft_amount": "Amount", - "send.nft_does_not_exist": "NFT does not exist.", - "send.no_route_found": "No route found.", - "send.no_token_message": "No tokens were found at this address", - "send.passcode_validation": "Passcode must be between 8 and 128 characters.", - "send.password_validation": "Password must be between 8 and 128 characters.", - "send.preview_button": "Preview", - "send.recipient_invalid": "Invalid recipient. Please check and re-enter", - "send.sending_str_requires_an_account_balance_of_at_least_str_str": "Sending {0} requires an account balance of at least {1} {2}.", - "send.str_minimum_balance_is_str": "Sending failed. Minimum balance for {token} is {amount}.", - "send.str_minimum_transfer": "Minimum transfer amount is {0}.", - "send.suggest_reserving_str_as_gas_fee": "Suggest reserving {0} as a network fee.", - "send.tag": "Tag", - "send.tag_placeholder": "Comment, tag, memo or note", - "send.the_invoice_has_expired": "Invoice has expired.", - "send.the_minimum_value_for_transffering_to_a_new_account_is_str_str": "The minimum value for transferring to a new account is {amount} {symbol}.", - "send.title": "Send", - "send.to": "To", - "send.to_contacts_selecor_account": "My account", - "send.to_contacts_selecor_account_title": "Select", - "send.to_contacts_selecor_address_book": "Address book", - "send.to_contacts_tooltip": "Contacts", - "send.to_ln_placeholder": "Enter Invoice, Lightning Address, LNURL or Node ID", - "send.to_paste_tooltip": "Paste", - "send.to_placeholder": "Enter address or domain name", - "send.to_scan_tooltip": "Scan", - "send.toast_btc_fork_insufficient_fund": "Insufficient balance. Please try a smaller amount", - "send.verification_failure": "Verification failed.", - "send_token_selector.no_match_found": "No match found for your search.", - "send_token_selector.no_results": "No Results", - "send_token_selector.search_placeholder": "Search symbol or contract address", - "send_token_selector.select_token": "Select Token", - "setting.floating_icon": "Floating icon", - "setting.floating_icon_always_display": "Always display", - "setting.floating_icon_always_display_description": "When enabled, OneKey will activate a floating icon in the bottom right corner of the webpage, which can help you check the security information of dApps.", - "settings.account_derivation_path": "Account derivation path", - "settings.account_derivation_path_desc": "If you don’t see the accounts you expect, try switching the derivation path.", - "settings.account_sync_dapp_to_wallet_mode_description": "Automatically syncs your dApp account and network settings to your wallet when switching back from a dApp.", - "settings.account_sync_dapp_to_wallet_mode_title": "Align dApp account to wallet", - "settings.account_sync_independent_mode_description": "Wallet and dApp accounts operate independently, without interfering with each other.", - "settings.account_sync_independent_mode_title": "Independent mode", - "settings.account_sync_modal_title": "Align primary account", - "settings.account_sync_wallet_to_all_mode_description": "Your current wallet account will be used for all dApp interactions.", - "settings.account_sync_wallet_to_all_mode_title": "Always use wallet account", - "settings.address_book": "Address book", - "settings.app_update_available": "App update available", - "settings.app_update_cache": "App update cache", - "settings.auto_lock": "Auto-lock", - "settings.backup_recovery_phrase_to_onekey_keytag": "Backup your recovery phrase to OneKey KeyTag", - "settings.backup_recovery_phrase_to_onekey_lite": "Backup your recovery phrase to OneKey Lite", - "settings.backup_with_onekey_keytag": "Back up with OneKey KeyTag", - "settings.browser_cache": "Browser cache", - "settings.browser_history_bookmarks_pins_risk_dapp_whitelist": "Browser history, bookmarks, pins, risk dApp whitelist", - "settings.change_pin": "Change PIN", - "settings.clear_browser_cache": "Clear browser cache", - "settings.clear_browser_cache_desc": "Open this link in your browser to clear the cache: {url}", - "settings.clear_browser_cache_desc2": "Please go to the browser settings page to continue clearing.", - "settings.clear_cache_on_app": "Clear cache on App", - "settings.clear_data": "Clear data", - "settings.clear_pending_transactions": "Clear pending transactions", - "settings.clear_pending_transactions_desc": "Clear the pending data in the local history record.", - "settings.clear_successful": "Clear successful", - "settings.connected_sites": "Connected sites", - "settings.create_remove_wallets": "Create / remove wallets without passcode", - "settings.create_remove_wallets_desc": "No passcode needed for creating/removing wallets", - "settings.create_transactions": "Create transaction without passwcode", - "settings.create_transactions_desc": "No passcode needed for transactions", - "settings.cryptocurrency": "Cryptocurrency", - "settings.default_currency": "Default currency", - "settings.default_wallet_settings": "Default wallet settings", - "settings.export_network_config_custom_network_label": "EVM networks and tokens", - "settings.export_network_config_desc": "Export your custom network configurations from OneKey 4.0.", - "settings.export_network_config_label": "Export custom network config", - "settings.export_state_logs": "Export state logs", - "settings.export_state_logs_desc": "This will help us debug any issue you might encounter. Please send to {email} to contact OneKey support.", - "settings.fiat": "Fiat", - "settings.go_to_settings_page_now": "Go to the Settings Page Now?", - "settings.google_drive_backup": "Google Drive backup", - "settings.hardware_bridge_status": "Hardware bridge status", - "settings.hardware_wallets_not_appear": "Hardware wallets will not appear here.", - "settings.help_center": "Help center", - "settings.how_to_import_from_onekey_keytag": "How to import from OneKey KeyTag?", - "settings.how_to_import_from_onekey_keytag_desc": "Sum the numbers in each row. This sum represents the word's position in the word list.\nThen, visit the {dotmap} website to find the corresponding word for this position.", - "settings.icloud_backup": "iCloud backup", - "settings.if_away_for_1_hr": "If away for 1 hr", - "settings.if_away_for_1_min": "If away for 1 min", - "settings.if_away_for_30_mins": "If away for 30 mins", - "settings.if_away_for_4_hrs": "If away for 4 hrs", - "settings.if_away_for_5_mins": "If away for 5 mins", - "settings.import_recovery_phrase_from_onekey_keytag": "Import recovery phrase from your OneKey KeyTag", - "settings.import_recovery_phrase_from_onekey_lite": "Import recovery phrase from your OneKey Lite", - "settings.lock_now": "Lock now", - "settings.logs_do_not_include_sensitive_data": "Logs do not include sensitive data like recovery phrases or private keys. They only contain local data, crash reports, and public wallet addresses.", - "settings.migration": "Migration", - "settings.nfc_not_supported": "Your current device does not support NFC, replace it with an NFC-enabled device and try again.", - "settings.no_connected_sites": "No connected sites", - "settings.no_connected_sites_desc": "All sites connected through OneKey will appear here.", - "settings.no_signed_text": "No signed text", - "settings.no_signed_text_desc": "All text signed through OneKey will appear here.", - "settings.no_signed_transactions": "No signed transactions", - "settings.no_signed_transactions_desc": "All transactions signed through OneKey will appear here.", - "settings.onekey_keytag_desc": "Powerful wallet backup kit made of titanium alloy", - "settings.onekey_lite_desc": "Restore your wallet without typing one word.", - "settings.onekey_wants_to_use_nfc": "\"OneKey\" wants to use NFC", - "settings.onekey_wants_to_use_nfc_desc": "To connect to OneKey Lite, NFC permissions are required.", - "settings.passcode_bypass": "Passcode bypass", - "settings.passcode_bypass_desc": "When the allowed time of 2 hours is exceeded, passcode verification is still required to ensure security.", - "settings.passkey": "PassKey", - "settings.password_bypass": "Password bypass", - "settings.password_bypass_desc": "When exceeding the allowed time of 2 hours, password verification is still required to ensure security.", - "settings.privacy_policy": "Privacy policy", - "settings.protection": "Protection", - "settings.protection_passcode_section_title": "Passcode protection", - "settings.rate_app": "Rate the App", - "settings.reset": "Reset", - "settings.reset_app": "Reset App", - "settings.reset_app_desc": "This will delete all data on OneKey. Ensure you have a backup, then enter \"RESET\" to proceed.", - "settings.resources": "Resources", - "settings.select_wallet": "Select wallet", - "settings.set_auto_lock_duration_desktop": "When the app runs in the background without exiting or when the device screen is locked, it will automatically lock after a specified period of time.", - "settings.set_auto_lock_duration_extension": "When closing the plugin window or when in full-screen mode with unused tabs, it will automatically lock after a specified period of time.", - "settings.set_auto_lock_duration_mobile": "When the app runs in the background without exiting or when the device screen is locked, it will automatically lock after a specified period of time.", - "settings.set_auto_lock_duration_web": "When the app is in an unused tab or minimized window, it will automatically lock after a specified period of time.", - "settings.settings": "Settings", - "settings.shortcuts": "Shortcuts", - "settings.sign_text": "Sign text", - "settings.signature_record": "Signature record", - "settings.spend_dust_utxo": "Spend dust UTXO", - "settings.spend_dust_utxo_desc": "Using dust UTXO increases transaction fees and reduces privacy. It's recommended to disable this feature to avoid malicious tracking.", - "settings.step1_get_bip39_dotmap": "Step 1: get your BIP39 dotmap", - "settings.step1_get_bip39_dotmap_desc": "Visit the {dotmap} online or refer to the physical map in your KeyTag starter guide.", - "settings.step2_match_recovery_phrase_dots": "Step 2: match recovery phrase dots", - "settings.step2_match_recovery_phrase_dots_desc": "Locate the dot pattern for each word of your recovery phrase on the {dotmap} .", - "settings.step3_align_and_punch": "Step 3: align and punch", - "settings.step3_align_and_punch_desc": "Each line of KeyTag represents a word. Use a center punch tool for accurate punching based on the black circle's position.\nFor Passphrase backup, punch on the line marked with '*'.", - "settings.submit_request": "Submit a request", - "settings.swap_history": "Swap history", - "settings.system_idle_lock": "System idle lock", - "settings.system_idle_lock_desc": "When enabled, starts timing when there is no user activity, even if the app is in the foreground", - "settings.theme": "Theme", - "settings.token_nft_data": "Token & NFT data", - "settings.token_risk_protection": "Risk protection", - "settings.token_risk_reminder": "Token risk reminder", - "settings.token_risk_reminder_desc": "When enabled, you'll be reminded when selecting non-verified tokens.", - "settings.transaction_history": "Transaction history", - "settings.transactions": "Transactions", - "settings.turn_on_nfc": "Turn on NFC and Let \"OneKey\" Connect Your Hardware Devices", - "settings.unable_to_connect": "Unable to connect", - "settings.user_agreement": "User agreement", - "settings.version_versionnum": "version {versionNum}", - "settings.view_address_in_explorer": "View address in explorer", - "settings.view_transaction_in_explorer": "View transaction in explorer", - "settings.whats_new": "What’s new", - "settings_protection.allowlist_content": "When enabled, you can only send funds to accounts within the wallet or to allowlisted addresses in the address book.", - "settings_protection.allowlist_title": "Transfer allowlist", - "shortcut.go_back": "Go back", - "shortcut.go_forward": "Go forward", - "shortcut.hide_sidebar": "Hide sidebar", - "shortcut.show_sidebar": "Show sidebar", - "shortcuts.account_selector": "Account selector", - "shortcuts.close_current_tab": "Close current tab", - "shortcuts.go_to_browser_tab": "Go to browser tab", - "shortcuts.go_to_earn_tab": "Go to earn tab", - "shortcuts.go_to_market_tab": "Go to market tab", - "shortcuts.go_to_swap_tab": "Go to swap tab", - "shortcuts.go_to_wallet_tab": "Go to wallet tab", - "shortcuts.network_selector": "Network selector", - "sig.account_rent_label": "Account rent", - "sig.approval_label": "Approval", - "sig.approve_to_label": "Approve to", - "sig.interact_contract_label": "Interact contract", - "sig.revoke_approval_label": "Revoke approval", - "sig.revoke_from_label": "Revoke from", - "sig.sigature_request_label": "Signature request", - "sign.swap_estimate_receive": "Estimate received", - "skip_verify_text": "I don't have my device with me", - "slippage_tolerance.button_save": "Save", - "slippage_tolerance.description": "Auto slippage optimizes slippage based on pool liquidity and trading volume, reducing transaction failures and MEV attack risks.", - "slippage_tolerance.error_message": "Slippage Tolerance must be between 0 to 50%.", - "slippage_tolerance.input_placeholder": "0.005", - "slippage_tolerance.popover": "Slippage tolerance is a setting for the amount of price slippage you are willing to accept for a trade.", - "slippage_tolerance.switch_auto": "Auto", - "slippage_tolerance.switch_custom": "Custom", - "slippage_tolerance.title": "Slippage tolerance", - "slippage_tolerance.warning_message_1": "High slippage tolerance may cause your asset loss.", - "slippage_tolerance.warning_message_2": "Slippage under {number}% may cause trade failure.", - "speed_up_cancellation": "Speed up cancellation", - "spotlight.account_alignment_desc": "OneKey now defaults to automatically switching to your last used dApp account. To change this setting, go to Settings > Align primary account.", - "spotlight.enable_account_asset_message": "If balances are missing, go to \"Networks\" on the homepage and select \"All networks\" first.", - "spotlight.enable_network_message": "Manage network visibility and quickly copy addresses for any network in 'All networks' view.", - "swap_account.from_address": "{addrss}", - "swap_account.to_address": "{addrss}", - "swap_account.to_address_edit": "(edited)", - "swap_account.to_address_edit_button": "Reset", - "swap_history.all_history": "All history", - "swap_history.all_history_content": "This will clear all history in the local history record.", - "swap_history.all_history_title": "Clear all history", - "swap_history.amount_received": "+{amount} {token}", - "swap_history.amount_sent": "-{amount} {token}", - "swap_history.date_time_format": "{date} {time}", - "swap_history.pending_history": "Pending history", - "swap_history.pending_history_content": "This will clear all pending data in the local history record, but it will not affect the status of this transaction on the blockchain.", - "swap_history.pending_history_title": "Clear pending history", - "swap_history.status_canceled": "Canceled", - "swap_history.status_cancelling": "Cancelling", - "swap_history.status_discard": "Timeout", - "swap_history.status_failed": "Failed", - "swap_history.status_pending": "Pending", - "swap_history.status_success": "Success", - "swap_history.title": "History", - "swap_history.transaction_format": "{token_from} → {token_to}", - "swap_history_detail.badge_bridge_failed": "Bridge transaction failed", - "swap_history_detail.badge_bridge_pending": "Bridge transaction pending", - "swap_history_detail.badge_bridge_success": "Bridge transaction successful", - "swap_history_detail.badge_expired": "Order expired", - "swap_history_detail.badge_from_failed": "Source chain transaction failed", - "swap_history_detail.badge_from_pending": "Source chain transaction pending", - "swap_history_detail.badge_from_success": "Source chain transaction successful", - "swap_history_detail.badge_provider_error": "Provider error", - "swap_history_detail.badge_refund_failed": "Refund failed", - "swap_history_detail.badge_refunded": "Refunded", - "swap_history_detail.badge_refunding": "Refunding", - "swap_history_detail.badge_to_failed": "Target chain transaction failed", - "swap_history_detail.badge_to_pending": "Target chain transaction pending", - "swap_history_detail.badge_to_success": "Target chain transaction successful", - "swap_history_detail.clear_content": "This will clear clear the data in the local history record.", - "swap_history_detail.clear_title": "Clear history", - "swap_history_detail.date": "Time", - "swap_history_detail.delete_confirm": "Delete", - "swap_history_detail.delete_title": "Are you sure to delete all history?", - "swap_history_detail.from": "Pay network", - "swap_history_detail.network_fee": "Network fee", - "swap_history_detail.order_detail": "Status detail", - "swap_history_detail.order_status": "Order status", - "swap_history_detail.pay_address": "Pay address", - "swap_history_detail.protocol_fee": "Provider Fee", - "swap_history_detail.provider": "Provider", - "swap_history_detail.rate": "Rate", - "swap_history_detail.receive_amount": "+Receive Amount", - "swap_history_detail.received_address": "Received address", - "swap_history_detail.send_amount": "-Send Amount", - "swap_history_detail.service_fee": "Service Fee", - "swap_history_detail.status_pending": "Pending", - "swap_history_detail.surplus": "Surplus", - "swap_history_detail.swap_duration": "Swap duration", - "swap_history_detail.title": "Transaction", - "swap_history_detail.to": "Received nework", - "swap_history_detail.toast_copy": "Copied", - "swap_history_detail.transaction_hash": "Transaction hash", - "swap_history_detail.transaction_price": "Transaction Price", - "swap_history_detail.view_in_browser": "View on Explorer", - "swap_page.account": "Account {number}", - "swap_page.account_to_address_title": "Edit address", - "swap_page.alert.account_does_not_support_swap": "Connected account doesn't support swap. Try another.", - "swap_page.alert.fee_exceeds_amount": "Est network fee exceeds swap amount, proceed with caution.", - "swap_page.alert.fee_exceeds_amount_title": "Network fee alert", - "swap_page.alert.maximum_amount": "Max amount {number} {symbol}", - "swap_page.alert.minimum_amount": "Minimum amount {number} {symbol}", - "swap_page.alert.network_fee_deducted": "Network fee in ETH deducted automatically in the next step.", - "swap_page.alert.no_provider_supports_trade": "No provider supports this trade", - "swap_page.alert.not_best_rate": "The current provider does not offer the best rate for this trade.", - "swap_page.alert.require_native_token_content": "Some bridges charge additional source chain native tokens as a bridge fee.", - "swap_page.alert.require_native_token_title": "Require {n} {token}", - "swap_page.alert.tax_detected": "The tax for the token goes to the token project, not OneKey.", - "swap_page.alert.tax_detected_buy": "buy", - "swap_page.alert.tax_detected_sell": "sell", - "swap_page.alert.tax_detected_title": "{percentage} {token} {action} tax detected", - "swap_page.alert.value_drop": "High price impact may cause your asset loss.", - "swap_page.alert.value_drop_title": "{number} value drop", - "swap_page.amount": "{number}", - "swap_page.approve_and_swap": "Approve and swap", - "swap_page.approve_button": "Approve {token} to {target}", - "swap_page.balance": "Balance: {number}", - "swap_page.bridge": "Bridge", - "swap_page.button_approve_amount": "Approve {number}", - "swap_page.button_approve_unlimited": "Approve unlimited", - "swap_page.button_cross_chain": "Bridge", - "swap_page.button_enter_a_recipient": "Enter a recipient", - "swap_page.button_enter_amount": "Enter amount", - "swap_page.button_fetching_quotes": "Fetching quotes", - "swap_page.button_insufficient_balance": "Insufficient balance", - "swap_page.button_no_connected_wallet": "No wallet connected", - "swap_page.button_no_enough_fee": "Not enough to cover network fee", - "swap_page.button_no_liquidity": "No liquidity for this trade", - "swap_page.button_refresh_quotes": "Refresh quotes", - "swap_page.button_select_token": "Select token", - "swap_page.button_wrap": "Swap via Wrap Contract", - "swap_page.buy_sell_tax": "{token} token tax", - "swap_page.create_to_enable_network": "Create to enable the network", - "swap_page.from": "From", - "swap_page.limit": "Limit", - "swap_page.limit_dialog_button": "Confirm", - "swap_page.limit_dialog_content": "Limit order will be available soon. If you have old orders on OneKey V4, you can visit Matcha (https://matcha.xyz) to view or manage your orders.", - "swap_page.limit_dialog_title": "Limit order", - "swap_page.max": "Max", - "swap_page.no_address": "No {network} address", - "swap_page.percentage_change": "(+{number}%)", - "swap_page.price_impact_content_1": "Value difference = (Received value – Paid value) / Paid value", - "swap_page.price_impact_content_2": "When a pool has low liquidity, your trade may experience greater price impact. OneKey Swap will initiate a price impact warning to alert you to the potential for significant loss.", - "swap_page.price_impact_title": "Value difference", - "swap_page.provider.approve": "Approve", - "swap_page.provider.approve_amount": "Approve amount", - "swap_page.provider.approve_amount_limit": "{value} {token}", - "swap_page.provider.approve_amount_un_limit": "Unlimited", - "swap_page.provider.approve_usdt_dialog_content": "Because the current USDT approved amount is lower than the intended swap amount, you must first revoke the existing one before setting a new allowance.", - "swap_page.provider.approve_usdt_dialog_title": "Insufficient approved amount", - "swap_page.provider.custom": "Custom ({number}%)", - "swap_page.provider.est_network_fee": "Est network fee", - "swap_page.provider.exchange_rate": "1 ETH = {number} USDC", - "swap_page.provider.fee_amount": "${number}", - "swap_page.provider.provider": "Provider", - "swap_page.provider.provider_insufficient_liquidity": "No provider support", - "swap_page.provider.rate_unavailable": "Failed to fetch the quote", - "swap_page.provider.slippage_auto": "Auto ({number}%)", - "swap_page.provider.slippage_tolerance": "Slippage", - "swap_page.recent_trade": "Recent trade", - "swap_page.recipient_add": "Add recipient address", - "swap_page.recipient_edit": "Edit recipient", - "swap_page.recipient_external_account": "External account", - "swap_page.recipient_modal_do_not": "Do not send to centralised exchange. Tokens sent to the wrong address are irretrievable", - "swap_page.recipient_modal_verify": "Ensure the address is correct and fully compatible with the target network", - "swap_page.recipient_send_to": "Sent to", - "swap_page.settings": "Advanced settings", - "swap_page.settings_recipient_content": "Allows you to choose a destination address for the swap other than the connected one", - "swap_page.settings_recipient_title": "Custom recipient", - "swap_page.settings_simple_mode": "Intelligent mode", - "swap_page.settings_simple_mode_content": "Offer an improved trading experience and guarantee the security of your approval", - "swap_page.swap": "Swap", - "swap_page.swap_button": "Swap", - "swap_page.swap_steps_1": "1. Approve {tokenSymbol}", - "swap_page.swap_steps_1_approve_dialog": "Give the provider permission to swap that token from your wallet. ", - "swap_page.swap_steps_2": "2. Swap", - "swap_page.to": "To", - "swap_page.toast.address_generated": "Address created", - "swap_page.toast.address_generated_fail": "Address creation failed", - "swap_page.toast.approve_canceled": "Approve cancel", - "swap_page.toast.approve_canceled_detail": "{token}", - "swap_page.toast.approve_discarded": "Approve discarded", - "swap_page.toast.approve_discarded_detail": "{token}", - "swap_page.toast.approve_failed": "Approve failed", - "swap_page.toast.approve_failed_detail": "{token}", - "swap_page.toast.approve_successful": "Approve successful", - "swap_page.toast.approve_successful_detail": "{token}", - "swap_page.toast.insufficient_balance_content": "You should reserve at least {number} {token} to cover the network fee.", - "swap_page.toast.insufficient_balance_title": "Insufficient {token} balance", - "swap_page.toast.insufficient_input_amount": "Insufficient input amount", - "swap_page.toast.swap_failed": "Swap failed", - "swap_page.toast.swap_failed_detail": "{number} {tokenSymbol} → {number} {tokenSymbol}", - "swap_page.toast.swap_successful": "Swap successful", - "swap_page.toast.swap_successful_detail": "{number} {symbol} → {number} {symbol}", - "swap_page.toast.taproot_unspported": "ThorSwap does not currently support Taproot-format BTC address.", - "swap_page.toast.token_not_supported": "Token is not supported", - "swap_page.usd_value": "${number}", - "swap_token_selector.all_token": "All token", - "swap_token_selector.contract_info": "View in explorer", - "swap_token_selector.popular_token": "Popular token", - "swap_token_selector.trending_token": "Trending token", - "symbol_and_more": "{symbol} and more", - "terms_privacy": "Use implies consent to our Terms & Privacy", - "title_403": "403 Forbidden", - "title__edit_fee": "Edit Fee", - "title__invoice_description": "Invoice description", - "title__lnurl_pay": "LNURL Pay", - "token_hidden_message": "This token is currently hidden and won't appear in the list", - "token_no_search_results_desc": "No match found for your search. Please re-enter.", - "token_selector.empty_content": "The token selected does not support cross-chain to this network.", - "token_selector.empty_title": "Unsupported", - "token_selector.network": "Network:", - "token_selector.risk_reminder.button_cancel": "Cancel", - "token_selector.risk_reminder.button_ok": "OK", - "token_selector.risk_reminder.checkbox": "Don't show this alert for all non-verified tokens", - "token_selector.risk_reminder.malicious_token_alert": "Caution! Malicious token.", - "token_selector.risk_reminder.message": "Anyone can issue tokens, including counterfeit tokens under valid projects. User who bought counterfeit tokens might not be able to sell them, resulting in asset loss. If you proceed to trade this custom token, you’ll be liable to all potential risk and responsibilities.", - "token_selector.risk_reminder.spam_token_alert": "Suspected spam token", - "token_selector.risk_reminder.title": "Risk reminder", - "token_selector.risk_reminder.token_address": "{token_address}", - "token_selector.risk_reminder.token_name": "{token_name}", - "token_selector.risk_reminder.token_symbol": "{token_symbol}", - "token_selector.search_placeholder": "Search symbol or contract address", - "token_selector.title": "Select token", - "token_selector.unverified_token_warning": "Unverified Token below. Proceed with caution.", - "touch_id_unlock_desc": "OneKey is trying to Unlock.", - "transaction.advanced": "Advanced", - "transaction.application": "dApp", - "transaction.cancel": "Cancel", - "transaction.confirm": "Confirm", - "transaction.current_gwei": "Current: {amount} Gwei", - "transaction.custom": "Custom", - "transaction.data": "Data", - "transaction.estimate_gas_limit": "Estimate gas limit is {amount}, recommend {amount}", - "transaction.expected_fee": "Expected Fee", - "transaction.fast": "Fast", - "transaction.fee_estimate": "Fee Estimate", - "transaction.layer_base_fee": "L1 Base Fee", - "transaction.max_base_fee": "Max base fee", - "transaction.max_fee": "Max Fee", - "transaction.network": "Network", - "transaction.normal": "Normal", - "transaction.slow": "Slow", - "transaction.to_contract": "To contract", - "transaction__contract_interaction": "Contract interaction", - "transaction__transaction_confirm": "Transaction confirm", - "transaction_confirm.batch_swap_tip": "By submitting this order, you are approving {token} for trading confirming a swap on {chain} powered by {provider} API. If you have any concerns about the order, please contact us.", - "transaction_confirm.single_swap_tip": "By submitting this order, you are confirming a swap on {chain} powered by {provider} API. If you have any concerns about the order, please contact us.", - "troubleshooting.change_usb_port": "Change the USB port used on your computer.", - "troubleshooting.check_bluetooth": "Ensure Bluetooth is enabled on your OneKey device (disable AirGap if using OneKey Pro).", - "troubleshooting.check_bridge": "Check if the Bridge is installed correctly. See details here.", - "troubleshooting.close_other_onekey_app": "Close any other OneKey apps, extensions, or web pages.", - "troubleshooting.connect_and_unlock": "Connect and unlock your device to see if it's detected.", - "troubleshooting.fallback_solution_label": "Still can't connect?", - "troubleshooting.help_center": "Visit our Help Center where we’ve pre-entered the specific keyword to assist you in finding the information you need.", - "troubleshooting.reconnect_and_pair": "Reconnect and pair your OneKey device.", - "troubleshooting.remove_device_from_bluetooth_list": "Go to your phone or tablet's Bluetooth settings and remove the OneKey device from the list of paired devices.", - "troubleshooting.remove_usb_dongles": "Remove any USB dongles.", - "troubleshooting.replug_usb_cable": "Replug the USB cable.", - "troubleshooting.request": "If you still can’t find a solution, click here to contact our support team for further assistance.", - "troubleshooting.restart_app": "Restart the OneKey app.", - "troubleshooting.show_helper_cta_label": "Having trouble connecting your device?", - "troubleshooting.solution_x": "Solution {number}", - "troubleshooting.try_different_usb_cable": "Try a different USB cable, making sure it supports data transfer.", - "troubleshooting.unlock_device": "Unlock your device to see if it's detected.", - "troubleshooting.use_original_usb_cable": "Use the original USB cable if possible.", - "trx_consumed": "TRX consumed", - "tx_accelerate.accelerator_selector_item_label": "{name} accelerator", - "tx_accelerate.order_inquiry_label": "Order inquiry", - "tx_accelerate.speed_up_with_accelerator_dialog_desc": "Your transaction ID will be automatically filled in for a seamless experience.", - "tx_accelerate.speed_up_with_accelerator_dialog_fee_refund": "Fees are non-refundable", - "tx_accelerate.speed_up_with_accelerator_dialog_note_fee_cal": "Additional fees will be calculated by {accelerator}", - "tx_accelerate.speed_up_with_accelerator_dialog_note_service_provide_by": "Service provided by {accelerator}", - "tx_accelerate.speed_up_with_accelerator_dialog_note_title": "Note", - "tx_accelerate.speed_up_with_accelerator_dialog_title": "Speed up with {accelerator}", - "update.all_other_apps_closed": "All other OneKey Apps and web upgrade tools are closed.", - "update.all_other_apps_closed_emoji": "All other OneKey Apps and web upgrade tools are closed. 🆗", - "update.all_updates_complete": "All updates complete 👏🏻", - "update.app_up_to_date": "You have the latest version of OneKey, thanks for staying on top of things.", - "update.app_update": "App update", - "update.app_update_latest_version": "You’re all good", - "update.app_version_ready_for_update": "App {version} ready for update", - "update.bluetooth_version_available": "Bluetooth {version} is available", - "update.bridge_network_error": "Bridge network error", - "update.bridge_not_installed": "Bridge not installed", - "update.bridge_timeout_error": "Bridge timeout error", - "update.check_connection_try_again": "Check your device's connection and try again.", - "update.checking_device": "Checking device...", - "update.checking_device_if_no_restart": "Checking device... If it doesn't restart automatically after installation, manually restart to continue.", - "update.checking_for_updates": "Checking for updates...", - "update.checking_latest_ui_resources": "Checking latest UI resources...", - "update.connection_interrupted": "Connection interrupted", - "update.connection_interrupted_desc": "The connection has been lost. Please check your network settings and try again.", - "update.connection_to_bridge_timed_out": "The connection to the bridge has timed out. Please check your internet connection and try again.", - "update.device_connected_via_bluetooth": "My device is connected via Bluetooth and the connection is stable.", - "update.device_connected_via_bluetooth_emoji": "My device is connected via Bluetooth and the connection is stable. 📲", - "update.device_connected_via_usb": "My device is connected via USB cable.", - "update.device_connected_via_usb_emoji": "My device is connected via USB cable. 🔌", - "update.device_disconnected": "Device disconnected", - "update.device_disconnected_desc": "The device has been disconnected. Please reconnect the device and try again.", - "update.device_fully_charged": "The device battery is fully charged and connected to power.", - "update.device_fully_charged_emoji": "The device battery is fully charged and connected to power. 🔋", - "update.device_in_bootloader_mode": "Device in bootloader mode", - "update.device_mismatch_detected": "Device mismatch detected", - "update.device_mismatch_detected_desc": "A different device has been detected. Please connect the original device intended for this operation.", - "update.download_failed": "Download failed", - "update.download_on_github": "Download on Github", - "update.download_success": "Download success", - "update.download_timed_out_check_connection": "Download timed out, please check your internet connection.", - "update.downloading": "Downloading...", - "update.downloading_latest_ui_resources": "Downloading latest UI resources...", - "update.downloading_package": "Downloading package... {progress}%", - "update.ensure_one_usb_device_connected": "Please ensure only one USB device is connected to proceed with the upgrade. If multiple devices are connected, disconnect the others and try again.", - "update.failed_to_enter_bootloader_mode": "Failed to enter bootloader mode", - "update.firmware_version_available": "Firmware {version} is available", - "update.follow_online_tutorial_to_proceed_manually": "Follow the online tutorial to proceed manually, then click \"Retry\".", - "update.hardware_sdk_initialization_failed": "Hardware SDK initialization failed. Please check your network or switch the proxy and try again.", - "update.hardware_update": "Hardware update", - "update.hardware_update_requires_bridge": "Hardware update requires the latest bridge software. Please visit our online tutorial [Download and update OneKey Bridge] for detailed installation instructions.", - "update.hardware_wallet_in_bootloader_mode": "Your hardware wallet is in bootloader mode, which is used for software updates. Would you like to update now?\nIf you prefer not to update, please manually restart the device to return to normal mode.", - "update.hardware_wallet_in_bootloader_mode_restart": "Your hardware wallet is currently in boot mode, which is used for hardware updates.\nDetected existing firmware on the device. Please restart the device to normal mode before connecting to the app.", - "update.i_have_backed_up_my_recovery_phrase": "I’ve backed up my recovery phrase.", - "update.i_have_backed_up_my_recovery_phrase_emoji": "I’ve backed up my recovery phrase. ✅", - "update.init_iframe_load_fail": "Init iframe load fail", - "update.install_and_restart": "Install and restart", - "update.install_now": "Install now", - "update.installation_failed": "Installation failed", - "update.installation_package_possibly_compromised": "Installation package verification failed.", - "update.installing": "Installing...", - "update.insufficient_battery_power": "Insufficient battery power", - "update.insufficient_battery_power_desc": "The connected hardware device has insufficient battery power and cannot proceed with the upgrade. Please charge the device before trying again.", - "update.insufficient_disk_space_clear_retry": "Insufficient disk space, please clear and retry.", - "update.keep_bluetooth_connected_and_app_active": "Keep bluetooth connected and app active during the upgrade.", - "update.keep_usb_connected_and_app_active": "Keep USB connected and app active during the upgrade.", - "update.latest_version": "You are on the latest version", - "update.manual_update": "Manual update", - "update.manually_entering_bootloader_mode": "Manually entering bootloader mode", - "update.manually_entering_bootloader_mode_desc": "To enter bootloader mode on your OneKey Mini, press and hold the lock screen button while inserting the data cable into the computer, then click 'Verify status and continue'.", - "update.network_exception_check_connection": "Network exception, please check your internet connection.", - "update.network_instability_check_connection": "Network instability, please check your internet connection.", - "update.new_app_version": "New App version 🎉", - "update.new_hardware_updates": "New hardware updates 🎉", - "update.new_update_downloaded": "A new update has been downloaded. Would you like to install and restart the app now?", - "update.only_one_device_connected": "Only one device is connected.", - "update.only_one_device_connected_emoji": "Only one device is connected. 📱", - "update.only_one_usb_device_supported_for_upgrade": "Only One USB Device Supported for Upgrade", - "update.operation_canceled": "Operation canceled", - "update.operation_canceled_desc": "The operation has been canceled. Please try again.", - "update.outdated_version_detected": "Outdated version detected", - "update.outdated_version_detected_desc": "Your current firmware version is too low. Please visit our online tutorial [Solution for failed firmware upgrade on Touch] and follow the step-by-step instructions to complete the update.", - "update.package_name_mismatch": "Installation package name mismatch", - "update.progress_downloading": "{progress}% downloading...", - "update.quit_update": "Quit update", - "update.quit_update_desc": "The firmware is being updated. Exiting may interrupt the upgrade. Are you sure you want to cancel the update?", - "update.ready_to_upgrade_checklist": "Ready to upgrade? let’s check you're all set 📝", - "update.reboot_success": "Reboot success", - "update.reboot_to_bootloader_mode": "Reboot to bootloader mode", - "update.recommend_regular_check_and_update_plugin": "To ensure you get the best experience, we recommend that you regularly check for and manually update the plugin.", - "update.restart_to_update": "Restart to update", - "update.server_not_responding_try_later": "Server not responding, please try again later.", - "update.transferring_data": "Transferring data...", - "update.troubleshoot_connection_issues": "To troubleshoot connection issues:\n\n1. Ensure OneKey Bridge is installed and running.\n2. Refresh or switch your browser, then try again.\n3. Use a different cable and port.\n\nIf this doesn’t help, contact OneKey support.", - "update.troubleshoot_connection_issues_desktop": "To troubleshoot connection issues, follow these steps:\n\n1. Reconnect your device and try again.\n2. Restart the app and your device, then try again.\n3. Use a different cable and port, then try again.\n\nIf this doesn’t help, contact OneKey support.", - "update.troubleshoot_connection_issues_mobile": "To troubleshoot connection issues:\n\n1. Ensure Bluetooth is enabled.\n2. Reconnect your device and try again.\n3. Restart the App and your device, then try again.\n\nIf this doesn’t help, contact OneKey support.", - "update.unable_to_connect_to_bridge": "Unable to connect to the bridge. Please check your internet connection and try again.", - "update.update_app_available": "Update App to {version} is available", - "update.update_completed": "Update Completed", - "update.update_history": "Update history", - "update.update_in_official_web_tool": "Update in official web tool", - "update.update_in_official_web_tool_desc": "Your hardware wallet firmware requires an update.\nPlease visit firmware.onekey.so on your computer to proceed with the upgrade.", - "update.update_in_official_web_tool_desc_copy": "Your hardware wallet firmware requires an update.\nPlease visit firmware.onekey.so on your computer to proceed with the upgrade.", - "update.update_now": "Update now", - "update.update_required": "Update required", - "update.update_required_desc": "Your hardware wallet's version is outdated and must be updated to continue.", - "update.update_resource_failed": "Update resource failed", - "update.update_ui_resources_success": "Update UI resources success", - "update.updated_to_latest_version": "Updated to the latest version {version}", - "update.updating_bootloader": "Updating bootloader", - "update.updating_ui_resources": "Updating UI resources...", - "update.verify_file_signature": "Verify file signature...", - "update.verify_status_and_continue": "Verify status and continue", - "update.verifying": "Verifying...", - "update.verifying_sha256_and_package_name": "Verifying SHA256 and package name…", - "update.whats_new_in_onekey_version": "What’s new\nin OneKey {version} 👋🏻", - "v4.select_account_name_label": "Name from OneKey v4", - "v4_migration.backed_up_warning": "Have you backed up everything?", - "v4_migration.backed_up_warning_desc": "Ensure you’ve backed up all your recovery phrases and private keys to prevent any loss of assets due to unexpected issues during data migration.", - "v4_migration.backup_alert_desc": "Before you proceed, make sure you've backed up the all recovery phrases or private keys.", - "v4_migration.backup_alert_title": "IMPORTANT: Back up all of your data", - "v4_migration.backup_primary_action": "I backed them up", - "v4_migration.backup_private_key_reveal_alert": "Click to view the private key, make sure no one is looking your screen", - "v4_migration.backup_recovery_phrase_reveal_alert": "Click to view the recovery phrase, make sure no one is looking your screen", - "v4_migration.backup_title": "Backup your data", - "v4_migration.completed_desc": "Explore the exciting new features of OneKey v5 now!", - "v4_migration.completed_title": "Migration completed", - "v4_migration.confirm_password_description": "Please enter the unlock password for OneKey App v4", - "v4_migration.exit_migration_checkbox_label": "Don't ask me to migrate when the App starts", - "v4_migration.update_in_progress": "Update in progress", - "v4_migration.update_in_progress_alert_description": "Migration may take longer with more wallets. Please be patient.", - "v4_migration.update_in_progress_alert_title": "Don't close your App during update", - "v4_migration.welcome_message": "OneKey 5.0 is here!", - "v4_migration.welcome_message_desc": "Here’s how to securely and quickly migrate your data. Ready to start?", - "wallet.buy_crypto_instruction": "Buy crypto to fund your wallet", - "wallet.currently_supports_up_to_str_all_networks_accounts": "Currently supports up to {0} accounts across all networks.", - "wallet.destination_tag": "Destination tag", - "wallet.engine_account_already_exists": "Account already exists.", - "wallet.engine_account_name_length_error": "Account name length exceeds the limit.", - "wallet.engine_too_many_hd_wallets": "Number of wallets exceeds the limit.", - "wallet.engine_too_many_hw_passphrase_wallets": "Number of passphrase wallets in the hardware wallet exceeds the limit.", - "wallet.engine_too_many_hw_wallets": "Number of hardware wallets exceeds the limit.", - "wallet.engine_too_many_imported_accounts": "Number of single-chain accounts exceeds the limit.", - "wallet.engine_too_many_watching_accounts": "Number of watched wallet accounts exceeds the limit.", - "wallet.engine_ttoo_many_external_accounts": "Number of external wallet accounts exceeds the limit.", - "wallet.engine_wallet_name_length_error": "Wallet name length exceeds the limit.", - "wallet.error_trade_with_watched_acocunt": "Cannot trade with a watched account.", - "wallet.generic_string_length_requirement": "Account name length exceeds the limit.", - "wallet.last_ledger_sequence": "Last ledger sequence", - "wallet.ledger_index": "Ledger index", - "wallet.no_address": "No address", - "wallet.no_address_desc": "Create address to enable network", - "wallet.receive_token_instruction": "Deposit from other wallets", - "wallet.unsupported_network_desc": "Switch networks in the top left or use a supported account", - "wallet.unsupported_network_desc_alt": "Switch networks on the previous page or use a supported account", - "wallet.unsupported_network_title": "This account doesn’t support {network}", - "wallet.you_need_str_accounts_on_any_network_to_create": "You need at least {0} accounts on any single network to create.", - "word": "Word" -} \ No newline at end of file diff --git a/packages/shared/src/locale/json/en_US.json b/packages/shared/src/locale/json/en_US.json index b25c2b30f4b..cc9dcdb65aa 100644 --- a/packages/shared/src/locale/json/en_US.json +++ b/packages/shared/src/locale/json/en_US.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "Passcodes do not match", "auth.error_passwcode_too_short": "Passcode must be at least {length} characters", "auth.error_password_empty": "Please enter a password", - "auth.error_password_incorrect": "Incorrect password", + "auth.error_password_incorrect": "Incorrect passcode", "auth.error_password_not_match": "Passwords do not match", "auth.error_password_too_short": "Password must be at least {length} characters", "auth.new_passcode_form_label": "New passcode", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Create a strong password", "auth.new_password_same_as_old": "New password must differ from the old one", "auth.passcode_cooldown": "Try again in {cooldowntime} min", - "auth.passcode_failed_alert": "{count} more failed attempts will reset the device", + "auth.passcode_failed_alert": "{count} more failed attempts will reset App", "auth.passcode_set": "Passcode set", "auth.password_set": "Password set", "auth.set_passcode": "Set passcode", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Claim available in {number} days", "earn.claim_limitations": "Due to the limitations of Lido, you must claim each of your withdrawals separately.", "earn.claim_rewards": "Claim rewards", - "earn.claim_rewards_morpho_desc": "Rewards are calculated from all Morpho staking positions and are updated about every 2 weeks.", + "earn.claim_rewards_morpho_desc": "Rewards are calculated from all Morpho staking positions and settled every 2 weeks.", "earn.claim_together_tooltip": "Automatically claimed to your wallet after each asset staking or withdrawal request.", "earn.claim_token": "Claim {token}", "earn.claim_token_desc": "Claim your {token} after the withdrawal request has been processed.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Can't find token? Try searching", "remove_account_desc": "This account will be removed.", "remove_device": "Remove device", - "remove_device_desc": "This will permanently delete your data. But you still can restore it from the hardware wallet which is loaded the recovery phrase of this wallet.", - "remove_hidden_wallet_desc": "This will permanently delete your data. Ensure you have saved the passphrase of this hidden wallet.", + "remove_device_desc": "This will disconnect this hardware wallet from the OneKey App. You can reconnect it to the App whenever you want.", + "remove_hidden_wallet_desc": "Remove this hidden wallet? Make sure you have saved the passphrase.", "remove_private_key_account_desc": "You can restore the account using its private key after removal. Ensure it's backed up to avoid permanent loss of access.", "remove_wallet": "Remove wallet", "remove_wallet_desc": "Make sure you've written down the recovery phrase before removing the wallet. Otherwise, you won't be able to recover the wallet.", diff --git a/packages/shared/src/locale/json/es.json b/packages/shared/src/locale/json/es.json index a425b735392..627ca76d76f 100644 --- a/packages/shared/src/locale/json/es.json +++ b/packages/shared/src/locale/json/es.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "Los códigos de acceso no coinciden", "auth.error_passwcode_too_short": "El código de acceso debe tener al menos {length} caracteres", "auth.error_password_empty": "Por favor, ingrese una contraseña", - "auth.error_password_incorrect": "Contraseña incorrecta", + "auth.error_password_incorrect": "Código de acceso incorrecto", "auth.error_password_not_match": "Las contraseñas no coinciden", "auth.error_password_too_short": "La contraseña debe tener al menos {length} caracteres", "auth.new_passcode_form_label": "Nuevo código de acceso", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Crea una contraseña fuerte", "auth.new_password_same_as_old": "La nueva contraseña debe ser diferente a la antigua", "auth.passcode_cooldown": "Inténtalo de nuevo en {cooldowntime} min", - "auth.passcode_failed_alert": "{count} intentos fallidos más restablecerán el dispositivo", + "auth.passcode_failed_alert": "{count} intentos fallidos más restablecerán la aplicación", "auth.passcode_set": "Conjunto de contraseñas", "auth.password_set": "Contraseña establecida", "auth.set_passcode": "Establecer código de acceso", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Reclamo disponible en {number} días", "earn.claim_limitations": "Debido a las limitaciones de Lido, debes reclamar cada uno de tus canjes por separado.", "earn.claim_rewards": "Reclamar recompensas", - "earn.claim_rewards_morpho_desc": "Las recompensas se calculan a partir de todas las posiciones de staking de Morpho y se actualizan aproximadamente cada dos semanas.", + "earn.claim_rewards_morpho_desc": "Las recompensas se calculan a partir de todas las posiciones de staking de Morpho y se liquidan cada 2 semanas.", "earn.claim_together_tooltip": "Reclamado automáticamente a tu billetera después de cada solicitud de staking o retiro de activos.", "earn.claim_token": "Reclamar {token}", "earn.claim_token_desc": "Reclama tu {token} después de que se haya procesado la solicitud de retiro.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "¿No encuentras el token? Intenta buscarlo", "remove_account_desc": "Esta cuenta será eliminada.", "remove_device": "Eliminar dispositivo", - "remove_device_desc": "Esto eliminará permanentemente tus datos. Pero aún puedes restaurarlos desde la cartera de hardware que tiene cargada la frase de recuperación de esta cartera.", - "remove_hidden_wallet_desc": "Esto eliminará permanentemente tus datos. Asegúrate de haber guardado la passphrase de esta cartera oculta.", + "remove_device_desc": "Esto desconectará este monedero de hardware de la OneKey App. Puedes volver a conectarlo a la App cuando quieras.", + "remove_hidden_wallet_desc": "¿Eliminar esta cartera oculta? Asegúrate de haber guardado la passphrase.", "remove_private_key_account_desc": "Puede restaurar la cuenta utilizando su clave privada después de eliminarla. Asegúrese de que esté respaldada para evitar la pérdida permanente de acceso.", "remove_wallet": "Eliminar billetera", "remove_wallet_desc": "Asegúrate de haber anotado la frase de recuperación antes de eliminar la billetera. De lo contrario, no podrás recuperar la billetera.", diff --git a/packages/shared/src/locale/json/fr_FR.json b/packages/shared/src/locale/json/fr_FR.json index 8d79dc25bac..2d5d73fc850 100644 --- a/packages/shared/src/locale/json/fr_FR.json +++ b/packages/shared/src/locale/json/fr_FR.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Créez un mot de passe fort", "auth.new_password_same_as_old": "Le nouveau mot de passe doit être différent de l'ancien", "auth.passcode_cooldown": "Réessayez dans {cooldowntime} min", - "auth.passcode_failed_alert": "{count} tentatives échouées supplémentaires réinitialiseront l'appareil", + "auth.passcode_failed_alert": "{count} tentatives infructueuses supplémentaires réinitialiseront l'application", "auth.passcode_set": "Ensemble de codes d'accès", "auth.password_set": "Mot de passe défini", "auth.set_passcode": "Définir le code d'accès", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Réclamation disponible dans {number} jours", "earn.claim_limitations": "En raison des limitations de Lido, vous devez réclamer chacune de vos rédemptions séparément.", "earn.claim_rewards": "Réclamer des récompenses", - "earn.claim_rewards_morpho_desc": "Les récompenses sont calculées à partir de toutes les positions de jalonnement Morpho et sont mises à jour environ toutes les deux semaines.", + "earn.claim_rewards_morpho_desc": "Les récompenses sont calculées à partir de toutes les positions de jalonnement Morpho et réglées toutes les 2 semaines.", "earn.claim_together_tooltip": "Réclamé automatiquement dans votre portefeuille après chaque demande de mise en jeu ou de retrait d'actifs.", "earn.claim_token": "Réclamer {token}", "earn.claim_token_desc": "Réclamez votre {token} après que la demande de retrait a été traitée.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Vous ne trouvez pas de jeton ? Essayez de rechercher", "remove_account_desc": "Ce compte sera supprimé.", "remove_device": "Supprimer l'appareil", - "remove_device_desc": "Cela supprimera définitivement vos données. Mais vous pouvez toujours les restaurer à partir du portefeuille matériel qui a chargé la phrase de récupération de ce portefeuille.", - "remove_hidden_wallet_desc": "Cela supprimera définitivement vos données. Assurez-vous d'avoir sauvegardé la passphrase de ce portefeuille caché.", + "remove_device_desc": "Cela va déconnecter ce portefeuille matériel de l'application OneKey. Vous pouvez le reconnecter à l'application à tout moment.", + "remove_hidden_wallet_desc": "Supprimer ce portefeuille caché ? Assurez-vous d'avoir sauvegardé la passphrase.", "remove_private_key_account_desc": "Vous pouvez restaurer le compte à l'aide de sa clé privée après sa suppression. Assurez-vous qu'elle est sauvegardée pour éviter une perte définitive d'accès.", "remove_wallet": "Supprimer le portefeuille", "remove_wallet_desc": "Assurez-vous d'avoir noté la phrase de récupération avant de supprimer le portefeuille. Sinon, vous ne pourrez pas récupérer le portefeuille.", diff --git a/packages/shared/src/locale/json/hi_IN.json b/packages/shared/src/locale/json/hi_IN.json index 0d7ceb94be9..ba580934547 100644 --- a/packages/shared/src/locale/json/hi_IN.json +++ b/packages/shared/src/locale/json/hi_IN.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "एक मजबूत पासवर्ड बनाएं", "auth.new_password_same_as_old": "नया पासवर्ड पुराने से अलग होना चाहिए", "auth.passcode_cooldown": "{cooldowntime} मिनट में फिर से प्रयास करें", - "auth.passcode_failed_alert": "{count} और असफल प्रयास डिवाइस को रीसेट कर देंगे", + "auth.passcode_failed_alert": "{count} और असफल प्रयास ऐप को रीसेट कर देंगे", "auth.passcode_set": "पासकोड सेट करें", "auth.password_set": "पासवर्ड सेट", "auth.set_passcode": "पासकोड सेट करें", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "{number} दिनों में उपलब्ध दावा", "earn.claim_limitations": "Lido की सीमाओं के कारण, आपको अपने प्रत्येक रिडेम्पशन को अलग-अलग दावा करना होगा।", "earn.claim_rewards": "इनाम प्राप्त करें", - "earn.claim_rewards_morpho_desc": "पुरस्कारों की गणना सभी मॉर्फो स्टेकिंग स्थितियों से की जाती है और लगभग हर दो सप्ताह में अपडेट की जाती है।", + "earn.claim_rewards_morpho_desc": "पुरस्कारों की गणना सभी मॉर्फो स्टेकिंग स्थितियों से की जाती है और हर 2 सप्ताह में उनका निपटान किया जाता है।", "earn.claim_together_tooltip": "प्रत्येक संपत्ति की स्टेकिंग या निकासी अनुरोध के बाद स्वचालित रूप से आपके वॉलेट में दावा किया जाता है।", "earn.claim_token": "{token} का दावा करें", "earn.claim_token_desc": "विनियोग की अनुरोध संसाधित होने के बाद अपने {token} का दावा करें।", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "टोकन नहीं मिल रहा? खोजने का प्रयास करें", "remove_account_desc": "यह खाता हटा दिया जाएगा।", "remove_device": "उपकरण हटाएं", - "remove_device_desc": "यह स्थायी रूप से आपका डाटा हटा देगा। लेकिन आप अभी भी इसे हार्डवेयर वॉलेट से पुनर्स्थापित कर सकते हैं जिसमें इस वॉलेट का रिकवरी फ़्रेज़ लोड होता है।", - "remove_hidden_wallet_desc": "यह स्थायी रूप से आपका डाटा हटा देगा। सुनिश्चित करें कि आपने इस छिपे हुए वॉलेट का पासफ़्रेज़ सहेज लिया है।", + "remove_device_desc": "यह इस हार्डवेयर वॉलेट को OneKey App से डिस्कनेक्ट कर देगा। आप इसे जब चाहें App से फिर से कनेक्ट कर सकते हैं।", + "remove_hidden_wallet_desc": "इस छिपे हुए वॉलेट को हटाएं? सुनिश्चित करें कि आपने पासफ़्रेज़ सहेज लिया है।", "remove_private_key_account_desc": "आप हटाने के बाद अपनी निजी कुंजी का उपयोग करके खाता पुनर्स्थापित कर सकते हैं। सुनिश्चित करें कि यह बैकअप किया गया है ताकि पहुंच की स्थायी हानि से बचा जा सके।", "remove_wallet": "वॉलेट हटाएं", "remove_wallet_desc": "सुनिश्चित करें कि आपने वॉलेट को हटाने से पहले रिकवरी फ़्रेज़ लिख लिया है। अन्यथा, आप वॉलेट को पुनः प्राप्त नहीं कर पाएंगे।", diff --git a/packages/shared/src/locale/json/id.json b/packages/shared/src/locale/json/id.json index 5ac27a0c0cb..96d7f4de9b0 100644 --- a/packages/shared/src/locale/json/id.json +++ b/packages/shared/src/locale/json/id.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "Kode sandi tidak cocok", "auth.error_passwcode_too_short": "Kode sandi harus terdiri dari setidaknya {length} karakter", "auth.error_password_empty": "Silakan masukkan kata sandi", - "auth.error_password_incorrect": "Kata sandi salah", + "auth.error_password_incorrect": "Kode sandi salah", "auth.error_password_not_match": "Kata sandi tidak cocok", "auth.error_password_too_short": "Kata sandi harus setidaknya {length} karakter", "auth.new_passcode_form_label": "Kode sandi baru", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Buat kata sandi yang kuat", "auth.new_password_same_as_old": "Kata sandi baru harus berbeda dari yang lama", "auth.passcode_cooldown": "Coba lagi dalam {cooldowntime} menit", - "auth.passcode_failed_alert": "{count} percobaan gagal lagi akan mengatur ulang perangkat", + "auth.passcode_failed_alert": "{count} lebih banyak percobaan yang gagal akan mengatur ulang Aplikasi", "auth.passcode_set": "Set kode sandi", "auth.password_set": "Kata sandi telah diatur", "auth.set_passcode": "Atur kode sandi", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Penukaran tersedia dalam {number} hari", "earn.claim_limitations": "Karena keterbatasan Lido, Anda harus mengklaim setiap penebusan Anda secara terpisah.", "earn.claim_rewards": "Klaim hadiah", - "earn.claim_rewards_morpho_desc": "Hadiah dihitung dari semua posisi staking Morpho dan diperbarui sekitar setiap dua minggu.", + "earn.claim_rewards_morpho_desc": "Hadiah dihitung dari semua posisi staking Morpho dan diselesaikan setiap 2 minggu.", "earn.claim_together_tooltip": "Secara otomatis diklaim ke dompet Anda setelah setiap permintaan staking atau penarikan aset.", "earn.claim_token": "Klaim {token}", "earn.claim_token_desc": "Klaim {token} Anda setelah permintaan penarikan telah diproses.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Tidak dapat menemukan token? Coba cari", "remove_account_desc": "Akun ini akan dihapus.", "remove_device": "Hapus perangkat", - "remove_device_desc": "Ini akan menghapus data Anda secara permanen. Namun, Anda masih dapat mengembalikannya dari dompet hardware yang telah memuat frasa pemulihan dari dompet ini.", - "remove_hidden_wallet_desc": "Ini akan menghapus data Anda secara permanen. Pastikan Anda telah menyimpan passphrase dari dompet tersembunyi ini.", + "remove_device_desc": "Ini akan memutuskan dompet hardware ini dari OneKey App. Anda dapat menyambungkannya kembali ke App kapan saja Anda mau.", + "remove_hidden_wallet_desc": "Hapus dompet tersembunyi ini? Pastikan Anda telah menyimpan passphrase.", "remove_private_key_account_desc": "Anda dapat memulihkan akun menggunakan kunci pribadi setelah penghapusan. Pastikan itu dicadangkan untuk menghindari kehilangan akses secara permanen.", "remove_wallet": "Hapus dompet", "remove_wallet_desc": "Pastikan Anda telah menulis frase pemulihan sebelum menghapus dompet. Jika tidak, Anda tidak akan dapat memulihkan dompet tersebut.", diff --git a/packages/shared/src/locale/json/it_IT.json b/packages/shared/src/locale/json/it_IT.json index d6a4001e1a8..46b765396d9 100644 --- a/packages/shared/src/locale/json/it_IT.json +++ b/packages/shared/src/locale/json/it_IT.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "I codici di accesso non corrispondono", "auth.error_passwcode_too_short": "Il codice di accesso deve essere di almeno {length} caratteri", "auth.error_password_empty": "Inserisci una password", - "auth.error_password_incorrect": "Password errata", + "auth.error_password_incorrect": "Codice di accesso errato", "auth.error_password_not_match": "Le password non corrispondono", "auth.error_password_too_short": "La password deve essere di almeno {length} caratteri", "auth.new_passcode_form_label": "Nuovo codice di accesso", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Crea una password forte", "auth.new_password_same_as_old": "La nuova password deve essere diversa da quella vecchia", "auth.passcode_cooldown": "Riprova tra {cooldowntime} min", - "auth.passcode_failed_alert": "{count} ulteriori tentativi falliti reimposteranno il dispositivo", + "auth.passcode_failed_alert": "{count} altri tentativi falliti reimposteranno l'app", "auth.passcode_set": "Codice di accesso impostato", "auth.password_set": "Password impostata", "auth.set_passcode": "Imposta codice di accesso", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Riscatta disponibile in {number} giorni", "earn.claim_limitations": "A causa delle limitazioni di Lido, devi richiedere ciascuno dei tuoi riscatti separatamente.", "earn.claim_rewards": "Richiedi ricompense", - "earn.claim_rewards_morpho_desc": "Le ricompense vengono calcolate su tutte le posizioni di staking Morpho e aggiornate circa ogni due settimane.", + "earn.claim_rewards_morpho_desc": "Le ricompense vengono calcolate su tutte le posizioni di staking Morpho e liquidate ogni 2 settimane.", "earn.claim_together_tooltip": "Accreditato automaticamente al tuo portafoglio dopo ogni richiesta di staking o prelievo di asset.", "earn.claim_token": "Riscatta {token}", "earn.claim_token_desc": "Rivendica il tuo {token} dopo che la richiesta di prelievo è stata elaborata.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Non riesci a trovare il token? Prova a cercare", "remove_account_desc": "Questo account verrà rimosso.", "remove_device": "Rimuovi dispositivo", - "remove_device_desc": "Questo cancellerà definitivamente i tuoi dati. Tuttavia, puoi ancora ripristinarli dal portafoglio hardware che ha caricato la frase di recupero di questo portafoglio.", - "remove_hidden_wallet_desc": "Questo cancellerà definitivamente i tuoi dati. Assicurati di aver salvato la passphrase di questo portafoglio nascosto.", + "remove_device_desc": "Questo disconnetterà questo portafoglio hardware dall'App OneKey. Puoi riconnetterlo all'App quando vuoi.", + "remove_hidden_wallet_desc": "Rimuovere questo portafoglio nascosto? Assicurati di aver salvato la passphrase.", "remove_private_key_account_desc": "Puoi ripristinare l'account utilizzando la sua chiave privata dopo la rimozione. Assicurati che sia salvata per evitare la perdita permanente dell'accesso.", "remove_wallet": "Rimuovi portafoglio", "remove_wallet_desc": "Assicurati di aver annotato la frase di recupero prima di rimuovere il portafoglio. Altrimenti, non sarai in grado di recuperare il portafoglio.", diff --git a/packages/shared/src/locale/json/ja_JP.json b/packages/shared/src/locale/json/ja_JP.json index 0719e0ca5e1..8613a38a136 100644 --- a/packages/shared/src/locale/json/ja_JP.json +++ b/packages/shared/src/locale/json/ja_JP.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "パスコードが一致しません", "auth.error_passwcode_too_short": "パスコードは少なくとも{length}文字でなければなりません", "auth.error_password_empty": "パスワードを入力してください", - "auth.error_password_incorrect": "パスワードが間違っています", + "auth.error_password_incorrect": "パスコードが間違っています", "auth.error_password_not_match": "パスワードが一致しません", "auth.error_password_too_short": "パスワードは少なくとも{length}文字でなければなりません", "auth.new_passcode_form_label": "新しいパスコード", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "強力なパスワードを作成する", "auth.new_password_same_as_old": "新しいパスワードは古いものと異なる必要があります", "auth.passcode_cooldown": "{cooldowntime} 分後に再試行してください", - "auth.passcode_failed_alert": "{count} 回以上の失敗があると、デバイスがリセットされます", + "auth.passcode_failed_alert": "あと{count}回失敗するとアプリがリセットされます", "auth.passcode_set": "パスコード設定", "auth.password_set": "パスワード設定", "auth.set_passcode": "パスコードを設定する", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "{number}日後に領取可能", "earn.claim_limitations": "Lidoの制限により、各リデンプションを個別に請求する必要があります。", "earn.claim_rewards": "報酬を請求する", - "earn.claim_rewards_morpho_desc": "報酬はすべての Morpho ステーキングポジションから計算され、約 2 週間ごとに更新されます。", + "earn.claim_rewards_morpho_desc": "報酬はすべての Morpho ステーキングポジションから計算され、2 週間ごとに決済されます。", "earn.claim_together_tooltip": "各資産のステーキングや引き出しリクエストの後、自動的にウォレットに反映されます。", "earn.claim_token": "{token}を請求する", "earn.claim_token_desc": "引き出しリクエストが処理された後、{token}を請求してください。", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "トークンが見つからない場合は検索してみてください", "remove_account_desc": "このアカウントは削除されます。", "remove_device": "デバイスを削除", - "remove_device_desc": "これにより、あなたのデータは永久に削除されます。しかし、このウォレットのリカバリーフレーズがロードされたハードウェアウォレットからそれを復元することはまだ可能です。", - "remove_hidden_wallet_desc": "これにより、あなたのデータは永久に削除されます。この隠されたウォレットのパスフレーズを保存したことを確認してください。", + "remove_device_desc": "これにより、このハードウェアウォレットはOneKey Appから切断されます。必要に応じて、Appに再接続することができます。", + "remove_hidden_wallet_desc": "この隠しウォレットを削除しますか?パスフレーズを保存したことを確認してください。", "remove_private_key_account_desc": "アカウントは削除後、そのプライベートキーを使用して復元できます。アクセスを永久に失うことを避けるために、バックアップを確認してください。", "remove_wallet": "ウォレットを削除", "remove_wallet_desc": "ウォレットを削除する前に、リカバリーフレーズを書き留めておくことを確認してください。そうしないと、ウォレットを復元することができません。", diff --git a/packages/shared/src/locale/json/ko_KR.json b/packages/shared/src/locale/json/ko_KR.json index d5b988a33ba..9197c324a27 100644 --- a/packages/shared/src/locale/json/ko_KR.json +++ b/packages/shared/src/locale/json/ko_KR.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "암호가 일치하지 않습니다", "auth.error_passwcode_too_short": "암호는 최소 {length}자 이상이어야 합니다", "auth.error_password_empty": "비밀번호를 입력해 주세요", - "auth.error_password_incorrect": "잘못된 비밀번호", + "auth.error_password_incorrect": "잘못된 암호", "auth.error_password_not_match": "비밀번호가 일치하지 않습니다", "auth.error_password_too_short": "비밀번호는 최소 {length}자 이상이어야 합니다", "auth.new_passcode_form_label": "새 비밀번호", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "강력한 비밀번호를 생성하세요", "auth.new_password_same_as_old": "새 비밀번호는 이전 비밀번호와 달라야 합니다", "auth.passcode_cooldown": "{cooldowntime} 분 후에 다시 시도하세요", - "auth.passcode_failed_alert": "{count} 번 더 실패하면 기기가 초기화됩니다", + "auth.passcode_failed_alert": "{count} 번 더 실패하면 앱이 재설정됩니다.", "auth.passcode_set": "암호 설정됨", "auth.password_set": "비밀번호 설정됨", "auth.set_passcode": "암호 설정", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "{number}일 후에 이용 가능", "earn.claim_limitations": "Lido의 제한 사항으로 인해, 각각의 환불을 따로 청구해야 합니다.", "earn.claim_rewards": "보상 받기", - "earn.claim_rewards_morpho_desc": "보상은 모든 Morpho 스테이킹 포지션을 기준으로 계산되며 약 2주마다 업데이트됩니다.", + "earn.claim_rewards_morpho_desc": "보상은 모든 Morpho 스테이킹 포지션에서 계산되며 2주마다 정산됩니다.", "earn.claim_together_tooltip": "자산 스테이킹 또는 출금 요청 후 자동으로 지갑에 청구됩니다.", "earn.claim_token": "{token} 청구하기", "earn.claim_token_desc": "출금 요청이 처리된 후에 {token}을 청구하세요.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "토큰을 찾을 수 없습니까? 검색해 보세요", "remove_account_desc": "이 계정은 삭제될 것입니다.", "remove_device": "장치 제거", - "remove_device_desc": "이 작업은 귀하의 데이터를 영구적으로 삭제합니다. 그러나 이 지갑의 복구 구문이 로드된 하드웨어 지갑에서 데이터를 복원할 수는 있습니다.", - "remove_hidden_wallet_desc": "이 작업은 귀하의 데이터를 영구적으로 삭제합니다. 이 숨겨진 지갑의 패스프레이즈를 저장했는지 확인하세요.", + "remove_device_desc": "이 작업은 이 하드웨어 지갑을 OneKey App에서 연결 해제합니다. 언제든지 App에 다시 연결할 수 있습니다.", + "remove_hidden_wallet_desc": "이 숨겨진 지갑을 제거하시겠습니까? 패스프레이즈를 저장했는지 확인하세요.", "remove_private_key_account_desc": "계정을 제거한 후에도 개인 키를 사용하여 계정을 복원할 수 있습니다. 접근 권한을 영구적으로 잃지 않도록 백업을 해두는 것이 중요합니다.", "remove_wallet": "지갑 제거", "remove_wallet_desc": "지갑을 제거하기 전에 복구 구문을 적어 두었는지 확인하세요. 그렇지 않으면 지갑을 복구할 수 없습니다.", diff --git a/packages/shared/src/locale/json/pt.json b/packages/shared/src/locale/json/pt.json index ad97dafd119..69e0a038ce6 100644 --- a/packages/shared/src/locale/json/pt.json +++ b/packages/shared/src/locale/json/pt.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Crie uma senha forte", "auth.new_password_same_as_old": "A nova senha deve ser diferente da antiga", "auth.passcode_cooldown": "Tente novamente em {cooldowntime} min", - "auth.passcode_failed_alert": "{count} tentativas falhas a mais irão reiniciar o dispositivo", + "auth.passcode_failed_alert": "{count} mais tentativas com falha irão reiniciar o aplicativo", "auth.passcode_set": "Conjunto de senhas", "auth.password_set": "Senha definida", "auth.set_passcode": "Definir código de acesso", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Reivindicação disponível em {number} dias", "earn.claim_limitations": "Devido às limitações do Lido, você deve reivindicar cada um dos seus resgates separadamente.", "earn.claim_rewards": "Reivindicar recompensas", - "earn.claim_rewards_morpho_desc": "As recompensas são calculadas a partir de todas as posições de staking da Morpho e são atualizadas a cada duas semanas.", + "earn.claim_rewards_morpho_desc": "As recompensas são calculadas a partir de todas as posições de staking da Morpho e liquidadas a cada 2 semanas.", "earn.claim_together_tooltip": "Automaticamente creditado na sua carteira após cada solicitação de staking ou retirada de ativos.", "earn.claim_token": "Reivindique {token}", "earn.claim_token_desc": "Reivindique o seu {token} após o pedido de saque ser processado.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Não consegue encontrar o token? Tente pesquisar", "remove_account_desc": "Esta conta será removida.", "remove_device": "Remover dispositivo", - "remove_device_desc": "Isso irá apagar permanentemente seus dados. Mas você ainda pode restaurá-los a partir da carteira de hardware que carrega a frase de recuperação desta carteira.", - "remove_hidden_wallet_desc": "Isso irá apagar permanentemente seus dados. Certifique-se de ter salvo a passphrase desta carteira oculta.", + "remove_device_desc": "Isso irá desconectar esta carteira de hardware do OneKey App. Você pode reconectá-la ao App sempre que quiser.", + "remove_hidden_wallet_desc": "Remover esta carteira oculta? Certifique-se de ter salvo a passphrase.", "remove_private_key_account_desc": "Você pode restaurar a conta usando sua chave privada após a remoção. Certifique-se de que ela esteja salva para evitar a perda permanente de acesso.", "remove_wallet": "Remover carteira", "remove_wallet_desc": "Certifique-se de ter anotado a frase de recuperação antes de remover a carteira. Caso contrário, você não conseguirá recuperar a carteira.", diff --git a/packages/shared/src/locale/json/pt_BR.json b/packages/shared/src/locale/json/pt_BR.json index 06718b7385c..358b29ad90f 100644 --- a/packages/shared/src/locale/json/pt_BR.json +++ b/packages/shared/src/locale/json/pt_BR.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Crie uma senha forte", "auth.new_password_same_as_old": "A nova senha deve ser diferente da antiga", "auth.passcode_cooldown": "Tente novamente em {cooldowntime} min", - "auth.passcode_failed_alert": "{count} tentativas falhas a mais irão redefinir o dispositivo", + "auth.passcode_failed_alert": "{count} mais tentativas com falha irão reiniciar o aplicativo", "auth.passcode_set": "Conjunto de senhas", "auth.password_set": "Senha definida", "auth.set_passcode": "Definir código de acesso", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Disponível para resgate em {number} dias", "earn.claim_limitations": "Devido às limitações do Lido, você deve reivindicar cada um dos seus resgates separadamente.", "earn.claim_rewards": "Resgatar recompensas", - "earn.claim_rewards_morpho_desc": "As recompensas são calculadas a partir de todas as posições de staking da Morpho e são atualizadas a cada duas semanas.", + "earn.claim_rewards_morpho_desc": "As recompensas são calculadas a partir de todas as posições de staking da Morpho e liquidadas a cada 2 semanas.", "earn.claim_together_tooltip": "Automaticamente creditado na sua carteira após cada solicitação de staking ou retirada de ativos.", "earn.claim_token": "Reivindique {token}", "earn.claim_token_desc": "Reivindique seu {token} após o pedido de saque ser processado.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Não consegue encontrar o token? Tente pesquisar", "remove_account_desc": "Esta conta será removida.", "remove_device": "Remover dispositivo", - "remove_device_desc": "Isso irá apagar permanentemente seus dados. Mas você ainda pode restaurá-los a partir da carteira de hardware que carrega a frase de recuperação desta carteira.", - "remove_hidden_wallet_desc": "Isso irá apagar permanentemente seus dados. Certifique-se de ter salvo a passphrase desta carteira oculta.", + "remove_device_desc": "Isso irá desconectar esta carteira de hardware do OneKey App. Você pode reconectá-la ao App sempre que quiser.", + "remove_hidden_wallet_desc": "Remover esta carteira oculta? Certifique-se de ter salvo a passphrase.", "remove_private_key_account_desc": "Você pode restaurar a conta usando sua chave privada após a remoção. Certifique-se de que ela esteja salva para evitar a perda permanente de acesso.", "remove_wallet": "Remover carteira", "remove_wallet_desc": "Certifique-se de ter anotado a frase de recuperação antes de remover a carteira. Caso contrário, você não conseguirá recuperar a carteira.", diff --git a/packages/shared/src/locale/json/ru.json b/packages/shared/src/locale/json/ru.json index 6b6cdd14714..37194d8f9ce 100644 --- a/packages/shared/src/locale/json/ru.json +++ b/packages/shared/src/locale/json/ru.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "Коды доступа не совпадают", "auth.error_passwcode_too_short": "Пароль должен содержать не менее {length} символов", "auth.error_password_empty": "Пожалуйста, введите пароль", - "auth.error_password_incorrect": "Неверный пароль", + "auth.error_password_incorrect": "Неправильный пароль", "auth.error_password_not_match": "Пароли не совпадают", "auth.error_password_too_short": "Пароль должен содержать не менее {length} символов", "auth.new_passcode_form_label": "Новый код доступа", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Создайте надежный пароль", "auth.new_password_same_as_old": "Новый пароль должен отличаться от старого", "auth.passcode_cooldown": "Попробуйте снова через {cooldowntime} мин", - "auth.passcode_failed_alert": "{count} неудачных попыток приведут к сбросу устройства", + "auth.passcode_failed_alert": "{count} больше неудачных попыток приведут к сбросу приложения", "auth.passcode_set": "Установлен пароль", "auth.password_set": "Пароль установлен", "auth.set_passcode": "Установить код доступа", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Возможность получения доступна через {number} дней", "earn.claim_limitations": "Из-за ограничений Lido, вы должны заявлять о каждом из своих возвратов отдельно.", "earn.claim_rewards": "Получить награды", - "earn.claim_rewards_morpho_desc": "Награды рассчитываются по всем позициям ставок Morpho и обновляются примерно каждые две недели.", + "earn.claim_rewards_morpho_desc": "Вознаграждения рассчитываются по всем позициям ставок Morpho и выплачиваются каждые 2 недели.", "earn.claim_together_tooltip": "Автоматически зачисляется на ваш кошелек после каждой заявки на стекинг или вывод активов.", "earn.claim_token": "Заявить {token}", "earn.claim_token_desc": "Заявите о своем {token} после того, как будет обработан запрос на вывод средств.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Не можете найти токен? Попробуйте поискать", "remove_account_desc": "Этот аккаунт будет удален.", "remove_device": "Удалить устройство", - "remove_device_desc": "Это навсегда удалит ваши данные. Но вы все еще можете восстановить их с помощью аппаратного кошелька, в который загружена фраза восстановления этого кошелька.", - "remove_hidden_wallet_desc": "Это навсегда удалит ваши данные. Убедитесь, что вы сохранили passphrase этого скрытого кошелька.", + "remove_device_desc": "Это отключит этот аппаратный кошелек от приложения OneKey. Вы можете снова подключить его к приложению в любое время.", + "remove_hidden_wallet_desc": "Удалить этот скрытый кошелек? Убедитесь, что вы сохранили passphrase.", "remove_private_key_account_desc": "Вы можете восстановить аккаунт с помощью его приватного ключа после удаления. Убедитесь, что он сохранен в резервной копии, чтобы избежать постоянной потери доступа.", "remove_wallet": "Удалить кошелек", "remove_wallet_desc": "Убедитесь, что вы записали фразу восстановления перед удалением кошелька. В противном случае, вы не сможете восстановить кошелек.", diff --git a/packages/shared/src/locale/json/th_TH.json b/packages/shared/src/locale/json/th_TH.json index 7e8251a4c6b..74fbbac5bc3 100644 --- a/packages/shared/src/locale/json/th_TH.json +++ b/packages/shared/src/locale/json/th_TH.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "สร้างรหัสผ่านที่มั่นคง", "auth.new_password_same_as_old": "รหัสผ่านใหม่ต้องแตกต่างจากรหัสผ่านเก่า", "auth.passcode_cooldown": "ลองใหม่อีกครั้งใน {cooldowntime} นาที", - "auth.passcode_failed_alert": "{count} ครั้งที่พยายามล้มเหลวเพิ่มเติมจะรีเซ็ตอุปกรณ์", + "auth.passcode_failed_alert": "ความพยายามที่ล้มเหลวอีก {count} ครั้งจะรีเซ็ตแอป", "auth.passcode_set": "ตั้งรหัสผ่าน", "auth.password_set": "ตั้งรหัสผ่านแล้ว", "auth.set_passcode": "ตั้งรหัสผ่าน", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "สามารถรับได้ใน {number} วัน", "earn.claim_limitations": "เนื่องจากข้อจำกัดของ Lido คุณต้องเรียกร้องการแลกเปลี่ยนของคุณแยกกันทีละรายการ", "earn.claim_rewards": "รับรางวัล", - "earn.claim_rewards_morpho_desc": "รางวัลจะคำนวณจากตำแหน่งการเดิมพัน Morpho ทั้งหมด และจะอัปเดตทุกๆ สองสัปดาห์", + "earn.claim_rewards_morpho_desc": "รางวัลจะคำนวณจากตำแหน่งการเดิมพัน Morpho ทั้งหมดและชำระทุกๆ 2 สัปดาห์", "earn.claim_together_tooltip": "จะถูกโอนเข้ากระเป๋าเงินของคุณโดยอัตโนมัติหลังจากการสเตกหรือการถอนสินทรัพย์แต่ละครั้ง", "earn.claim_token": "เคลม {token}", "earn.claim_token_desc": "เคลม {token} ของคุณหลังจากที่คำขอถอนเงินได้รับการดำเนินการแล้ว", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "ไม่พบโทเค็นใช่ไหม ลองค้นหาดู", "remove_account_desc": "บัญชีนี้จะถูกลบออก", "remove_device": "นำอุปกรณ์ออก", - "remove_device_desc": "การดำเนินการนี้จะลบข้อมูลของคุณอย่างถาวร แต่คุณยังสามารถกู้คืนข้อมูลได้จากกระเป๋าสตางค์ฮาร์ดแวร์ที่ได้โหลด recovery phrase ของกระเป๋าสตางค์นี้ไว้", - "remove_hidden_wallet_desc": "การดำเนินการนี้จะลบข้อมูลของคุณอย่างถาวร โปรดตรวจสอบว่าคุณได้บันทึก passphrase ของกระเป๋าเงินที่ซ่อนอยู่นี้แล้ว", + "remove_device_desc": "การดำเนินการนี้จะตัดการเชื่อมต่อกระเป๋าสตางค์ฮาร์ดแวร์นี้ออกจาก OneKey App คุณสามารถเชื่อมต่อใหม่กับ App ได้ทุกเมื่อที่ต้องการ", + "remove_hidden_wallet_desc": "ลบกระเป๋าเงินที่ซ่อนอยู่นี้หรือไม่? ตรวจสอบให้แน่ใจว่าคุณได้บันทึก passphrase แล้ว", "remove_private_key_account_desc": "คุณสามารถกู้คืนบัญชีโดยใช้คีย์ส่วนตัวหลังจากที่ถูกลบออก โปรดตรวจสอบว่าได้สำรองข้อมูลเพื่อป้องกันการสูญเสียการเข้าถึงอย่างถาวร", "remove_wallet": "ลบกระเป๋าเงิน", "remove_wallet_desc": "ตรวจสอบให้แน่ใจว่าคุณได้เขียน recovery phrase ไว้ก่อนที่จะลบกระเป๋าเงิน มิฉะนั้นคุณจะไม่สามารถกู้คืนกระเป๋าเงินได้", diff --git a/packages/shared/src/locale/json/uk_UA.json b/packages/shared/src/locale/json/uk_UA.json index 11279a9593f..0df54fdae40 100644 --- a/packages/shared/src/locale/json/uk_UA.json +++ b/packages/shared/src/locale/json/uk_UA.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Створіть надійний пароль", "auth.new_password_same_as_old": "Новий пароль має відрізнятися від старого", "auth.passcode_cooldown": "Спробуйте знову через {cooldowntime} хв", - "auth.passcode_failed_alert": "{count} ще кілька невдалих спроб скинуть пристрій", + "auth.passcode_failed_alert": "Ще {count} невдалих спроб скине налаштування програми", "auth.passcode_set": "Встановлено пароль", "auth.password_set": "Пароль встановлено", "auth.set_passcode": "Встановити код доступу", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Легко отримати через {number} днів", "earn.claim_limitations": "Через обмеження Lido, ви повинні заявляти про кожне своє викуплення окремо.", "earn.claim_rewards": "Отримати винагороди", - "earn.claim_rewards_morpho_desc": "Винагороди розраховуються з усіх позицій ставок Morpho та оновлюються приблизно кожні два тижні.", + "earn.claim_rewards_morpho_desc": "Винагороди розраховуються з усіх позицій ставок Morpho та розраховуються кожні 2 тижні.", "earn.claim_together_tooltip": "Автоматично зараховується на ваш гаманець після кожного запиту на стейкінг або виведення активів.", "earn.claim_token": "Ствердити {token}", "earn.claim_token_desc": "Заявіть про отримання {token} після обробки запиту на виведення коштів.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Не можете знайти маркер? Спробуйте пошукати", "remove_account_desc": "Цей обліковий запис буде видалено.", "remove_device": "Видалити пристрій", - "remove_device_desc": "Це назавжди видалить ваші дані. Але ви все ще можете відновити їх з апаратного гаманця, в якому зберігається фраза відновлення цього гаманця.", - "remove_hidden_wallet_desc": "Це назавжди видалить ваші дані. Переконайтеся, що ви зберегли passphrase цього прихованого гаманця.", + "remove_device_desc": "Це відключить цей апаратний гаманець від OneKey App. Ви можете підключити його до App у будь-який час.", + "remove_hidden_wallet_desc": "Видалити цей прихований гаманець? Переконайтеся, що ви зберегли passphrase.", "remove_private_key_account_desc": "Ви можете відновити обліковий запис за допомогою його приватного ключа після видалення. Переконайтеся, що ви зробили резервну копію, щоб уникнути постійної втрати доступу.", "remove_wallet": "Видалити гаманець", "remove_wallet_desc": "Переконайтеся, що ви записали фразу відновлення перед видаленням гаманця. В іншому випадку, ви не зможете відновити гаманець.", diff --git a/packages/shared/src/locale/json/vi.json b/packages/shared/src/locale/json/vi.json index 91dbc23c496..c6efa621693 100644 --- a/packages/shared/src/locale/json/vi.json +++ b/packages/shared/src/locale/json/vi.json @@ -91,7 +91,7 @@ "auth.error_passcode_not_match": "Mã truy cập không khớp", "auth.error_passwcode_too_short": "Mã bảo mật phải có ít nhất {length} ký tự", "auth.error_password_empty": "Vui lòng nhập mật khẩu", - "auth.error_password_incorrect": "Mật khẩu không chính xác", + "auth.error_password_incorrect": "Mật mã không đúng", "auth.error_password_not_match": "Mật khẩu không khớp", "auth.error_password_too_short": "Mật khẩu phải có ít nhất {length} ký tự", "auth.new_passcode_form_label": "Mã bảo mật mới", @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "Tạo một mật khẩu mạnh", "auth.new_password_same_as_old": "Mật khẩu mới phải khác với mật khẩu cũ", "auth.passcode_cooldown": "Thử lại sau {cooldowntime} phút", - "auth.passcode_failed_alert": "{count} lần thử không thành công nữa sẽ đặt lại thiết bị", + "auth.passcode_failed_alert": "{count} lần thử không thành công nữa sẽ thiết lập lại Ứng dụng", "auth.passcode_set": "Đã đặt mật mã", "auth.password_set": "Đặt mật khẩu", "auth.set_passcode": "Thiết lập mã khóa", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "Nhận có sẵn trong {number} ngày", "earn.claim_limitations": "Do vì hạn chế của Lido, bạn phải yêu cầu mỗi lần đổi quà của mình một cách riêng biệt.", "earn.claim_rewards": "Nhận phần thưởng", - "earn.claim_rewards_morpho_desc": "Phần thưởng được tính từ tất cả các vị trí đặt cược Morpho và được cập nhật khoảng hai tuần một lần.", + "earn.claim_rewards_morpho_desc": "Phần thưởng được tính từ tất cả các vị trí đặt cược Morpho và được thanh toán sau mỗi 2 tuần.", "earn.claim_together_tooltip": "Tự động chuyển vào ví của bạn sau mỗi lần yêu cầu đặt cược hoặc rút tài sản.", "earn.claim_token": "Yêu cầu {token}", "earn.claim_token_desc": "Yêu cầu rút {token} của bạn sau khi yêu cầu rút đã được xử lý.", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "Không tìm thấy token? Hãy thử tìm kiếm", "remove_account_desc": "Tài khoản này sẽ bị xóa.", "remove_device": "Gỡ bỏ thiết bị", - "remove_device_desc": "Điều này sẽ xóa vĩnh viễn dữ liệu của bạn. Nhưng bạn vẫn có thể khôi phục nó từ ví cứng đã tải cụm từ khôi phục của ví này.", - "remove_hidden_wallet_desc": "Điều này sẽ xóa vĩnh viễn dữ liệu của bạn. Hãy đảm bảo bạn đã lưu passphrase của ví ẩn này.", + "remove_device_desc": "Điều này sẽ ngắt kết nối ví cứng này khỏi ứng dụng OneKey. Bạn có thể kết nối lại với ứng dụng bất cứ khi nào bạn muốn.", + "remove_hidden_wallet_desc": "Xóa ví ẩn này? Hãy đảm bảo bạn đã lưu passphrase.", "remove_private_key_account_desc": "Bạn có thể khôi phục tài khoản bằng khóa riêng của nó sau khi xóa. Hãy đảm bảo nó đã được sao lưu để tránh mất quyền truy cập vĩnh viễn.", "remove_wallet": "Xóa ví", "remove_wallet_desc": "Hãy chắc chắn bạn đã ghi lại cụm từ khôi phục trước khi gỡ ví đi. Nếu không, bạn sẽ không thể khôi phục lại ví.", diff --git a/packages/shared/src/locale/json/zh_CN.json b/packages/shared/src/locale/json/zh_CN.json index 0e0afa666eb..c5c759cdee8 100644 --- a/packages/shared/src/locale/json/zh_CN.json +++ b/packages/shared/src/locale/json/zh_CN.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "创建一个强密码", "auth.new_password_same_as_old": "新密码必须与旧密码不同", "auth.passcode_cooldown": "请在 {cooldowntime} 分钟后再试", - "auth.passcode_failed_alert": "再失败 {count} 次将重置该设备", + "auth.passcode_failed_alert": "再失败{count}次尝试将重置 App", "auth.passcode_set": "密码已设置", "auth.password_set": "密码已设置", "auth.set_passcode": "设置密码", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "可在 {number} 天后领取", "earn.claim_limitations": "由于 Lido 的限制,您必须分别申请每一次的赎回。", "earn.claim_rewards": "领取奖励", - "earn.claim_rewards_morpho_desc": "奖励根据所有 Morpho 的质押仓位计算,大约每两周更新一次。", + "earn.claim_rewards_morpho_desc": "奖励根据所有 Morpho 的质押仓位计算,大约每两周结算一次。", "earn.claim_together_tooltip": "在每次质押或请求赎回资产后,自动存入您的钱包。", "earn.claim_token": "领取 {token}", "earn.claim_token_desc": "在赎回请求处理完毕后,领取您的 {token}。", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "找不到代币?试试搜索", "remove_account_desc": "此账户将被删除。", "remove_device": "移除设备", - "remove_device_desc": "这将永久删除您的数据。但您仍然可以从已加载此钱包的助记词的硬件钱包中恢复。", - "remove_hidden_wallet_desc": "这将永久删除您的数据。请确保您已保存此隐藏钱包的 passphrase。", + "remove_device_desc": "这将断开此硬件钱包与 OneKey App 的连接。您可以随时重新连接到 App。", + "remove_hidden_wallet_desc": "移除这个隐藏钱包?请确保您已保存 passphrase。", "remove_private_key_account_desc": "您可以在删除后使用其私钥恢复账户。请确保已备份,以避免永久失去访问权限。", "remove_wallet": "移除钱包", "remove_wallet_desc": "在删除钱包之前,请确保您已写下助记词。否则,您将无法恢复钱包。", diff --git a/packages/shared/src/locale/json/zh_HK.json b/packages/shared/src/locale/json/zh_HK.json index 5f49ae73883..15a7c153a03 100644 --- a/packages/shared/src/locale/json/zh_HK.json +++ b/packages/shared/src/locale/json/zh_HK.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "建立一個強密碼", "auth.new_password_same_as_old": "新密碼必須與舊密碼不同", "auth.passcode_cooldown": "請在 {cooldowntime} 分鐘後再試", - "auth.passcode_failed_alert": "再多 {count} 次失敗嘗試將重置該裝置", + "auth.passcode_failed_alert": "再嘗試失敗{count}次將會重設 App", "auth.passcode_set": "密碼已設定", "auth.password_set": "密碼已設定", "auth.set_passcode": "設置密碼", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "可在 {number} 天後領取", "earn.claim_limitations": "由於 Lido 的限制,您必須分別申請每一次的贖回。", "earn.claim_rewards": "領取獎勵", - "earn.claim_rewards_morpho_desc": "獎勵根據所有 Morpho 的質押倉位計算,大約每兩週更新一次。", + "earn.claim_rewards_morpho_desc": "獎勵根據所有 Morpho 的質押部位計算,大約每兩週結算一次。", "earn.claim_together_tooltip": "在每次質押或請求贖回資產後,自動存入您的錢包。", "earn.claim_token": "領取 {token}", "earn.claim_token_desc": "在贖回請求處理完畢後,領取您的 {token}。", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "找不到代幣?試試搜索", "remove_account_desc": "此帳戶將被刪除。", "remove_device": "移除裝置", - "remove_device_desc": "這將永久刪除您的數據。但您仍然可以從已載入此錢包的助記詞的硬件錢包中恢復。", - "remove_hidden_wallet_desc": "這將永久刪除您的數據。請確保您已保存此隱藏錢包的 passphrase。", + "remove_device_desc": "這將會將此硬件錢包從 OneKey App 中斷開。您可以隨時重新連接到 App。", + "remove_hidden_wallet_desc": "移除這個隱藏錢包?請確保您已保存 passphrase。", "remove_private_key_account_desc": "您可以在刪除後使用其私鑰恢復帳戶。請確保已備份,以避免永久失去訪問權限。", "remove_wallet": "移除錢包", "remove_wallet_desc": "在刪除錢包之前,請確保你已寫下助記詞。否則,你將無法恢復錢包。", diff --git a/packages/shared/src/locale/json/zh_TW.json b/packages/shared/src/locale/json/zh_TW.json index 57ff2e397bc..47262f46388 100644 --- a/packages/shared/src/locale/json/zh_TW.json +++ b/packages/shared/src/locale/json/zh_TW.json @@ -101,7 +101,7 @@ "auth.new_password_form_placeholder": "創建一個強大的密碼", "auth.new_password_same_as_old": "新密碼必須與舊密碼不同", "auth.passcode_cooldown": "請在 {cooldowntime} 分鐘後再試", - "auth.passcode_failed_alert": "再嘗試 {count} 次失敗將重置該裝置", + "auth.passcode_failed_alert": "再嘗試失敗{count}次將會重設 App", "auth.passcode_set": "密碼已設定", "auth.password_set": "密碼已設定", "auth.set_passcode": "設置密碼", @@ -374,7 +374,7 @@ "earn.claim_available_in_number_days": "可在 {number} 天後領取", "earn.claim_limitations": "由於 Lido 的限制,您必須分別申請每一次的贖回。", "earn.claim_rewards": "領取獎勵", - "earn.claim_rewards_morpho_desc": "獎勵根據所有 Morpho 的質押倉位計算,大約每兩週更新一次。", + "earn.claim_rewards_morpho_desc": "獎勵根據所有 Morpho 的質押部位計算,大約每兩週結算一次。", "earn.claim_together_tooltip": "在每次質押或請求贖回資產後,自動存入您的錢包。", "earn.claim_token": "領取 {token}", "earn.claim_token_desc": "在贖回請求處理完畢後,領取您的 {token}。", @@ -1645,8 +1645,8 @@ "receive_token_list_footer_text": "找不到代幣?試試搜尋", "remove_account_desc": "此帳戶將被移除。", "remove_device": "移除裝置", - "remove_device_desc": "這將永久刪除您的數據。但您仍然可以從已載入此錢包的助記詞的硬體錢包中恢復它。", - "remove_hidden_wallet_desc": "這將永久刪除您的數據。請確保您已保存此隱藏錢包的 passphrase。", + "remove_device_desc": "這將會把這個硬體錢包從 OneKey App 中斷開。您可以隨時重新連接到 App。", + "remove_hidden_wallet_desc": "移除這個隱藏的錢包?請確保您已保存 passphrase。", "remove_private_key_account_desc": "您可以在移除後使用其私鑰恢復帳戶。請確保已備份,以避免永久失去訪問權限。", "remove_wallet": "移除錢包", "remove_wallet_desc": "在移除錢包之前,請確保您已寫下助記詞。否則,您將無法恢復錢包。", diff --git a/packages/shared/src/locale/localeJsonMap.ts b/packages/shared/src/locale/localeJsonMap.ts index 33d696b88e5..53e021899d1 100644 --- a/packages/shared/src/locale/localeJsonMap.ts +++ b/packages/shared/src/locale/localeJsonMap.ts @@ -5,10 +5,8 @@ import enUS from './json/en_US.json'; export const LOCALES = { - 'ar': () => import('./json/ar.json'), 'bn': () => import('./json/bn.json'), 'de': () => import('./json/de.json'), - 'en': () => import('./json/en.json'), 'en-US': enUS, 'es': () => import('./json/es.json'), 'fr-FR': () => import('./json/fr_FR.json'), From 46731a7ca42fd6993dcc08dd539ab29e28c73a96 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 11:03:01 +0800 Subject: [PATCH 03/55] feat: update i18n content --- .../views/Market/MarketHomeWithProvider.tsx | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 packages/kit/src/views/Market/MarketHomeWithProvider.tsx diff --git a/packages/kit/src/views/Market/MarketHomeWithProvider.tsx b/packages/kit/src/views/Market/MarketHomeWithProvider.tsx deleted file mode 100644 index bff46610879..00000000000 --- a/packages/kit/src/views/Market/MarketHomeWithProvider.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { EJotaiContextStoreNames } from '@onekeyhq/kit-bg/src/states/jotai/atoms'; -import { EAccountSelectorSceneName } from '@onekeyhq/shared/types'; -import { AccountSelectorProviderMirror } from '../../components/AccountSelector'; -import { MarketHome } from './MarketHome'; -import { MarketWatchListProviderMirror } from './MarketWatchListProviderMirror'; - -export default function MarketHomeWithProvider() { - PrimeRouter; - return ( - - - - - - ); -} From 4bd3084e274f43e3b4812872dd08c812e7910aff Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 14:21:51 +0800 Subject: [PATCH 04/55] feat: update PrimeHeaderIconButton --- .../src/actions/IconButton/index.tsx | 4 +++ .../PrimeHeaderIconButton.tsx | 36 +++++++++++-------- .../views/Prime/hooks/usePrivyUniversal.ts | 12 ------- .../pages/PrimeDashboard/PrimeDashboard.tsx | 1 + 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/components/src/actions/IconButton/index.tsx b/packages/components/src/actions/IconButton/index.tsx index 217ff869a49..086c90e03bc 100644 --- a/packages/components/src/actions/IconButton/index.tsx +++ b/packages/components/src/actions/IconButton/index.tsx @@ -14,6 +14,7 @@ import { Tooltip } from '../Tooltip'; import type { IButtonProps, IIconProps, IKeyOfIcons } from '../../primitives'; import type { ITooltipProps } from '../Tooltip'; import type { GestureResponderEvent } from 'react-native'; +import type { TooltipProps } from 'tamagui'; export interface IIconButtonProps extends Omit { @@ -24,6 +25,7 @@ export interface IIconButtonProps // Allow triggering via the Enter or Space key. hotKey?: boolean; titlePlacement?: ITooltipProps['placement']; + tooltipProps?: TooltipProps; } const sizes = { @@ -56,6 +58,7 @@ export const IconButton = (props: IIconButtonProps) => { variant = 'secondary', hotKey = false, titlePlacement = 'top', + tooltipProps, ...rest } = props; @@ -116,6 +119,7 @@ export const IconButton = (props: IIconButtonProps) => { renderContent={title} placement={titlePlacement} {...(variant === 'tertiary' && { offset: 12 })} + {...tooltipProps} /> ); } diff --git a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx index 68cab694dc0..fdbdcd7cb8c 100644 --- a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx +++ b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx @@ -1,8 +1,6 @@ -import { useCallback } from 'react'; +import { useCallback, useState } from 'react'; -import { useIntl } from 'react-intl'; - -import { HeaderIconButton } from '@onekeyhq/components'; +import { HeaderIconButton, Toast } from '@onekeyhq/components'; import useAppNavigation from '@onekeyhq/kit/src/hooks/useAppNavigation'; import { EModalRoutes } from '@onekeyhq/shared/src/routes'; import { EPrimePages } from '@onekeyhq/shared/src/routes/prime'; @@ -11,26 +9,36 @@ import { usePrimeAuth } from '../../hooks/usePrimeAuth'; export function PrimeHeaderIconButton() { const { user, isReady } = usePrimeAuth(); - const intl = useIntl(); const navigation = useAppNavigation(); - // TODO: add a state to check if the user has clicked the button - const isClicked = true; + const [isHover, setIsHover] = useState(false); + + const onPrimeButtonPressed = useCallback(() => { + if (!isReady) { + Toast.message({ + title: 'Prime not ready.', + }); + return; + } - const onPrimeButtonPressed = useCallback(async () => { navigation.pushFullModal(EModalRoutes.PrimeModal, { screen: EPrimePages.PrimeDashboard, }); - }, [navigation]); + + setIsHover(false); + }, [navigation, isReady]); return ( setIsHover(true)} + onMouseLeave={() => setIsHover(false)} key="header-prime-button" - title={ - 'Prime' - // intl.formatMessage({ id: ETranslations.global_prime }) + title="Prime" + icon={ + user.isLoggedIn || isHover ? 'OnekeyPrimeLightColored' : 'PrimeOutline' } - icon={user.isLoggedIn ? 'OnekeyPrimeLightColored' : 'PrimeOutline'} - // icon={isClicked ? '' : 'OnekeyPrimeLightColored'} + tooltipProps={{ + open: isHover, + }} onPress={onPrimeButtonPressed} /> ); diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversal.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversal.ts index 35eb19128dc..d672c4d13d7 100644 --- a/packages/kit/src/views/Prime/hooks/usePrivyUniversal.ts +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversal.ts @@ -14,18 +14,6 @@ export function usePrivyUniversal(): IUsePrivyUniversal { logout, updateEmail: updateEmailWeb, updatePhone: updatePhoneWeb, - linkEmail, - linkWallet, - unlinkEmail, - linkPhone, - unlinkPhone, - unlinkWallet, - linkGoogle, - unlinkGoogle, - linkTwitter, - unlinkTwitter, - linkDiscord, - unlinkDiscord, getAccessToken, } = privy; const { login: loginWeb } = usePrivyLogin({ diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index aad707c8e9f..7ea781902be 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -197,6 +197,7 @@ export default function PrimeDashboard() { try { setIsLoading(true); if (!user?.isLoggedIn) { + console.log('loginByPrivy', loginByPrivy); return await loginByPrivy(); // loginLegacy(); } From dd040220576c42ac64db18b276646142624f6c19 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 14:22:14 +0800 Subject: [PATCH 05/55] feat: update PrimeHeaderIconButton --- .../PrimeHeaderIconButton/PrimeHeaderIconButton.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx index fdbdcd7cb8c..f0cf33e5e4f 100644 --- a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx +++ b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx @@ -29,8 +29,8 @@ export function PrimeHeaderIconButton() { return ( setIsHover(true)} - onMouseLeave={() => setIsHover(false)} + onPointerEnter={() => setIsHover(true)} + onPointerLeave={() => setIsHover(false)} key="header-prime-button" title="Prime" icon={ From 03bd9c695977d3a7827e52bbbbe783b54b4b982a Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 14:41:17 +0800 Subject: [PATCH 06/55] feat: add PrimeBenefitsList --- .../PrimeDashboard/PrimeBenefitsList.tsx | 86 ++++++++++++++++++ .../pages/PrimeDashboard/PrimeDashboard.tsx | 88 +------------------ 2 files changed, 88 insertions(+), 86 deletions(-) create mode 100644 packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeBenefitsList.tsx diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeBenefitsList.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeBenefitsList.tsx new file mode 100644 index 00000000000..490f27fd2ee --- /dev/null +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeBenefitsList.tsx @@ -0,0 +1,86 @@ +import type { IKeyOfIcons } from '@onekeyhq/components'; +import { Icon, Stack, Toast, YStack } from '@onekeyhq/components'; +import { ListItem } from '@onekeyhq/kit/src/components/ListItem'; + +function PrimeBenefitsItem({ + icon, + title, + subtitle, + onPress, +}: { + icon: IKeyOfIcons; + title: string; + subtitle: string; + onPress: () => void; +}) { + return ( + + + + + + + ); +} + +export function PrimeBenefitsList() { + return ( + + { + Toast.success({ + title: 'Sync', + }); + }} + /> + { + Toast.success({ + title: 'Premium RPC', + }); + }} + /> + { + Toast.success({ + title: 'Account Activity', + }); + }} + /> + { + Toast.success({ + title: 'Analytics', + }); + }} + /> + { + Toast.success({ + title: 'Device management', + }); + }} + /> + + ); +} diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index 7ea781902be..804a4082d66 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -2,7 +2,6 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { StyleSheet } from 'react-native'; -import type { IKeyOfIcons } from '@onekeyhq/components'; import { ActionList, Button, @@ -14,13 +13,11 @@ import { SizableText, Stack, Theme, - Toast, XStack, YStack, useSafeAreaInsets, } from '@onekeyhq/components'; import PrimeBannerBgDark from '@onekeyhq/kit/assets/animations/prime-banner-bg-dark.json'; -import { ListItem } from '@onekeyhq/kit/src/components/ListItem'; import useAppNavigation from '@onekeyhq/kit/src/hooks/useAppNavigation'; import { usePromiseResult } from '@onekeyhq/kit/src/hooks/usePromiseResult'; import { EWebEmbedRoutePath } from '@onekeyhq/shared/src/consts/webEmbedConsts'; @@ -32,6 +29,7 @@ import { useFetchPrimeUserInfo } from '../../hooks/useFetchPrimeUserInfo'; import { usePrimeAuth } from '../../hooks/usePrimeAuth'; import { usePrimePayment } from '../../hooks/usePrimePayment'; +import { PrimeBenefitsList } from './PrimeBenefitsList'; import { PrimeSubscriptionPlans } from './PrimeSubscriptionPlans'; import { PrimeUserInfo } from './PrimeUserInfo'; @@ -63,89 +61,6 @@ function PrimeBanner() { ); } -function PrimeBenefitsItem({ - icon, - title, - subtitle, - onPress, -}: { - icon: IKeyOfIcons; - title: string; - subtitle: string; - onPress: () => void; -}) { - return ( - - - - - - - ); -} - -function PrimeBenefitsList() { - return ( - - { - Toast.success({ - title: 'Sync', - }); - }} - /> - { - Toast.success({ - title: 'Premium RPC', - }); - }} - /> - { - Toast.success({ - title: 'Account Activity', - }); - }} - /> - { - Toast.success({ - title: 'Analytics', - }); - }} - /> - { - Toast.success({ - title: 'Device management', - }); - }} - /> - - ); -} - export default function PrimeDashboard() { const { top } = useSafeAreaInsets(); const { login, loginLegacy, logout, privy, getAccessToken, user } = @@ -333,6 +248,7 @@ export default function PrimeDashboard() { ) : null} {subscriptionPlans} + - + + diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx new file mode 100644 index 00000000000..b305b013f33 --- /dev/null +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx @@ -0,0 +1,143 @@ +import { useCallback, useMemo, useState } from 'react'; + +import { ActionList, Page, SizableText } from '@onekeyhq/components'; +import useAppNavigation from '@onekeyhq/kit/src/hooks/useAppNavigation'; +import { EWebEmbedRoutePath } from '@onekeyhq/shared/src/consts/webEmbedConsts'; +import platformEnv from '@onekeyhq/shared/src/platformEnv'; +import openUrlUtils from '@onekeyhq/shared/src/utils/openUrlUtils'; + +import { useFetchPrimeUserInfo } from '../../hooks/useFetchPrimeUserInfo'; +import { usePrimeAuth } from '../../hooks/usePrimeAuth'; +import { usePrimePayment } from '../../hooks/usePrimePayment'; + +export function PrimeDashboardFooter() { + const { login, loginLegacy, logout, privy, getAccessToken, user } = + usePrimeAuth(); + const { fetchPrimeUserInfo } = useFetchPrimeUserInfo(); + const navigation = useAppNavigation(); + const [selectedPackageId, setSelectedPackageId] = useState< + string | undefined + >(); + + const [isLoading, setIsLoading] = useState(false); + const { + presentPaywallNative, + purchasePaywallPackageWeb, + getPaywallPackagesWeb, + getPaywallPackagesNative, + getCustomerInfo, + } = usePrimePayment(); + + const loginByPrivy = useCallback(async () => { + if (platformEnv.isNative) { + // TODO: privy login Modal is conflict with OneKey Modal + // navigation.popStack(); + // await timerUtils.wait(1000); + } + login(); + }, [login]); + + const purchaseByWebview = useCallback(async () => { + navigation.popStack(); + // await timerUtils.wait(1000); + // purchase by webview + openUrlUtils.openUrlByWebviewPro({ + url: '', + title: 'WebView', + isWebEmbed: true, + hashRoutePath: EWebEmbedRoutePath.primePurchase, + hashRouteQueryParams: { + primeUserId: user?.privyUserId || '', + primeUserEmail: user?.email || '', + }, + }); + }, [navigation, user?.privyUserId, user?.email]); + + const doPurchase = useCallback(async () => { + try { + setIsLoading(true); + if (!user?.isLoggedIn) { + return await loginByPrivy(); + // loginLegacy(); + } + if (platformEnv.isNative) { + ActionList.show({ + title: 'Purchase', + onClose: () => {}, + sections: [ + { + items: [ + { + label: 'Purchase by AppStore/GooglePlay', + // description: 'Purchase by AppStore/GooglePlay', + onPress: () => { + void presentPaywallNative?.(); + }, + }, + { + label: 'Purchase by Webview', + // description: 'Purchase by Webview', + onPress: () => { + void purchaseByWebview(); + }, + }, + ], + }, + ], + }); + return; + } + if (selectedPackageId) { + await purchasePaywallPackageWeb?.({ + packageId: selectedPackageId, + email: user?.email || '', + }); + // await backgroundApiProxy.servicePrime.initRevenuecatPurchases({ + // privyUserId: user.privyUserId || '', + // }); + // await backgroundApiProxy.servicePrime.purchasePaywallPackage({ + // packageId: selectedPackageId, + // email: user?.email || '', + // }); + } + } finally { + setIsLoading(false); + await fetchPrimeUserInfo(); + } + }, [ + user?.isLoggedIn, + user?.email, + selectedPackageId, + loginByPrivy, + purchaseByWebview, + presentPaywallNative, + purchasePaywallPackageWeb, + fetchPrimeUserInfo, + ]); + + const shouldShowConfirmButton = useMemo(() => { + if (!user?.isLoggedIn) { + return true; + } + if (user?.isLoggedIn && !user?.primeSubscription?.isActive) { + return true; + } + return false; + }, [user?.isLoggedIn, user?.primeSubscription]); + + return ( + + sss + + ); +} diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/usePrimeDashboard.ts b/packages/kit/src/views/Prime/pages/PrimeDashboard/usePrimeDashboard.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/shared/src/routes/gallery.ts b/packages/shared/src/routes/gallery.ts index 746cb215170..943a13ceb55 100644 --- a/packages/shared/src/routes/gallery.ts +++ b/packages/shared/src/routes/gallery.ts @@ -79,4 +79,5 @@ export enum EGalleryRoutes { HyperlinkTextGallery = 'component-HyperlinkText', HapticsGallery = 'component-Haptics', ComponentAccordion = 'component-accordion', + ComponentOTPInput = 'component-OTPInput', } diff --git a/yarn.lock b/yarn.lock index e247580966a..b131f00e4ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6938,6 +6938,7 @@ __metadata: react-native-copy-asset: "npm:^3.0.2" react-native-draggable-flatlist: "npm:4.0.1" react-native-flipper: "npm:0.201.0" + react-native-otp-entry: "npm:^1.8.2" react-native-reanimated: "npm:3.6.1" react-native-web: "npm:0.18.12" react-refresh: "npm:^0.14.0" @@ -35067,6 +35068,16 @@ __metadata: languageName: node linkType: hard +"react-native-otp-entry@npm:^1.8.2": + version: 1.8.2 + resolution: "react-native-otp-entry@npm:1.8.2" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/697c7564a23317f0c0f2e1b400d02340e31f954e230be7017efe1dcf810753fcde79cbdd27f045dd3813e26db3f31c877933bc02bd4a42cfa04820c7a7f299d5 + languageName: node + linkType: hard + "react-native-passkeys@npm:^0.3.0": version: 0.3.1 resolution: "react-native-passkeys@npm:0.3.1" From a389d866aeac9edd124e6ab0dba42a09106c2fe5 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 20:48:34 +0800 Subject: [PATCH 08/55] feat: update OTPInput color --- packages/components/src/forms/OTPInput/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/components/src/forms/OTPInput/index.tsx b/packages/components/src/forms/OTPInput/index.tsx index 093e7badfcd..8e714e739bc 100644 --- a/packages/components/src/forms/OTPInput/index.tsx +++ b/packages/components/src/forms/OTPInput/index.tsx @@ -5,13 +5,14 @@ import { useThemeValue } from '../../hooks'; import type { OtpInputProps } from 'react-native-otp-entry'; export function OTPInput(props: OtpInputProps) { - const [neutral5Color] = useThemeValue(['neutral5']); + const [neutral5Color, textColor] = useThemeValue(['neutral5', 'text']); return ( ); From 243dafcfb14a8de86cb714ffdecbf80227637e06 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 21:27:27 +0800 Subject: [PATCH 09/55] feat: update OTPInputGallery demo --- .../components/src/forms/OTPInput/index.tsx | 19 ++++++++++++++++--- .../Components/stories/OTPInputGallery.tsx | 16 ++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/components/src/forms/OTPInput/index.tsx b/packages/components/src/forms/OTPInput/index.tsx index 8e714e739bc..dfe4a4f1e96 100644 --- a/packages/components/src/forms/OTPInput/index.tsx +++ b/packages/components/src/forms/OTPInput/index.tsx @@ -1,14 +1,27 @@ +import { useEffect, useRef } from 'react'; + import { OtpInput } from 'react-native-otp-entry'; import { useThemeValue } from '../../hooks'; -import type { OtpInputProps } from 'react-native-otp-entry'; +import type { OtpInputProps, OtpInputRef } from 'react-native-otp-entry'; -export function OTPInput(props: OtpInputProps) { +export function OTPInput( + props: OtpInputProps & { + value: string; + }, +) { + const { value, ...rest } = props; const [neutral5Color, textColor] = useThemeValue(['neutral5', 'text']); + const ref = useRef(null); + + useEffect(() => { + ref.current?.setValue(value); + }, [value]); return ( ); } diff --git a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx index ec7828fbb34..75c7375c1b4 100644 --- a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx +++ b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx @@ -1,26 +1,30 @@ import { useState } from 'react'; -import { OTPInput, SizableText, YStack } from '@onekeyhq/components'; +import { Button, OTPInput, SizableText, YStack } from '@onekeyhq/components'; import { Layout } from './utils/Layout'; function OTPInputGallery() { - const [text, setText] = useState(''); + const [value, setText] = useState(''); return ( - {text} + setText(value)} + value={value} + onTextChange={(newValue) => setText(newValue)} /> + + value: {value} + + ), }, From 837db20738e2f6fb0b689c43de4cd07d331d7c00 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 21:29:40 +0800 Subject: [PATCH 10/55] feat: fix suggestions value --- .../Developer/pages/Gallery/Components/stories/utils/Layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/utils/Layout.tsx b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/utils/Layout.tsx index 50beaaa3d80..cc1ca8eee69 100644 --- a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/utils/Layout.tsx +++ b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/utils/Layout.tsx @@ -138,7 +138,7 @@ export function Layout({ ) : null} - {suggestions ? ( + {suggestions && suggestions.length > 0 ? ( 使用建议 From 5d2947d24b146d9216ffe84e8aac5860f7f90893 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 22:07:41 +0800 Subject: [PATCH 11/55] feat: add PrimeSignupTest --- package.json | 2 +- .../pages/PrimeDashboard/PrimeDashboard.tsx | 3 + .../pages/PrimeDashboard/PrimeSignupTest.tsx | 68 ++++++ yarn.lock | 207 +++++------------- 4 files changed, 127 insertions(+), 153 deletions(-) create mode 100644 packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx diff --git a/package.json b/package.json index 8818c013191..350bfa5db5f 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@polkadot/extension-inject": "0.46.6", "@polkadot/types": "11.3.1", "@polkadot/util-crypto": "12.6.2", - "@privy-io/react-auth": "1.98.4", + "@privy-io/react-auth": "2.0.4", "@revenuecat/purchases-js": "^0.15.1", "@sentry/browser": "8.42.0", "@sentry/core": "8.42.0", diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index de7055a4eeb..89c423f88d0 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -31,6 +31,7 @@ import { usePrimePayment } from '../../hooks/usePrimePayment'; import { PrimeBenefitsList } from './PrimeBenefitsList'; import { PrimeDashboardFooter } from './PrimeDashboardFooter'; +import { PrimeSignupTest } from './PrimeSignupTest'; import { PrimeSubscriptionPlans } from './PrimeSubscriptionPlans'; import { PrimeUserInfo } from './PrimeUserInfo'; @@ -317,6 +318,8 @@ export default function PrimeDashboard() { + + diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx new file mode 100644 index 00000000000..cf0cc77f3e9 --- /dev/null +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx @@ -0,0 +1,68 @@ +import { useEffect, useState } from 'react'; + +import { + useGuestAccounts, + useLoginWithEmail, + usePrivy, +} from '@privy-io/react-auth'; + +import { Button, Input, OTPInput, YStack } from '@onekeyhq/components'; + +export function PrimeSignupTest() { + const { createGuestAccount } = useGuestAccounts(); + const { ready, authenticated, logout } = usePrivy(); + + const { + sendCode: sendCodeEmail, + loginWithCode: loginWithCodeEmail, + state: stateEmail, + } = useLoginWithEmail({ + onComplete: ({ user, isNewUser, wasAlreadyAuthenticated, loginMethod }) => { + console.log('🔑 ✅ User successfully logged in with email', { + user, + isNewUser, + wasAlreadyAuthenticated, + loginMethod, + }); + }, + onError: (error) => { + console.log(error); + }, + }); + + // Email Local State + const [email, setEmail] = useState('limichange@hotmail.com'); + const [codeEmail, setCodeEmail] = useState(''); + const [emailState, setEmailState] = useState(stateEmail.status as string); + + // Update email status + useEffect(() => { + if (stateEmail.status === 'error' && stateEmail.error) { + const message = `Error ${stateEmail.error.message}`; + setEmailState(message); + } else { + setEmailState(stateEmail.status); + } + }, [stateEmail]); + + return ( + + + + + + + + + + ); +} diff --git a/yarn.lock b/yarn.lock index b131f00e4ea..f6322c8f0d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3212,7 +3212,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": +"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.2": version: 5.7.2 resolution: "@ethersproject/providers@npm:5.7.2" dependencies: @@ -6820,7 +6820,7 @@ __metadata: "@polkadot/extension-inject": "npm:0.46.6" "@polkadot/types": "npm:11.3.1" "@polkadot/util-crypto": "npm:12.6.2" - "@privy-io/react-auth": "npm:1.98.4" + "@privy-io/react-auth": "npm:2.0.4" "@revenuecat/purchases-js": "npm:^0.15.1" "@sentry/babel-plugin-component-annotate": "npm:2.21.1" "@sentry/browser": "npm:8.42.0" @@ -9025,7 +9025,7 @@ __metadata: languageName: node linkType: hard -"@privy-io/api-base@npm:^1.4.1": +"@privy-io/api-base@npm:1.4.2, @privy-io/api-base@npm:^1.4.1, @privy-io/api-base@npm:^1.4.2": version: 1.4.2 resolution: "@privy-io/api-base@npm:1.4.2" dependencies: @@ -9117,6 +9117,37 @@ __metadata: languageName: node linkType: hard +"@privy-io/js-sdk-core@npm:0.40.0": + version: 0.40.0 + resolution: "@privy-io/js-sdk-core@npm:0.40.0" + dependencies: + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/contracts": "npm:^5.7.0" + "@ethersproject/providers": "npm:^5.7.2" + "@ethersproject/transactions": "npm:^5.7.0" + "@ethersproject/units": "npm:^5.7.0" + "@privy-io/api-base": "npm:^1.4.2" + "@privy-io/public-api": "npm:2.18.0" + eventemitter3: "npm:^5.0.1" + fetch-retry: "npm:^5.0.6" + jose: "npm:^4.15.5" + js-cookie: "npm:^3.0.5" + libphonenumber-js: "npm:^1.10.44" + set-cookie-parser: "npm:^2.6.0" + uuid: "npm:>=8 <10" + peerDependencies: + permissionless: ^0.2.10 + viem: ^2.21.36 + peerDependenciesMeta: + permissionless: + optional: true + viem: + optional: true + checksum: 10/12b71e6ba1d19bb21be375ee783e1326948c0b2a6467e6ad07997c65e37f20975af33d06c905e9cd8a54a5b237db1374dff68ea986e3702fc17d3d1cd8cd52f3 + languageName: node + linkType: hard + "@privy-io/public-api@npm:2.15.8": version: 2.15.8 resolution: "@privy-io/public-api@npm:2.15.8" @@ -9130,27 +9161,30 @@ __metadata: languageName: node linkType: hard -"@privy-io/react-auth@npm:1.98.4": - version: 1.98.4 - resolution: "@privy-io/react-auth@npm:1.98.4" +"@privy-io/public-api@npm:2.18.0": + version: 2.18.0 + resolution: "@privy-io/public-api@npm:2.18.0" + dependencies: + "@privy-io/api-base": "npm:1.4.2" + bs58: "npm:^5.0.0" + ethers: "npm:^5.7.2" + libphonenumber-js: "npm:^1.10.31" + zod: "npm:^3.22.4" + checksum: 10/66faaeab5f58b9b1315d93a943800e62b786608cd92936c0097a4d5e381f3b70ee5e9822052972c5e977bad9c17048ede8564d7c3a3a98314817a6f71f43ee40 + languageName: node + linkType: hard + +"@privy-io/react-auth@npm:2.0.4": + version: 2.0.4 + resolution: "@privy-io/react-auth@npm:2.0.4" dependencies: "@coinbase/wallet-sdk": "npm:4.0.3" - "@ethersproject/abstract-signer": "npm:^5.7.0" - "@ethersproject/address": "npm:^5.7.0" - "@ethersproject/bignumber": "npm:^5.7.0" - "@ethersproject/bytes": "npm:^5.7.0" - "@ethersproject/contracts": "npm:^5.7.0" - "@ethersproject/logger": "npm:^5.7.0" - "@ethersproject/providers": "npm:^5.7.1" - "@ethersproject/strings": "npm:^5.7.0" - "@ethersproject/transactions": "npm:^5.7.0" - "@ethersproject/units": "npm:^5.7.0" "@floating-ui/react": "npm:^0.26.22" "@headlessui/react": "npm:^2.2.0" "@heroicons/react": "npm:^2.1.1" "@marsidev/react-turnstile": "npm:^0.4.1" "@metamask/eth-sig-util": "npm:^6.0.0" - "@privy-io/js-sdk-core": "npm:0.36.1" + "@privy-io/js-sdk-core": "npm:0.40.0" "@simplewebauthn/browser": "npm:^9.0.1" "@solana/wallet-adapter-base": "npm:^0.9.23" "@solana/wallet-standard-wallet-adapter-base": "npm:^1.1.2" @@ -9178,11 +9212,9 @@ __metadata: tinycolor2: "npm:^1.6.0" uuid: "npm:>=8 <10" viem: "npm:^2.21.9" - web3-core: "npm:^1.8.0" - web3-core-helpers: "npm:^1.8.0" - zustand: "npm:^5.0.1" + zustand: "npm:^5.0.0" peerDependencies: - "@abstract-foundation/agw-client": ^0.1.0 + "@abstract-foundation/agw-client": ^1.0.0 "@solana/web3.js": ^1.95.8 permissionless: ^0.2.10 react: ^18 || ^19 @@ -9194,7 +9226,7 @@ __metadata: optional: true permissionless: optional: true - checksum: 10/fcf98771e0cc03e2c472ea7a6876a5a5dd479348f7abda93ba01971eceba8aecb1e8973d99ed1a27fb6f98dda8a0cf6475f5ecf6004549823cbfa0aaeaa41245 + checksum: 10/ac4911f2343254e012228a716e0e934ce0cae7c7f5166dbedcce4238b190ba8268c48a1884666ae135afbc8c156ace222abe718d3828d5f92687fd3cfbe4f0b3 languageName: node linkType: hard @@ -40925,16 +40957,6 @@ __metadata: languageName: node linkType: hard -"web3-core-helpers@npm:1.10.4, web3-core-helpers@npm:^1.8.0": - version: 1.10.4 - resolution: "web3-core-helpers@npm:1.10.4" - dependencies: - web3-eth-iban: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 10/9c22942827bed0e46ae491a0bee3cd60cea636f9b0408b11bb341b0370e58a94358025657405142c2a24f3912a8f947e6e977d594d9ba66e11dedce3c5c4a7f4 - languageName: node - linkType: hard - "web3-core-method@npm:1.10.3": version: 1.10.3 resolution: "web3-core-method@npm:1.10.3" @@ -40948,19 +40970,6 @@ __metadata: languageName: node linkType: hard -"web3-core-method@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-method@npm:1.10.4" - dependencies: - "@ethersproject/transactions": "npm:^5.6.2" - web3-core-helpers: "npm:1.10.4" - web3-core-promievent: "npm:1.10.4" - web3-core-subscriptions: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 10/d942beba3999c084333f5c808ada2a90930d55d148d5f8cc51a2135f8ab3f101fa5ce0d732a60830e8cad2af844bbed6cf0b6250863003adafb08c7ffa9fbd5f - languageName: node - linkType: hard - "web3-core-promievent@npm:1.10.3": version: 1.10.3 resolution: "web3-core-promievent@npm:1.10.3" @@ -40970,15 +40979,6 @@ __metadata: languageName: node linkType: hard -"web3-core-promievent@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-promievent@npm:1.10.4" - dependencies: - eventemitter3: "npm:4.0.4" - checksum: 10/a792c74aa5c91dc63fb493af04628ecfa08b9e6ceea402dfe53f718b019c41d63a0200bf3045dd23ec3c42b8d7474ac96eb4cb4456060becc551c2cacbd02bb1 - languageName: node - linkType: hard - "web3-core-requestmanager@npm:1.10.3": version: 1.10.3 resolution: "web3-core-requestmanager@npm:1.10.3" @@ -40992,19 +40992,6 @@ __metadata: languageName: node linkType: hard -"web3-core-requestmanager@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-requestmanager@npm:1.10.4" - dependencies: - util: "npm:^0.12.5" - web3-core-helpers: "npm:1.10.4" - web3-providers-http: "npm:1.10.4" - web3-providers-ipc: "npm:1.10.4" - web3-providers-ws: "npm:1.10.4" - checksum: 10/c26bf616cc156b2198bf634084978d66cf384cf2b174324b6ada071a8c9e9be7855d72c09453308d1a46b50874c18ff9b75193f8736c2b285cdc32209391880c - languageName: node - linkType: hard - "web3-core-subscriptions@npm:1.10.3": version: 1.10.3 resolution: "web3-core-subscriptions@npm:1.10.3" @@ -41015,16 +41002,6 @@ __metadata: languageName: node linkType: hard -"web3-core-subscriptions@npm:1.10.4": - version: 1.10.4 - resolution: "web3-core-subscriptions@npm:1.10.4" - dependencies: - eventemitter3: "npm:4.0.4" - web3-core-helpers: "npm:1.10.4" - checksum: 10/b1652988c0925ab1d5c27e67a816ec6bcb32f37f59c7314e1f02552233fbc486a0de579aeb660d77d82452b63e9feaa98317ec7897cd7aeb140595c8e176d0eb - languageName: node - linkType: hard - "web3-core@npm:1.10.3": version: 1.10.3 resolution: "web3-core@npm:1.10.3" @@ -41040,21 +41017,6 @@ __metadata: languageName: node linkType: hard -"web3-core@npm:^1.8.0": - version: 1.10.4 - resolution: "web3-core@npm:1.10.4" - dependencies: - "@types/bn.js": "npm:^5.1.1" - "@types/node": "npm:^12.12.6" - bignumber.js: "npm:^9.0.0" - web3-core-helpers: "npm:1.10.4" - web3-core-method: "npm:1.10.4" - web3-core-requestmanager: "npm:1.10.4" - web3-utils: "npm:1.10.4" - checksum: 10/138c5abff27a48d16584fdbe56b940f9efe7cd2463d768f42c5fcdfc97d0dc4fc41e09ff1ffb8c8ff79b22a69e9efbf5af27c4b6a0d888c351202f03a8b01b8e - languageName: node - linkType: hard - "web3-eth-abi@npm:1.10.3": version: 1.10.3 resolution: "web3-eth-abi@npm:1.10.3" @@ -41125,16 +41087,6 @@ __metadata: languageName: node linkType: hard -"web3-eth-iban@npm:1.10.4": - version: 1.10.4 - resolution: "web3-eth-iban@npm:1.10.4" - dependencies: - bn.js: "npm:^5.2.1" - web3-utils: "npm:1.10.4" - checksum: 10/b5e33aaf3d41608ed59ea98c703271eefcd30aea15163cda4bc8713f9716eb40b816e8047022ebf71391250983acfe58e65551461109a53e266f4b824c4a0678 - languageName: node - linkType: hard - "web3-eth-personal@npm:1.10.3": version: 1.10.3 resolution: "web3-eth-personal@npm:1.10.3" @@ -41192,18 +41144,6 @@ __metadata: languageName: node linkType: hard -"web3-providers-http@npm:1.10.4": - version: 1.10.4 - resolution: "web3-providers-http@npm:1.10.4" - dependencies: - abortcontroller-polyfill: "npm:^1.7.5" - cross-fetch: "npm:^4.0.0" - es6-promise: "npm:^4.2.8" - web3-core-helpers: "npm:1.10.4" - checksum: 10/2ff27d45cc7c7b1e8f07a7917fe1502fef59e211b2ee97851369f9b6dab99ce81b0bef50f9ecf36286137fc41f1230f04b55b090d30f870fbc5ef1972d165b5f - languageName: node - linkType: hard - "web3-providers-ipc@npm:1.10.3": version: 1.10.3 resolution: "web3-providers-ipc@npm:1.10.3" @@ -41214,16 +41154,6 @@ __metadata: languageName: node linkType: hard -"web3-providers-ipc@npm:1.10.4": - version: 1.10.4 - resolution: "web3-providers-ipc@npm:1.10.4" - dependencies: - oboe: "npm:2.1.5" - web3-core-helpers: "npm:1.10.4" - checksum: 10/cd33a954f59ba3a9ca466dca0d6563f46c56879dc249d885b8edfee077f9f58ccf591ba06855e1d69baba52a8719c03684b0ba7b33d836bfdd4c6166e289c0d4 - languageName: node - linkType: hard - "web3-providers-ws@npm:1.10.3": version: 1.10.3 resolution: "web3-providers-ws@npm:1.10.3" @@ -41235,17 +41165,6 @@ __metadata: languageName: node linkType: hard -"web3-providers-ws@npm:1.10.4": - version: 1.10.4 - resolution: "web3-providers-ws@npm:1.10.4" - dependencies: - eventemitter3: "npm:4.0.4" - web3-core-helpers: "npm:1.10.4" - websocket: "npm:^1.0.32" - checksum: 10/98cb76473ae1060e21ff474768a04c6dcd91724f24a1fac2d4a5f186a35bd2f119605fbb28423dfe5be33755b1e5808b10514ddaf326b57573b447efc84ef730 - languageName: node - linkType: hard - "web3-shh@npm:1.10.3": version: 1.10.3 resolution: "web3-shh@npm:1.10.3" @@ -41274,22 +41193,6 @@ __metadata: languageName: node linkType: hard -"web3-utils@npm:1.10.4": - version: 1.10.4 - resolution: "web3-utils@npm:1.10.4" - dependencies: - "@ethereumjs/util": "npm:^8.1.0" - bn.js: "npm:^5.2.1" - ethereum-bloom-filters: "npm:^1.0.6" - ethereum-cryptography: "npm:^2.1.2" - ethjs-unit: "npm:0.1.6" - number-to-bn: "npm:1.7.0" - randombytes: "npm:^2.1.0" - utf8: "npm:3.0.0" - checksum: 10/3e586b638cdae9fa45b7698e8a511ae2cbf60e219a900351ae38d384beaaf67424ac6e1d9c5098c3fb8f2ff3cc65a70d977a20bdce3dad542cb50deb666ea2a3 - languageName: node - linkType: hard - "web3@npm:^1.7.3": version: 1.10.3 resolution: "web3@npm:1.10.3" @@ -42554,7 +42457,7 @@ __metadata: languageName: node linkType: hard -"zustand@npm:^5.0.1": +"zustand@npm:^5.0.0": version: 5.0.3 resolution: "zustand@npm:5.0.3" peerDependencies: From 122bc4211c79eb2f25205d1f1f3ab1d1450eaf90 Mon Sep 17 00:00:00 2001 From: limichange Date: Wed, 22 Jan 2025 22:14:09 +0800 Subject: [PATCH 12/55] feat: upgrade @privy-io/expo --- apps/mobile/package.json | 2 +- yarn.lock | 67 +++++----------------------------------- 2 files changed, 8 insertions(+), 61 deletions(-) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 5ee0883a943..6a6dcae6f89 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -43,7 +43,7 @@ "@onekeyhq/components": "*", "@onekeyhq/kit": "*", "@onekeyhq/shared": "*", - "@privy-io/expo": "^0.35.1", + "@privy-io/expo": "0.40.0", "@privy-io/expo-native-extensions": "^0.0.3", "@react-native-async-storage/async-storage": "1.22.0", "@react-native-community/netinfo": "^11.4.1", diff --git a/yarn.lock b/yarn.lock index f6322c8f0d3..7250c421134 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7172,7 +7172,7 @@ __metadata: "@onekeyhq/components": "npm:*" "@onekeyhq/kit": "npm:*" "@onekeyhq/shared": "npm:*" - "@privy-io/expo": "npm:^0.35.1" + "@privy-io/expo": "npm:0.40.0" "@privy-io/expo-native-extensions": "npm:^0.0.3" "@react-native-async-storage/async-storage": "npm:1.22.0" "@react-native-community/netinfo": "npm:^11.4.1" @@ -9016,16 +9016,7 @@ __metadata: languageName: node linkType: hard -"@privy-io/api-base@npm:1.4.1": - version: 1.4.1 - resolution: "@privy-io/api-base@npm:1.4.1" - dependencies: - zod: "npm:^3.21.4" - checksum: 10/4a3d48670cdd2a9373071f3e911f421decf4b7eb4c6c8acca378854b7baaba239ec785d9bd67a3736e9ea284d424d2db0819a26a06c1e1834a0142d7e21cd63f - languageName: node - linkType: hard - -"@privy-io/api-base@npm:1.4.2, @privy-io/api-base@npm:^1.4.1, @privy-io/api-base@npm:^1.4.2": +"@privy-io/api-base@npm:1.4.2, @privy-io/api-base@npm:^1.4.2": version: 1.4.2 resolution: "@privy-io/api-base@npm:1.4.2" dependencies: @@ -9045,11 +9036,11 @@ __metadata: languageName: node linkType: hard -"@privy-io/expo@npm:^0.35.1": - version: 0.35.1 - resolution: "@privy-io/expo@npm:0.35.1" +"@privy-io/expo@npm:0.40.0": + version: 0.40.0 + resolution: "@privy-io/expo@npm:0.40.0" dependencies: - "@privy-io/js-sdk-core": "npm:0.36.1" + "@privy-io/js-sdk-core": "npm:0.40.0" react-fast-compare: "npm:^3.2.2" zustand: "npm:^4.4.1" peerDependencies: @@ -9082,38 +9073,7 @@ __metadata: optional: true viem: optional: true - checksum: 10/6e0915f610f5e506491602ef680c820771c5070366a816c4cf54fcd079a2951603e4b89daf28cdcd0ed7a9f40a86bca0e7ecaeedd37986f2ea6b145fdd0c3ea1 - languageName: node - linkType: hard - -"@privy-io/js-sdk-core@npm:0.36.1": - version: 0.36.1 - resolution: "@privy-io/js-sdk-core@npm:0.36.1" - dependencies: - "@ethersproject/abstract-signer": "npm:^5.7.0" - "@ethersproject/bignumber": "npm:^5.7.0" - "@ethersproject/contracts": "npm:^5.7.0" - "@ethersproject/providers": "npm:^5.7.2" - "@ethersproject/transactions": "npm:^5.7.0" - "@ethersproject/units": "npm:^5.7.0" - "@privy-io/api-base": "npm:^1.4.1" - "@privy-io/public-api": "npm:2.15.8" - eventemitter3: "npm:^5.0.1" - fetch-retry: "npm:^5.0.6" - jose: "npm:^4.15.5" - js-cookie: "npm:^3.0.5" - libphonenumber-js: "npm:^1.10.44" - set-cookie-parser: "npm:^2.6.0" - uuid: "npm:>=8 <10" - peerDependencies: - permissionless: ^0.2.10 - viem: ^2.21.36 - peerDependenciesMeta: - permissionless: - optional: true - viem: - optional: true - checksum: 10/8f2e5dff2fbd37bdadcf680a1139d782cfa68d1cc33969f3ed1f88f963f0601bf4306362872442052f4d9737d613407a118d6f51d0279749ca4f17d4540a8966 + checksum: 10/5abedea9db1e31f635c9300c86e04b6e56d3a9d84ce3683f6d6690372f542432c9f546198f002489538271c480a0d22e40f338a75c652c9fb12c7dd4cf4e2f4b languageName: node linkType: hard @@ -9148,19 +9108,6 @@ __metadata: languageName: node linkType: hard -"@privy-io/public-api@npm:2.15.8": - version: 2.15.8 - resolution: "@privy-io/public-api@npm:2.15.8" - dependencies: - "@privy-io/api-base": "npm:1.4.1" - bs58: "npm:^5.0.0" - ethers: "npm:^5.7.2" - libphonenumber-js: "npm:^1.10.31" - zod: "npm:^3.22.4" - checksum: 10/bf7ec8d8c608c2ef206a4a1ae87354e3626d78e0d23f83e00b31056a0ab8f57fff144c60bb614665b2abc3d0aabc6076fcd85f85e82ef08f557ca3b16e638fba - languageName: node - linkType: hard - "@privy-io/public-api@npm:2.18.0": version: 2.18.0 resolution: "@privy-io/public-api@npm:2.18.0" From 63ee690c851583cfe1992f7b3b575c21184ae71f Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 08:49:16 +0800 Subject: [PATCH 13/55] feat: native PrimeSignupTest test success --- .../pages/PrimeDashboard/PrimeDashboard.tsx | 2 +- .../PrimeDashboard/PrimeSignupTest.native.tsx | 46 +++++++++++++++++++ .../pages/PrimeDashboard/PrimeSignupTest.tsx | 7 +-- 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.native.tsx diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index 89c423f88d0..7a21b6cb17a 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -320,7 +320,7 @@ export default function PrimeDashboard() { - + {/* */} diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.native.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.native.tsx new file mode 100644 index 00000000000..a9761023d0d --- /dev/null +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.native.tsx @@ -0,0 +1,46 @@ +import { useState } from 'react'; + +import { useLoginWithEmail } from '@privy-io/expo'; + +import { Button, Input, OTPInput, Toast, YStack } from '@onekeyhq/components'; + +export function PrimeSignupTest() { + const [email, setEmail] = useState('limichange@hotmail.com'); + const { sendCode, loginWithCode } = useLoginWithEmail({ + onSendCodeSuccess() { + Toast.message({ + title: 'onSendCodeSuccess', + }); + }, + onLoginSuccess(user, isNewUser) { + Toast.success({ + title: 'onLoginSuccess', + message: `user${JSON.stringify(user, null, 2)}`, + }); + }, + onError(error) { + console.log('error', error); + // show a toast, update form errors, etc... + }, + }); + const [codeEmail, setCodeEmail] = useState(''); + + return ( + + + + + + + + + + ); +} diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx index cf0cc77f3e9..ee09b99f406 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx @@ -1,15 +1,10 @@ import { useEffect, useState } from 'react'; -import { - useGuestAccounts, - useLoginWithEmail, - usePrivy, -} from '@privy-io/react-auth'; +import { useLoginWithEmail, usePrivy } from '@privy-io/react-auth'; import { Button, Input, OTPInput, YStack } from '@onekeyhq/components'; export function PrimeSignupTest() { - const { createGuestAccount } = useGuestAccounts(); const { ready, authenticated, logout } = usePrivy(); const { From f6ad061bab723fdd91962b96ed13ba0164fdb0cb Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 09:26:40 +0800 Subject: [PATCH 14/55] fix: prime icon --- .../PrimeHeaderIconButton/PrimeHeaderIconButton.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx index f0cf33e5e4f..7b4eeada03e 100644 --- a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx +++ b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx @@ -2,6 +2,7 @@ import { useCallback, useState } from 'react'; import { HeaderIconButton, Toast } from '@onekeyhq/components'; import useAppNavigation from '@onekeyhq/kit/src/hooks/useAppNavigation'; +import { useThemeVariant } from '@onekeyhq/kit/src/hooks/useThemeVariant'; import { EModalRoutes } from '@onekeyhq/shared/src/routes'; import { EPrimePages } from '@onekeyhq/shared/src/routes/prime'; @@ -11,6 +12,12 @@ export function PrimeHeaderIconButton() { const { user, isReady } = usePrimeAuth(); const navigation = useAppNavigation(); const [isHover, setIsHover] = useState(false); + const themeVariant = useThemeVariant(); + + const icon = + themeVariant === 'light' + ? 'OnekeyPrimeLightColored' + : 'OnekeyPrimeDarkColored'; const onPrimeButtonPressed = useCallback(() => { if (!isReady) { @@ -33,9 +40,7 @@ export function PrimeHeaderIconButton() { onPointerLeave={() => setIsHover(false)} key="header-prime-button" title="Prime" - icon={ - user.isLoggedIn || isHover ? 'OnekeyPrimeLightColored' : 'PrimeOutline' - } + icon={user.isLoggedIn || isHover ? icon : 'PrimeOutline'} tooltipProps={{ open: isHover, }} From dc70b1e20d4a69d7f212d0a1499869d9ce105099 Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 09:28:19 +0800 Subject: [PATCH 15/55] feat: add memo --- .../PrimeHeaderIconButton/PrimeHeaderIconButton.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx index 7b4eeada03e..5d8db70a196 100644 --- a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx +++ b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { HeaderIconButton, Toast } from '@onekeyhq/components'; import useAppNavigation from '@onekeyhq/kit/src/hooks/useAppNavigation'; @@ -14,10 +14,13 @@ export function PrimeHeaderIconButton() { const [isHover, setIsHover] = useState(false); const themeVariant = useThemeVariant(); - const icon = - themeVariant === 'light' - ? 'OnekeyPrimeLightColored' - : 'OnekeyPrimeDarkColored'; + const icon = useMemo( + () => + themeVariant === 'light' + ? 'OnekeyPrimeLightColored' + : 'OnekeyPrimeDarkColored', + [themeVariant], + ); const onPrimeButtonPressed = useCallback(() => { if (!isReady) { From 20dd72363ef04891cbc5613fa924d6ce83b9e7c1 Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 11:25:19 +0800 Subject: [PATCH 16/55] feat: update OTPInput style --- packages/components/src/forms/OTPInput/index.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/components/src/forms/OTPInput/index.tsx b/packages/components/src/forms/OTPInput/index.tsx index dfe4a4f1e96..0ac0a0ebb49 100644 --- a/packages/components/src/forms/OTPInput/index.tsx +++ b/packages/components/src/forms/OTPInput/index.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef } from 'react'; import { OtpInput } from 'react-native-otp-entry'; -import { useThemeValue } from '../../hooks'; +import { useTheme } from '../../hooks'; import type { OtpInputProps, OtpInputRef } from 'react-native-otp-entry'; @@ -12,7 +12,7 @@ export function OTPInput( }, ) { const { value, ...rest } = props; - const [neutral5Color, textColor] = useThemeValue(['neutral5', 'text']); + const theme = useTheme(); const ref = useRef(null); useEffect(() => { @@ -25,20 +25,23 @@ export function OTPInput( theme={{ pinCodeTextStyle: { fontSize: 18, - color: textColor, + color: theme.text.val, }, pinCodeContainerStyle: { width: 46, height: 46, borderWidth: 1, - borderColor: neutral5Color, + borderColor: theme.neutral6.val, + }, + filledPinCodeContainerStyle: { + borderWidth: 2, }, focusedPinCodeContainerStyle: { borderWidth: 2, - borderColor: neutral5Color, + borderColor: theme.borderActive.val, }, }} - focusColor={textColor} + focusColor={theme.text.val} {...rest} /> ); From 2b833e004b866b592df1abbb1add327f5a9e42a4 Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 11:25:39 +0800 Subject: [PATCH 17/55] feat: reset usePrivyUniversal --- .../Prime/hooks/usePrivyUniversal/README.md | 5 +++++ .../Prime/hooks/usePrivyUniversal/index.ts | 1 + .../usePrivyUniversal.native.ts | 0 .../usePrivyUniversal.ts | 20 ++----------------- .../usePrivyUniversalTypes.ts | 0 .../pages/PrimeDashboard/PrimeDashboard.tsx | 7 +------ .../PrimeDashboard/PrimeDashboardFooter.tsx | 4 +--- 7 files changed, 10 insertions(+), 27 deletions(-) create mode 100644 packages/kit/src/views/Prime/hooks/usePrivyUniversal/README.md create mode 100644 packages/kit/src/views/Prime/hooks/usePrivyUniversal/index.ts rename packages/kit/src/views/Prime/hooks/{ => usePrivyUniversal}/usePrivyUniversal.native.ts (100%) rename packages/kit/src/views/Prime/hooks/{ => usePrivyUniversal}/usePrivyUniversal.ts (72%) rename packages/kit/src/views/Prime/hooks/{ => usePrivyUniversal}/usePrivyUniversalTypes.ts (100%) diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversal/README.md b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/README.md new file mode 100644 index 00000000000..7bd07757daf --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/README.md @@ -0,0 +1,5 @@ +# Privy Universal + +https://docs.privy.io/guide/expo/authentication/email + +https://github.com/privy-io/whitelabel-starter/blob/main/app/components/Login.tsx diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversal/index.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/index.ts new file mode 100644 index 00000000000..274b01aa1ec --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/index.ts @@ -0,0 +1 @@ +export * from './usePrivyUniversal'; diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversal.native.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.native.ts similarity index 100% rename from packages/kit/src/views/Prime/hooks/usePrivyUniversal.native.ts rename to packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.native.ts diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversal.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.ts similarity index 72% rename from packages/kit/src/views/Prime/hooks/usePrivyUniversal.ts rename to packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.ts index d672c4d13d7..ccab1b85a87 100644 --- a/packages/kit/src/views/Prime/hooks/usePrivyUniversal.ts +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.ts @@ -6,31 +6,15 @@ import type { IUsePrivyUniversal } from './usePrivyUniversalTypes'; export function usePrivyUniversal(): IUsePrivyUniversal { const privy = usePrivy(); - // https://github.com/privy-io/create-next-app/blob/main/pages/index.tsx const { - ready, - authenticated, - user, logout, updateEmail: updateEmailWeb, updatePhone: updatePhoneWeb, getAccessToken, } = privy; const { login: loginWeb } = usePrivyLogin({ - onComplete( - user0, - isNewUser, - wasAlreadyAuthenticated, - loginMethod, - loginAccount, - ) { - console.log('privy login complete >>> ', { - user0, - isNewUser, - wasAlreadyAuthenticated, - loginMethod, - loginAccount, - }); + onComplete(...args) { + console.log('privy login complete >>> ', args); }, }); diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalTypes.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversalTypes.ts similarity index 100% rename from packages/kit/src/views/Prime/hooks/usePrivyUniversalTypes.ts rename to packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversalTypes.ts diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index 7a21b6cb17a..facf3193e4a 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -31,12 +31,9 @@ import { usePrimePayment } from '../../hooks/usePrimePayment'; import { PrimeBenefitsList } from './PrimeBenefitsList'; import { PrimeDashboardFooter } from './PrimeDashboardFooter'; -import { PrimeSignupTest } from './PrimeSignupTest'; import { PrimeSubscriptionPlans } from './PrimeSubscriptionPlans'; import { PrimeUserInfo } from './PrimeUserInfo'; -// intl.formatMessage({ id: ETranslations.global_prime }) - function showDebugMessageByDialog(obj: any) { Dialog.debugMessage({ debugMessage: obj, @@ -318,9 +315,7 @@ export default function PrimeDashboard() { - - - {/* */} + diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx index b305b013f33..406958db380 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx @@ -136,8 +136,6 @@ export function PrimeDashboardFooter() { } : undefined } - > - sss - + /> ); } From 04e0fe928d75fd5843793f72bc466e741c0821e0 Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 11:26:21 +0800 Subject: [PATCH 18/55] feat: add comments --- packages/components/src/forms/OTPInput/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/components/src/forms/OTPInput/index.tsx b/packages/components/src/forms/OTPInput/index.tsx index 0ac0a0ebb49..2f3d0c033e7 100644 --- a/packages/components/src/forms/OTPInput/index.tsx +++ b/packages/components/src/forms/OTPInput/index.tsx @@ -4,6 +4,7 @@ import { OtpInput } from 'react-native-otp-entry'; import { useTheme } from '../../hooks'; +// https://github.com/anday013/react-native-otp-entry import type { OtpInputProps, OtpInputRef } from 'react-native-otp-entry'; export function OTPInput( From 2d3a664c7428bc7bc534b894e6a3024595c24adf Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 11:38:02 +0800 Subject: [PATCH 19/55] feat: update OTPInput --- packages/components/src/forms/OTPInput/index.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/components/src/forms/OTPInput/index.tsx b/packages/components/src/forms/OTPInput/index.tsx index 2f3d0c033e7..4b1398e7898 100644 --- a/packages/components/src/forms/OTPInput/index.tsx +++ b/packages/components/src/forms/OTPInput/index.tsx @@ -25,17 +25,19 @@ export function OTPInput( ref={ref} theme={{ pinCodeTextStyle: { - fontSize: 18, + fontSize: 20, + fontWeight: 'bold', color: theme.text.val, }, pinCodeContainerStyle: { - width: 46, - height: 46, + width: 50, + height: 50, borderWidth: 1, - borderColor: theme.neutral6.val, + borderColor: theme.neutral7.val, }, filledPinCodeContainerStyle: { borderWidth: 2, + backgroundColor: theme.gray2.val, }, focusedPinCodeContainerStyle: { borderWidth: 2, From e9d97d93ea3ecac2de1daf54f0c8818ee053ecfd Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 11:51:49 +0800 Subject: [PATCH 20/55] feat: remove VerificationCodeInput --- .../src/forms/Input/VerificationCodeInput.tsx | 109 ------------------ .../components/src/forms/OTPInput/index.tsx | 10 +- packages/components/src/forms/index.ts | 1 - .../Gallery/Components/stories/Input.tsx | 34 +----- .../PrimeLoginEmailCodeDialog.tsx | 11 +- 5 files changed, 16 insertions(+), 149 deletions(-) delete mode 100644 packages/components/src/forms/Input/VerificationCodeInput.tsx diff --git a/packages/components/src/forms/Input/VerificationCodeInput.tsx b/packages/components/src/forms/Input/VerificationCodeInput.tsx deleted file mode 100644 index 2608c2766b1..00000000000 --- a/packages/components/src/forms/Input/VerificationCodeInput.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import type { ComponentProps } from 'react'; -import { useCallback, useRef, useState } from 'react'; - -import { Input } from '.'; - -import { XStack } from '../../primitives'; - -import type { IInputRef } from '.'; -import type { Stack } from '../../primitives'; -import type { - NativeSyntheticEvent, - TextInputKeyPressEventData, -} from 'react-native'; - -type IVerificationCodeInputProps = { - length?: number; - onChange?: (code: string) => void; - onComplete?: (code: string) => void; -} & ComponentProps; - -export function VerificationCodeInput({ - length = 6, - onChange, - onComplete, - ...props -}: IVerificationCodeInputProps) { - const [code, setCode] = useState(Array(length).fill('')); - const inputRefs = useRef<(IInputRef | null)[]>([]); - - const focusNextInput = useCallback((index: number) => { - inputRefs.current[index + 1]?.focus(); - }, []); - - const focusPrevInput = useCallback((index: number) => { - inputRefs.current[index - 1]?.focus(); - }, []); - - const handleChange = useCallback( - (index: number, value: string) => { - const newCode = [...code]; - newCode[index] = value.slice(-1); - setCode(newCode); - - if (value && index < length - 1) { - focusNextInput(index); - } - // if (!value && index > 0) { - // focusPrevInput(index); - // } - - onChange?.(newCode.join('')); - if (newCode.filter(Boolean).length >= length) { - inputRefs?.current?.forEach((input) => { - // TODO blur not working if rendered in Dialog - input?.blur(); - }); - const completeCode = newCode.join(''); - onComplete?.(completeCode); - } - }, - [code, focusNextInput, length, onChange, onComplete], - ); - - const handleKeyDown = useCallback( - (index: number, e: NativeSyntheticEvent) => { - const keyboardKey = e.nativeEvent.key; - if (keyboardKey === 'Backspace') { - if (code[index]) { - handleChange(index, ''); - } else if (index > 0) { - focusPrevInput(index); - handleChange(index - 1, ''); - } - } - - if (!Number.isNaN(Number(keyboardKey))) { - handleChange(index, keyboardKey); - } - }, - [code, focusPrevInput, handleChange], - ); - - const inputSize = '$11'; - return ( - - {Array(length) - .fill(null) - .map((_, index) => ( - (inputRefs.current[index] = el)} - value={code[index]} - onKeyPress={(e) => handleKeyDown(index, e)} - maxLength={1} - textAlign="center" - w={inputSize} - h={inputSize} - minWidth={inputSize} // iOS - /> - ))} - - ); -} diff --git a/packages/components/src/forms/OTPInput/index.tsx b/packages/components/src/forms/OTPInput/index.tsx index 4b1398e7898..f84fda7f0b1 100644 --- a/packages/components/src/forms/OTPInput/index.tsx +++ b/packages/components/src/forms/OTPInput/index.tsx @@ -10,15 +10,20 @@ import type { OtpInputProps, OtpInputRef } from 'react-native-otp-entry'; export function OTPInput( props: OtpInputProps & { value: string; + onComplete?: (value: string) => void; }, ) { - const { value, ...rest } = props; + const { value, onComplete, numberOfDigits, ...rest } = props; const theme = useTheme(); const ref = useRef(null); useEffect(() => { ref.current?.setValue(value); - }, [value]); + + if (numberOfDigits === value.length) { + onComplete?.(value); + } + }, [onComplete, numberOfDigits, value]); return ( ); diff --git a/packages/components/src/forms/index.ts b/packages/components/src/forms/index.ts index 6fa6f1def9e..c4a866ead49 100644 --- a/packages/components/src/forms/index.ts +++ b/packages/components/src/forms/index.ts @@ -1,7 +1,6 @@ export * from './Checkbox'; export * from './Form'; export * from './Input'; -export * from './Input/VerificationCodeInput'; export * from './Radio'; export * from './Select'; export * from './Slider'; diff --git a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/Input.tsx b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/Input.tsx index f7a270a6803..ca457cf3ec1 100644 --- a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/Input.tsx +++ b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/Input.tsx @@ -1,35 +1,7 @@ -import { useState } from 'react'; - -import { - Input, - SizableText, - Stack, - Toast, - VerificationCodeInput, - YStack, -} from '@onekeyhq/components'; +import { Input, Stack } from '@onekeyhq/components'; import { Layout } from './utils/Layout'; -function VerificationCodeInputDemo() { - const [code, setCode] = useState(''); - return ( - - { - Toast.success({ - title: 'Complete', - message: completeCode, - }); - }} - /> - {code} - - ); -} - const InputGallery = () => ( ( ), }, - { - title: 'VerificationCodeInput', - element: , - }, ]} /> ); diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialog/PrimeLoginEmailCodeDialog.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialog/PrimeLoginEmailCodeDialog.tsx index 591d4bbbb67..b77fc0a2f0b 100644 --- a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialog/PrimeLoginEmailCodeDialog.tsx +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialog/PrimeLoginEmailCodeDialog.tsx @@ -3,10 +3,10 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { Button, Dialog, + OTPInput, RichSizeableText, Stack, Toast, - VerificationCodeInput, XStack, YStack, } from '@onekeyhq/components'; @@ -24,6 +24,7 @@ export function PrimeLoginEmailCodeDialog({ const [code, setCode] = useState(''); const [countdown, setCountdown] = useState(COUNTDOWN_TIME); const [isResending, setIsResending] = useState(false); + const [verificationCode, setVerificationCode] = useState(''); const sendEmailVerificationCode = useCallback(async () => { setIsResending(true); @@ -97,8 +98,11 @@ export function PrimeLoginEmailCodeDialog({ {buttonText} - { setCode(value); Toast.success({ @@ -106,7 +110,6 @@ export function PrimeLoginEmailCodeDialog({ message: value, }); }} - length={6} /> From 4464e3d26179089f20f006aea7db1b24ad04295d Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 16:19:51 +0800 Subject: [PATCH 21/55] feat: update OTPInput demo --- .../Components/stories/OTPInputGallery.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx index 75c7375c1b4..f7c73eb758e 100644 --- a/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx +++ b/packages/kit/src/views/Developer/pages/Gallery/Components/stories/OTPInputGallery.tsx @@ -6,6 +6,7 @@ import { Layout } from './utils/Layout'; function OTPInputGallery() { const [value, setText] = useState(''); + const [isCompleted, setIsCompleted] = useState(false); return ( setText(newValue)} + onTextChange={setText} + onComplete={() => setIsCompleted(true)} /> - value: {value} + + value: {value}, isCompleted: {isCompleted ? 'true' : 'false'} + - + ), }, From 955b4dd1b2b2c0259a4a80fda6ccbc54a49273f6 Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 22:03:38 +0800 Subject: [PATCH 22/55] feat: add usePrivyUniversalV2 --- .../usePrivyUniversal/usePrivyUniversal.ts | 1 - .../Prime/hooks/usePrivyUniversalV2/index.ts | 1 + .../usePrivyUniversalV2.native.ts | 21 +++++++++++++++++++ .../usePrivyUniversalV2.ts | 17 +++++++++++++++ .../usePrivyUniversalV2Types.ts | 8 +++++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/index.ts create mode 100644 packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts create mode 100644 packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts create mode 100644 packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.ts index ccab1b85a87..519e72ca6f3 100644 --- a/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.ts +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversal/usePrivyUniversal.ts @@ -20,7 +20,6 @@ export function usePrivyUniversal(): IUsePrivyUniversal { return useMemo( () => ({ - // privy, native: undefined, web: { user: privy.user, diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/index.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/index.ts new file mode 100644 index 00000000000..3168202f1f1 --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/index.ts @@ -0,0 +1 @@ +export { usePrivyUniversalV2 } from './usePrivyUniversalV2'; diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts new file mode 100644 index 00000000000..6c74f580d5d --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts @@ -0,0 +1,21 @@ +import { useLoginWithEmail, usePrivy } from '@privy-io/expo'; + +import type { IUsePrivyUniversalV2 } from './usePrivyUniversalV2Types'; + +export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { + const { sendCode, loginWithCode } = useLoginWithEmail(); + const { logout, isReady, getAccessToken, user } = usePrivy(); + + return { + logout, + isReady, + getAccessToken, + sendCode: async (args) => { + await sendCode(args); + }, + loginWithCode: async (args) => { + await loginWithCode(args); + }, + authenticated: !!user, + }; +} diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts new file mode 100644 index 00000000000..5d8463b21a0 --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts @@ -0,0 +1,17 @@ +import { useLoginWithEmail, usePrivy } from '@privy-io/react-auth'; + +import type { IUsePrivyUniversalV2 } from './usePrivyUniversalV2Types'; + +export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { + const { sendCode, loginWithCode } = useLoginWithEmail(); + const { logout, ready, getAccessToken, authenticated } = usePrivy(); + + return { + sendCode, + loginWithCode, + logout, + isReady: ready, + getAccessToken, + authenticated, + }; +} diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts new file mode 100644 index 00000000000..9dd62aee764 --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts @@ -0,0 +1,8 @@ +export type IUsePrivyUniversalV2 = { + logout: () => Promise; + isReady: boolean; + getAccessToken: () => Promise; + sendCode: (args: { email: string }) => Promise; + loginWithCode: (args: { code: string; email?: string }) => Promise; + authenticated: boolean; +}; From e14365a9e19694b3de2d4a933f8ab8af98cd5702 Mon Sep 17 00:00:00 2001 From: limichange Date: Thu, 23 Jan 2025 22:22:17 +0800 Subject: [PATCH 23/55] feat: update usePrivyUniversalV2 --- .../usePrivyUniversalV2/usePrivyUniversalV2.native.ts | 8 +++++++- .../hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts | 7 ++++++- .../hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts index 6c74f580d5d..425e5626000 100644 --- a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts @@ -5,6 +5,7 @@ import type { IUsePrivyUniversalV2 } from './usePrivyUniversalV2Types'; export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { const { sendCode, loginWithCode } = useLoginWithEmail(); const { logout, isReady, getAccessToken, user } = usePrivy(); + const authenticated = !!user; return { logout, @@ -16,6 +17,11 @@ export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { loginWithCode: async (args) => { await loginWithCode(args); }, - authenticated: !!user, + authenticated, + user: authenticated + ? { + id: user?.id || '', + } + : undefined, }; } diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts index 5d8463b21a0..b9d7faed44a 100644 --- a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.ts @@ -4,7 +4,7 @@ import type { IUsePrivyUniversalV2 } from './usePrivyUniversalV2Types'; export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { const { sendCode, loginWithCode } = useLoginWithEmail(); - const { logout, ready, getAccessToken, authenticated } = usePrivy(); + const { logout, ready, getAccessToken, authenticated, user } = usePrivy(); return { sendCode, @@ -13,5 +13,10 @@ export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { isReady: ready, getAccessToken, authenticated, + user: authenticated + ? { + id: user?.id || '', + } + : undefined, }; } diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts index 9dd62aee764..24d4e509a08 100644 --- a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2Types.ts @@ -5,4 +5,7 @@ export type IUsePrivyUniversalV2 = { sendCode: (args: { email: string }) => Promise; loginWithCode: (args: { code: string; email?: string }) => Promise; authenticated: boolean; + user?: { + id: string; + }; }; From bafa875ff61517dd98e7259d801d4d2cdd4324be Mon Sep 17 00:00:00 2001 From: limichange Date: Fri, 24 Jan 2025 07:21:34 +0800 Subject: [PATCH 24/55] feat: add PrimeLoginEmailCodeDialogV2 --- .../PrimeHeaderIconButton.tsx | 6 +- .../PrimeLoginEmailCodeDialogV2.tsx | 114 ++++++++++++++ .../PrimeLoginEmailCodeDialogV2/index.tsx | 1 + .../views/Prime/components/PrivyProvider.tsx | 1 + .../src/views/Prime/hooks/usePrimePayment.ts | 36 ++--- .../pages/PrimeDashboard/PrimeDashboard.tsx | 40 +++-- .../PrimeDashboard/PrimeDashboardFooter.tsx | 141 ------------------ 7 files changed, 155 insertions(+), 184 deletions(-) create mode 100644 packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx create mode 100644 packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/index.tsx delete mode 100644 packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboardFooter.tsx diff --git a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx index 5d8db70a196..293509bff91 100644 --- a/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx +++ b/packages/kit/src/views/Prime/components/PrimeHeaderIconButton/PrimeHeaderIconButton.tsx @@ -6,10 +6,10 @@ import { useThemeVariant } from '@onekeyhq/kit/src/hooks/useThemeVariant'; import { EModalRoutes } from '@onekeyhq/shared/src/routes'; import { EPrimePages } from '@onekeyhq/shared/src/routes/prime'; -import { usePrimeAuth } from '../../hooks/usePrimeAuth'; +import { usePrivyUniversalV2 } from '../../hooks/usePrivyUniversalV2'; export function PrimeHeaderIconButton() { - const { user, isReady } = usePrimeAuth(); + const { user, isReady } = usePrivyUniversalV2(); const navigation = useAppNavigation(); const [isHover, setIsHover] = useState(false); const themeVariant = useThemeVariant(); @@ -43,7 +43,7 @@ export function PrimeHeaderIconButton() { onPointerLeave={() => setIsHover(false)} key="header-prime-button" title="Prime" - icon={user.isLoggedIn || isHover ? icon : 'PrimeOutline'} + icon={user?.id || isHover ? icon : 'PrimeOutline'} tooltipProps={{ open: isHover, }} diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx new file mode 100644 index 00000000000..94dc155584e --- /dev/null +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx @@ -0,0 +1,114 @@ +import { useCallback, useEffect, useMemo, useState } from 'react'; + +import { + Button, + Dialog, + OTPInput, + RichSizeableText, + Stack, + Toast, + XStack, + YStack, +} from '@onekeyhq/components'; + +const COUNTDOWN_TIME = 60; + +export function PrimeLoginEmailCodeDialogV2() { + const [code, setCode] = useState(''); + const [countdown, setCountdown] = useState(COUNTDOWN_TIME); + const [isResending, setIsResending] = useState(false); + const [verificationCode, setVerificationCode] = useState(''); + + const sendEmailVerificationCode = useCallback(async () => { + setIsResending(true); + try { + setCountdown(COUNTDOWN_TIME); + } finally { + setIsResending(false); + } + }, []); + + useEffect(() => { + let timer: NodeJS.Timeout; + if (countdown > 0) { + timer = setInterval(() => { + setCountdown((prev) => prev - 1); + }, 1000); + } + return () => { + if (timer) { + clearInterval(timer); + } + }; + }, [countdown]); + + useEffect(() => { + void sendEmailVerificationCode(); + }, [sendEmailVerificationCode]); + + const buttonText = useMemo(() => { + if (isResending) return '发送中...'; + if (countdown > 0) return `重新发送 (${countdown}s)`; + return '重新发送'; + }, [isResending, countdown]); + + return ( + + + Enter verification code + + {`Sent to ${''}`} + + + + + + + + { + setCode(value); + Toast.success({ + title: 'code', + message: value, + }); + }} + /> + + + { + try { + console.log(2); + } catch (error) { + preventClose(); + throw error; + } + }} + /> + + ); +} diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/index.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/index.tsx new file mode 100644 index 00000000000..7bde086b499 --- /dev/null +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/index.tsx @@ -0,0 +1 @@ +export * from './PrimeLoginEmailCodeDialogV2'; diff --git a/packages/kit/src/views/Prime/components/PrivyProvider.tsx b/packages/kit/src/views/Prime/components/PrivyProvider.tsx index 6c8792ae58f..5fe02d2d443 100644 --- a/packages/kit/src/views/Prime/components/PrivyProvider.tsx +++ b/packages/kit/src/views/Prime/components/PrivyProvider.tsx @@ -9,6 +9,7 @@ function PrivyAuthSyncToAtom() { export function PrivyProvider({ children }: { children: React.ReactNode }) { const appId = process.env.PRIVY_APP_ID ?? ''; + console.log('nnnn', process.env); if (!appId) { throw new Error('PRIVY_APP_ID is not set'); } diff --git a/packages/kit/src/views/Prime/hooks/usePrimePayment.ts b/packages/kit/src/views/Prime/hooks/usePrimePayment.ts index ec73faebf19..30b90743b84 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimePayment.ts +++ b/packages/kit/src/views/Prime/hooks/usePrimePayment.ts @@ -1,21 +1,21 @@ -// load stripe js before revenuecat, otherwise revenuecat will create script tag load https://js.stripe.com/v3 -// eslint-disable-next-line import/order -import '@onekeyhq/shared/src/modules3rdParty/stripe-v3'; - import { useCallback, useEffect, useRef } from 'react'; import { LogLevel, Purchases } from '@revenuecat/purchases-js'; import { usePrimePersistAtom } from '@onekeyhq/kit-bg/src/states/jotai/atoms'; +import errorToastUtils from '@onekeyhq/shared/src/errors/utils/errorToastUtils'; + +// load stripe js before revenuecat, otherwise revenuecat will create script tag load https://js.stripe.com/v3 +// eslint-disable-next-line import/order +import '@onekeyhq/shared/src/modules3rdParty/stripe-v3'; + import perfUtils from '@onekeyhq/shared/src/utils/debug/perfUtils'; import { createPromiseTarget } from '@onekeyhq/shared/src/utils/promiseUtils'; import type { IPrimeUserInfo } from '@onekeyhq/shared/types/prime/primeTypes'; import backgroundApiProxy from '../../../background/instance/backgroundApiProxy'; -import { usePrimeAuth } from './usePrimeAuth'; - -import errorToastUtils from '@onekeyhq/shared/src/errors/utils/errorToastUtils'; +import { usePrivyUniversalV2 } from './usePrivyUniversalV2'; import type { IUsePrimePayment } from './usePrimePaymentTypes'; import type { @@ -25,7 +25,7 @@ import type { } from '@revenuecat/purchases-js'; export function usePrimePayment(): IUsePrimePayment { - const { isReady: isAuthReady, user } = usePrimeAuth(); + const { user, isReady: isAuthReady, authenticated } = usePrivyUniversalV2(); const [primePersistAtom, setPrimePersistAtom] = usePrimePersistAtom(); const isReady = isAuthReady; @@ -35,7 +35,7 @@ export function usePrimePayment(): IUsePrimePayment { if (!isReady) { throw new Error('PrimeAuth Not ready'); } - if (!user?.privyUserId) { + if (!user?.id) { throw new Error('User not logged in'); } if (process.env.NODE_ENV !== 'production') { @@ -57,14 +57,14 @@ export function usePrimePayment(): IUsePrimePayment { // TODO how to configure another userId when user login with another account // https://www.revenuecat.com/docs/customers/user-ids#logging-in-with-a-custom-app-user-id - Purchases.configure(apiKey, user?.privyUserId || ''); + Purchases.configure(apiKey, user?.id || ''); const customerInfo: CustomerInfo = await Purchases.getSharedInstance().getCustomerInfo(); - console.log('customerInfo >>>>>> ', user?.privyUserId, customerInfo); + console.log('customerInfo >>>>>> ', user?.id, customerInfo); const appUserId = Purchases.getSharedInstance().getAppUserId(); - if (appUserId !== user?.privyUserId) { + if (appUserId !== user?.id) { throw new Error('AppUserId not match'); } @@ -100,28 +100,28 @@ export function usePrimePayment(): IUsePrimePayment { configureDonePromise.current.resolveTarget(true); return customerInfo; - }, [isReady, setPrimePersistAtom, user?.privyUserId]); + }, [isReady, setPrimePersistAtom, user?.id]); useEffect(() => { void (async () => { - if (isReady && user?.privyUserId) { + if (isReady && user?.id) { await getCustomerInfo(); } })(); - }, [getCustomerInfo, isReady, user?.privyUserId]); + }, [getCustomerInfo, isReady, user?.id]); const getOfferings = useCallback(async () => { if (!isReady) { throw new Error('PrimeAuth Not ready'); } - if (!user?.isLoggedIn) { + if (!authenticated) { return undefined; } const offerings = await Purchases.getSharedInstance().getOfferings({ currency: 'USD', }); return offerings; - }, [isReady, user?.isLoggedIn]); + }, [isReady, authenticated]); const getPaywallPackagesWeb = useCallback(async () => { await configureDonePromise.current.ready; @@ -179,7 +179,7 @@ export function usePrimePayment(): IUsePrimePayment { customerEmail: email, selectedLocale: locale, }; - // TODO check package user is Matched to privyUserId + // TODO check package user is Matched to id // TODO check if user has already purchased const purchase = await Purchases.getSharedInstance().purchase( purchaseParams, diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index facf3193e4a..dabda105b59 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -25,12 +25,12 @@ import platformEnv from '@onekeyhq/shared/src/platformEnv'; import openUrlUtils from '@onekeyhq/shared/src/utils/openUrlUtils'; import timerUtils from '@onekeyhq/shared/src/utils/timerUtils'; +import { PrimeLoginEmailCodeDialogV2 } from '../../components/PrimeLoginEmailCodeDialogV2'; import { useFetchPrimeUserInfo } from '../../hooks/useFetchPrimeUserInfo'; import { usePrimeAuth } from '../../hooks/usePrimeAuth'; import { usePrimePayment } from '../../hooks/usePrimePayment'; import { PrimeBenefitsList } from './PrimeBenefitsList'; -import { PrimeDashboardFooter } from './PrimeDashboardFooter'; import { PrimeSubscriptionPlans } from './PrimeSubscriptionPlans'; import { PrimeUserInfo } from './PrimeUserInfo'; @@ -62,8 +62,7 @@ function PrimeBanner() { export default function PrimeDashboard() { const { top } = useSafeAreaInsets(); - const { login, loginLegacy, logout, privy, getAccessToken, user } = - usePrimeAuth(); + const { login, logout, privy, getAccessToken, user } = usePrimeAuth(); const navigation = useAppNavigation(); const { fetchPrimeUserInfo } = useFetchPrimeUserInfo(); useEffect(() => { @@ -81,15 +80,6 @@ export default function PrimeDashboard() { getCustomerInfo, } = usePrimePayment(); - const loginByPrivy = useCallback(async () => { - if (platformEnv.isNative) { - // TODO: privy login Modal is conflict with OneKey Modal - navigation.popStack(); - await timerUtils.wait(1000); - } - login(); - }, [login, navigation]); - const purchaseByWebview = useCallback(async () => { navigation.popStack(); await timerUtils.wait(1000); @@ -111,8 +101,12 @@ export default function PrimeDashboard() { try { setIsLoading(true); if (!user?.isLoggedIn) { - return await loginByPrivy(); + // return await loginByPrivy(); // loginLegacy(); + Dialog.show({ + renderContent: , + onClose: async () => {}, + }); } if (platformEnv.isNative) { ActionList.show({ @@ -162,7 +156,6 @@ export default function PrimeDashboard() { user?.isLoggedIn, user?.email, selectedPackageId, - loginByPrivy, purchaseByWebview, presentPaywallNative, purchasePaywallPackageWeb, @@ -248,13 +241,6 @@ export default function PrimeDashboard() { - - - - - - - ); -} diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx deleted file mode 100644 index ee09b99f406..00000000000 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeSignupTest.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useEffect, useState } from 'react'; - -import { useLoginWithEmail, usePrivy } from '@privy-io/react-auth'; - -import { Button, Input, OTPInput, YStack } from '@onekeyhq/components'; - -export function PrimeSignupTest() { - const { ready, authenticated, logout } = usePrivy(); - - const { - sendCode: sendCodeEmail, - loginWithCode: loginWithCodeEmail, - state: stateEmail, - } = useLoginWithEmail({ - onComplete: ({ user, isNewUser, wasAlreadyAuthenticated, loginMethod }) => { - console.log('🔑 ✅ User successfully logged in with email', { - user, - isNewUser, - wasAlreadyAuthenticated, - loginMethod, - }); - }, - onError: (error) => { - console.log(error); - }, - }); - - // Email Local State - const [email, setEmail] = useState('limichange@hotmail.com'); - const [codeEmail, setCodeEmail] = useState(''); - const [emailState, setEmailState] = useState(stateEmail.status as string); - - // Update email status - useEffect(() => { - if (stateEmail.status === 'error' && stateEmail.error) { - const message = `Error ${stateEmail.error.message}`; - setEmailState(message); - } else { - setEmailState(stateEmail.status); - } - }, [stateEmail]); - - return ( - - - - - - - - - - ); -} From 3c6dda9dccfb0a49a956ac7706ed8b21972b167d Mon Sep 17 00:00:00 2001 From: limichange Date: Fri, 24 Jan 2025 13:42:41 +0800 Subject: [PATCH 33/55] feat: check state --- .../PrimeLoginEmailCodeDialogV2.tsx | 13 +++++++++++-- packages/kit/src/views/Prime/hooks/usePrimeAuth.ts | 2 +- .../kit/src/views/Prime/hooks/usePrimeAuthV2.tsx | 14 ++++++++++---- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx index 1b34d1f1f10..3a84e408805 100644 --- a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx @@ -18,8 +18,9 @@ const COUNTDOWN_TIME = 60; export function PrimeLoginEmailCodeDialogV2(props: { email: string; loginWithCode: (args: { code: string; email?: string }) => Promise; + sendCode: (args: { email: string }) => void; }) { - const { email, loginWithCode } = props; + const { email, loginWithCode, sendCode } = props; const [countdown, setCountdown] = useState(COUNTDOWN_TIME); const [isResending, setIsResending] = useState(false); const [verificationCode, setVerificationCode] = useState(''); @@ -27,12 +28,19 @@ export function PrimeLoginEmailCodeDialogV2(props: { const sendEmailVerificationCode = useCallback(async () => { setIsResending(true); + + if (isResending) { + return; + } + try { + sendCode({ email }); + setCountdown(COUNTDOWN_TIME); } finally { setIsResending(false); } - }, []); + }, [email, isResending, sendCode]); useEffect(() => { let timer: NodeJS.Timeout; @@ -112,6 +120,7 @@ export function PrimeLoginEmailCodeDialogV2(props: { email, }); } catch (error) { + console.log('error', error); preventClose(); throw error; } diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts b/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts index 3e53bab7535..5326aa668aa 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts @@ -18,7 +18,7 @@ export function usePrimeAuth() { const [primeInitAtom, setPrimeInitAtom] = usePrimeInitAtom(); const privy = usePrivyUniversal(); - const { logout, isReady, getAccessToken } = privy; + const { logout, getAccessToken } = privy; const login = useCallback(() => { if (platformEnv.isNative) { diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx index 5a5508f1e4e..d265b585d4f 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx @@ -1,5 +1,8 @@ +import { useEffect } from 'react'; + import type { IDialogInstance } from '@onekeyhq/components'; import { Dialog } from '@onekeyhq/components'; +import { usePrimePersistAtom } from '@onekeyhq/kit-bg/src/states/jotai/atoms'; import { PrimeLoginEmailCodeDialogV2 } from '../components/PrimeLoginEmailCodeDialogV2'; import { PrimeLoginEmailDialogV2 } from '../components/PrimeLoginEmailDialogV2'; @@ -7,6 +10,8 @@ import { PrimeLoginEmailDialogV2 } from '../components/PrimeLoginEmailDialogV2'; import { usePrivyUniversalV2 } from './usePrivyUniversalV2'; export function usePrimeAuthV2() { + const [primePersistAtom] = usePrimePersistAtom(); + const { useLoginWithEmail } = usePrivyUniversalV2(); const { sendCode, loginWithCode, state } = useLoginWithEmail({ onComplete: () => { @@ -17,7 +22,9 @@ export function usePrimeAuthV2() { }, }); - console.log('state', state); + useEffect(() => { + console.log('state', state); + }, [state]); const loginWithEmail = async () => { // 1. open dialog @@ -31,13 +38,12 @@ export function usePrimeAuthV2() { renderContent: ( // 4. input code ), }); - - await sendCode({ email }); }} /> ), @@ -46,5 +52,5 @@ export function usePrimeAuthV2() { console.log('dialog', dialog); }; - return { loginWithEmail }; + return { loginWithEmail, user: primePersistAtom }; } From b65ba6a3cd4ddf72013518a57dc27b735ca5b79b Mon Sep 17 00:00:00 2001 From: limichange Date: Fri, 24 Jan 2025 13:54:01 +0800 Subject: [PATCH 34/55] feat: update i18n content --- .../PrimeLoginEmailCodeDialogV2.tsx | 6 +++++- .../views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx index 3a84e408805..ec01460c934 100644 --- a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx @@ -75,7 +75,11 @@ export function PrimeLoginEmailCodeDialogV2(props: { return ( - Enter verification code + + {intl.formatMessage({ + id: ETranslations.prime_enter_verification_code, + })} + @@ -53,8 +57,9 @@ function PrimeBanner() { textAlign="center" color="$textSubdued" > - Unlock advanced features to enhance your crypto asset management - experience. + {intl.formatMessage({ + id: ETranslations.prime_description, + })} ); From e7ec3f99e6429c93c6f17b80b45e821083419bb9 Mon Sep 17 00:00:00 2001 From: limichange Date: Fri, 24 Jan 2025 14:41:03 +0800 Subject: [PATCH 35/55] feat: update i18n content --- .../PrimeLoginEmailCodeDialogV2.tsx | 17 ++++++++++++++++- .../Prime/hooks/usePrivyUniversalV2/README.md | 18 ++++++++++++++++++ .../pages/PrimeDashboard/PrimeDashboard.tsx | 5 ++++- .../PrimeDashboard/PrimeUserInfoMoreButton.tsx | 16 +++++++++++++--- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/README.md diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx index ec01460c934..ed061618c8b 100644 --- a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx @@ -8,6 +8,7 @@ import { OTPInput, RichSizeableText, Stack, + Toast, XStack, YStack, } from '@onekeyhq/components'; @@ -91,7 +92,9 @@ export function PrimeLoginEmailCodeDialogV2(props: { }, }} > - {`Sent to ${email}`} + {`${intl.formatMessage({ + id: ETranslations.prime_sent_to, + })}${email}`} @@ -123,8 +126,20 @@ export function PrimeLoginEmailCodeDialogV2(props: { code: verificationCode, email, }); + + Toast.success({ + title: intl.formatMessage({ + id: ETranslations.login_welcome_message, + }), + }); } catch (error) { console.log('error', error); + + Toast.error({ + title: intl.formatMessage({ + id: ETranslations.auth_error_passcode_incorrect, + }), + }); preventClose(); throw error; } diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/README.md b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/README.md new file mode 100644 index 00000000000..a0ed264ff5e --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/README.md @@ -0,0 +1,18 @@ +``` +/** + * Use this hook to update a users account and to attach callbacks + * for successful `updateAccount`, and`updateAccount` errors. + * + * @param callbacks.onSuccess {@link PrivyEvents} callback to execute for after successful account update + * @param callbacks.onError {@link PrivyEvents} callback to execute if there is an error during `updatePhone` or `updateEmail`. + * @returns updateEmail - opens the Privy modal and prompts the user to update email + * @returns updatePhone - opens the Privy modal and prompts the user to update phone number + */ +declare function useUpdateAccount(callbacks?: PrivyEvents['update']): { + /** + * Opens the Privy modal and prompts the user to update their accont. + */ + updateEmail: () => void; + updatePhone: () => void; +}; +``` diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index 73d853fe6f7..f5cc5eb1625 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -66,6 +66,7 @@ function PrimeBanner() { } export default function PrimeDashboard() { + const intl = useIntl(); const { loginWithEmail } = usePrimeAuthV2(); const { top } = useSafeAreaInsets(); const { logout, privy, getAccessToken, user } = usePrimeAuth(); @@ -307,7 +308,9 @@ export default function PrimeDashboard() { @@ -97,15 +101,21 @@ function PrimeUserInfoMoreButtonDropDownMenu({ ) : null} { Dialog.show({ icon: 'InfoCircleOutline', - title: 'Log out', + title: intl.formatMessage({ + id: ETranslations.prime_onekeyid_log_out, + }), description: 'Are you sure you want to log out?', - onConfirmText: 'Log out', + onConfirmText: intl.formatMessage({ + id: ETranslations.prime_log_out, + }), onConfirm: () => logout(), }); }} From f8eccdb3971bfa9d24901f359a0798bb3455193b Mon Sep 17 00:00:00 2001 From: limichange Date: Sat, 25 Jan 2025 20:05:49 +0800 Subject: [PATCH 36/55] feat: test --- apps/mobile/package.json | 2 +- package.json | 2 +- .../Prime/components/PrivyProvider.native.tsx | 7 +- .../views/Prime/components/PrivyProvider.tsx | 9 +- .../src/views/Prime/hooks/PrimeSignupTest.tsx | 42 +++ .../usePrivyUniversalV2.native.ts | 6 + .../pages/PrimeDashboard/PrimeDashboard.tsx | 6 +- yarn.lock | 246 ++++++++++++++++-- 8 files changed, 284 insertions(+), 36 deletions(-) create mode 100644 packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 6a6dcae6f89..d42a8681ef8 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -43,7 +43,7 @@ "@onekeyhq/components": "*", "@onekeyhq/kit": "*", "@onekeyhq/shared": "*", - "@privy-io/expo": "0.40.0", + "@privy-io/expo": "0.42.0", "@privy-io/expo-native-extensions": "^0.0.3", "@react-native-async-storage/async-storage": "1.22.0", "@react-native-community/netinfo": "^11.4.1", diff --git a/package.json b/package.json index 350bfa5db5f..8818c013191 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@polkadot/extension-inject": "0.46.6", "@polkadot/types": "11.3.1", "@polkadot/util-crypto": "12.6.2", - "@privy-io/react-auth": "2.0.4", + "@privy-io/react-auth": "1.98.4", "@revenuecat/purchases-js": "^0.15.1", "@sentry/browser": "8.42.0", "@sentry/core": "8.42.0", diff --git a/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx b/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx index 4fea8e93c26..c62542c9f75 100644 --- a/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx +++ b/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx @@ -11,15 +11,16 @@ function PrivyAuthSyncToAtom() { } export function PrivyProvider({ children }: { children: React.ReactNode }) { - const appId = process.env.PRIVY_APP_ID ?? ''; - const clientId = process.env.PRIVY_MOBILE_CLIENT_ID ?? ''; + const appId = process.env.PRIVY_APP_ID ?? 'cm5599w1609v7kfpecfmser60'; + const clientId = + process.env.PRIVY_MOBILE_CLIENT_ID ?? + 'client-WY5fBvyK4K8iTegm8s91XNttaKsDN9mJeTJUu1FXxckKp'; if (!appId) { throw new Error('PRIVY_APP_ID is not set'); } if (!clientId) { throw new Error('PRIVY_MOBILE_CLIENT_ID is not set'); } - // throw new Error('PRIVY_MOBILE_CLIENT_ID is not set'); return ( diff --git a/packages/kit/src/views/Prime/components/PrivyProvider.tsx b/packages/kit/src/views/Prime/components/PrivyProvider.tsx index 5fe02d2d443..55233d223f3 100644 --- a/packages/kit/src/views/Prime/components/PrivyProvider.tsx +++ b/packages/kit/src/views/Prime/components/PrivyProvider.tsx @@ -8,11 +8,16 @@ function PrivyAuthSyncToAtom() { } export function PrivyProvider({ children }: { children: React.ReactNode }) { - const appId = process.env.PRIVY_APP_ID ?? ''; - console.log('nnnn', process.env); + const appId = process.env.PRIVY_APP_ID ?? 'cm5599w1609v7kfpecfmser60'; + const clientId = + process.env.PRIVY_MOBILE_CLIENT_ID ?? + 'client-WY5fBvyK4K8iTegm8s91XNttaKsDN9mJeTJUu1FXxckKp'; if (!appId) { throw new Error('PRIVY_APP_ID is not set'); } + if (!clientId) { + throw new Error('PRIVY_MOBILE_CLIENT_ID is not set'); + } // TODO: ext error // Embedded wallet is only available over HTTPS diff --git a/packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx b/packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx new file mode 100644 index 00000000000..5864b722a76 --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx @@ -0,0 +1,42 @@ +import { useState } from 'react'; + +import { useLoginWithEmail } from '@privy-io/expo'; + +import { Button, Input, OTPInput, Toast, YStack } from '@onekeyhq/components'; + +export function PrimeSignupTest() { + const [email, setEmail] = useState('limichange@hotmail.com'); + const { sendCode, loginWithCode, state } = useLoginWithEmail({ + onSendCodeSuccess() { + Toast.message({ + title: 'onSendCodeSuccess', + }); + }, + onLoginSuccess(user, isNewUser) { + Toast.success({ + title: 'onLoginSuccess', + message: `user${JSON.stringify(user, null, 2)}`, + }); + }, + onError(error) { + console.log('error', error); + // show a toast, update form errors, etc... + }, + }); + const [codeEmail, setCodeEmail] = useState(''); + return ( + + + + + + + ); +} diff --git a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts index 8d8be0bbbd9..e091f24d2f7 100644 --- a/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts +++ b/packages/kit/src/views/Prime/hooks/usePrivyUniversalV2/usePrivyUniversalV2.native.ts @@ -1,6 +1,7 @@ import { useLoginWithEmail, usePrivy } from '@privy-io/expo'; import type { IUsePrivyUniversalV2 } from './usePrivyUniversalV2Types'; +import { Toast } from '@onekeyhq/components'; export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { const { logout, isReady, getAccessToken, user } = usePrivy(); @@ -10,6 +11,11 @@ export function usePrivyUniversalV2(): IUsePrivyUniversalV2 { useLoginWithEmail: (args) => { const { onComplete, onError } = args || {}; const { sendCode, loginWithCode, state } = useLoginWithEmail({ + onSendCodeSuccess: () => { + Toast.success({ + title: 'send code', + }); + }, onLoginSuccess: () => { onComplete?.(); }, diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index f5cc5eb1625..a77e86304f4 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -110,9 +110,7 @@ export default function PrimeDashboard() { if (!user?.isLoggedIn) { await loginWithEmail(); - } - - if (platformEnv.isNative) { + } else if (platformEnv.isNative) { ActionList.show({ title: 'Purchase', onClose: () => {}, @@ -304,6 +302,8 @@ export default function PrimeDashboard() { PaywallPackages + + {/* */} =8 <10" + peerDependencies: + permissionless: ^0.2.10 + viem: ^2.21.36 + peerDependenciesMeta: + permissionless: + optional: true + viem: + optional: true + checksum: 10/8f2e5dff2fbd37bdadcf680a1139d782cfa68d1cc33969f3ed1f88f963f0601bf4306362872442052f4d9737d613407a118d6f51d0279749ca4f17d4540a8966 + languageName: node + linkType: hard + +"@privy-io/js-sdk-core@npm:0.41.1": + version: 0.41.1 + resolution: "@privy-io/js-sdk-core@npm:0.41.1" dependencies: "@ethersproject/abstract-signer": "npm:^5.7.0" "@ethersproject/bignumber": "npm:^5.7.0" @@ -9088,7 +9128,7 @@ __metadata: "@ethersproject/transactions": "npm:^5.7.0" "@ethersproject/units": "npm:^5.7.0" "@privy-io/api-base": "npm:^1.4.2" - "@privy-io/public-api": "npm:2.18.0" + "@privy-io/public-api": "npm:2.18.2" eventemitter3: "npm:^5.0.1" fetch-retry: "npm:^5.0.6" jose: "npm:^4.15.5" @@ -9104,34 +9144,57 @@ __metadata: optional: true viem: optional: true - checksum: 10/12b71e6ba1d19bb21be375ee783e1326948c0b2a6467e6ad07997c65e37f20975af33d06c905e9cd8a54a5b237db1374dff68ea986e3702fc17d3d1cd8cd52f3 + checksum: 10/a437362b791b78bde55d3a831da6d01ac77b8486562d868ae686eacc2786426b51d3e350725e2ef10ea73649e04b94b99f1f4e62268c02462d1849caaf8088d6 languageName: node linkType: hard -"@privy-io/public-api@npm:2.18.0": - version: 2.18.0 - resolution: "@privy-io/public-api@npm:2.18.0" +"@privy-io/public-api@npm:2.15.8": + version: 2.15.8 + resolution: "@privy-io/public-api@npm:2.15.8" + dependencies: + "@privy-io/api-base": "npm:1.4.1" + bs58: "npm:^5.0.0" + ethers: "npm:^5.7.2" + libphonenumber-js: "npm:^1.10.31" + zod: "npm:^3.22.4" + checksum: 10/bf7ec8d8c608c2ef206a4a1ae87354e3626d78e0d23f83e00b31056a0ab8f57fff144c60bb614665b2abc3d0aabc6076fcd85f85e82ef08f557ca3b16e638fba + languageName: node + linkType: hard + +"@privy-io/public-api@npm:2.18.2": + version: 2.18.2 + resolution: "@privy-io/public-api@npm:2.18.2" dependencies: "@privy-io/api-base": "npm:1.4.2" bs58: "npm:^5.0.0" ethers: "npm:^5.7.2" libphonenumber-js: "npm:^1.10.31" zod: "npm:^3.22.4" - checksum: 10/66faaeab5f58b9b1315d93a943800e62b786608cd92936c0097a4d5e381f3b70ee5e9822052972c5e977bad9c17048ede8564d7c3a3a98314817a6f71f43ee40 + checksum: 10/0368a5f275e83b4aa02f9cf3bb7ecaf17aecaa83990db634906a8b424181a951da2b67b28b17357bb6df80028c39b0ff3c69ba5f06453fc04c974ce669ef0f87 languageName: node linkType: hard -"@privy-io/react-auth@npm:2.0.4": - version: 2.0.4 - resolution: "@privy-io/react-auth@npm:2.0.4" +"@privy-io/react-auth@npm:1.98.4": + version: 1.98.4 + resolution: "@privy-io/react-auth@npm:1.98.4" dependencies: "@coinbase/wallet-sdk": "npm:4.0.3" + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/contracts": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/providers": "npm:^5.7.1" + "@ethersproject/strings": "npm:^5.7.0" + "@ethersproject/transactions": "npm:^5.7.0" + "@ethersproject/units": "npm:^5.7.0" "@floating-ui/react": "npm:^0.26.22" "@headlessui/react": "npm:^2.2.0" "@heroicons/react": "npm:^2.1.1" "@marsidev/react-turnstile": "npm:^0.4.1" "@metamask/eth-sig-util": "npm:^6.0.0" - "@privy-io/js-sdk-core": "npm:0.40.0" + "@privy-io/js-sdk-core": "npm:0.36.1" "@simplewebauthn/browser": "npm:^9.0.1" "@solana/wallet-adapter-base": "npm:^0.9.23" "@solana/wallet-standard-wallet-adapter-base": "npm:^1.1.2" @@ -9159,9 +9222,11 @@ __metadata: tinycolor2: "npm:^1.6.0" uuid: "npm:>=8 <10" viem: "npm:^2.21.9" - zustand: "npm:^5.0.0" + web3-core: "npm:^1.8.0" + web3-core-helpers: "npm:^1.8.0" + zustand: "npm:^5.0.1" peerDependencies: - "@abstract-foundation/agw-client": ^1.0.0 + "@abstract-foundation/agw-client": ^0.1.0 "@solana/web3.js": ^1.95.8 permissionless: ^0.2.10 react: ^18 || ^19 @@ -9173,7 +9238,7 @@ __metadata: optional: true permissionless: optional: true - checksum: 10/ac4911f2343254e012228a716e0e934ce0cae7c7f5166dbedcce4238b190ba8268c48a1884666ae135afbc8c156ace222abe718d3828d5f92687fd3cfbe4f0b3 + checksum: 10/fcf98771e0cc03e2c472ea7a6876a5a5dd479348f7abda93ba01971eceba8aecb1e8973d99ed1a27fb6f98dda8a0cf6475f5ecf6004549823cbfa0aaeaa41245 languageName: node linkType: hard @@ -40904,6 +40969,16 @@ __metadata: languageName: node linkType: hard +"web3-core-helpers@npm:1.10.4, web3-core-helpers@npm:^1.8.0": + version: 1.10.4 + resolution: "web3-core-helpers@npm:1.10.4" + dependencies: + web3-eth-iban: "npm:1.10.4" + web3-utils: "npm:1.10.4" + checksum: 10/9c22942827bed0e46ae491a0bee3cd60cea636f9b0408b11bb341b0370e58a94358025657405142c2a24f3912a8f947e6e977d594d9ba66e11dedce3c5c4a7f4 + languageName: node + linkType: hard + "web3-core-method@npm:1.10.3": version: 1.10.3 resolution: "web3-core-method@npm:1.10.3" @@ -40917,6 +40992,19 @@ __metadata: languageName: node linkType: hard +"web3-core-method@npm:1.10.4": + version: 1.10.4 + resolution: "web3-core-method@npm:1.10.4" + dependencies: + "@ethersproject/transactions": "npm:^5.6.2" + web3-core-helpers: "npm:1.10.4" + web3-core-promievent: "npm:1.10.4" + web3-core-subscriptions: "npm:1.10.4" + web3-utils: "npm:1.10.4" + checksum: 10/d942beba3999c084333f5c808ada2a90930d55d148d5f8cc51a2135f8ab3f101fa5ce0d732a60830e8cad2af844bbed6cf0b6250863003adafb08c7ffa9fbd5f + languageName: node + linkType: hard + "web3-core-promievent@npm:1.10.3": version: 1.10.3 resolution: "web3-core-promievent@npm:1.10.3" @@ -40926,6 +41014,15 @@ __metadata: languageName: node linkType: hard +"web3-core-promievent@npm:1.10.4": + version: 1.10.4 + resolution: "web3-core-promievent@npm:1.10.4" + dependencies: + eventemitter3: "npm:4.0.4" + checksum: 10/a792c74aa5c91dc63fb493af04628ecfa08b9e6ceea402dfe53f718b019c41d63a0200bf3045dd23ec3c42b8d7474ac96eb4cb4456060becc551c2cacbd02bb1 + languageName: node + linkType: hard + "web3-core-requestmanager@npm:1.10.3": version: 1.10.3 resolution: "web3-core-requestmanager@npm:1.10.3" @@ -40939,6 +41036,19 @@ __metadata: languageName: node linkType: hard +"web3-core-requestmanager@npm:1.10.4": + version: 1.10.4 + resolution: "web3-core-requestmanager@npm:1.10.4" + dependencies: + util: "npm:^0.12.5" + web3-core-helpers: "npm:1.10.4" + web3-providers-http: "npm:1.10.4" + web3-providers-ipc: "npm:1.10.4" + web3-providers-ws: "npm:1.10.4" + checksum: 10/c26bf616cc156b2198bf634084978d66cf384cf2b174324b6ada071a8c9e9be7855d72c09453308d1a46b50874c18ff9b75193f8736c2b285cdc32209391880c + languageName: node + linkType: hard + "web3-core-subscriptions@npm:1.10.3": version: 1.10.3 resolution: "web3-core-subscriptions@npm:1.10.3" @@ -40949,6 +41059,16 @@ __metadata: languageName: node linkType: hard +"web3-core-subscriptions@npm:1.10.4": + version: 1.10.4 + resolution: "web3-core-subscriptions@npm:1.10.4" + dependencies: + eventemitter3: "npm:4.0.4" + web3-core-helpers: "npm:1.10.4" + checksum: 10/b1652988c0925ab1d5c27e67a816ec6bcb32f37f59c7314e1f02552233fbc486a0de579aeb660d77d82452b63e9feaa98317ec7897cd7aeb140595c8e176d0eb + languageName: node + linkType: hard + "web3-core@npm:1.10.3": version: 1.10.3 resolution: "web3-core@npm:1.10.3" @@ -40964,6 +41084,21 @@ __metadata: languageName: node linkType: hard +"web3-core@npm:^1.8.0": + version: 1.10.4 + resolution: "web3-core@npm:1.10.4" + dependencies: + "@types/bn.js": "npm:^5.1.1" + "@types/node": "npm:^12.12.6" + bignumber.js: "npm:^9.0.0" + web3-core-helpers: "npm:1.10.4" + web3-core-method: "npm:1.10.4" + web3-core-requestmanager: "npm:1.10.4" + web3-utils: "npm:1.10.4" + checksum: 10/138c5abff27a48d16584fdbe56b940f9efe7cd2463d768f42c5fcdfc97d0dc4fc41e09ff1ffb8c8ff79b22a69e9efbf5af27c4b6a0d888c351202f03a8b01b8e + languageName: node + linkType: hard + "web3-eth-abi@npm:1.10.3": version: 1.10.3 resolution: "web3-eth-abi@npm:1.10.3" @@ -41034,6 +41169,16 @@ __metadata: languageName: node linkType: hard +"web3-eth-iban@npm:1.10.4": + version: 1.10.4 + resolution: "web3-eth-iban@npm:1.10.4" + dependencies: + bn.js: "npm:^5.2.1" + web3-utils: "npm:1.10.4" + checksum: 10/b5e33aaf3d41608ed59ea98c703271eefcd30aea15163cda4bc8713f9716eb40b816e8047022ebf71391250983acfe58e65551461109a53e266f4b824c4a0678 + languageName: node + linkType: hard + "web3-eth-personal@npm:1.10.3": version: 1.10.3 resolution: "web3-eth-personal@npm:1.10.3" @@ -41091,6 +41236,18 @@ __metadata: languageName: node linkType: hard +"web3-providers-http@npm:1.10.4": + version: 1.10.4 + resolution: "web3-providers-http@npm:1.10.4" + dependencies: + abortcontroller-polyfill: "npm:^1.7.5" + cross-fetch: "npm:^4.0.0" + es6-promise: "npm:^4.2.8" + web3-core-helpers: "npm:1.10.4" + checksum: 10/2ff27d45cc7c7b1e8f07a7917fe1502fef59e211b2ee97851369f9b6dab99ce81b0bef50f9ecf36286137fc41f1230f04b55b090d30f870fbc5ef1972d165b5f + languageName: node + linkType: hard + "web3-providers-ipc@npm:1.10.3": version: 1.10.3 resolution: "web3-providers-ipc@npm:1.10.3" @@ -41101,6 +41258,16 @@ __metadata: languageName: node linkType: hard +"web3-providers-ipc@npm:1.10.4": + version: 1.10.4 + resolution: "web3-providers-ipc@npm:1.10.4" + dependencies: + oboe: "npm:2.1.5" + web3-core-helpers: "npm:1.10.4" + checksum: 10/cd33a954f59ba3a9ca466dca0d6563f46c56879dc249d885b8edfee077f9f58ccf591ba06855e1d69baba52a8719c03684b0ba7b33d836bfdd4c6166e289c0d4 + languageName: node + linkType: hard + "web3-providers-ws@npm:1.10.3": version: 1.10.3 resolution: "web3-providers-ws@npm:1.10.3" @@ -41112,6 +41279,17 @@ __metadata: languageName: node linkType: hard +"web3-providers-ws@npm:1.10.4": + version: 1.10.4 + resolution: "web3-providers-ws@npm:1.10.4" + dependencies: + eventemitter3: "npm:4.0.4" + web3-core-helpers: "npm:1.10.4" + websocket: "npm:^1.0.32" + checksum: 10/98cb76473ae1060e21ff474768a04c6dcd91724f24a1fac2d4a5f186a35bd2f119605fbb28423dfe5be33755b1e5808b10514ddaf326b57573b447efc84ef730 + languageName: node + linkType: hard + "web3-shh@npm:1.10.3": version: 1.10.3 resolution: "web3-shh@npm:1.10.3" @@ -41140,6 +41318,22 @@ __metadata: languageName: node linkType: hard +"web3-utils@npm:1.10.4": + version: 1.10.4 + resolution: "web3-utils@npm:1.10.4" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + bn.js: "npm:^5.2.1" + ethereum-bloom-filters: "npm:^1.0.6" + ethereum-cryptography: "npm:^2.1.2" + ethjs-unit: "npm:0.1.6" + number-to-bn: "npm:1.7.0" + randombytes: "npm:^2.1.0" + utf8: "npm:3.0.0" + checksum: 10/3e586b638cdae9fa45b7698e8a511ae2cbf60e219a900351ae38d384beaaf67424ac6e1d9c5098c3fb8f2ff3cc65a70d977a20bdce3dad542cb50deb666ea2a3 + languageName: node + linkType: hard + "web3@npm:^1.7.3": version: 1.10.3 resolution: "web3@npm:1.10.3" @@ -42404,7 +42598,7 @@ __metadata: languageName: node linkType: hard -"zustand@npm:^5.0.0": +"zustand@npm:^5.0.1": version: 5.0.3 resolution: "zustand@npm:5.0.3" peerDependencies: From fb0fb44a538a3ea85dd770ba68761690a9accca8 Mon Sep 17 00:00:00 2001 From: limichange Date: Sat, 25 Jan 2025 23:25:53 +0800 Subject: [PATCH 37/55] feat: import test env --- apps/mobile/ios/Podfile.lock | 208 +++++++++--------- .../Prime/components/PrivyProvider.native.tsx | 6 +- .../views/Prime/components/PrivyProvider.tsx | 6 +- 3 files changed, 110 insertions(+), 110 deletions(-) diff --git a/apps/mobile/ios/Podfile.lock b/apps/mobile/ios/Podfile.lock index 1733ecdd034..88e0409682c 100644 --- a/apps/mobile/ios/Podfile.lock +++ b/apps/mobile/ios/Podfile.lock @@ -1727,141 +1727,141 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: d3f49c53809116a5d38da093a8aa78bf551aed09 - Burnt: dde5dd245f124a4594098e3938ba71aae4ec83c3 + Burnt: e3a3397e26172fca31a59bb27421475a58068836 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 CocoaLumberjack: 5c7e64cdb877770859bddec4d3d5a0d7c9299df9 DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953 - EXApplication: 137189a3f149b4e8e546884629392c3efc94cbd3 - EXBarCodeScanner: d59fd943cebee3f913ebf4ffde0d05d344da8b78 - EXConstants: a5f6276e565d98f9eb4280f81241fc342d641590 - EXFont: f20669cb266ef48b004f1eb1f2b20db96cd1df9f - EXImageLoader: 03063370bc06ea1825713d3f55fe0455f7c88d04 - EXNotifications: e11f0e9a5b657c064a481a5d522f3bc5a07bf7cd - Expo: d86f597bbab83615207499c5b3bfd80992e2bbd3 - ExpoAppleAuthentication: 4fc9972356977f009911f2f3a5f56319c2a5b11b - ExpoBlur: 2eb7f7ac50c0818ee7d596996e4c0112b3d225f6 - ExpoClipboard: b597982124f067ff9f5b89093eb3d97898d5d877 - ExpoCrypto: b6428f48599c007676dc81a9b5f72c07e62fdccc - ExpoDevice: d204395e17fffdcefa7470bdef33b07719ac41b1 - ExpoFileSystem: 04795dd4d47e76eaf12e38c92091f77d794f9e7f - ExpoHaptics: 28a771b630353cd6e8dcf1b1e3e693e38ad7c3c3 - ExpoImageManipulator: 6d37f811d47a89afb34c0ec2521c6a6ea5f5a5be - ExpoImagePicker: 9e5c745cb3e56ee00e1cfe5d6af59caab66ecf1a - ExpoKeepAwake: 0f5cad99603a3268e50af9a6eb8b76d0d9ac956c - ExpoLinearGradient: d10226652f849e675528883aa45afd2358c2f92f - ExpoLocalAuthentication: 2fed4b25cf8e54d36d5d1ebc9917e8325b3b5911 - ExpoLocalization: 2d5f47577d67ce991ebdd951edf14fe1db85fa06 - ExpoModulesCore: 370096473359f5f6aade0871400d063333747719 - ExpoNativeExtensions: 6c442ddce49ea2d1780e56224b222e5b103193f1 - ExpoSecureStore: 5372610a4bbcf5e50fafbe6f38f8d9c22edf8253 - ExpoSharing: 752ad6ae2b693de9cd4e7fddb78297bdc658b815 - ExpoWebBrowser: e31c97230ea93b51a2a74c6c2381b0d4fca5698c - EXScreenCapture: d23d01882ce614ba2a341f9fe4bf4a9559830d92 - EXSplashScreen: 6bd596128cd52fac91997ebc64f3d394c843a8f9 + EXApplication: 45ce4be704dbde177c98e2e0e38c3aae3bb92535 + EXBarCodeScanner: 83622fbebb5b6711a5a1ce4ccd3dfdbb5d6a0ab8 + EXConstants: c82ef9280044accc91fb6082047afdc9a408f61a + EXFont: 64e653a110eee050ad80dfcd676c4bada0a1ff92 + EXImageLoader: 0bf290da061ebd43c1dc57a481bb83a210eee16c + EXNotifications: 0df7db27e8cc862e37a30a56775ab883642f2872 + Expo: b35d1da5aad3c8fb7bb373ee6c0b2de4d0f3da0e + ExpoAppleAuthentication: d6814aaa787fc4357363efa1b0d29185d1360d24 + ExpoBlur: 233e548200304f30f93a32078b8be64faa829dae + ExpoClipboard: 24cc2b881ab6ca2e5b431b1f6d9d4a302adbf9d0 + ExpoCrypto: 9be8806e896380cb18e5d3d2c13a89ce2f36946a + ExpoDevice: a9a3955ece7cffe8ee98869d01018e4d6ca91bc7 + ExpoFileSystem: c2b5f0af17bfa77de94f23910f1fece34aa9bf7d + ExpoHaptics: c91902e436f3fb0e07aa19acc118018089fa90de + ExpoImageManipulator: 993fa262527ed55ced6b93b339beedf82f6c30c8 + ExpoImagePicker: 5b79d3ea005ec953a21e41c28b4c8312f101ea0a + ExpoKeepAwake: 3b8cf8533b9212500565a1e41fb080fc5af29918 + ExpoLinearGradient: 42ef35fce22bca0ca05a1224d279446db3d68e9c + ExpoLocalAuthentication: 0c91ff4eebbfd6cf7ecfd5a86cebb7ef6c100932 + ExpoLocalization: 76f12a2a4e3137e73834e4366b63fa2874e2d7f6 + ExpoModulesCore: d66d388397a705e301e39f190a9870445006c880 + ExpoNativeExtensions: ac2ffff99e3480446becd430cb2febe295d72ea4 + ExpoSecureStore: 0fcdedf77e48b9d4259fab210f7eb97c1d275d0b + ExpoSharing: 2537ddc516138bb6d8eb536ff7055e370485f4d1 + ExpoWebBrowser: c5d027f58a0b2c1926c86ce3596c94490a639fa2 + EXScreenCapture: 94621416ecfbf87e3faff235984ab30d5647433f + EXSplashScreen: 7bbe853200d944b7266b53d5c79499b0d1fdcb19 FBLazyVector: 9f533d5a4c75ca77c8ed774aced1a91a0701781e FBReactNativeSpec: 2db5940ee4b58968274eec0a4f1c736fc4caefa3 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 hermes-engine: 39589e9c297d024e90fe68f6830ff86c4e01498a - ImageColors: 88be684570585c07ae2750bff34eb7b78bfc53b4 + ImageColors: 869f48b27ca2afb347fd0bada3257a5f698ee55e IQKeyboardManagerSwift: c7955c0bdbf7b2eb29bb7daaa44e3d90f55a9a85 - JCore: fd3304b14f32fdb8cc3999c58d4d8366fb50085f - JPush: 0f2e50224c69fe5c2d6385776ed8c84e1b0727bd + JCore: 4707d226b452782383a401bea8ee2518565017e6 + JPush: 7888dd3b0b4b2acaec7e1368eb8a9e3418e311d1 JXCategoryView: 262d503acea0b1278c79a1c25b7332ffaef4d518 JXPagingView: afdd2e9af09c90160dd232b970d603cc6e7ddd0e libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 lottie-ios: 25e7b2675dad5c3ddad369ac9baab03560c5bfdd - lottie-react-native: c9f1db4f4124dcce9f8159e65d8dc6e8bcb11fb4 + lottie-react-native: 925b18f0275e811a98264da10cc2762d65980f1b MMKV: 5a07930c70c70b86cd87761a42c8f3836fb681d7 MMKVCore: e50135dbd33235b6ab390635991bab437ab873c0 MultiplatformBleAdapter: 5a6a897b006764392f9cef785e4360f54fb9477d PurchasesHybridCommon: ea662e5a551e6fc79c1eb17feb0478c01c59f3e6 PurchasesHybridCommonUI: 7f6a7707655327740f4b7e2842985bcb38745030 - RCT-Folly: 7169b2b1c44399c76a47b5deaaba715eeeb476c0 + RCT-Folly: cd21f1661364f975ae76b3308167ad66b09f53f5 RCTRequired: 77f73950d15b8c1a2b48ba5b79020c3003d1c9b5 RCTTypeSafety: ede1e2576424d89471ef553b2aed09fbbcc038e3 React: 2ddb437e599df2f1bffa9b248de2de4cfa0227f0 React-callinvoker: 10fc710367985e525e2d65bcc3a73d536c992aea - React-Codegen: 84c733096531d1caa6098973eb71eb852b4b66fa - React-Core: c771634f2ed0c59bef0bcd3d85d6f2c3af91eb96 - React-CoreModules: 97e5860e7e2d8549a5a357c2e0b115e93f25e5e7 - React-cxxreact: 62fcadb4e0d38175f8f220d9c970c5dbeed2eae4 + React-Codegen: b771f598598e09eb0a10e618dd935a6d217a43eb + React-Core: 94539e5a6c01f05f5b3b51207cb2452297a27835 + React-CoreModules: 7e5aacc985835c07faa8e95406e3f7326cce92f1 + React-cxxreact: 67431ad6c2e24ce761814923fecd5f27eef06a9c React-debug: 9bd4a362330d85b4f5d14e3d170b090713dc7fcf - React-Fabric: 134c3ac43c57c1bef8ae0f365e28c1af021a48d5 - React-FabricImage: 83120dee7e289412d646caa0924a6d17381da27a - React-graphics: 435c668cfe2a91fea54197c1c1baa49a56a5a255 - React-hermes: 938f6b4c585b3f98d9b65bfd9b84ebeb29e4db2b - React-ImageManager: 5fc7a18c64c3b198ba24579fdfefa77672986262 - React-jserrorhandler: 817d449297b9f4bf2b36c87ca0c689c64c0f2310 - React-jsi: 5fa3dfbe4f1d6b1fb08650cb877c340ddb70066d - React-jsiexecutor: d7e1aa9e9aefff1e6aee2beea13eb98be431a67f + React-Fabric: a7ad1643ec11111569737691285133c3a79453aa + React-FabricImage: 3dc5aeba47813d45fd36eeae7c09a7e8e6f7497f + React-graphics: f7f3e6b9ed278d1291a5fc27d09befd570c715fc + React-hermes: f025011c06c241d6cafbe2f465847394551a704c + React-ImageManager: af1b47a1d8a33a228d11b6b3f4f312e3cbb30264 + React-jserrorhandler: bfb9898055d806ac3bf9ff30fb17b24ed9bddfbc + React-jsi: 580e219940861c5d90156dfc52deb700c6d09d53 + React-jsiexecutor: ed868f628f463ab7409a15dcfd3e38101e2e7f7d React-jsinspector: f356e49aa086380d3a4892708ca173ad31ac69c1 - React-logger: 7b19bdfb254772a0332d6cd4d66eceb0678b6730 - React-Mapbuffer: 401b164386595138c3ee5c2106ff117d54c3ba22 - react-native-ble-manager: 09724bad4d06b86a85e0cd7bd97196fecca15e9a - react-native-ble-plx: 4b0b605e4c52453ecbeb82807878bc4a2652d1c9 - react-native-cloud-fs: 70c7cafe80186a6022da6741a76741e215633b6c - react-native-compat: 896f9ea99a6917730b112c3be4d400fa1e6b5381 - react-native-get-random-values: dee677497c6a740b71e5612e8dbd83e7539ed5bb - react-native-lite-card: a7a68f79d02449a4a1eeea52c2cb52d592bbe014 - react-native-metrix: dd791bfe9f9acfeb6bdd07da19747136ac977a4d - react-native-mmkv: 9ae7ca3977e8ef48dbf7f066974eb844c20b5fd7 - react-native-netinfo: f0a9899081c185db1de5bb2fdc1c88c202a059ac - react-native-randombytes: 421f1c7d48c0af8dbcd471b0324393ebf8fe7846 - react-native-restart: 7595693413fe3ca15893702f2c8306c62a708162 - react-native-safe-area-context: 7aa8e6d9d0f3100a820efb1a98af68aa747f9284 - react-native-slider: 1cdd6ba29675df21f30544253bf7351d3c2d68c4 - react-native-tab-page-view: 85c179e539d8a096f13a057ffe97aa3995479dc2 - react-native-tcp-socket: e724380c910c2e704816ec817ed28f1342246ff7 - react-native-video: 12a68a3e9a6d93e8bdfa8e352917261c49ac35f7 - react-native-view-shot: 4475fde003fe8a210053d1f98fb9e06c1d834e1c - react-native-webview: ab8587e1e43e274471ec8dc9342ec1711fa8bf61 - react-native-webview-cleaner: 93c8c73a302c90fcd83a227438b2a53bdb47f7cc + React-logger: 3017d7c365f7df9a4575f13e98c1ef1d96b85ba5 + React-Mapbuffer: 385706f2ccd18b1096e12434bab765d7cc6ce7ef + react-native-ble-manager: b7ce735a9a79123a5e5af567b164d9918cf688e2 + react-native-ble-plx: 25cf530d23fa20ca50e47a3e24e4e5fbfeb670e6 + react-native-cloud-fs: c86a54591a932e41d94b0965f16d0713150b1fd0 + react-native-compat: 6e7fd7799e8b4b0744b3e8c35e4d4e8d09af0335 + react-native-get-random-values: 419569b6ed3d15bfb9b6781b2f2e058f8e8d2698 + react-native-lite-card: 7fb5882947e435bb1ed5c2b3a8fe84a86d74cf1e + react-native-metrix: e0da83f9212460c8c37f3ca2754b13e863c85dfc + react-native-mmkv: 7b42ba029ab9aedf4b9e5da1f1b498735874d0e1 + react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187 + react-native-randombytes: 3c8f3e89d12487fd03a2f966c288d495415fc116 + react-native-restart: 0bc732f4461709022a742bb29bcccf6bbc5b4863 + react-native-safe-area-context: 9fdf214647353ab717139d164c9e1f163045eb1c + react-native-slider: e472a35a07451af85d2aad887d550dd3213c6190 + react-native-tab-page-view: f7c014458aeb992389f7c22ce26a46771547293d + react-native-tcp-socket: ae8abcfebc071216302a09d9ed1e375d4e877484 + react-native-video: 2ebadb73ee3f6614841434a7e7dbefbd788adab8 + react-native-view-shot: bb8934cb93bf8ec740c81ed94f93244778797b6c + react-native-webview: decc3f683e8ed8671fab0d3d73f24db1c63a2b41 + react-native-webview-cleaner: c2d3bbb850105553c845303044234ca82062d592 React-nativeconfig: 1c018931dcd44532a5df80426c4387d71f66c737 - React-NativeModulesApple: fe9afa0c30c58c6e7f01ad34cd5012e7e42a8cad + React-NativeModulesApple: 21e99badc890e1551808b0567ce225123e641785 React-perflogger: 68ec84e2f858a3e35009aef8866b55893e5e0a1f React-RCTActionSheet: 348c4c729fdfb874f6937abbea90355ecaa6977c - React-RCTAnimation: 9fb1232af37d25d03415af2e0b8ab3b585ed856d - React-RCTAppDelegate: e0d41ac7fc71b5badb381c70ba585951ba7c8d2a - React-RCTBlob: 70b608915d20ffd397f8ba52278bee7e73f16994 - React-RCTFabric: 0b0c4fde89b6a9d9473bed0892eb8533c965281c - React-RCTImage: 520fe02462804655e39b6657996e47277e6f0115 - React-RCTLinking: fb46b9dfea24f4a876163f95769ab279851e0b65 - React-RCTNetwork: dd4396889c20fa8872d4028a4d08f2d2888e2c7f - React-RCTSettings: a7d6fe4b52b98c08b12532a42a18cb12a1667d0a - React-RCTText: df7267a4bc092429fcf285238fbe67a89406ff44 - React-RCTVibration: df03af479dc7ec756e2ca73eb6ce2fa3da6b2888 - React-rendererdebug: 0cfc1a279c7bde67a9935f6b0405b0cd018fd912 + React-RCTAnimation: a2a1329fb302f92fc09a5072790e5ee33f34c599 + React-RCTAppDelegate: 4072a33e6a4318d5ea8342eba4fd753f08a09dc5 + React-RCTBlob: 64279ac7ce41c5c8a5de583d2a2ea08b2f35c9e8 + React-RCTFabric: e772541d8c16a003639a492c38c7290cc269cfdd + React-RCTImage: 647298d9a05f18296ad14deb9faffcccbf90c3fa + React-RCTLinking: 1af4b83559ba537485dc46dba8a7eaa3cb2ceeae + React-RCTNetwork: 99b13f8ff8a3a8aed6f5d9c2295895938c6089ad + React-RCTSettings: da7241ef344854b2c1d84d80d652a0535f304c41 + React-RCTText: 4e24f5a4e5473448c73e60c19ef5e1c48da1e835 + React-RCTVibration: 8a00b2adcae0924f1764a937c0b18291f02857ee + React-rendererdebug: d1322c9a45115ad4000e902617d865100578b787 React-rncore: ab75824bc1cc307cddb26fef112097895c71b7e3 React-runtimeexecutor: b7f307017d54701cf3a4ae41c7558051e0660658 - React-runtimescheduler: 7c3d11d18ec8c4f53921056cc8890f38f968854c - React-utils: e11de3f63640028dbeae517196b104b918b0e9b5 - ReactCommon: 4bd3f9d15757585ef4077479e5c578bc5b8bbc7b - ReactNativeCameraKit: 71343efc1256720184ce980f164c7eedb78d5c16 - ReactNativeKeyboardManager: 60292dbac467c49841a7d69588208ec4a4f7b2a2 - ReactNativeSecureWindow: b9dcbfe769995b0e0f499c4558819b440987afb9 - RealmJS: 4c52a15602e70b64cd9230b0a17a9c12741371f4 + React-runtimescheduler: 19ae641cc603c53ff77974c2616452a6d7cb2f28 + React-utils: 096cc1c5b26e0db6d6b550e34e8b96e0cd678a77 + ReactCommon: ee2d51628f84e5cb2695194df1cd5340474d3e9e + ReactNativeCameraKit: aeb9c5219e4c948d07152d3bdbaef38dc72199be + ReactNativeKeyboardManager: 25f1090b2a82fb449feb0f8f026cf3b34dcaff37 + ReactNativeSecureWindow: aca1652c05825f4a3c1706b942a5a12060c54742 + RealmJS: e5f3296583122bac88e6a74ff9c6c7688bc11be8 RevenueCat: 34f4147c8d26d2f3c691be4e3c9f033698e557f2 RevenueCatUI: d07cd11f991f9fe72fbc64aa14257438ff1b3189 - RNCAsyncStorage: c43e6d71e13bb4748503797784839e0fbbf89d56 - RNDeviceInfo: bf8a32acbcb875f568217285d1793b0e8588c974 - RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8 - RNFileLogger: 9eaf7a6ea709eaaffe646cc485b98ae1dbf1e9f0 - RNFlashList: 4b4b6b093afc0df60ae08f9cbf6ccd4c836c667a - RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 - RNGestureHandler: 12833709769dde5fdb36ec9d4cdf4d3a1a024122 - RNImageCropPicker: 771e2ca319d2cf92e04ebf334ece892ee9a6728f - RNNotifee: e940770a09b9a3e7fe6c4155b7849fb00271b154 - RNPaywalls: 87b0a5aaa0ae343f7e4416c9541287ecd57adcde - RNPermissions: ac5ac3a8f5f63166a4ea5473c73d7e28447e8178 - RNPurchases: a99a9d9139c977811e5db73178ea21d8c12f11ac - RNReanimated: f5cb331578e0c4263050d77ba8bbec209f6b82d7 - RNScreens: 99476adb9f898a77872e67836bbb9d47988788cc - RNSentry: 780f6c64063f176a9f8296ef32390c3025c97e80 - RNShare: 0fad69ae2d71de9d1f7b9a43acf876886a6cb99c - RNSVG: d00c8f91c3cbf6d476451313a18f04d220d4f396 - RNZipArchive: ef9451b849c45a29509bf44e65b788829ab07801 + RNCAsyncStorage: 992e0c559d9c1b2b637ecb343f6f1713e99b6598 + RNDeviceInfo: 0fdf3a74396823838469394397d218fe159227f2 + RNFastImage: 462a183c4b0b6b26fdfd639e1ed6ba37536c3b87 + RNFileLogger: 25252ae3e0c8104b8e4dc29ff1f027d3c70f0b5c + RNFlashList: 1076a3fb7c4608a8cdf265f0783592b8fc41b6a7 + RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 + RNGestureHandler: 758d382274dfcb9f791f90b2beff774d25e358ce + RNImageCropPicker: d14a08134d1b5bc2d5f29a12ce3ac1d402dd2389 + RNNotifee: 3978eab0eb24f9c2ee6ee0440ee7c50748803559 + RNPaywalls: 6ee68a0e0529927fb72d51617d4d283f3ea071b3 + RNPermissions: 99f34316932be93c8b98c0a771ab80008049e34a + RNPurchases: a8ab3d5abe8f58899f9eb6f1a321598ee5f77e70 + RNReanimated: b13f6c502215f86657a2c8e2e9e851d8fd955360 + RNScreens: 83090da53f79e29b6586c70946fdf174e5baad95 + RNSentry: 2148771a896aa7704ccf5d8b7df6241b2a4d3843 + RNShare: 694e19d7f74ac4c04de3a8af0649e9ccc03bd8b1 + RNSVG: 4cab00c621b328a4a2fedaaedc15d8822216723e + RNZipArchive: 2b0d34cfe303447f5b55ae5658ec62f1ebce4ab5 ScreenshotPreventing: 7057fd23cb00599ba265c0b166768e1e0cb3a0b0 SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d @@ -1876,4 +1876,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 5b7f20a90e19262f325cab10e37056b7f3cd0ffb -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx b/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx index c62542c9f75..00c870c72ce 100644 --- a/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx +++ b/packages/kit/src/views/Prime/components/PrivyProvider.native.tsx @@ -11,10 +11,10 @@ function PrivyAuthSyncToAtom() { } export function PrivyProvider({ children }: { children: React.ReactNode }) { - const appId = process.env.PRIVY_APP_ID ?? 'cm5599w1609v7kfpecfmser60'; + const appId = process.env.PRIVY_APP_ID || 'cm6c9xup40017zyrnnp8zh0bt'; const clientId = - process.env.PRIVY_MOBILE_CLIENT_ID ?? - 'client-WY5fBvyK4K8iTegm8s91XNttaKsDN9mJeTJUu1FXxckKp'; + process.env.PRIVY_MOBILE_CLIENT_ID || + 'client-WY5gESiXQgTXogYv2M8iCM3LaaDDaKAdigE9Bg7a9pr1W'; if (!appId) { throw new Error('PRIVY_APP_ID is not set'); } diff --git a/packages/kit/src/views/Prime/components/PrivyProvider.tsx b/packages/kit/src/views/Prime/components/PrivyProvider.tsx index 55233d223f3..8400b8ebca1 100644 --- a/packages/kit/src/views/Prime/components/PrivyProvider.tsx +++ b/packages/kit/src/views/Prime/components/PrivyProvider.tsx @@ -8,10 +8,10 @@ function PrivyAuthSyncToAtom() { } export function PrivyProvider({ children }: { children: React.ReactNode }) { - const appId = process.env.PRIVY_APP_ID ?? 'cm5599w1609v7kfpecfmser60'; + const appId = process.env.PRIVY_APP_ID || 'cm6c9xup40017zyrnnp8zh0bt'; const clientId = - process.env.PRIVY_MOBILE_CLIENT_ID ?? - 'client-WY5fBvyK4K8iTegm8s91XNttaKsDN9mJeTJUu1FXxckKp'; + process.env.PRIVY_MOBILE_CLIENT_ID || + 'client-WY5gESiXQgTXogYv2M8iCM3LaaDDaKAdigGMM4dCxSzy6'; if (!appId) { throw new Error('PRIVY_APP_ID is not set'); } From a6abcfad7d6989245d006e26f79f287d3349dc3a Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 07:36:20 +0800 Subject: [PATCH 38/55] feat: add logout --- .../kit/src/views/Prime/hooks/usePrimeAuthV2.tsx | 12 +++++++----- .../pages/PrimeDashboard/PrimeUserInfoMoreButton.tsx | 8 ++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx index d265b585d4f..94414aca543 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react'; import type { IDialogInstance } from '@onekeyhq/components'; -import { Dialog } from '@onekeyhq/components'; +import { Dialog, Toast } from '@onekeyhq/components'; import { usePrimePersistAtom } from '@onekeyhq/kit-bg/src/states/jotai/atoms'; import { PrimeLoginEmailCodeDialogV2 } from '../components/PrimeLoginEmailCodeDialogV2'; @@ -12,10 +12,10 @@ import { usePrivyUniversalV2 } from './usePrivyUniversalV2'; export function usePrimeAuthV2() { const [primePersistAtom] = usePrimePersistAtom(); - const { useLoginWithEmail } = usePrivyUniversalV2(); + const { useLoginWithEmail, logout } = usePrivyUniversalV2(); const { sendCode, loginWithCode, state } = useLoginWithEmail({ onComplete: () => { - console.log('🔑 ✅ User successfully logged in with email', {}); + console.log('🔑 ✅ User successfully logged in with email'); }, onError: (error) => { console.log(error); @@ -23,7 +23,9 @@ export function usePrimeAuthV2() { }); useEffect(() => { - console.log('state', state); + Toast.success({ + title: JSON.stringify(state), + }); }, [state]); const loginWithEmail = async () => { @@ -52,5 +54,5 @@ export function usePrimeAuthV2() { console.log('dialog', dialog); }; - return { loginWithEmail, user: primePersistAtom }; + return { loginWithEmail, user: primePersistAtom, logout }; } diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeUserInfoMoreButton.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeUserInfoMoreButton.tsx index c3724413100..b576ecb797b 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeUserInfoMoreButton.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeUserInfoMoreButton.tsx @@ -18,7 +18,7 @@ import { formatDateFns } from '@onekeyhq/shared/src/utils/dateUtils'; import openUrlUtils from '@onekeyhq/shared/src/utils/openUrlUtils'; import { useFetchPrimeUserInfo } from '../../hooks/useFetchPrimeUserInfo'; -import { usePrimeAuth } from '../../hooks/usePrimeAuth'; +import { usePrimeAuthV2 } from '../../hooks/usePrimeAuthV2'; import { usePrimePayment } from '../../hooks/usePrimePayment'; function PrimeUserInfoMoreButtonDropDownMenu({ @@ -28,7 +28,7 @@ function PrimeUserInfoMoreButtonDropDownMenu({ handleActionListClose: () => void; doPurchase?: () => Promise; }) { - const { user, logout, updateEmail } = usePrimeAuth(); + const { logout, user } = usePrimeAuthV2(); const isPrime = user?.primeSubscription?.isActive; const primeExpiredAt = user?.primeSubscription?.expiresAt; const { fetchPrimeUserInfo } = useFetchPrimeUserInfo(); @@ -61,7 +61,7 @@ function PrimeUserInfoMoreButtonDropDownMenu({ return ( <> {userInfo} - + /> */} {isPrime ? ( <> Date: Sun, 26 Jan 2025 07:42:51 +0800 Subject: [PATCH 39/55] feat: test ci --- .github/workflows/release-web.yml | 35 ++++++++++++++++++------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 7cc424d846c..ee054866876 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -1,6 +1,12 @@ name: release-web on: + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_run: workflows: - daily-build @@ -22,10 +28,10 @@ jobs: with: lfs: true - - name: Run Shared Env Setup + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: - env_file_name: ".env" + env_file_name: '.env' sentry_project: 'web' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -36,7 +42,6 @@ jobs: revenuecat_api_key_apple: ${{ secrets.REVENUECAT_API_KEY_APPLE }} revenuecat_api_key_google: ${{ secrets.REVENUECAT_API_KEY_GOOGLE }} - - name: Setup Environment uses: actions/setup-node@v3 with: @@ -97,15 +102,15 @@ jobs: cname: ${{ env.TEST_ENDPOINT }} force_orphan: true - - name: 'Notify to Slack' - if: ${{ github.event.workflow_run }} - uses: onekeyhq/actions/slack-notify-webhook@main - with: - web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - artifact-type: Web - artifact-name: OneKey-Web - artifact-bundle-id: 'so.onekey.wallet.web' - artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - artifact-version-code: '${{ env.BUILD_NUMBER }}' - artifact-download-url: '${{ env.ARTIFACTS_URL }}' + # - name: 'Notify to Slack' + # if: ${{ github.event.workflow_run }} + # uses: onekeyhq/actions/slack-notify-webhook@main + # with: + # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + # artifact-type: Web + # artifact-name: OneKey-Web + # artifact-bundle-id: 'so.onekey.wallet.web' + # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + # artifact-version-code: '${{ env.BUILD_NUMBER }}' + # artifact-download-url: '${{ env.ARTIFACTS_URL }}' From c283608a62ae5642229cce5dae21d8a49fb2617a Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 07:48:01 +0800 Subject: [PATCH 40/55] feat: test ci --- .github/workflows/release-desktop-mas.yml | 34 +++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/.github/workflows/release-desktop-mas.yml b/.github/workflows/release-desktop-mas.yml index 6c3df38985d..4f514a936eb 100644 --- a/.github/workflows/release-desktop-mas.yml +++ b/.github/workflows/release-desktop-mas.yml @@ -1,6 +1,12 @@ name: release-desktop-mas on: + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_run: workflows: - daily-build @@ -22,10 +28,10 @@ jobs: with: lfs: true - - name: Run Shared Env Setup + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: - env_file_name: ".env" + env_file_name: '.env' sentry_project: 'desktop-mas' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -157,15 +163,15 @@ jobs: run: | xcrun altool --upload-app --f ./apps/desktop/build-electron/mas-universal/*.pkg -t macOS -u $APPLEID -p $APPLEIDPASS --show-progress - - name: 'Notify to Slack' - if: ${{ github.event.workflow_run }} - uses: onekeyhq/actions/slack-notify-webhook@main - with: - web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - artifact-type: Desktop - artifact-name: OneKey-Desktop-MAS - artifact-bundle-id: 'so.onekey.wallet' - artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - artifact-version-code: '${{ env.BUILD_NUMBER }}' - artifact-download-url: '${{ env.ARTIFACTS_URL }}' + # - name: 'Notify to Slack' + # if: ${{ github.event.workflow_run }} + # uses: onekeyhq/actions/slack-notify-webhook@main + # with: + # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + # artifact-type: Desktop + # artifact-name: OneKey-Desktop-MAS + # artifact-bundle-id: 'so.onekey.wallet' + # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + # artifact-version-code: '${{ env.BUILD_NUMBER }}' + # artifact-download-url: '${{ env.ARTIFACTS_URL }}' From 13cc98a571d155c1c1657c17d740a3d085fda8fa Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 08:01:36 +0800 Subject: [PATCH 41/55] feat: test ci --- .github/workflows/release-android-debug.yml | 16 +++++--- .github/workflows/release-android.yml | 24 ++++++------ .github/workflows/release-desktop-winms.yml | 36 ++++++++++-------- .github/workflows/release-ext.yml | 41 +++++++++++---------- 4 files changed, 63 insertions(+), 54 deletions(-) diff --git a/.github/workflows/release-android-debug.yml b/.github/workflows/release-android-debug.yml index 400d5b6333e..347687b8255 100644 --- a/.github/workflows/release-android-debug.yml +++ b/.github/workflows/release-android-debug.yml @@ -1,6 +1,12 @@ name: release-android-debug on: + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_dispatch: inputs: is-split-bundle: @@ -19,16 +25,16 @@ jobs: # https://github.com/orgs/community/discussions/25678 - name: Delete huge unnecessary tools folder run: rm -rf /opt/hostedtoolcache - + - name: Checkout Source Code uses: actions/checkout@v3 with: lfs: true - - name: Run Shared Env Setup + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: - env_file_name: ".env.expo" + env_file_name: '.env.expo' sentry_project: '' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -85,7 +91,7 @@ jobs: # https://github.com/orgs/community/discussions/25678 - name: Delete huge unnecessary tools folder run: rm -rf /opt/hostedtoolcache - + - name: Upload Main Debug APK uses: actions/upload-artifact@v3 with: @@ -99,7 +105,7 @@ jobs: name: release-google-debug path: | ./apps/mobile/android/app/build/outputs/apk/google/debug - + - name: Upload Huawei Debug APK uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/release-android.yml b/.github/workflows/release-android.yml index 89993bd1277..70955fc8399 100644 --- a/.github/workflows/release-android.yml +++ b/.github/workflows/release-android.yml @@ -1,11 +1,12 @@ name: release-android on: - workflow_run: - workflows: - - daily-build - types: - - completed + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_dispatch: inputs: is-split-bundle: @@ -13,7 +14,7 @@ on: required: false default: '' -jobs: +jobs: release-android: runs-on: ubuntu-latest if: ${{ !github.event.workflow_run || (github.event.workflow_run && github.event.workflow_run.conclusion == 'success') }} @@ -22,14 +23,14 @@ jobs: uses: actions/checkout@v3 with: lfs: true - - - name: Run Shared Env Setup + + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: additional_env: | NO_FLIPPER=1 SENTRY_DISABLE_AUTO_UPLOAD=false - env_file_name: ".env.expo" + env_file_name: '.env.expo' sentry_project: '' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -72,7 +73,7 @@ jobs: run: | # pass BUILD_NUMBER as env variable to expo server echo "BUILD_NUMBER=${{ env.BUILD_NUMBER }}" >> .env.version - + - name: Write .sentry.properties run: | echo "auth.token=${{ secrets.SENTRY_TOKEN }}" >> apps/mobile/android/sentry.properties @@ -84,14 +85,12 @@ jobs: run: | yarn - - name: Build WebEmbed env: NODE_OPTIONS: '--max_old_space_size=8192' SENTRY_DISABLE_AUTO_UPLOAD: 'true' run: | yarn app:web-embed:build - - name: Build on EAS And Submit if: ${{ github.event.workflow_run }} @@ -114,4 +113,3 @@ jobs: path: | ./apps/web-embed/web-build if-no-files-found: error - diff --git a/.github/workflows/release-desktop-winms.yml b/.github/workflows/release-desktop-winms.yml index 672c59a27ab..bae176a2d3e 100644 --- a/.github/workflows/release-desktop-winms.yml +++ b/.github/workflows/release-desktop-winms.yml @@ -1,6 +1,12 @@ name: release-desktop-winms on: + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_run: workflows: - daily-build @@ -22,10 +28,10 @@ jobs: with: lfs: true - - name: Run Shared Env Setup + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: - env_file_name: ".env" + env_file_name: '.env' sentry_project: 'desktop-winms' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -36,8 +42,6 @@ jobs: revenuecat_api_key_apple: ${{ secrets.REVENUECAT_API_KEY_APPLE }} revenuecat_api_key_google: ${{ secrets.REVENUECAT_API_KEY_GOOGLE }} - - - name: 'Setup ENV' run: | eval "$(node -e 'const v=require("./apps/desktop/package.json").version; console.log("pkg_version="+v)')" @@ -124,15 +128,15 @@ jobs: !./apps/desktop/build-electron/linux-unpacked !./apps/desktop/build-electron/builder-debug.yml - - name: 'Notify to Slack' - if: ${{ github.event.workflow_run }} - uses: onekeyhq/actions/slack-notify-webhook@main - with: - web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - artifact-type: Desktop - artifact-name: OneKey-Desktop-Win-Store - artifact-bundle-id: 'so.onekey.wallet.desktop' - artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - artifact-version-code: '${{ env.BUILD_NUMBER }}' - artifact-download-url: '${{ env.ARTIFACTS_URL }}' + # - name: 'Notify to Slack' + # if: ${{ github.event.workflow_run }} + # uses: onekeyhq/actions/slack-notify-webhook@main + # with: + # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + # artifact-type: Desktop + # artifact-name: OneKey-Desktop-Win-Store + # artifact-bundle-id: 'so.onekey.wallet.desktop' + # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + # artifact-version-code: '${{ env.BUILD_NUMBER }}' + # artifact-download-url: '${{ env.ARTIFACTS_URL }}' diff --git a/.github/workflows/release-ext.yml b/.github/workflows/release-ext.yml index 554898950fe..61095d3d3e7 100644 --- a/.github/workflows/release-ext.yml +++ b/.github/workflows/release-ext.yml @@ -1,11 +1,12 @@ name: release-ext on: - workflow_run: - workflows: - - daily-build - types: - - completed + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_dispatch: jobs: @@ -21,11 +22,11 @@ jobs: uses: actions/checkout@v3 with: lfs: true - - - name: Run Shared Env Setup + + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: - env_file_name: ".env" + env_file_name: '.env' sentry_project: 'chrome-extension' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -89,15 +90,15 @@ jobs: path: | ./apps/ext/build/_dist/*.zip - - name: 'Notify to Slack' - if: ${{ github.event.workflow_run }} - uses: onekeyhq/actions/slack-notify-webhook@main - with: - web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - artifact-type: Extension - artifact-name: OneKey-Extension-RN - artifact-bundle-id: 'so.onekey.wallet.extension' - artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - artifact-version-code: '${{ env.BUILD_NUMBER }}' - artifact-download-url: '${{ env.ARTIFACTS_URL }}' + # - name: 'Notify to Slack' + # if: ${{ github.event.workflow_run }} + # uses: onekeyhq/actions/slack-notify-webhook@main + # with: + # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + # artifact-type: Extension + # artifact-name: OneKey-Extension-RN + # artifact-bundle-id: 'so.onekey.wallet.extension' + # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + # artifact-version-code: '${{ env.BUILD_NUMBER }}' + # artifact-download-url: '${{ env.ARTIFACTS_URL }}' From ac04066fd4e5ea7227202e3bb23d5fc1c921546b Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 08:02:32 +0800 Subject: [PATCH 42/55] feat: test ci --- .github/workflows/release-ios.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release-ios.yml b/.github/workflows/release-ios.yml index 771adb388ea..6c280598351 100644 --- a/.github/workflows/release-ios.yml +++ b/.github/workflows/release-ios.yml @@ -1,6 +1,12 @@ name: release-ios on: + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_run: workflows: - daily-build @@ -23,13 +29,13 @@ jobs: with: lfs: true - - name: Run Shared Env Setup + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: additional_env: | NO_FLIPPER=1 SENTRY_DISABLE_AUTO_UPLOAD=false - env_file_name: ".env.expo" + env_file_name: '.env.expo' sentry_project: '' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -40,7 +46,6 @@ jobs: revenuecat_api_key_apple: ${{ secrets.REVENUECAT_API_KEY_APPLE }} revenuecat_api_key_google: ${{ secrets.REVENUECAT_API_KEY_GOOGLE }} - - name: Setup Node.js uses: actions/setup-node@v3 with: From b98d15a9750f6f3f6c70706a6b70662dd5c2d538 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 08:44:54 +0800 Subject: [PATCH 43/55] fix: V2 --- .../PrimeLoginEmailDialogV2.tsx | 2 +- .../src/views/Prime/hooks/usePrimeAuthV2.tsx | 51 ++++++++++++++++--- .../usePrivyUniversalV2.native.ts | 3 +- .../pages/PrimeDashboard/PrimeDashboard.tsx | 17 ++++--- .../pages/PrimeDashboard/PrimeUserInfo.tsx | 8 +-- 5 files changed, 60 insertions(+), 21 deletions(-) diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailDialogV2/PrimeLoginEmailDialogV2.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailDialogV2/PrimeLoginEmailDialogV2.tsx index 908f8647ac7..385d2c8b87c 100644 --- a/packages/kit/src/views/Prime/components/PrimeLoginEmailDialogV2/PrimeLoginEmailDialogV2.tsx +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailDialogV2/PrimeLoginEmailDialogV2.tsx @@ -13,7 +13,7 @@ export function PrimeLoginEmailDialogV2(props: { const intl = useIntl(); const form = useForm<{ email: string }>({ - defaultValues: { email: 'limichange@hotmail.com' }, + defaultValues: { email: 'yao.hou@onekey.so' }, }); const submit = useCallback( diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx index 94414aca543..bdb20ed09f5 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx @@ -1,4 +1,4 @@ -import { useEffect } from 'react'; +import { useEffect, useRef } from 'react'; import type { IDialogInstance } from '@onekeyhq/components'; import { Dialog, Toast } from '@onekeyhq/components'; @@ -11,8 +11,11 @@ import { usePrivyUniversalV2 } from './usePrivyUniversalV2'; export function usePrimeAuthV2() { const [primePersistAtom] = usePrimePersistAtom(); + const emailDialogRef = useRef(undefined); + const emailCodeDialogRef = useRef(undefined); - const { useLoginWithEmail, logout } = usePrivyUniversalV2(); + const { useLoginWithEmail, logout, getAccessToken, isReady, authenticated } = + usePrivyUniversalV2(); const { sendCode, loginWithCode, state } = useLoginWithEmail({ onComplete: () => { console.log('🔑 ✅ User successfully logged in with email'); @@ -22,10 +25,35 @@ export function usePrimeAuthV2() { }, }); + async function closeDialogs() { + await emailDialogRef.current?.close(); + await emailCodeDialogRef.current?.close(); + } + useEffect(() => { - Toast.success({ - title: JSON.stringify(state), - }); + if (state.status === 'sending-code') { + Toast.success({ + title: '🔑 ✅ send code', + }); + } else if (state.status === 'awaiting-code-input') { + Toast.success({ + title: '🔑 ✅ awaiting code input', + }); + } else if (state.status === 'submitting-code') { + Toast.success({ + title: '🔑 ✅ submitting code', + }); + } else if (state.status === 'done') { + Toast.success({ + title: '🔑 ✅ User successfully logged in with email', + }); + + closeDialogs(); + } else if (state.status === 'error') { + Toast.error({ + title: '🔑 ❌ User failed to log in with email', + }); + } }, [state]); const loginWithEmail = async () => { @@ -36,7 +64,7 @@ export function usePrimeAuthV2() { // 2. on email submitted onEmailSubmitted={async (email) => { // 3. open code dialog - Dialog.show({ + emailCodeDialogRef.current = Dialog.show({ renderContent: ( // 4. input code { @@ -261,10 +266,8 @@ export default function PrimeDashboard() { - - - - ); -} diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts b/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts index 5326aa668aa..6b6efdb91cb 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuth.ts @@ -14,8 +14,8 @@ import backgroundApiProxy from '../../../background/instance/backgroundApiProxy' import { usePrivyUniversal } from './usePrivyUniversal'; export function usePrimeAuth() { - const [primePersistAtom, setPrimePersistAtom] = usePrimePersistAtom(); - const [primeInitAtom, setPrimeInitAtom] = usePrimeInitAtom(); + const [primePersistAtom] = usePrimePersistAtom(); + const [primeInitAtom] = usePrimeInitAtom(); const privy = usePrivyUniversal(); const { logout, getAccessToken } = privy; diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx index bdb20ed09f5..92535bd6f5d 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx @@ -43,44 +43,42 @@ export function usePrimeAuthV2() { Toast.success({ title: '🔑 ✅ submitting code', }); - } else if (state.status === 'done') { - Toast.success({ - title: '🔑 ✅ User successfully logged in with email', - }); - - closeDialogs(); } else if (state.status === 'error') { Toast.error({ title: '🔑 ❌ User failed to log in with email', }); } - }, [state]); + }, [state.status]); - const loginWithEmail = async () => { - // 1. open dialog - const dialog: IDialogInstance = Dialog.show({ - renderContent: ( - { - // 3. open code dialog - emailCodeDialogRef.current = Dialog.show({ - renderContent: ( - // 4. input code - - ), - }); - }} - /> - ), - }); + const loginWithEmail = async () => + new Promise((resolve) => { + // 1. open dialog + const dialog: IDialogInstance = Dialog.show({ + renderContent: ( + { + // 3. open code dialog + emailCodeDialogRef.current = Dialog.show({ + renderContent: ( + // 4. input code + { + resolve(true); + }} + /> + ), + }); + }} + /> + ), + }); - emailDialogRef.current = dialog; - }; + emailDialogRef.current = dialog; + }); return { loginWithEmail, diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index d5968624e1c..789c8a94431 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -113,9 +113,14 @@ export default function PrimeDashboard() { try { setIsLoading(true); + // await 1s + await timerUtils.wait(500); + if (!user?.isLoggedIn) { await loginWithEmail(); - } else if (platformEnv.isNative) { + } + + if (platformEnv.isNative) { ActionList.show({ title: 'Purchase', onClose: () => {}, @@ -305,8 +310,6 @@ export default function PrimeDashboard() { PaywallPackages - - {/* */} Date: Sun, 26 Jan 2025 09:14:33 +0800 Subject: [PATCH 45/55] feat: watch state --- .../PrimeLoginEmailCodeDialogV2.tsx | 31 ++++++++++++++----- .../src/views/Prime/hooks/usePrimeAuthV2.tsx | 17 +++++----- .../usePrivyUniversalV2Types.ts | 4 +-- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx index 19aece63a9b..452053a42b4 100644 --- a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx @@ -14,15 +14,18 @@ import { } from '@onekeyhq/components'; import { ETranslations } from '@onekeyhq/shared/src/locale'; +import type { IPrivyState } from '../../hooks/usePrivyUniversalV2/usePrivyUniversalV2Types'; + const COUNTDOWN_TIME = 60; export function PrimeLoginEmailCodeDialogV2(props: { email: string; + state: IPrivyState; loginWithCode: (args: { code: string; email?: string }) => Promise; sendCode: (args: { email: string }) => void; onLoginSuccess: () => void; }) { - const { email, loginWithCode, sendCode, onLoginSuccess } = props; + const { email, loginWithCode, sendCode, onLoginSuccess, state } = props; const [countdown, setCountdown] = useState(COUNTDOWN_TIME); const [isResending, setIsResending] = useState(false); const [verificationCode, setVerificationCode] = useState(''); @@ -128,13 +131,25 @@ export function PrimeLoginEmailCodeDialogV2(props: { email, }); - onLoginSuccess?.(); - - Toast.success({ - title: intl.formatMessage({ - id: ETranslations.login_welcome_message, - }), - }); + if (state.status === 'done') { + Toast.success({ + title: intl.formatMessage({ + id: ETranslations.login_welcome_message, + }), + }); + + onLoginSuccess?.(); + } + + if (state.status === 'error') { + Toast.error({ + title: intl.formatMessage({ + id: ETranslations.auth_error_passcode_incorrect, + }), + }); + + preventClose(); + } } catch (error) { console.log('error', error); diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx index 92535bd6f5d..9ea6520fe51 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx @@ -33,20 +33,16 @@ export function usePrimeAuthV2() { useEffect(() => { if (state.status === 'sending-code') { Toast.success({ - title: '🔑 ✅ send code', + title: 'send code', }); } else if (state.status === 'awaiting-code-input') { Toast.success({ - title: '🔑 ✅ awaiting code input', - }); - } else if (state.status === 'submitting-code') { - Toast.success({ - title: '🔑 ✅ submitting code', - }); - } else if (state.status === 'error') { - Toast.error({ - title: '🔑 ❌ User failed to log in with email', + title: 'awaiting code input', }); + // } else if (state.status === 'submitting-code') { + // Toast.success({ + // title: 'submitting code', + // }); } }, [state.status]); @@ -63,6 +59,7 @@ export function usePrimeAuthV2() { renderContent: ( // 4. input code void; onError?: (error: any) => void; }) => { - state: IState; + state: IPrivyState; sendCode: (args: { email: string }) => Promise; loginWithCode: (args: { code: string; email?: string }) => Promise; }; From 86d0f45679d7de65fe37cc3e4f3cd645cbc37d57 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 09:42:58 +0800 Subject: [PATCH 46/55] feat: auth --- development/spellCheckerSkipWords.js | 1 + .../PrimeLoginEmailCodeDialogV2.tsx | 24 +---- .../src/views/Prime/hooks/usePrimeAuthV2.tsx | 88 +++++++++++-------- .../pages/PrimeDashboard/PrimeDashboard.tsx | 8 +- 4 files changed, 58 insertions(+), 63 deletions(-) diff --git a/development/spellCheckerSkipWords.js b/development/spellCheckerSkipWords.js index 732405c79bb..8193f92916b 100644 --- a/development/spellCheckerSkipWords.js +++ b/development/spellCheckerSkipWords.js @@ -800,4 +800,5 @@ module.exports = [ 'hashify', 'Otp', 'onekeyid', + 'passcode', ]; diff --git a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx index 452053a42b4..9802c341adb 100644 --- a/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx +++ b/packages/kit/src/views/Prime/components/PrimeLoginEmailCodeDialogV2/PrimeLoginEmailCodeDialogV2.tsx @@ -23,9 +23,9 @@ export function PrimeLoginEmailCodeDialogV2(props: { state: IPrivyState; loginWithCode: (args: { code: string; email?: string }) => Promise; sendCode: (args: { email: string }) => void; - onLoginSuccess: () => void; + onLoginSuccess?: () => void; }) { - const { email, loginWithCode, sendCode, onLoginSuccess, state } = props; + const { email, loginWithCode, sendCode } = props; const [countdown, setCountdown] = useState(COUNTDOWN_TIME); const [isResending, setIsResending] = useState(false); const [verificationCode, setVerificationCode] = useState(''); @@ -131,25 +131,7 @@ export function PrimeLoginEmailCodeDialogV2(props: { email, }); - if (state.status === 'done') { - Toast.success({ - title: intl.formatMessage({ - id: ETranslations.login_welcome_message, - }), - }); - - onLoginSuccess?.(); - } - - if (state.status === 'error') { - Toast.error({ - title: intl.formatMessage({ - id: ETranslations.auth_error_passcode_incorrect, - }), - }); - - preventClose(); - } + preventClose(); } catch (error) { console.log('error', error); diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx index 9ea6520fe51..bc96cce3b90 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx @@ -1,8 +1,11 @@ import { useEffect, useRef } from 'react'; +import { useIntl } from 'react-intl'; + import type { IDialogInstance } from '@onekeyhq/components'; import { Dialog, Toast } from '@onekeyhq/components'; import { usePrimePersistAtom } from '@onekeyhq/kit-bg/src/states/jotai/atoms'; +import { ETranslations } from '@onekeyhq/shared/src/locale'; import { PrimeLoginEmailCodeDialogV2 } from '../components/PrimeLoginEmailCodeDialogV2'; import { PrimeLoginEmailDialogV2 } from '../components/PrimeLoginEmailDialogV2'; @@ -13,6 +16,7 @@ export function usePrimeAuthV2() { const [primePersistAtom] = usePrimePersistAtom(); const emailDialogRef = useRef(undefined); const emailCodeDialogRef = useRef(undefined); + const intl = useIntl(); const { useLoginWithEmail, logout, getAccessToken, isReady, authenticated } = usePrivyUniversalV2(); @@ -25,12 +29,8 @@ export function usePrimeAuthV2() { }, }); - async function closeDialogs() { - await emailDialogRef.current?.close(); - await emailCodeDialogRef.current?.close(); - } - useEffect(() => { + console.log('state.status', state.status); if (state.status === 'sending-code') { Toast.success({ title: 'send code', @@ -39,43 +39,57 @@ export function usePrimeAuthV2() { Toast.success({ title: 'awaiting code input', }); - // } else if (state.status === 'submitting-code') { - // Toast.success({ - // title: 'submitting code', - // }); + } else if (state.status === 'submitting-code') { + Toast.success({ + title: 'submitting code', + }); } - }, [state.status]); - const loginWithEmail = async () => - new Promise((resolve) => { - // 1. open dialog - const dialog: IDialogInstance = Dialog.show({ - renderContent: ( - { - // 3. open code dialog - emailCodeDialogRef.current = Dialog.show({ - renderContent: ( - // 4. input code - { - resolve(true); - }} - /> - ), - }); - }} - /> - ), + if (state.status === 'done') { + // Toast.success({ + // title: intl.formatMessage({ + // id: ETranslations.login_welcome_message, + // }), + // }); + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + emailDialogRef.current?.close(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + emailCodeDialogRef.current?.close(); + } + + if (state.status === 'error') { + Toast.error({ + title: intl.formatMessage({ + id: ETranslations.auth_error_passcode_incorrect, + }), }); + } + }, [intl, state.status]); - emailDialogRef.current = dialog; + const loginWithEmail = () => { + Dialog.show({ + renderContent: ( + { + // 3. open code dialog + emailCodeDialogRef.current = Dialog.show({ + renderContent: ( + // 4. input code + + ), + }); + }} + /> + ), }); + }; return { loginWithEmail, diff --git a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx index 789c8a94431..5982af776c4 100644 --- a/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx +++ b/packages/kit/src/views/Prime/pages/PrimeDashboard/PrimeDashboard.tsx @@ -111,16 +111,14 @@ export default function PrimeDashboard() { // TODO move to jotai context method const doPurchase = useCallback(async () => { try { - setIsLoading(true); - // await 1s await timerUtils.wait(500); if (!user?.isLoggedIn) { - await loginWithEmail(); - } + loginWithEmail(); + } else if (platformEnv.isNative) { + setIsLoading(true); - if (platformEnv.isNative) { ActionList.show({ title: 'Purchase', onClose: () => {}, From a4934fbfb2870dca569334d3ad58496033256db7 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 10:26:18 +0800 Subject: [PATCH 47/55] feat: remove logs --- .../src/views/Prime/hooks/usePrimeAuthV2.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx index bc96cce3b90..3cca1e67f9f 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx +++ b/packages/kit/src/views/Prime/hooks/usePrimeAuthV2.tsx @@ -32,17 +32,17 @@ export function usePrimeAuthV2() { useEffect(() => { console.log('state.status', state.status); if (state.status === 'sending-code') { - Toast.success({ - title: 'send code', - }); + // Toast.success({ + // title: 'send code', + // }); } else if (state.status === 'awaiting-code-input') { - Toast.success({ - title: 'awaiting code input', - }); + // Toast.success({ + // title: 'awaiting code input', + // }); } else if (state.status === 'submitting-code') { - Toast.success({ - title: 'submitting code', - }); + // Toast.success({ + // title: 'submitting code', + // }); } if (state.status === 'done') { From 30bcfe83c6c9a99fb297ea17c8902f090e00b87a Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 10:29:43 +0800 Subject: [PATCH 48/55] feat: test release --- .github/workflows/release-web.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index ee054866876..c8d3afacf48 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -102,15 +102,15 @@ jobs: cname: ${{ env.TEST_ENDPOINT }} force_orphan: true - # - name: 'Notify to Slack' - # if: ${{ github.event.workflow_run }} - # uses: onekeyhq/actions/slack-notify-webhook@main - # with: - # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - # artifact-type: Web - # artifact-name: OneKey-Web - # artifact-bundle-id: 'so.onekey.wallet.web' - # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - # artifact-version-code: '${{ env.BUILD_NUMBER }}' - # artifact-download-url: '${{ env.ARTIFACTS_URL }}' + - name: 'Notify to Slack' + if: ${{ github.event.workflow_run }} + uses: onekeyhq/actions/slack-notify-webhook@main + with: + web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + artifact-type: Web + artifact-name: OneKey-Web + artifact-bundle-id: 'so.onekey.wallet.web' + artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + artifact-version-code: '${{ env.BUILD_NUMBER }}' + artifact-download-url: '${{ env.ARTIFACTS_URL }}' From 79cfba43775446c19e630a357ff36613288cf9e4 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 11:05:23 +0800 Subject: [PATCH 49/55] feat: test release --- .github/workflows/release-desktop-mas.yml | 6 ------ .github/workflows/release-ios.yml | 6 ------ 2 files changed, 12 deletions(-) diff --git a/.github/workflows/release-desktop-mas.yml b/.github/workflows/release-desktop-mas.yml index 4f514a936eb..a86cb524164 100644 --- a/.github/workflows/release-desktop-mas.yml +++ b/.github/workflows/release-desktop-mas.yml @@ -1,12 +1,6 @@ name: release-desktop-mas on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi workflow_run: workflows: - daily-build diff --git a/.github/workflows/release-ios.yml b/.github/workflows/release-ios.yml index 6c280598351..5db0160164c 100644 --- a/.github/workflows/release-ios.yml +++ b/.github/workflows/release-ios.yml @@ -1,12 +1,6 @@ name: release-ios on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi workflow_run: workflows: - daily-build From da28085b9812dca3668c49c485b90290f6879b3c Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 15:20:05 +0800 Subject: [PATCH 50/55] feat: showPrimeTest true --- packages/kit-bg/src/states/jotai/atoms/devSettings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit-bg/src/states/jotai/atoms/devSettings.ts b/packages/kit-bg/src/states/jotai/atoms/devSettings.ts index 79ed354d419..fb4a8d26d54 100644 --- a/packages/kit-bg/src/states/jotai/atoms/devSettings.ts +++ b/packages/kit-bg/src/states/jotai/atoms/devSettings.ts @@ -49,6 +49,7 @@ export const { disableNumberShortcuts: false, disableSearchAndAccountSelectorShortcuts: false, webviewDebuggingEnabled: false, + showPrimeTest: true, }, }, }); From 139e6690cb89d3cf8e5fc7e7a1a5174309329d65 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 16:06:47 +0800 Subject: [PATCH 51/55] feat: test ci --- .github/workflows/release-android-debug.yml | 7 +++++++ .github/workflows/release-android.yml | 6 ++++++ .github/workflows/release-ios-debug.yml | 14 ++++++++------ .github/workflows/release-ios.yml | 6 ++++++ .../src/components/TabPageHeader/HeaderRight.tsx | 9 +++++---- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release-android-debug.yml b/.github/workflows/release-android-debug.yml index 347687b8255..7f7ded7e03f 100644 --- a/.github/workflows/release-android-debug.yml +++ b/.github/workflows/release-android-debug.yml @@ -123,3 +123,10 @@ jobs: large-packages: false docker-images: false swap-storage: false + + - name: Download App File + uses: actions/download-artifact@v3 + with: + name: release-App-debug + path: | + ./apps/mobile/android/app/build/outputs/apk/google/debug diff --git a/.github/workflows/release-android.yml b/.github/workflows/release-android.yml index 70955fc8399..1f4122c70cf 100644 --- a/.github/workflows/release-android.yml +++ b/.github/workflows/release-android.yml @@ -113,3 +113,9 @@ jobs: path: | ./apps/web-embed/web-build if-no-files-found: error + + - name: Download WebEmbed Artifacts + uses: actions/download-artifact@v3 + with: + name: upload-web-embed-artifacts + path: ./apps/web-embed/web-build diff --git a/.github/workflows/release-ios-debug.yml b/.github/workflows/release-ios-debug.yml index 0869d9ff390..d49ec8a5878 100644 --- a/.github/workflows/release-ios-debug.yml +++ b/.github/workflows/release-ios-debug.yml @@ -23,10 +23,10 @@ jobs: with: lfs: true - - name: Run Shared Env Setup + - name: Run Shared Env Setup uses: ./.github/actions/shared-env with: - env_file_name: ".env.expo" + env_file_name: '.env.expo' sentry_project: '' covalent_key: ${{ secrets.COVALENT_KEY }} sentry_token: ${{ secrets.SENTRY_TOKEN }} @@ -37,8 +37,6 @@ jobs: revenuecat_api_key_apple: ${{ secrets.REVENUECAT_API_KEY_APPLE }} revenuecat_api_key_google: ${{ secrets.REVENUECAT_API_KEY_GOOGLE }} - - - name: Setup Node uses: actions/setup-node@v3 with: @@ -87,7 +85,7 @@ jobs: yarn app:web-embed:build cd apps/mobile/ios xcodebuild -workspace OneKeyWallet.xcworkspace -configuration Debug -scheme OneKeyWallet -sdk iphonesimulator -derivedDataPath ./outputs - + - name: Zip artifact run: | cd apps/mobile/ios/outputs/Build/Products/Debug-iphonesimulator @@ -101,4 +99,8 @@ jobs: ./apps/mobile/ios/outputs/Build/Products/Debug-iphonesimulator/OneKeyWallet-Debug.zip if-no-files-found: error - + - name: Download App File + uses: actions/download-artifact@v3 + with: + name: release-App-debug + path: ./apps/mobile/ios/outputs/Build/Products/Debug-iphonesimulator/OneKeyWallet-Debug.zip diff --git a/.github/workflows/release-ios.yml b/.github/workflows/release-ios.yml index 5db0160164c..6c280598351 100644 --- a/.github/workflows/release-ios.yml +++ b/.github/workflows/release-ios.yml @@ -1,6 +1,12 @@ name: release-ios on: + pull_request: + branches: + - feat/prime-login0-limi + push: + branches: + - feat/prime-login0-limi workflow_run: workflows: - daily-build diff --git a/packages/kit/src/components/TabPageHeader/HeaderRight.tsx b/packages/kit/src/components/TabPageHeader/HeaderRight.tsx index 43edb712223..596ef3c6752 100644 --- a/packages/kit/src/components/TabPageHeader/HeaderRight.tsx +++ b/packages/kit/src/components/TabPageHeader/HeaderRight.tsx @@ -171,10 +171,11 @@ export function HeaderRight({ onPress={onScanButtonPressed} /> ); - const primeButton = - devSettings?.enabled && devSettings?.settings?.showPrimeTest ? ( - - ) : null; + // const primeButton = + // devSettings?.enabled && devSettings?.settings?.showPrimeTest ? ( + // + // ) : null; + const primeButton = ; let notificationsButton: ReactNode | null = ( Date: Sun, 26 Jan 2025 16:52:46 +0800 Subject: [PATCH 52/55] feat: test ci --- .github/workflows/release-android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-android.yml b/.github/workflows/release-android.yml index 1f4122c70cf..ce03ac225df 100644 --- a/.github/workflows/release-android.yml +++ b/.github/workflows/release-android.yml @@ -118,4 +118,4 @@ jobs: uses: actions/download-artifact@v3 with: name: upload-web-embed-artifacts - path: ./apps/web-embed/web-build + path: ./apps/mobile/android/app/build/ From 8a226432a272a09492daefcaa460894b3a2a4681 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 17:03:40 +0800 Subject: [PATCH 53/55] feat: test ci --- .github/workflows/release-android.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-android.yml b/.github/workflows/release-android.yml index ce03ac225df..fd06149c76c 100644 --- a/.github/workflows/release-android.yml +++ b/.github/workflows/release-android.yml @@ -114,7 +114,14 @@ jobs: ./apps/web-embed/web-build if-no-files-found: error - - name: Download WebEmbed Artifacts + - name: Upload build Artifacts + uses: actions/upload-artifact@v3 + with: + name: build + path: ./apps/mobile/android/app/build/ + if-no-files-found: error + + - name: Download build Artifacts uses: actions/download-artifact@v3 with: name: upload-web-embed-artifacts From 44c8da1c2d3d16e80b0297bd19594dcf727af760 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 17:12:06 +0800 Subject: [PATCH 54/55] feat: test ci --- .github/workflows/release-android.yml | 4 ++-- .github/workflows/release-web.yml | 30 +++++++++++---------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/.github/workflows/release-android.yml b/.github/workflows/release-android.yml index fd06149c76c..743f8205dfb 100644 --- a/.github/workflows/release-android.yml +++ b/.github/workflows/release-android.yml @@ -118,11 +118,11 @@ jobs: uses: actions/upload-artifact@v3 with: name: build - path: ./apps/mobile/android/app/build/ + path: ./apps/mobile/android/app/build if-no-files-found: error - name: Download build Artifacts uses: actions/download-artifact@v3 with: name: upload-web-embed-artifacts - path: ./apps/mobile/android/app/build/ + path: ./apps/mobile/android/app/build diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index c8d3afacf48..abaf98ab940 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -1,12 +1,6 @@ name: release-web on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi workflow_run: workflows: - daily-build @@ -102,15 +96,15 @@ jobs: cname: ${{ env.TEST_ENDPOINT }} force_orphan: true - - name: 'Notify to Slack' - if: ${{ github.event.workflow_run }} - uses: onekeyhq/actions/slack-notify-webhook@main - with: - web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - artifact-type: Web - artifact-name: OneKey-Web - artifact-bundle-id: 'so.onekey.wallet.web' - artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - artifact-version-code: '${{ env.BUILD_NUMBER }}' - artifact-download-url: '${{ env.ARTIFACTS_URL }}' + # - name: 'Notify to Slack' + # if: ${{ github.event.workflow_run }} + # uses: onekeyhq/actions/slack-notify-webhook@main + # with: + # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + # artifact-type: Web + # artifact-name: OneKey-Web + # artifact-bundle-id: 'so.onekey.wallet.web' + # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + # artifact-version-code: '${{ env.BUILD_NUMBER }}' + # artifact-download-url: '${{ env.ARTIFACTS_URL }}' From ee34eb63e8e4edb20258cab6d58900cdbb2ef301 Mon Sep 17 00:00:00 2001 From: limichange Date: Sun, 26 Jan 2025 17:36:25 +0800 Subject: [PATCH 55/55] reset --- .github/workflows/release-android-debug.yml | 13 ------ .github/workflows/release-android.yml | 24 +++-------- .github/workflows/release-desktop-mas.yml | 24 +++++------ .github/workflows/release-desktop-winms.yml | 30 ++++++------- .github/workflows/release-ext.yml | 35 ++++++++-------- .github/workflows/release-ios-debug.yml | 6 --- .github/workflows/release-ios.yml | 6 --- .github/workflows/release-web.yml | 24 +++++------ apps/mobile/package.json | 1 + .../src/views/Prime/hooks/PrimeSignupTest.tsx | 42 +++++++++++++++++++ 10 files changed, 101 insertions(+), 104 deletions(-) create mode 100644 packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx diff --git a/.github/workflows/release-android-debug.yml b/.github/workflows/release-android-debug.yml index 7f7ded7e03f..65dca7aa3e9 100644 --- a/.github/workflows/release-android-debug.yml +++ b/.github/workflows/release-android-debug.yml @@ -1,12 +1,6 @@ name: release-android-debug on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi workflow_dispatch: inputs: is-split-bundle: @@ -123,10 +117,3 @@ jobs: large-packages: false docker-images: false swap-storage: false - - - name: Download App File - uses: actions/download-artifact@v3 - with: - name: release-App-debug - path: | - ./apps/mobile/android/app/build/outputs/apk/google/debug diff --git a/.github/workflows/release-android.yml b/.github/workflows/release-android.yml index 743f8205dfb..66d39f32209 100644 --- a/.github/workflows/release-android.yml +++ b/.github/workflows/release-android.yml @@ -1,12 +1,11 @@ name: release-android on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi + workflow_run: + workflows: + - daily-build + types: + - completed workflow_dispatch: inputs: is-split-bundle: @@ -113,16 +112,3 @@ jobs: path: | ./apps/web-embed/web-build if-no-files-found: error - - - name: Upload build Artifacts - uses: actions/upload-artifact@v3 - with: - name: build - path: ./apps/mobile/android/app/build - if-no-files-found: error - - - name: Download build Artifacts - uses: actions/download-artifact@v3 - with: - name: upload-web-embed-artifacts - path: ./apps/mobile/android/app/build diff --git a/.github/workflows/release-desktop-mas.yml b/.github/workflows/release-desktop-mas.yml index a86cb524164..76bc4bd2b88 100644 --- a/.github/workflows/release-desktop-mas.yml +++ b/.github/workflows/release-desktop-mas.yml @@ -157,15 +157,15 @@ jobs: run: | xcrun altool --upload-app --f ./apps/desktop/build-electron/mas-universal/*.pkg -t macOS -u $APPLEID -p $APPLEIDPASS --show-progress - # - name: 'Notify to Slack' - # if: ${{ github.event.workflow_run }} - # uses: onekeyhq/actions/slack-notify-webhook@main - # with: - # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - # artifact-type: Desktop - # artifact-name: OneKey-Desktop-MAS - # artifact-bundle-id: 'so.onekey.wallet' - # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - # artifact-version-code: '${{ env.BUILD_NUMBER }}' - # artifact-download-url: '${{ env.ARTIFACTS_URL }}' + - name: 'Notify to Slack' + if: ${{ github.event.workflow_run }} + uses: onekeyhq/actions/slack-notify-webhook@main + with: + web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + artifact-type: Desktop + artifact-name: OneKey-Desktop-MAS + artifact-bundle-id: 'so.onekey.wallet' + artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + artifact-version-code: '${{ env.BUILD_NUMBER }}' + artifact-download-url: '${{ env.ARTIFACTS_URL }}' diff --git a/.github/workflows/release-desktop-winms.yml b/.github/workflows/release-desktop-winms.yml index bae176a2d3e..cf07767386a 100644 --- a/.github/workflows/release-desktop-winms.yml +++ b/.github/workflows/release-desktop-winms.yml @@ -1,12 +1,6 @@ name: release-desktop-winms on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi workflow_run: workflows: - daily-build @@ -128,15 +122,15 @@ jobs: !./apps/desktop/build-electron/linux-unpacked !./apps/desktop/build-electron/builder-debug.yml - # - name: 'Notify to Slack' - # if: ${{ github.event.workflow_run }} - # uses: onekeyhq/actions/slack-notify-webhook@main - # with: - # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - # artifact-type: Desktop - # artifact-name: OneKey-Desktop-Win-Store - # artifact-bundle-id: 'so.onekey.wallet.desktop' - # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - # artifact-version-code: '${{ env.BUILD_NUMBER }}' - # artifact-download-url: '${{ env.ARTIFACTS_URL }}' + - name: 'Notify to Slack' + if: ${{ github.event.workflow_run }} + uses: onekeyhq/actions/slack-notify-webhook@main + with: + web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + artifact-type: Desktop + artifact-name: OneKey-Desktop-Win-Store + artifact-bundle-id: 'so.onekey.wallet.desktop' + artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + artifact-version-code: '${{ env.BUILD_NUMBER }}' + artifact-download-url: '${{ env.ARTIFACTS_URL }}' diff --git a/.github/workflows/release-ext.yml b/.github/workflows/release-ext.yml index 61095d3d3e7..5bbf78302dc 100644 --- a/.github/workflows/release-ext.yml +++ b/.github/workflows/release-ext.yml @@ -1,12 +1,11 @@ name: release-ext on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi + workflow_run: + workflows: + - daily-build + types: + - completed workflow_dispatch: jobs: @@ -90,15 +89,15 @@ jobs: path: | ./apps/ext/build/_dist/*.zip - # - name: 'Notify to Slack' - # if: ${{ github.event.workflow_run }} - # uses: onekeyhq/actions/slack-notify-webhook@main - # with: - # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - # artifact-type: Extension - # artifact-name: OneKey-Extension-RN - # artifact-bundle-id: 'so.onekey.wallet.extension' - # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - # artifact-version-code: '${{ env.BUILD_NUMBER }}' - # artifact-download-url: '${{ env.ARTIFACTS_URL }}' + - name: 'Notify to Slack' + if: ${{ github.event.workflow_run }} + uses: onekeyhq/actions/slack-notify-webhook@main + with: + web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + artifact-type: Extension + artifact-name: OneKey-Extension-RN + artifact-bundle-id: 'so.onekey.wallet.extension' + artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + artifact-version-code: '${{ env.BUILD_NUMBER }}' + artifact-download-url: '${{ env.ARTIFACTS_URL }}' diff --git a/.github/workflows/release-ios-debug.yml b/.github/workflows/release-ios-debug.yml index d49ec8a5878..b43f0f24e17 100644 --- a/.github/workflows/release-ios-debug.yml +++ b/.github/workflows/release-ios-debug.yml @@ -98,9 +98,3 @@ jobs: path: | ./apps/mobile/ios/outputs/Build/Products/Debug-iphonesimulator/OneKeyWallet-Debug.zip if-no-files-found: error - - - name: Download App File - uses: actions/download-artifact@v3 - with: - name: release-App-debug - path: ./apps/mobile/ios/outputs/Build/Products/Debug-iphonesimulator/OneKeyWallet-Debug.zip diff --git a/.github/workflows/release-ios.yml b/.github/workflows/release-ios.yml index 6c280598351..5db0160164c 100644 --- a/.github/workflows/release-ios.yml +++ b/.github/workflows/release-ios.yml @@ -1,12 +1,6 @@ name: release-ios on: - pull_request: - branches: - - feat/prime-login0-limi - push: - branches: - - feat/prime-login0-limi workflow_run: workflows: - daily-build diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index abaf98ab940..71f3e4de255 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -96,15 +96,15 @@ jobs: cname: ${{ env.TEST_ENDPOINT }} force_orphan: true - # - name: 'Notify to Slack' - # if: ${{ github.event.workflow_run }} - # uses: onekeyhq/actions/slack-notify-webhook@main - # with: - # web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} - # secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} - # artifact-type: Web - # artifact-name: OneKey-Web - # artifact-bundle-id: 'so.onekey.wallet.web' - # artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' - # artifact-version-code: '${{ env.BUILD_NUMBER }}' - # artifact-download-url: '${{ env.ARTIFACTS_URL }}' + - name: 'Notify to Slack' + if: ${{ github.event.workflow_run }} + uses: onekeyhq/actions/slack-notify-webhook@main + with: + web-hook-url: ${{ secrets.SLACK_NOTIFICATION_WEBHOOK }} + secret-key: ${{ secrets.ACTION_SIGN_SECERT_KEY }} + artifact-type: Web + artifact-name: OneKey-Web + artifact-bundle-id: 'so.onekey.wallet.web' + artifact-version-name: '${{ steps.dotenv.outputs.version }}@${{ env.BUILD_NUMBER }}' + artifact-version-code: '${{ env.BUILD_NUMBER }}' + artifact-download-url: '${{ env.ARTIFACTS_URL }}' diff --git a/apps/mobile/package.json b/apps/mobile/package.json index d42a8681ef8..11ea0f823a9 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -8,6 +8,7 @@ "android:device": "SENTRY_DISABLE_AUTO_UPLOAD=true ANDROID_CHANNEL=direct expo run:android --variant=ProdDebug --device", "android:huawei": "SENTRY_DISABLE_AUTO_UPLOAD=true ANDROID_CHANNEL=huawei expo run:android --variant=ProdDebug", "android:google": "SENTRY_DISABLE_AUTO_UPLOAD=true ANDROID_CHANNEL=google expo run:android --variant=GoogleDebug", + "android:build": "cd android && ./gradlew assembleDebug", "ios": "SENTRY_DISABLE_AUTO_UPLOAD=true expo run:ios", "ios:device": "SENTRY_DISABLE_AUTO_UPLOAD=true expo run:ios --device", "ios:pod-install": "cd ios && pod install && cd ..", diff --git a/packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx b/packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx new file mode 100644 index 00000000000..5864b722a76 --- /dev/null +++ b/packages/kit/src/views/Prime/hooks/PrimeSignupTest.tsx @@ -0,0 +1,42 @@ +import { useState } from 'react'; + +import { useLoginWithEmail } from '@privy-io/expo'; + +import { Button, Input, OTPInput, Toast, YStack } from '@onekeyhq/components'; + +export function PrimeSignupTest() { + const [email, setEmail] = useState('limichange@hotmail.com'); + const { sendCode, loginWithCode, state } = useLoginWithEmail({ + onSendCodeSuccess() { + Toast.message({ + title: 'onSendCodeSuccess', + }); + }, + onLoginSuccess(user, isNewUser) { + Toast.success({ + title: 'onLoginSuccess', + message: `user${JSON.stringify(user, null, 2)}`, + }); + }, + onError(error) { + console.log('error', error); + // show a toast, update form errors, etc... + }, + }); + const [codeEmail, setCodeEmail] = useState(''); + return ( + + + + + + + ); +}