Updated on 2026-08-14
This commit is contained in:
commit
666fbdea89
30 changed files with 257 additions and 193 deletions
|
|
@ -20,5 +20,16 @@ data class QuotesResponse(
|
|||
val priceChange1w: BigDecimal?,
|
||||
@Json(name = "priceChange30d")
|
||||
val priceChange30d: BigDecimal?,
|
||||
)
|
||||
) {
|
||||
|
||||
companion object {
|
||||
|
||||
val EMPTY = Quote(
|
||||
price = null,
|
||||
priceChange24h = null,
|
||||
priceChange1w = null,
|
||||
priceChange30d = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1025,9 +1025,7 @@
|
|||
<string name="send_recent_transactions">Jüngste</string>
|
||||
<string name="send_recipient">Empfänger</string>
|
||||
<string name="send_recipient_address_error">Keine gültige Adresse</string>
|
||||
<string name="send_recipient_address_footer">Stelle sicher, dass sich die empfangende Wallet-Adresse im ** %s -Netzwerk** befindet, um den Verlust Deiner Token zu vermeiden.</string>
|
||||
<string name="send_recipient_address_footer_highlighted_part">senden an %s</string>
|
||||
<string name="send_recipient_address_footer_v2">Stelle sicher, dass Du %s Netzwerkadresse hast, da Fehler zu verlorenen Übertragungen führen können</string>
|
||||
<string name="send_recipient_address_footer">Stelle sicher, dass sich die empfangende Wallet-Adresse im **%s -Netzwerk** befindet, um den Verlust Deiner Token zu vermeiden.</string>
|
||||
<string name="send_recipient_label">Senden an</string>
|
||||
<string name="send_recipient_memo_footer">Ein Memo/Destination Tag ist eine eindeutige ID zur Unterscheidung von Transaktionen, die an denselben Empfänger im selben Netzwerk gesendet werden. Vorsicht! Das Weglassen eines Vermerks kann dazu führen, dass Gelder für immer verloren sind!</string>
|
||||
<string name="send_recipient_memo_footer_v2">Memo / Destination Tag ist ein Code, der Transaktionen an einen gemeinsamen Empfänger im Kryptonetzwerk voneinander trennt.</string>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
<string name="action_buttons_swap_no_available_pair_notification_title">No hay par disponible</string>
|
||||
<string name="action_buttons_swap_no_tokens_added_alert_message">Para utilizar la función de intercambio, su billetera debe contener al menos 2 tokens</string>
|
||||
<string name="action_buttons_swap_no_tokens_added_alert_title">Añada tokens</string>
|
||||
<string name="action_buttons_swap_not_enough_tokens_alert_message">Sólo tienes 1 token añadido a tu portafolio. Para utilizar la función de intercambio, necesita añadir al menos 2 tokens</string>
|
||||
<string name="action_buttons_swap_not_enough_tokens_alert_message">Solo tiene 1 token añadido a su portafolio. Para utilizar la función de intercambio, necesita añadir al menos 2 tokens</string>
|
||||
<string name="action_buttons_swap_not_enough_tokens_alert_title">Añada tokens</string>
|
||||
<string name="action_buttons_you_want_to_receive">Seleccione el token que desea recibir</string>
|
||||
<string name="action_buttons_you_want_to_swap">Seleccione el token que desea intercambiar</string>
|
||||
|
|
@ -34,7 +34,7 @@
|
|||
<string name="alert_failed_to_send_transaction_message">Razón: %s</string>
|
||||
<string name="alert_failed_to_send_transaction_title">No se puede completar una transacción</string>
|
||||
<string name="alert_manage_tokens_unsupported_blockchain_by_card_message">El seleccionado no admite la red %1$s</string>
|
||||
<string name="alert_manage_tokens_unsupported_curve_message">Para activar el %1$s cifrado criptográfico de la blockchain, necesitarás reiniciar la billetera a los ajustes de fábrica. Por favor, retire sus fondos antes de hacerlo para asegurarse no perderlos, y luego complete el proceso de reinicio. El acceso a la billetera actual no será posible después del reinicio.</string>
|
||||
<string name="alert_manage_tokens_unsupported_curve_message">Para activar el cifrado criptográfico de la blockchain %1$s, tendrá que restablecer la configuración de fábrica de la billetera. Por favor, retire tus fondos antes de hacerlo para asegurarse de que no los pierda, y luego complete el proceso de restablecimiento. El acceso a la billetera actual no será posible tras el restablecimiento.</string>
|
||||
<string name="alert_manage_tokens_unsupported_message">Esta tarjeta no admite tokens en la red %1$s debido a una limitación del firmware.</string>
|
||||
<string name="alert_troubleshooting_scan_card_title">¿Tiene dificultades para escanear su tarjeta/anillo?</string>
|
||||
<string name="alert_unsupported_card">Esta tarjeta no está diseñada para funcionar con Tangem</string>
|
||||
|
|
@ -114,7 +114,7 @@
|
|||
<string name="card_settings_reset_card_to_factory">Resetear a configuración de fábrica</string>
|
||||
<string name="card_settings_security_mode">Modo de seguridad</string>
|
||||
<string name="card_settings_title">Ajustes del dispositivo</string>
|
||||
<string name="cardano_coin_will_be_send_with_token_description">Además de la tarifa de red, la red Cardano cobra %1$s ADA al realizar transacciones con el %2$s token</string>
|
||||
<string name="cardano_coin_will_be_send_with_token_description">Además de la tarifa de red, la red Cardano cobra %1$s ADA al realizar transacciones con el token %2$s</string>
|
||||
<string name="cardano_coin_will_be_send_with_token_title">Requisitos de transacción de Cardano</string>
|
||||
<string name="cardano_insufficient_balance_to_send_token_description">Para realizar una %1$s transacción, deba depositar algo de ADA para cubrir la tarifa de red y el valor mínimo de ADA (se recomiendan 5 ADA)</string>
|
||||
<string name="cardano_insufficient_balance_to_send_token_title">ADA insuficiente para la transferencia de tokens</string>
|
||||
|
|
@ -185,7 +185,7 @@
|
|||
<string name="common_exchange">Intercambiar</string>
|
||||
<string name="common_explore">Explore</string>
|
||||
<string name="common_explore_transaction_history">Explore historial de transacciones</string>
|
||||
<string name="common_explorer">Explorador(a)</string>
|
||||
<string name="common_explorer">Explorador</string>
|
||||
<string name="common_fee_error">No se pudo obtener la tarifa</string>
|
||||
<string name="common_fee_selector_footer">Las tarifas de red son cargos que los usuarios pagan para procesar y confirmar transacciones. El importe de la tarifa puede verse afectado por la congestión de la red, el tamaño de la transacción y la prioridad de ejecución. %s</string>
|
||||
<string name="common_fee_selector_option_fast">Rápido</string>
|
||||
|
|
@ -234,7 +234,7 @@
|
|||
<string name="common_save_changes">Guardar cambios</string>
|
||||
<string name="common_search">Buscar</string>
|
||||
<string name="common_search_tokens">Buscar tokens</string>
|
||||
<string name="common_second_no_param">sec</string>
|
||||
<string name="common_second_no_param">seg</string>
|
||||
<string name="common_see_all">Ver todo</string>
|
||||
<string name="common_seed_phrase">Seed phrase</string>
|
||||
<string name="common_select_action">Seleccione una acción</string>
|
||||
|
|
@ -255,7 +255,7 @@
|
|||
<string name="common_success">Con éxito</string>
|
||||
<string name="common_support">Soporte</string>
|
||||
<string name="common_supported_networks">Redes soportadas</string>
|
||||
<string name="common_swap">Swap</string>
|
||||
<string name="common_swap">Intercambiar</string>
|
||||
<string name="common_terms_and_conditions">términos y condiciones</string>
|
||||
<string name="common_terms_of_use">Condiciones de uso</string>
|
||||
<string name="common_today">Hoy</string>
|
||||
|
|
@ -276,23 +276,23 @@
|
|||
<string name="common_week">semana</string>
|
||||
<string name="common_with">con</string>
|
||||
<string name="common_yes">Sí</string>
|
||||
<string name="contract_address_copied_message">Dirección del contract copiada</string>
|
||||
<string name="contract_address_copied_message">Dirección de contrato copiada</string>
|
||||
<string name="currency_subtitle_expanded">Redes disponibles</string>
|
||||
<string name="custom_token_contract_address_input_title">Dirección del contract</string>
|
||||
<string name="custom_token_creation_error_invalid_contract_address">La dirección del contract no es válida</string>
|
||||
<string name="custom_token_contract_address_input_title">Dirección de contrato</string>
|
||||
<string name="custom_token_creation_error_invalid_contract_address">La dirección de contrato es incorrecta</string>
|
||||
<string name="custom_token_creation_error_network_not_selected">Por favor, seleccione la red</string>
|
||||
<string name="custom_token_creation_error_token_already_exist_message">Este token ya ha sido agregado a la lista</string>
|
||||
<string name="custom_token_creation_error_token_already_exist_title">Este token ya existe</string>
|
||||
<string name="custom_token_creation_error_wrong_decimals">Los decimales deben ser un número entero válido, hasta %d</string>
|
||||
<string name="custom_token_custom_derivation">Derivación personalizada</string>
|
||||
<string name="custom_token_custom_derivation_placeholder">Por ejemplo m/00\'/0000\'/0\'/0/0</string>
|
||||
<string name="custom_token_custom_derivation_title">Introduzque una derivación personalizada</string>
|
||||
<string name="custom_token_custom_derivation_title">Introduzca una derivación personalizada</string>
|
||||
<string name="custom_token_decimals_input_title">Decimales</string>
|
||||
<string name="custom_token_derivation_path">Ruta de derivación</string>
|
||||
<string name="custom_token_derivation_path_default">Por defecto</string>
|
||||
<string name="custom_token_derivation_path_input_title">Coin de tipo BIP44</string>
|
||||
<string name="custom_token_derivation_path_input_title">Tipo de moneda BIP44</string>
|
||||
<string name="custom_token_invalid_derivation_path">La ruta de derivación que ha ingresado no es válida</string>
|
||||
<string name="custom_token_name_input_placeholder">Por ejemplo USD coin</string>
|
||||
<string name="custom_token_name_input_placeholder">Por ejemplo moneda USD</string>
|
||||
<string name="custom_token_name_input_title">Nombre</string>
|
||||
<string name="custom_token_network_input_not_selected">No elegida</string>
|
||||
<string name="custom_token_network_input_title">Red</string>
|
||||
|
|
@ -335,18 +335,18 @@
|
|||
<string name="domain_receive_assets_network_name_address">%s dirección</string>
|
||||
<string name="domain_receive_assets_onboarding_description">Enviar activos a otras redes resultará en una pérdida permanente.</string>
|
||||
<string name="domain_receive_assets_onboarding_network_name">Red de %s</string>
|
||||
<string name="domain_receive_assets_onboarding_title">Envíe fondos utilizando solo la</string>
|
||||
<string name="domain_receive_assets_onboarding_title">Envíe fondos utilizando solo</string>
|
||||
<string name="email_preface_wc_error">Hola equipo de soporte, he encontrado un error con el código: %s</string>
|
||||
<string name="email_subject_wc_error">Error de WalletConnect</string>
|
||||
<string name="error_wrong_wallet_tapped">Ha usado una tarjeta de otra billetera. Toque la tarjeta asociada con esta billetera</string>
|
||||
<string name="eth_gas_required_exceeds_allowance">No hay fondos suficientes para la transacción. Por favor, recargue su cuenta.</string>
|
||||
<string name="exchange_tokens_available_tokens_header">Mis tokens</string>
|
||||
<string name="exchange_tokens_empty_tokens">Aún no ha añadido ningún token. Agregue tokens a través de Market para hacer swap</string>
|
||||
<string name="exchange_tokens_empty_tokens">Aún no ha añadido ningún token. Agregue tokens a través de Mercados para hacer intercambios</string>
|
||||
<string name="exchange_tokens_unavailable_tokens_header">No se puede intercambiar por %s</string>
|
||||
<string name="express_by_provider">Proporcionado por</string>
|
||||
<string name="express_cex_status_button_title">Estado</string>
|
||||
<string name="express_choose_provider">Elegir proveedor</string>
|
||||
<string name="express_choose_providers_subtitle">Tangem ofrece swaps de tokens a través de proveedores externos</string>
|
||||
<string name="express_choose_providers_subtitle">Tangem ofrece intercambios de tokens a través de proveedores externos</string>
|
||||
<string name="express_choose_providers_title">Elija proveedor</string>
|
||||
<string name="express_error_code">Ha ocurrido un error. Código: %s</string>
|
||||
<string name="express_error_provider_amount_roundup">Error %1$s. El proveedor seleccionado no puede procesar la transacción especificada. Por favor, redondee el valor a %2$s o cámbielo</string>
|
||||
|
|
@ -358,7 +358,7 @@
|
|||
<string name="express_exchange_notification_failed_title">Operación fallida por el proveedor</string>
|
||||
<string name="express_exchange_notification_long_transaction_time_text">Su intercambio está tardando más de lo esperado. Por favor, consulte al soporte del proveedor para obtener ayuda.</string>
|
||||
<string name="express_exchange_notification_long_transaction_time_title">Tiempo de transacción prolongado</string>
|
||||
<string name="express_exchange_notification_refund_text">El monto de la transacción fue reembolsado en %1$s a su billetera debido a OKX o reglas puente. %2$s</string>
|
||||
<string name="express_exchange_notification_refund_text">La cantidad de la transacción fue reembolsada en %1$s a su billetera debido a OKX o reglas puente. %2$s</string>
|
||||
<string name="express_exchange_notification_refund_title">El monto fue reembolsado en %1$s (red %2$s)</string>
|
||||
<string name="express_exchange_notification_verification_text">Visite el sitio web del proveedor para la verificación</string>
|
||||
<string name="express_exchange_notification_verification_title">Verificación KYC requerida por el proveedor</string>
|
||||
|
|
@ -389,7 +389,7 @@
|
|||
<string name="express_exchange_token_list_subtitle">Lista de todos los tokens agregados a su billetera</string>
|
||||
<string name="express_fetch_best_rates">Buscar tarifas actuales...</string>
|
||||
<string name="express_floating_rate">Tasa flotante</string>
|
||||
<string name="express_legal_one_placeholder">Al utilizar la función de intercambio, acepta el %s</string>
|
||||
<string name="express_legal_one_placeholder">Al utilizar la función de intercambio, acepta los %s</string>
|
||||
<string name="express_legal_two_placeholders">Al utilizar la función de intercambio, aceptas las condiciones de %1$s y %2$s del proveedor.</string>
|
||||
<string name="express_more_providers_soon">Pronto habrá más proveedores disponibles</string>
|
||||
<string name="express_provider">Proveedor</string>
|
||||
|
|
@ -434,7 +434,7 @@
|
|||
<string name="give_permission_rows_amount">Montante %s</string>
|
||||
<string name="give_permission_staking_footer">La función Aprobar es necesaria para otorgar permiso a otra dirección para usar una cantidad específica de sus tokens. Por diseño, los contratos inteligentes no pueden acceder a sus tokens sin su aprobación. Al \"desbloquear\" sus tokens, autoriza al contrato inteligente de StakeKit a usarlos. Los mineros de la red reciben una tarifa de gas (pagada por usted) por registrar esta acción en la cadena de bloques. Puede apostar su token después de dar su aprobación.</string>
|
||||
<string name="give_permission_staking_subtitle">Para continuar, debe autorizar el contrato inteligente de Polygon para utilizar su %s</string>
|
||||
<string name="give_permission_swap_subtitle" formatted="false">Para continuar, de autorización a los smart contracts de %1s para usar su %2s</string>
|
||||
<string name="give_permission_swap_subtitle" formatted="false">Para continuar, conceda a los contratos inteligentes de %1s permiso para utilizar su %2s</string>
|
||||
<string name="give_permission_title">Dar autorización</string>
|
||||
<string name="give_permission_unlimited">Ilimitado</string>
|
||||
<string name="home_button_add_existing_wallet">Agregar Billetera Existente</string>
|
||||
|
|
@ -464,19 +464,19 @@
|
|||
<string name="koinos_mana_exceeds_koin_balance_title">Límite de Mana</string>
|
||||
<string name="koinos_mana_level_description">La red Koinos requiere Mana para las tarifas de red. Tienes %1$s/%2$s Mana</string>
|
||||
<string name="koinos_mana_level_title">Nivel de Mana</string>
|
||||
<string name="main_empty_tokens_list_message">Para comenzar a seguir tus activos crypto y transacciones, agregue tokens</string>
|
||||
<string name="main_empty_tokens_list_message">Para hacer un seguimiento de sus criptomonedas y transacciones, agregue tokens</string>
|
||||
<string name="main_manage_tokens">Gestionar tokens</string>
|
||||
<string name="main_scan_card_warning_view_subtitle">Para acceder a todas las redes necesita escanear la tarjeta</string>
|
||||
<string name="main_scan_card_warning_view_title">Escanee su tarjeta o anillo</string>
|
||||
<string name="main_swap_changelly_promotion_message">Benefíciese de %1$s tarifa de servicio en intercambios a través de Changelly del %2$s al %3$s de febrero</string>
|
||||
<string name="main_swap_changelly_promotion_title">Intercambio con Changelly, %s tarifa</string>
|
||||
<string name="main_swap_changelly_promotion_message">Disfrute de %1$s comisiones de servicio en los swaps a través de Changelly a partir de febrero %2$s-%3$s</string>
|
||||
<string name="main_swap_changelly_promotion_title">Intercambie con Changelly, %s comisiones</string>
|
||||
<string name="main_tokens">Tokens</string>
|
||||
<string name="manage_tokens_add">Agregar</string>
|
||||
<string name="manage_tokens_edit">Editar</string>
|
||||
<string name="manage_tokens_list_header_title">Capitalización de mercado de la moneda</string>
|
||||
<string name="manage_tokens_network_selector_native_subtitle">Blockchain en la que se creó inicialmente la criptomoneda</string>
|
||||
<string name="manage_tokens_network_selector_native_title">Red nativa</string>
|
||||
<string name="manage_tokens_network_selector_non_native_info">El uso de redes no nativas para tokens permite la interoperabilidad entre blockchains, permitiendo que los activos se utilicen en diversas aplicaciones descentralizadas y smart contracts en diferentes plataformas. Sin embargo, esto a menudo implica un custodio o smart contract para mantener el activo original de forma segura, introduciendo centralización y riesgo de contraparte.</string>
|
||||
<string name="manage_tokens_network_selector_non_native_info">El uso de redes no nativas para tokens permite la interoperabilidad entre cadenas de bloques, lo que permite el uso de activos en diversas aplicaciones descentralizadas y contratos inteligentes en distintas plataformas. Sin embargo, esto suele implicar un custodio o un contrato inteligente que mantenga el activo original de forma segura, lo que introduce centralización y riesgo de contraparte.</string>
|
||||
<string name="manage_tokens_network_selector_non_native_subtitle">No es la blockchain original o primaria donde se aloja el token</string>
|
||||
<string name="manage_tokens_network_selector_non_native_title">Redes no nativas</string>
|
||||
<string name="manage_tokens_network_selector_title">Elegir redes</string>
|
||||
|
|
@ -507,7 +507,7 @@
|
|||
<string name="markets_quick_actions">Acciones rápidas</string>
|
||||
<string name="markets_search_header_title">Busque en el mercado</string>
|
||||
<string name="markets_search_result_title">Resultado</string>
|
||||
<string name="markets_search_see_tokens_under_100k">Ver tokens con una capitalización de mercado inferior a 100,000$</string>
|
||||
<string name="markets_search_see_tokens_under_100k">Ver tokens con marketcap inferior a 100.000$</string>
|
||||
<string name="markets_search_show_tokens">Mostrar tokens</string>
|
||||
<string name="markets_search_token_no_result_title">Sin resultado</string>
|
||||
<string name="markets_select_network">Seleccione una red</string>
|
||||
|
|
@ -555,7 +555,7 @@
|
|||
<string name="markets_token_details_fully_diluted_valuation">Valoración totalmente diluida</string>
|
||||
<string name="markets_token_details_fully_diluted_valuation_description">El valor teórico total de una criptomoneda si todas las monedas que podrían existir estuvieran en circulación, incluidas las que actualmente no circulan.</string>
|
||||
<string name="markets_token_details_fully_diluted_valuation_full">Valoración totalmente diluida</string>
|
||||
<string name="markets_token_details_genesis_date">Dato de Genesis</string>
|
||||
<string name="markets_token_details_genesis_date">Fecha de génesis</string>
|
||||
<string name="markets_token_details_high">Alto</string>
|
||||
<string name="markets_token_details_holders">Titulares</string>
|
||||
<string name="markets_token_details_holders_description">El cambio en el número de poseedores de tokens dentro de un período de tiempo específico</string>
|
||||
|
|
@ -650,11 +650,11 @@
|
|||
<string name="notification_referral_promo_button">Únase ahora</string>
|
||||
<string name="notification_referral_promo_text">Comparta su código y gane 5 USDT por venta. Su amigo obtiene un 10% de descuento.</string>
|
||||
<string name="notification_referral_promo_title">¡Obtenga RECOMPENSAS por cada amigo!</string>
|
||||
<string name="onboarding_access_code_feature_1_description">Deba configurar un único código de acceso para proteger todss sus dispositivos.</string>
|
||||
<string name="onboarding_access_code_feature_1_description">Configure un código de acceso único para proteger todos sus dispositivos.</string>
|
||||
<string name="onboarding_access_code_feature_1_title">Proteger</string>
|
||||
<string name="onboarding_access_code_feature_2_description">Puede configurar un código de acceso individual en cada tarjeta más adelante</string>
|
||||
<string name="onboarding_access_code_feature_2_title">Personalizar</string>
|
||||
<string name="onboarding_access_code_feature_3_description">El código de acceso se puede recuperar con una tarjeta o un anillo vinculada(o). No guarde todos los dispositivos en el mismo lugar.</string>
|
||||
<string name="onboarding_access_code_feature_3_description">El código de acceso puede restaurarse con una tarjeta o un anillo vinculados. No guarde todos sus dispositivos en el mismo lugar.</string>
|
||||
<string name="onboarding_access_code_feature_3_title">Restaurar</string>
|
||||
<string name="onboarding_access_code_hint">Elige cualquier palabra, frase o número que quieras como su código de acceso</string>
|
||||
<string name="onboarding_access_code_intro_title">Crear un código de acceso</string>
|
||||
|
|
@ -704,19 +704,19 @@
|
|||
<item quantity="one"></item>
|
||||
<item quantity="other">%d palabras</item>
|
||||
</plurals>
|
||||
<string name="onboarding_seed_import_message">Para importar su billetera, ingrese su seed phrase en el campo de abajo</string>
|
||||
<string name="onboarding_seed_import_message">Para importar su billetera, introduzca su seed phrase en el campo a continuación</string>
|
||||
<string name="onboarding_seed_intro_button_generate">Generar seed phrase</string>
|
||||
<string name="onboarding_seed_intro_button_import">Importe una billetera</string>
|
||||
<string name="onboarding_seed_intro_message">Una seed phrase es una serie de palabras que se permite recuperar su billetera. A diferencia de las claves generadas por la tarjeta, las seed phrases no están protegidas y pueden ser copiadas y robadas. Use esta opción bajo su propia responsabilidad.</string>
|
||||
<string name="onboarding_seed_intro_message">Una seed phrase (o frase semilla) es una serie de palabras que permite recuperar su billetera. A diferencia de las claves generadas por la tarjeta, las seed phrases no están protegidas y pueden ser copiadas y robadas. Use esta opción bajo su propia responsabilidad.</string>
|
||||
<string name="onboarding_seed_intro_title">Usar seed phrase</string>
|
||||
<string name="onboarding_seed_mnemonic_invalid_checksum">Seed phrase no válida. Por favor, comprueba el orden de las palabras.</string>
|
||||
<string name="onboarding_seed_mnemonic_wrong_words">Seed phrase no válida. Por favor, comprueba tu ortografía.</string>
|
||||
<string name="onboarding_seed_mnemonic_invalid_checksum">Seed phrase incorrecta. Por favor, comprueba el orden de las palabras.</string>
|
||||
<string name="onboarding_seed_mnemonic_wrong_words">Seed phrase incorrecta. Por favor, compruebe la ortografía.</string>
|
||||
<string name="onboarding_seed_phrase_intro_legacy">Legado</string>
|
||||
<string name="onboarding_seed_user_validation_message">Para comprobar si has escrito correctamente su seed phrase, por favor introduce las palabras 2ª, 7ª y 11ª</string>
|
||||
<string name="onboarding_seed_user_validation_message">Para comprobar si ha escrito correctamente su seed phrase, por favor introduzca las palabras 2ª, 7ª y 11ª</string>
|
||||
<string name="onboarding_seed_user_validation_title">Bien, vamos a comprobar</string>
|
||||
<string name="onboarding_subtitle_no_backup_cards">Para iniciar el proceso de backup, agregue hasta dos tarjetas/anillos de backup.</string>
|
||||
<string name="onboarding_subtitle_one_backup_card">Puede agregar una tarjeta/anillo más o finalizar el proceso de backup</string>
|
||||
<string name="onboarding_subtitle_scan_backup_card_format">Prepare su tarjeta de backup con el no.%s</string>
|
||||
<string name="onboarding_subtitle_scan_backup_card_format">Prepare su tarjeta de backup con el número %s</string>
|
||||
<string name="onboarding_subtitle_scan_primary">Escanee la tarjeta principal o el anillo para iniciar el proceso de backup.</string>
|
||||
<string name="onboarding_subtitle_scan_primary_card_format">Prepare la tarjeta principal con el número %s</string>
|
||||
<string name="onboarding_subtitle_scan_ring">Prepare el anillo y presione el botón de escaneo a continuación</string>
|
||||
|
|
@ -752,7 +752,7 @@
|
|||
<string name="onramp_country_search">Buscar por país</string>
|
||||
<string name="onramp_country_unavailable">Indisponible</string>
|
||||
<string name="onramp_currency_other">Otras monedas</string>
|
||||
<string name="onramp_currency_popular">Monedas Fiats Populares</string>
|
||||
<string name="onramp_currency_popular">Monedas fiduciarias populares</string>
|
||||
<string name="onramp_currency_search">Buscar por moneda</string>
|
||||
<string name="onramp_legal">Al utilizar la funcionalidad onramp, acepta %1$s y %2$s del proveedor.</string>
|
||||
<string name="onramp_max_amount_restriction">El monto de la compra no debe ser mayor a %s</string>
|
||||
|
|
@ -805,7 +805,7 @@
|
|||
<item quantity="one">para %d billetera </item>
|
||||
<item quantity="other">para %d billeteras</item>
|
||||
</plurals>
|
||||
<string name="referral_point_currencies_description">Obtendrá ^^%1$s^^ por cada wallet comprada por su amigo en su dirección %3$s de la red %2$s ^^30 días después^^</string>
|
||||
<string name="referral_point_currencies_description">Obtendrá ^^%1$s^^ por cada wallet comprada por sus amigos en su dirección %3$s de la red %2$s ^^30 días después^^ de la compra</string>
|
||||
<string name="referral_point_currencies_title">Usted</string>
|
||||
<string name="referral_point_discount_description_prefix">Obtendrá un</string>
|
||||
<string name="referral_point_discount_description_suffix">al comprar una billetera en tangem.com</string>
|
||||
|
|
@ -816,7 +816,7 @@
|
|||
<string name="referral_share_link">¡Compra Tangem Wallet con descuento!\n%s</string>
|
||||
<string name="referral_title">Recomiende Tangem a sus amigos</string>
|
||||
<string name="referral_tos_enroled_prefix">Ha aceptado</string>
|
||||
<string name="referral_tos_not_enroled_prefix">Al tocar este botón, ud. acepta</string>
|
||||
<string name="referral_tos_not_enroled_prefix">Al pulsar este botón acepta</string>
|
||||
<string name="referral_tos_suffix">del programa de referidos</string>
|
||||
<plurals name="referral_wallets_purchased_count">
|
||||
<item quantity="one">%d billetera</item>
|
||||
|
|
@ -827,7 +827,7 @@
|
|||
<string name="reset_card_to_factory_condition_2">Entiendo que no puedo usar esta tarjeta para recuperar mi código de acceso en las otras tarjetas de la wallet actual</string>
|
||||
<string name="reset_card_with_backup_to_factory_message">El restablecimiento de fábrica eliminará completamente la billetera de la tarjeta seleccionada. No podrá restaurar la billetera actual ni usar la tarjeta para recuperar el código de acceso.</string>
|
||||
<string name="reset_card_without_backup_to_factory_message">El reseteo a valores de fábrica eliminará completamente la billetera de la tarjeta/anillo seleccionado y lo eliminará de la app. No podrá restaurar la billetera actual.</string>
|
||||
<string name="ring_promo_text">Si tienes un Anillo Tangem, ¡3 swaps sin comisión en Changelly hasta el 15/11!</string>
|
||||
<string name="ring_promo_text">Si tiene un Anillo Tangem, ¡3 swaps sin comisión en Changelly hasta el 15/11!</string>
|
||||
<string name="ring_promo_title">¡Intercambia con 0% de comisión!</string>
|
||||
<string name="save_user_wallet_agreement_access_description">Inicie sesión en la app y comprueba su saldo sin escanear la tarjeta o el anillo</string>
|
||||
<string name="save_user_wallet_agreement_access_title">Acceder a la app</string>
|
||||
|
|
@ -857,7 +857,7 @@
|
|||
<string name="send_amount_convert_to_another_token">Convertir a otro token</string>
|
||||
<string name="send_amount_label">Montante</string>
|
||||
<string name="send_amount_receive_token_subtitle">Se enviará al destinatario</string>
|
||||
<string name="send_bitcoin_custom_fee_footer">Puede establecer tu tarifa de transacción ajustando el valor en el campo\nSatoshi por vByte.</string>
|
||||
<string name="send_bitcoin_custom_fee_footer">Puede establecer su tarifa de transacción ajustando el valor en el campo Satoshi por vByte.</string>
|
||||
<string name="send_custom_amount_fee_footer">La tarifa que se cobrará por tu transacción. Puedes establecer tu propio valor.</string>
|
||||
<string name="send_custom_evm_max_fee">Tarifa máxima</string>
|
||||
<string name="send_custom_evm_max_fee_footer">Este es el coste que está dispuesto(a) a pagar por cada unidad de gas. Cuanto más alto sea el precio del gas, más rápido se procesará su transacción. (Tarifa prioritaria incluida)</string>
|
||||
|
|
@ -914,22 +914,20 @@
|
|||
<string name="send_notification_reduce_to">Reducir a %s</string>
|
||||
<string name="send_notification_transaction_delay_text">Tenga en cuenta que su transacción puede experimentar retrasos bajo configuraciones específicas de tarifas</string>
|
||||
<string name="send_notification_transaction_delay_title">Es posible que haya retrasos en las transacciones</string>
|
||||
<string name="send_notification_transaction_limit_text">Debido a las limitaciones de %1$s, solo %2$s UTXO pueden caber en una sola transacción. Esto significa que solo puedes enviar %3$s o menos. Necesitas reducir la cantidad.</string>
|
||||
<string name="send_notification_transaction_limit_text">Debido a las limitaciones de %1$s solo %2$s UTXO pueden usarse en una sola transacción. Esto significa que solo puede enviar %3$s o menos. Debe reducir la cantidad.</string>
|
||||
<string name="send_notification_transaction_limit_title">Limitación de transacciones</string>
|
||||
<string name="send_optional_field">Opcional</string>
|
||||
<string name="send_qrcode_scan_info">Por favor, alinee su código QR con el cuadrado para escanearlo. Asegúrese de escanear la dirección de la red %s.</string>
|
||||
<string name="send_recent_transactions">Reciente</string>
|
||||
<string name="send_recipient">Destinatario</string>
|
||||
<string name="send_recipient_address_error">No es una dirección válida</string>
|
||||
<string name="send_recipient_address_footer">Asegúrese de que la dirección de la billetera receptora esté en la red %s para evitar perder sus tokens</string>
|
||||
<string name="send_recipient_address_footer_highlighted_part">enviar a %s</string>
|
||||
<string name="send_recipient_address_footer_v2">Asegúrese de que %s dirección de red, ya que los errores pueden resultar en transferencias perdidas</string>
|
||||
<string name="send_recipient_address_footer">Asegúrese de que la dirección de la billetera receptora esté en **la red %s** para evitar perder sus tokens</string>
|
||||
<string name="send_recipient_label">Destinatario</string>
|
||||
<string name="send_recipient_memo_footer">Un Memo/ID de destino es un ID único para diferenciar transacciones enviadas al mismo destinatario en la misma red. Precaución: Omitir un memo puede llevar a la pérdida de fondos</string>
|
||||
<string name="send_recipient_memo_footer_v2">Memo / Destination Tag es un código que separa las transacciones dirigidas a un destinatario compartido en una red de criptomonedas.</string>
|
||||
<string name="send_recipient_memo_footer_v2_highlighted">Atención: La omisión del campo Memo puede provocar la pérdida de fondos.</string>
|
||||
<string name="send_recipient_wallets_title">Mis billeteras</string>
|
||||
<string name="send_satoshi_per_byte_text">Una forma de medir las tarifas de transacción de Bitcoin. Indique el número de la unidad más pequeña de Bitcoin (Satoshi) por cada byte virtual en una transacción. Cuanto más alto sea el número, más rápido procesarán los mineros la transacción.</string>
|
||||
<string name="send_satoshi_per_byte_text">Una forma de medir las comisiones por transacción de Bitcoin. Indica la cantidad de la unidad de Bitcoin más pequeña (Satoshi) por cada byte virtual en una transacción. Cuanto mayor sea la cantidad, más rápido procesarán la transacción los mineros.</string>
|
||||
<string name="send_satoshi_per_byte_title">Satoshi / vByte</string>
|
||||
<string name="send_sending">Enviando...</string>
|
||||
<string name="send_summary_tap_hint">Toque cualquier campo para editarlo</string>
|
||||
|
|
@ -952,7 +950,7 @@
|
|||
<string name="send_with_swap_change_token_alert_message">¿Está seguro que desea cambiar el token a recibir? Esto restablecerá los datos introducidos previamente.</string>
|
||||
<string name="send_with_swap_change_token_alert_title">Cambio de token</string>
|
||||
<string name="send_with_swap_confirm_title">Intercambiar y enviar</string>
|
||||
<string name="send_with_swap_convert_token_alert_message">¿Continuar con la conversión? Esto borrará sus datos anteriores.</string>
|
||||
<string name="send_with_swap_convert_token_alert_message">¿Continuar con la conversión? Sus datos anteriores se borrarán.</string>
|
||||
<string name="send_with_swap_convert_token_alert_title">Confirmar Conversión</string>
|
||||
<string name="send_with_swap_correct_recipient_network_notification_message">El envío de cualquier otra moneda supondrá su pérdida irreversible.</string>
|
||||
<string name="send_with_swap_correct_recipient_network_notification_title">Seleccione la red de destino correcta</string>
|
||||
|
|
@ -972,14 +970,14 @@
|
|||
<string name="stake_token_description">Haga que su token trabaje para Ud.</string>
|
||||
<string name="staking_amount_requirement_error">La cantidad del staking debe ser al menos %s</string>
|
||||
<string name="staking_amount_tron_integer_error">La cantidad de staking se redondeará a %1$s TRX debido a las reglas de la red.</string>
|
||||
<string name="staking_amount_tron_integer_error_unstaking">El monto de cancelación del staking se redondeará a %1$s TRX debido a las reglas de la red.</string>
|
||||
<string name="staking_amount_tron_integer_error_unstaking">La cantidad de unstaking se redondeará a %1$s TRX debido a las reglas de la red.</string>
|
||||
<string name="staking_claim_unstaked">Reclamar lo que no está en staking</string>
|
||||
<string name="staking_details_account_fee">Tarifa de staking de la cuenta </string>
|
||||
<string name="staking_details_account_fee_info">Una cuenta de staking es una cuenta especial donde se almacenan los tokens SOL de staking. Se crea cuando delegas sus tokens a un validador para participar en la validación de transacciones y ganar recompensas. Se cobra una pequeña tarifa por crear la cuenta de staking, que se devuelve una vez que se completa el staking.</string>
|
||||
<string name="staking_details_annual_percentage_rate">Porcentaje de rendimiento anual</string>
|
||||
<string name="staking_details_annual_percentage_rate_info">El porcentaje de rendimiento anual que podrá ganar como participante en el staking.</string>
|
||||
<string name="staking_details_apr">APR</string>
|
||||
<string name="staking_details_auto_claiming_rewards_daily_text">Las recompensas se acumulan automáticamente en su saldo de apustaking esta cada día.</string>
|
||||
<string name="staking_details_auto_claiming_rewards_daily_text">Las recompensas se acumulan automáticamente en su saldo de staking diariamente.</string>
|
||||
<string name="staking_details_available">Disponible</string>
|
||||
<string name="staking_details_average_reward_rate">Tasa de recompensa promedio</string>
|
||||
<string name="staking_details_banner_text">¿Cómo funciona el staking?</string>
|
||||
|
|
@ -1005,7 +1003,7 @@
|
|||
<string name="staking_legal">Al utilizar la función de staking, usted acepta %1$s y %2$s del proveedor</string>
|
||||
<string name="staking_locked">Bloqueado</string>
|
||||
<string name="staking_migrate">Migrar</string>
|
||||
<string name="staking_native">Native staking</string>
|
||||
<string name="staking_native">Staking nativo</string>
|
||||
<string name="staking_no_validators_error_message">No hay validadores activos disponibles para hacer staking en este momento. Por favor, inténtalo de nuevo más tarde.</string>
|
||||
<string name="staking_notification_additional_ada_deposit_text">Al hacer staking en la red Cardano, se utiliza todo su saldo. Se reservarán 2 ADA adicionales y se devolverán después del staking. Su ADA permanece desbloqueado mientras hace staking.</string>
|
||||
<string name="staking_notification_additional_ada_deposit_title">Detalles del staking de ADA</string>
|
||||
|
|
@ -1032,7 +1030,7 @@
|
|||
<string name="staking_notification_new_validator_funds_transfer">El staking en la red %1$s con un nuevo validador transferirá automáticamente todos los fondos previamente en staking a este validador.</string>
|
||||
<string name="staking_notification_restake_rewards_text">Reinvierta las recompensas obtenidas en el monto apostado, aumentando las ganancias potenciales.</string>
|
||||
<string name="staking_notification_restake_text">La opción de volver a staking le permite mover sus fondos de un validador a otro sin necesidad de retirarlos.</string>
|
||||
<string name="staking_notification_stake_entire_balance_text">Está a punto de hacer staking con todo su saldo. Recomendamos dejar una cantidad para cubrir las tarifas de la red por unstaking o reclamo de recompensas.</string>
|
||||
<string name="staking_notification_stake_entire_balance_text">Está a punto de hacer staking con todo su saldo. Recomendamos dejar una pequeña cantidad para cubrir las tarifas de red para hacer unstaking o reclamar recompensas.</string>
|
||||
<string name="staking_notification_ton_activate_account">Para empezar a hacer staking en TON, realice primero una transacción de salida de cualquier importe - esto activará su billetera.</string>
|
||||
<string name="staking_notification_ton_extra_reserve_info">Es posible que se requieran hasta 0.2 TON además de la tarifa de red para completar la transacción. Cualquier cantidad no utilizada será reembolsada.</string>
|
||||
<string name="staking_notification_ton_extra_reserve_is_required">Se requieren 0.2 TON para realizar esta operación, además de la tarifa de red. Por favor, recargue su saldo.</string>
|
||||
|
|
@ -1069,21 +1067,21 @@
|
|||
<string name="staking_stake_more">Hacer más staking</string>
|
||||
<string name="staking_stake_more_button_unavailability_reason">Al hacer staking de %1$s, se realiza sobre todo su saldo de %2$s. Cualquier %2$s adicional que deposite en su billetera Tangem también se pondrá en staking automáticamente.</string>
|
||||
<string name="staking_staked_amount">Monto del staking</string>
|
||||
<string name="staking_summary_description_text">Ud hace el staking de %1$s y recibirá %2$s</string>
|
||||
<string name="staking_summary_description_text">Hará staking de %1$s y recibirá recompensas %2$s</string>
|
||||
<string name="staking_tap_to_unlock">Toque para desbloquear</string>
|
||||
<string name="staking_tap_to_unlock_or_vote">Pulse para desbloquear o votar</string>
|
||||
<string name="staking_tap_to_withdraw">Toque para retirar</string>
|
||||
<string name="staking_title_stake">Stake %s</string>
|
||||
<string name="staking_title_unstake">El unstaking de %s</string>
|
||||
<string name="staking_title_unstake">Unstaking de %s</string>
|
||||
<string name="staking_transaction_in_progress_text">¡La transacción se está procesando! La validación está en curso en la cadena de bloques. Esto puede tardar unos minutos.</string>
|
||||
<string name="staking_unbonding">Desunión</string>
|
||||
<string name="staking_unlocked_locked">Desbloquear</string>
|
||||
<string name="staking_unlocking">Desbloqueando</string>
|
||||
<string name="staking_unstake_amount_requirement_error">La cantidad para el unstaking debe ser al menos %s</string>
|
||||
<string name="staking_unstake_amount_requirement_error">La cantidad para hacer unstaking debe ser al menos %s</string>
|
||||
<string name="staking_unstake_amount_validation_error">El monto excede el saldo apostado</string>
|
||||
<string name="staking_unstaked">Sin staking</string>
|
||||
<string name="staking_unstaking">Deshacer el staking</string>
|
||||
<string name="staking_unstaking_item_name">Detenando el staking de activos %s</string>
|
||||
<string name="staking_unstaking_item_name">Haciendo unstaking de %s</string>
|
||||
<string name="staking_validator">Validador</string>
|
||||
<string name="staking_validators">Validadores</string>
|
||||
<string name="staking_validators_label">Socio estratégico</string>
|
||||
|
|
@ -1105,7 +1103,7 @@
|
|||
<string name="sui_not_enough_coin_for_fee_description">Se requiere una transacción entrante de al menos %1$s para proceder</string>
|
||||
<string name="sui_not_enough_coin_for_fee_title">Fondos insuficientes</string>
|
||||
<string name="swap_fixed_rate">Tasa Fija</string>
|
||||
<string name="swap_give_permission_fee_footer">La red cobrará una tarifa de aprobación de token para verificar que está autorizando el uso de su token para el swap.</string>
|
||||
<string name="swap_give_permission_fee_footer">La red cobrará una tasa de aprobación del token para verificar que usted autoriza el uso de su token para el intercambio.</string>
|
||||
<string name="swap_promo_text">Intercambie más tokens a mejores tasas directamente en su billetera.</string>
|
||||
<string name="swap_promo_title">¡Nuevo proveedor de intercambio disponible!</string>
|
||||
<string name="swap_story_fifth_subtitle">Siéntase seguro con una asistencia permanente que le ayudará con cualquier problema</string>
|
||||
|
|
@ -1120,15 +1118,15 @@
|
|||
<string name="swap_story_third_title">Simplemente cómodo</string>
|
||||
<string name="swap_via_provider">Intercambio a través del proveedor</string>
|
||||
<string name="swapping_alert_cex_description">La cantidad incluye:\n• Tarifas del proveedor de servicios\n• Tarifas de red por enviar %s desde el intercambio a la dirección del usuario.</string>
|
||||
<string name="swapping_alert_cex_description_with_slippage">El monto incluye:\n• tarifas del proveedor de servicios\n• tarifas de red por enviar %1$s desde el intercambio a la dirección del usuario. \n\nEl slippage del proveedor puede alcanzar el %2$s</string>
|
||||
<string name="swapping_alert_cex_description_with_slippage">El importe incluye:\n- comisión del proveedor de servicios\n- comisión de red por el envío de %1$s desde el exchange de vuelta a la dirección del usuario. \n\nEl deslizamiento (slippage) del proveedor es de hasta %2$s</string>
|
||||
<string name="swapping_alert_dex_description">El importe incluye los honorarios del proveedor de servicios.</string>
|
||||
<string name="swapping_alert_dex_description_with_slippage">El importe incluye las tarifas del proveedor de servicios. \n\nEl slippage del proveedor puede alcanzar el %s</string>
|
||||
<string name="swapping_alert_dex_description_with_slippage">El importe incluye las tarifas del proveedor de servicios. \n\nEl deslizamiento (slippage) del proveedor puede llegar a %s</string>
|
||||
<string name="swapping_alert_title">Información</string>
|
||||
<string name="swapping_approve_information_text">Todos los exchanges descentralizados requieren aprobaciones para evitar que los smart contracts accedan a su billetera sin su permiso. Por diseño, los smart contracts no pueden acceder a tus tokens a menos que lo apruebes. Al \"desbloquear\" sus tokens, autoriza al smart contract de 1-inch a gastarlos. Los mineros de la red reciben una tarifa de gas (pagada por voz) para registrar esta acción en la blockchain. Puede intercambiar su token después de dar la aprobación.</string>
|
||||
<string name="swapping_approve_information_text">Todos los intercambios descentralizados requieren aprobaciones para evitar que los contratos inteligentes accedan a su billetera sin su permiso. Por diseño, los contratos inteligentes no pueden acceder a sus tokens a menos que lo apruebe. Al \"desbloquear\" sus tokens, autoriza al contrato inteligente de 1-inch a gastarlos. Los mineros de la red reciben una tarifa de gas (pagada por usted) para registrar esta acción en la blockchain. Puede intercambiar su token después de dar su aprobación.</string>
|
||||
<string name="swapping_approve_information_title">Aprobar</string>
|
||||
<string name="swapping_fee_estimation_error_text">Error en la estimación de la tarifa. Envíe sus comentarios al servicio de asistencia.</string>
|
||||
<string name="swapping_from_title">Usted intercambia</string>
|
||||
<string name="swapping_high_price_impact_description">Hacer swap de esta cantidad de tokens seleccionados causará un impacto significativo en el precio y reducirá su resultado.</string>
|
||||
<string name="swapping_high_price_impact_description">Hacer un intercambio de esta cantidad del token seleccionado causará un impacto significativo en el precio y reducirá su resultado.</string>
|
||||
<string name="swapping_insufficient_funds">Fondos insuficientes</string>
|
||||
<string name="swapping_permission_header">Dar autorización</string>
|
||||
<string name="swapping_swap_action">Intercambiar</string>
|
||||
|
|
@ -1147,8 +1145,8 @@
|
|||
<string name="token_button_unavailability_reason_loading">Los datos aún no se han cargado. Esto puede tardar unos segundos. Por favor, inténtelo de nuevo más tarde.</string>
|
||||
<string name="token_button_unavailability_reason_not_exchangeable">El servicio de intercambio %s no está compatible con los proveedores actuales pero estamos trabajando para agregar más opciones.</string>
|
||||
<string name="token_button_unavailability_reason_out_of_date_balance">Es posible que el saldo mostrado esté desactualizado debido al almacenamiento en caché.</string>
|
||||
<string name="token_button_unavailability_reason_pending_transaction_sell">La venta de fondos estará disponible una vez que la(s) transacción(es) pendiente(s) en la red %s se complete</string>
|
||||
<string name="token_button_unavailability_reason_pending_transaction_send">El envío de fondos estará disponible una vez que se completen las transacciones pendientes en la red %s.</string>
|
||||
<string name="token_button_unavailability_reason_pending_transaction_sell">La venta de fondos estará disponible una vez que la(s) transacción(es) pendiente(s) en la red %s se completen</string>
|
||||
<string name="token_button_unavailability_reason_pending_transaction_send">El envío de fondos estará disponible una vez que se complete(n) la(s) transacción(es) pendiente(s) en la red %s</string>
|
||||
<string name="token_button_unavailability_reason_sell_unavailable">Vender %s no es compatible con los proveedores actuales, pero estamos trabajando para agregar más opciones.</string>
|
||||
<string name="token_button_unavailability_reason_staking_unavailable">El staking de %s no es compatible con los proveedores actuales, pero estamos trabajando para agregar más opciones.</string>
|
||||
<string name="token_details_generate_xpub">Generar XPUB</string>
|
||||
|
|
@ -1159,11 +1157,11 @@
|
|||
<string name="token_details_staking_block_subtitle">El staking le permite ganar %1$s y obtener recompensas cada %2$s días</string>
|
||||
<string name="token_details_staking_block_title">Servicio de Staking</string>
|
||||
<string name="token_details_token_type_subtitle">Token de %1$s en la red %%image%% %2$s</string>
|
||||
<string name="token_details_token_type_subtitle_no_standard">Token en la %%image%% red %1$s</string>
|
||||
<string name="token_details_token_type_subtitle_no_standard">Token en la red %%image%% %1$s</string>
|
||||
<string name="token_details_unable_hide_alert_message">El token %1$s (%2$s) es la moneda principal en la red %3$s y no se puede ocultar mientras tengas otros tokens de esta red en la lista</string>
|
||||
<string name="token_details_unable_hide_alert_title">No se puede ocultar %s</string>
|
||||
<string name="token_swap_changelly_promotion_message">Cambie este token por otro por una tarifa de servicio de %1$s del %2$s al %3$s de febrero.</string>
|
||||
<string name="token_swap_changelly_promotion_title">Intercambio con Changelly, %s tarifa</string>
|
||||
<string name="token_swap_changelly_promotion_title">Intercambie con Changelly, %s comisiones</string>
|
||||
<string name="token_swap_promotion_button">Intercambie ahora</string>
|
||||
<string name="tokens_list_hot_crypto_header">Criptomonedas populares 🔥</string>
|
||||
<string name="tokens_list_unavailable_to_purchase_header">No disponible para compra</string>
|
||||
|
|
@ -1260,8 +1258,8 @@
|
|||
<string name="wallet_notification_address_copied">La dirección se copió correctamente</string>
|
||||
<string name="wallet_notification_no_internet">Sin conexión a internet</string>
|
||||
<string name="wallet_promo_banner_button_title">Consíguelo ahora con un 10 % de descuento</string>
|
||||
<string name="wallet_promo_banner_description">Accede a más de 13 000 criptomonedas. Compra, vende, intercambia y realiza staking con un solo toque.\nVincula hasta tres tarjetas para hacer copias de seguridad.</string>
|
||||
<string name="wallet_promo_banner_title">Descubre Tangem Wallet</string>
|
||||
<string name="wallet_promo_banner_description">Acceda a más de 13.000 criptomonedas. Compre, venda, intercambie y realice staking con un solo toque.\nVincule hasta tres tarjetas para hacer copias de seguridad.</string>
|
||||
<string name="wallet_promo_banner_title">Descubra Tangem Wallet</string>
|
||||
<string name="wallet_settings_change_access_code_title">Cambiar código de acceso</string>
|
||||
<string name="wallet_settings_push_notifications_description">Manténgase informado sobre las transacciones entrantes de la billetera y las actualizaciones de Tangem.</string>
|
||||
<string name="wallet_settings_push_notifications_title">Notificaciones de transacciones</string>
|
||||
|
|
@ -1308,11 +1306,11 @@
|
|||
<string name="warning_failed_to_verify_card_message">Esta tarjeta podría ser una muestra de producción o una falsificación</string>
|
||||
<string name="warning_failed_to_verify_card_title">La verificación de autenticidad falló</string>
|
||||
<string name="warning_hedera_missing_token_association_button_title">Asociar</string>
|
||||
<string name="warning_hedera_missing_token_association_message">Este token debe estar asociado a tu cuenta de Hedera antes de que pueda recibirlo. Tarifa de asociación ~%1$s %2$s</string>
|
||||
<string name="warning_hedera_missing_token_association_message">Este token debe estar asociado a su cuenta de Hedera antes de que pueda recibirlo. Tarifa de asociación ~%1$s %2$s</string>
|
||||
<string name="warning_hedera_missing_token_association_message_brief">Este token debe estar asociado con su cuenta de Hedera antes de poder recibirlo.</string>
|
||||
<string name="warning_hedera_missing_token_association_title">Asocie su token</string>
|
||||
<string name="warning_hedera_token_association_not_enough_hbar_message">No hay suficiente %s. Recargue su cuenta de Hedera para asociar este token</string>
|
||||
<string name="warning_kaspa_unfinished_token_transaction_discard_message">¿Está seguro(a) de que desea cancelar la transacción? No podrá volver a intentar realizarla.</string>
|
||||
<string name="warning_kaspa_unfinished_token_transaction_discard_message">¿Está seguro de que desea cancelar la transacción? No podrá volver a reintentarlo.</string>
|
||||
<string name="warning_kaspa_unfinished_token_transaction_message">Su transacción con un importe de %1$s %2$s no se ha completado. Puede volver a intentarlo para completarla.</string>
|
||||
<string name="warning_kaspa_unfinished_token_transaction_title">Tiene una transacción sin terminar</string>
|
||||
<string name="warning_last_balance_updated_time">Última actualización hace %s</string>
|
||||
|
|
@ -1353,7 +1351,7 @@
|
|||
<string name="warning_some_networks_unreachable_title">Algunas redes no están disponibles</string>
|
||||
<string name="warning_some_token_balances_not_updated">No se han podido actualizar los saldos de algunos tokens</string>
|
||||
<string name="warning_stellar_token_trustline_not_enough_xlm">No hay suficiente %s. Recargue su cuenta XLM para abrir trustline</string>
|
||||
<string name="warning_testnet_card_message">Esta es una tarjeta de Testnet. No puede procesar transacciones y solo deba usarse para pruebas y desarrollo.</string>
|
||||
<string name="warning_testnet_card_message">Esta es una tarjeta de Testnet. No puede procesar transacciones y solo debe usarse para fines de prueba y desarrollo.</string>
|
||||
<string name="warning_testnet_card_title">Solo para fines de prueba</string>
|
||||
<string name="warning_token_balance_not_updated">El saldo podría estar desactualizado. Actualice la página.</string>
|
||||
<string name="warning_token_required_min_coin_reserve">No hay suficiente %1$s. Recargue su cuenta %2$s para asociar este token</string>
|
||||
|
|
@ -1373,7 +1371,7 @@
|
|||
<string name="wc_alert_request_timeout_description">Verifique su conexión de red</string>
|
||||
<string name="wc_alert_request_timeout_title">Tiempo de espera agotado</string>
|
||||
<string name="wc_alert_session_disconnected_description">Vuelva a su navegador y vuelva a conectarse a través de WalletConnect.</string>
|
||||
<string name="wc_alert_session_disconnected_title">La sesión de Wallet Connect se desconectó</string>
|
||||
<string name="wc_alert_session_disconnected_title">La sesión de Wallet Connect fue desconectada</string>
|
||||
<string name="wc_alert_sign_anyway">Firmar de todos modos</string>
|
||||
<string name="wc_alert_unknown_error_description">Código de error: %s. Si el problema persiste - no dude en ponerse en contacto con nuestro soporte.</string>
|
||||
<string name="wc_alert_unknown_error_description_no_error_code">Si el problema persiste, no dude en contactar con nuestro soporte.</string>
|
||||
|
|
|
|||
|
|
@ -895,9 +895,7 @@
|
|||
<string name="send_recent_transactions">Récent</string>
|
||||
<string name="send_recipient">Destinataire</string>
|
||||
<string name="send_recipient_address_error">Adresse non valide</string>
|
||||
<string name="send_recipient_address_footer">Assurez-vous que l\'adresse du portefeuille de réception est sur le réseau %s pour éviter de perdre vos jetons</string>
|
||||
<string name="send_recipient_address_footer_highlighted_part">envoyer à %s</string>
|
||||
<string name="send_recipient_address_footer_v2">Assurez-vous de %s une adresse réseau, car des erreurs peuvent entraîner des transferts perdus</string>
|
||||
<string name="send_recipient_address_footer">Assurez-vous que l\'adresse du portefeuille de réception est sur **le réseau %s** pour éviter de perdre vos jetons</string>
|
||||
<string name="send_recipient_label">Envoyer à</string>
|
||||
<string name="send_recipient_memo_footer">Un Memo/Destination Tag est un identifiant unique permettant de différencier les transactions envoyées au même destinataire sur le même réseau. Attention : L\'omission d\'un mémo peut entraîner des fonds mal placés</string>
|
||||
<string name="send_recipient_memo_footer_v2">Le Memo / Destination Tag est un code qui distingue les transactions envoyées à un destinataire partagé sur un réseau crypto.</string>
|
||||
|
|
|
|||
|
|
@ -1034,9 +1034,7 @@
|
|||
<string name="send_recent_transactions">最近の取引</string>
|
||||
<string name="send_recipient">受取人</string>
|
||||
<string name="send_recipient_address_error">有効なアドレスではありません</string>
|
||||
<string name="send_recipient_address_footer">トークンの損失を避けるために、受信ウォレットアドレスが** %sネットワーク**上にあることを確認してください</string>
|
||||
<string name="send_recipient_address_footer_highlighted_part">%s に送信</string>
|
||||
<string name="send_recipient_address_footer_v2">%sネットワーク上のアドレスに送信していることを確認してください。エラーが発生すると資金が失われる可能性があります。</string>
|
||||
<string name="send_recipient_address_footer">トークンの損失を避けるために、受信ウォレットアドレスが**%sネットワーク**上にあることを確認してください</string>
|
||||
<string name="send_recipient_label">送金先</string>
|
||||
<string name="send_recipient_memo_footer">メモ/宛先タグは、同じネットワーク上の同じ受信者に送信された取引を区別するためのユニークなIDです。注意:メモを省略すると、資金の行き違いにつながる可能性があります。</string>
|
||||
<string name="send_recipient_memo_footer_v2">メモ / 宛先タグは、暗号資産ネットワーク内の共有受信者への取引を分離するコードです。</string>
|
||||
|
|
|
|||
|
|
@ -945,8 +945,7 @@
|
|||
<string name="send_recent_transactions">Последние</string>
|
||||
<string name="send_recipient">Получатель</string>
|
||||
<string name="send_recipient_address_error">Неверный адрес</string>
|
||||
<string name="send_recipient_address_footer">Убедитесь, что вы отправляете средства на адрес кошелька %s. Ошибки могут привести к потере ваших токенов.</string>
|
||||
<string name="send_recipient_address_footer_v2">Убедитесь, что отправляете на адрес в сети %s, ошибки могут привести к потере средств.</string>
|
||||
<string name="send_recipient_address_footer">Убедитесь, что адрес получателя находится **в сети %s**, чтобы избежать потери отправляемых средств</string>
|
||||
<string name="send_recipient_label">Отправить</string>
|
||||
<string name="send_recipient_memo_footer">Мемо/ Код назначения - это код, разделяющий транзакции к общему получателю в сети криптовалют. Внимание: отсутствие мемо может привести к потере средств.</string>
|
||||
<string name="send_recipient_memo_footer_v2">Memo / Destination Tag — это код, разделяющий транзакции, отправляемые одному и тому же получателю в криптовалютной сети.</string>
|
||||
|
|
|
|||
|
|
@ -902,8 +902,7 @@
|
|||
<string name="send_recent_transactions">Останні</string>
|
||||
<string name="send_recipient">Одержувач</string>
|
||||
<string name="send_recipient_address_error">Недійсна адреса</string>
|
||||
<string name="send_recipient_address_footer">Переконайтеся, що адреса гаманця одержувача знаходиться в мережі %s, щоб уникнути втрати ваших токенів</string>
|
||||
<string name="send_recipient_address_footer_v2">Переконайтеся, що ви надсилаєте на адресу в мережі %s. Помилка може призвести до втрати коштів.</string>
|
||||
<string name="send_recipient_address_footer">Переконайтеся, що адреса отримувача знаходиться **в мережі %s**, щоб уникнути втрати ваших коштів.</string>
|
||||
<string name="send_recipient_label">Надіслати до</string>
|
||||
<string name="send_recipient_memo_footer">Memo/ Тег призначення — це унікальний ідентифікатор для розрізнення транзакцій, надісланих тому самому одержувачу в тій самій мережі. Застереження: відсутність тегу може призвести до втрати коштів.</string>
|
||||
<string name="send_recipient_memo_footer_v2">Мемо / Destination Tag — це код, що розділяє транзакції до спільного одержувача в криптовалютній мережі.</string>
|
||||
|
|
|
|||
|
|
@ -1012,7 +1012,6 @@
|
|||
<string name="send_fee_unreachable_error_text">Check your network connection</string>
|
||||
<string name="send_fee_unreachable_error_title">Network fee info unreachable</string>
|
||||
<string name="send_from_title">You send</string>
|
||||
<string name="send_from_wallet_android">From</string>
|
||||
<string name="send_from_wallet_name">From %s</string>
|
||||
<string name="send_gas_limit">Gas limit</string>
|
||||
<string name="send_gas_limit_footer">This is the maximum amount of gas that will be spent to complete a transaction or contract. A gas limit prevents unexpected or unlimited charges when executing a transaction.</string>
|
||||
|
|
@ -1054,9 +1053,7 @@
|
|||
<string name="send_recent_transactions">Recent</string>
|
||||
<string name="send_recipient">Recipient</string>
|
||||
<string name="send_recipient_address_error">Not a valid address</string>
|
||||
<string name="send_recipient_address_footer">Ensure the receiving wallet address is on **the %s network** to avoid losing your tokens</string>
|
||||
<string name="send_recipient_address_footer_highlighted_part">send to %s</string>
|
||||
<string name="send_recipient_address_footer_v2">Make sure you are sending to an address on the %s network. An error may result in the loss of funds.</string>
|
||||
<string name="send_recipient_address_footer">Ensure the recipient\'s address is on **the %s network** to avoid losing your funds</string>
|
||||
<string name="send_recipient_label">Send to</string>
|
||||
<string name="send_recipient_memo_footer">A Memo/Destination Tag is a unique ID for differentiating transactions sent to the same recipient on the same network. Caution: Omitting a memo may lead to misplaced funds</string>
|
||||
<string name="send_recipient_memo_footer_v2">Memo / Destination Tag is a code separating transactions to a shared recipient in a crypto network.</string>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import com.tangem.data.quotes.store.QuotesStatusesStore
|
|||
import com.tangem.data.quotes.store.setSourceAsCache
|
||||
import com.tangem.data.quotes.store.setSourceAsOnlyCache
|
||||
import com.tangem.data.quotes.utils.QuotesUnsupportedCurrenciesIdAdapter
|
||||
import com.tangem.datasource.api.tangemTech.models.QuotesResponse
|
||||
import com.tangem.datasource.appcurrency.AppCurrencyResponseStore
|
||||
import com.tangem.domain.core.utils.catchOn
|
||||
import com.tangem.domain.models.currency.CryptoCurrency
|
||||
|
|
@ -58,6 +59,7 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor(
|
|||
fields = setOf(Field.PRICE, Field.PRICE_CHANGE_24H),
|
||||
)
|
||||
.getOrElse { error("Cause: $it") }
|
||||
.addSkippedIfHas(ids = replacementIdsResult.idsForRequest)
|
||||
|
||||
val updatedResponse = QuotesUnsupportedCurrenciesIdAdapter.getResponseWithUnsupportedCurrencies(
|
||||
response = response,
|
||||
|
|
@ -84,4 +86,16 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor(
|
|||
|
||||
return appCurrencyId
|
||||
}
|
||||
|
||||
private fun QuotesResponse.addSkippedIfHas(ids: Set<String>): QuotesResponse {
|
||||
val skippedIds = ids.filterNot(quotes.keys::contains).ifEmpty {
|
||||
return this
|
||||
}
|
||||
|
||||
Timber.d("Some quotes are missing from the server response: $skippedIds")
|
||||
|
||||
val emptyQuotes = skippedIds.associateWith { QuotesResponse.Quote.EMPTY }
|
||||
|
||||
return copy(quotes = quotes + emptyQuotes)
|
||||
}
|
||||
}
|
||||
|
|
@ -215,6 +215,50 @@ internal class DefaultMultiQuoteStatusFetcherTest {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `fetch successfully if not all quotes are fetched`() = runTest {
|
||||
// Arrange
|
||||
val params = MultiQuoteStatusFetcher.Params(currenciesIds = currenciesIds, appCurrencyId = null)
|
||||
|
||||
coEvery { appCurrencyResponseStore.getSyncOrNull() } returns usdAppCurrency
|
||||
|
||||
val currenciesIds = setOf("BTC", "ETH")
|
||||
val response = QuotesResponse(
|
||||
quotes = mapOf(
|
||||
"BTC" to MockQuoteResponseFactory.createSinglePrice(value = BigDecimal.ONE),
|
||||
),
|
||||
)
|
||||
|
||||
coEvery {
|
||||
quotesFetcher.fetch(fiatCurrencyId = "usd", currenciesIds = currenciesIds, fields = fields)
|
||||
} returns response.right()
|
||||
|
||||
// Act
|
||||
val actual = fetcher(params)
|
||||
|
||||
// Assert
|
||||
val expected = Unit.right()
|
||||
Truth.assertThat(actual).isEqualTo(expected)
|
||||
|
||||
val storedQuotes = QuotesResponse(
|
||||
quotes = mapOf(
|
||||
"BTC" to MockQuoteResponseFactory.createSinglePrice(value = BigDecimal.ONE),
|
||||
"ETH" to QuotesResponse.Quote.EMPTY,
|
||||
),
|
||||
)
|
||||
|
||||
coVerifyOrder {
|
||||
quotesStore.setSourceAsCache(currenciesIds = params.currenciesIds)
|
||||
appCurrencyResponseStore.getSyncOrNull()
|
||||
quotesFetcher.fetch(fiatCurrencyId = "usd", currenciesIds = currenciesIds, fields = fields)
|
||||
quotesStore.store(values = storedQuotes.quotes)
|
||||
}
|
||||
|
||||
coVerify(inverse = true) {
|
||||
quotesStore.setSourceAsOnlyCache(currenciesIds = any())
|
||||
}
|
||||
}
|
||||
|
||||
private companion object {
|
||||
|
||||
val currenciesIds = setOf(
|
||||
|
|
|
|||
|
|
@ -51,7 +51,12 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
|
|||
val pairResult = sdkDelegate.pair(uri)
|
||||
.onLeft {
|
||||
Timber.tag(WC_TAG).e(it, "Failed to call pair $pairRequest")
|
||||
analytics.send(WcAnalyticEvents.PairFailed(it.code))
|
||||
analytics.send(
|
||||
WcAnalyticEvents.PairFailed(
|
||||
errorCode = it.code,
|
||||
errorMessage = it.message,
|
||||
),
|
||||
)
|
||||
emit(WcPairState.Error(it))
|
||||
}
|
||||
.getOrNull() ?: return@flow
|
||||
|
|
@ -73,7 +78,12 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
|
|||
|
||||
val proposalState = buildProposalState(sdkSessionProposal, sdkVerifyContext)
|
||||
.onLeft {
|
||||
analytics.send(WcAnalyticEvents.PairFailed(it.code))
|
||||
analytics.send(
|
||||
WcAnalyticEvents.PairFailed(
|
||||
errorCode = it.code,
|
||||
errorMessage = it.message,
|
||||
),
|
||||
)
|
||||
emit(WcPairState.Error(it))
|
||||
}
|
||||
.getOrNull() ?: return@flow
|
||||
|
|
@ -121,7 +131,12 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
|
|||
)
|
||||
newSession
|
||||
}.onLeft {
|
||||
analytics.send(WcAnalyticEvents.DAppConnectionFailed(it.code))
|
||||
analytics.send(
|
||||
WcAnalyticEvents.DAppConnectionFailed(
|
||||
errorCode = it.code,
|
||||
errorMessage = it.message,
|
||||
),
|
||||
)
|
||||
sdkDelegate.rejectSession(sdkSessionProposal.proposerPublicKey)
|
||||
Timber.tag(WC_TAG).e(it, "Failed to approve session ${sdkSessionProposal.name}")
|
||||
}
|
||||
|
|
@ -188,8 +203,10 @@ internal class DefaultWcPairUseCase @AssistedInject constructor(
|
|||
.values.map { it.available.plus(it.required) }.flatten().toSet()
|
||||
analytics.send(
|
||||
WcAnalyticEvents.PairRequested(
|
||||
dAppName = sessionProposal.name,
|
||||
dAppUrl = sessionProposal.url,
|
||||
network = requestedNetworks,
|
||||
verificationInfo,
|
||||
domainVerification = verificationInfo,
|
||||
),
|
||||
)
|
||||
val appMetaData = WcAppMetaData(
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ internal class DefaultWcRequestUseCaseFactory @Inject constructor(
|
|||
rawRequest = request,
|
||||
errorCode = error.code().orEmpty(),
|
||||
blockchain = blockchainName,
|
||||
errorMessage = error.message,
|
||||
)
|
||||
analytics.send(event)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import com.tangem.data.walletconnect.sign.SignStateConverter.toSigning
|
|||
import com.tangem.domain.walletconnect.WcAnalyticEvents
|
||||
import com.tangem.domain.walletconnect.model.WcRequestError
|
||||
import com.tangem.domain.walletconnect.model.WcRequestError.Companion.code
|
||||
import com.tangem.domain.walletconnect.model.WcRequestError.Companion.message
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcSignState
|
||||
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
|
||||
import kotlinx.coroutines.Job
|
||||
|
|
@ -63,23 +64,16 @@ internal class WcSignUseCaseDelegate<MiddleAction, SignModel>(
|
|||
}
|
||||
.onEach { state ->
|
||||
val step = state.domainStep as? WcSignStep.Result ?: return@onEach
|
||||
val event = step.result.fold(
|
||||
ifLeft = { error ->
|
||||
WcAnalyticEvents.SignatureRequestFailed(
|
||||
rawRequest = context.rawSdkRequest,
|
||||
network = context.network,
|
||||
errorCode = error.code() ?: error::class.simpleName.orEmpty(),
|
||||
)
|
||||
},
|
||||
ifRight = {
|
||||
WcAnalyticEvents.SignatureRequestHandled(
|
||||
rawRequest = context.rawSdkRequest,
|
||||
network = context.network,
|
||||
securityStatus = context.session.securityStatus,
|
||||
)
|
||||
},
|
||||
)
|
||||
analytics.send(event)
|
||||
step.result.leftOrNull()?.let { error ->
|
||||
val errorMessage = error.message() ?: ""
|
||||
val event = WcAnalyticEvents.SignatureRequestFailed(
|
||||
rawRequest = context.rawSdkRequest,
|
||||
network = context.network,
|
||||
errorCode = error.code() ?: error::class.simpleName.orEmpty(),
|
||||
errorMessage = errorMessage,
|
||||
)
|
||||
analytics.send(event)
|
||||
}
|
||||
}
|
||||
|
||||
var signJob: Job? = null
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@ sealed class WcRequestError {
|
|||
is SendTransactionError.NetworkError -> message
|
||||
is SendTransactionError.DataError -> message
|
||||
is SendTransactionError.UnknownError -> ex?.message
|
||||
is SendTransactionError.TangemSdkError,
|
||||
SendTransactionError.DemoCardError,
|
||||
is SendTransactionError.TangemSdkError -> "TangemSdkError code: ${this.code}"
|
||||
SendTransactionError.DemoCardError -> "DemoCardError"
|
||||
SendTransactionError.UserCancelledError,
|
||||
is SendTransactionError.CreateAccountUnderfunded,
|
||||
-> null
|
||||
|
|
|
|||
|
|
@ -37,11 +37,15 @@ sealed class WcAnalyticEvents(
|
|||
)
|
||||
|
||||
class PairRequested(
|
||||
dAppName: String,
|
||||
dAppUrl: String,
|
||||
network: Set<Network>,
|
||||
domainVerification: CheckDAppResult,
|
||||
) : WcAnalyticEvents(
|
||||
event = "dApp Connection Requested",
|
||||
params = mapOf(
|
||||
AnalyticsParam.DAPP_NAME to dAppName,
|
||||
AnalyticsParam.DAPP_URL to dAppUrl,
|
||||
NETWORKS to network.joinToString(",") { it.name },
|
||||
DOMAIN_VERIFICATION to domainVerification.toAnalyticVerificationStatus(),
|
||||
),
|
||||
|
|
@ -49,10 +53,12 @@ sealed class WcAnalyticEvents(
|
|||
|
||||
class PairFailed(
|
||||
errorCode: String,
|
||||
errorMessage: String,
|
||||
) : WcAnalyticEvents(
|
||||
event = "Session Failed",
|
||||
params = mapOf(
|
||||
AnalyticsParam.Key.ERROR_CODE to errorCode,
|
||||
AnalyticsParam.Key.ERROR_DESCRIPTION to errorMessage,
|
||||
),
|
||||
)
|
||||
|
||||
|
|
@ -72,10 +78,12 @@ sealed class WcAnalyticEvents(
|
|||
|
||||
class DAppConnectionFailed(
|
||||
errorCode: String,
|
||||
errorMessage: String,
|
||||
) : WcAnalyticEvents(
|
||||
event = "dApp Connection Failed",
|
||||
params = mapOf(
|
||||
AnalyticsParam.Key.ERROR_CODE to errorCode,
|
||||
AnalyticsParam.Key.ERROR_DESCRIPTION to errorMessage,
|
||||
),
|
||||
)
|
||||
|
||||
|
|
@ -104,7 +112,7 @@ sealed class WcAnalyticEvents(
|
|||
rawRequest: WcSdkSessionRequest,
|
||||
network: Network,
|
||||
emulationStatus: EmulationStatus?,
|
||||
securityStatus: CheckDAppResult?,
|
||||
securityStatus: CheckDAppResult,
|
||||
) : WcAnalyticEvents(
|
||||
event = "Signature Request Received",
|
||||
params = mapOf(
|
||||
|
|
@ -113,7 +121,7 @@ sealed class WcAnalyticEvents(
|
|||
AnalyticsParam.Key.METHOD_NAME to rawRequest.request.method,
|
||||
AnalyticsParam.Key.BLOCKCHAIN to network.name,
|
||||
AnalyticsParam.Key.EMULATION_STATUS to emulationStatus?.status,
|
||||
AnalyticsParam.Key.TYPE to securityStatus?.toAnalyticVerificationStatus(),
|
||||
AnalyticsParam.Key.TYPE to securityStatus.toAnalyticVerificationStatus(),
|
||||
).mapNotNullValues { it.value },
|
||||
) {
|
||||
enum class EmulationStatus(val status: String) {
|
||||
|
|
@ -142,6 +150,7 @@ sealed class WcAnalyticEvents(
|
|||
rawRequest: WcSdkSessionRequest,
|
||||
network: Network,
|
||||
errorCode: String,
|
||||
errorMessage: String,
|
||||
) : WcAnalyticEvents(
|
||||
event = "Signature Request Failed",
|
||||
params = mapOf(
|
||||
|
|
@ -150,6 +159,7 @@ sealed class WcAnalyticEvents(
|
|||
AnalyticsParam.Key.METHOD_NAME to rawRequest.request.method,
|
||||
AnalyticsParam.Key.BLOCKCHAIN to network.name,
|
||||
AnalyticsParam.Key.ERROR_CODE to errorCode,
|
||||
AnalyticsParam.Key.ERROR_DESCRIPTION to errorMessage,
|
||||
),
|
||||
)
|
||||
|
||||
|
|
@ -157,6 +167,7 @@ sealed class WcAnalyticEvents(
|
|||
rawRequest: WcSdkSessionRequest,
|
||||
blockchain: String,
|
||||
errorCode: String,
|
||||
errorMessage: String,
|
||||
) : WcAnalyticEvents(
|
||||
event = "Signature Request Received with Failed",
|
||||
params = mapOf(
|
||||
|
|
@ -165,6 +176,7 @@ sealed class WcAnalyticEvents(
|
|||
AnalyticsParam.Key.METHOD_NAME to rawRequest.request.method,
|
||||
AnalyticsParam.Key.BLOCKCHAIN to blockchain,
|
||||
AnalyticsParam.Key.ERROR_CODE to errorCode,
|
||||
AnalyticsParam.Key.ERROR_DESCRIPTION to errorMessage,
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import com.arkivanov.decompose.extensions.compose.stack.animation.stackAnimation
|
|||
import com.arkivanov.decompose.extensions.compose.subscribeAsState
|
||||
import com.arkivanov.decompose.router.stack.ChildStack
|
||||
import com.arkivanov.decompose.router.stack.childStack
|
||||
import com.arkivanov.decompose.router.stack.push
|
||||
import com.arkivanov.decompose.value.Value
|
||||
import com.arkivanov.decompose.value.subscribe
|
||||
import com.arkivanov.essenty.instancekeeper.getOrCreateSimple
|
||||
|
|
@ -59,7 +58,7 @@ internal class DefaultOnboardingNoteComponent @AssistedInject constructor(
|
|||
key = "innerStack",
|
||||
source = model.stackNavigation,
|
||||
serializer = null,
|
||||
initialConfiguration = model.initialRoute,
|
||||
initialConfiguration = OnboardingNoteRoute.CreateWallet,
|
||||
handleBackButton = true,
|
||||
childFactory = { configuration, factoryContext ->
|
||||
createChild(
|
||||
|
|
@ -99,17 +98,10 @@ internal class DefaultOnboardingNoteComponent @AssistedInject constructor(
|
|||
childParams = childParams,
|
||||
onWalletCreated = { userWallet ->
|
||||
model.onWalletCreated(userWallet)
|
||||
model.stackNavigation.push(OnboardingNoteRoute.Done)
|
||||
params.onDone()
|
||||
},
|
||||
),
|
||||
)
|
||||
OnboardingNoteRoute.Done -> onboardingDoneComponentFactory.create(
|
||||
context = factoryContext,
|
||||
params = OnboardingDoneComponent.Params(
|
||||
mode = OnboardingDoneComponent.Mode.WalletCreated,
|
||||
onDone = { params.onDone() },
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,10 +35,8 @@ internal class OnboardingNoteModel @Inject constructor(
|
|||
@Suppress("UnusedPrivateMember")
|
||||
private val params = paramsContainer.require<OnboardingNoteComponent.Params>()
|
||||
|
||||
val initialRoute = initializeRoute()
|
||||
|
||||
private val _innerNavigationState =
|
||||
MutableStateFlow(OnboardingNoteInnerNavigationState(stackSize = initialRoute.stepNum()))
|
||||
MutableStateFlow(OnboardingNoteInnerNavigationState(stackSize = OnboardingNoteRoute.CreateWallet.stepNum()))
|
||||
|
||||
val innerNavigationState = _innerNavigationState.asStateFlow()
|
||||
|
||||
|
|
@ -79,15 +77,6 @@ internal class OnboardingNoteModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private fun initializeRoute(): OnboardingNoteRoute {
|
||||
val card = params.scanResponse.card
|
||||
return if (card.wallets.isEmpty()) {
|
||||
OnboardingNoteRoute.CreateWallet
|
||||
} else {
|
||||
OnboardingNoteRoute.Done
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadArtwork() {
|
||||
modelScope.launch {
|
||||
val cardInfo = params.scanResponse.card
|
||||
|
|
|
|||
|
|
@ -7,9 +7,6 @@ internal sealed class OnboardingNoteRoute {
|
|||
|
||||
@Serializable
|
||||
data object CreateWallet : OnboardingNoteRoute()
|
||||
|
||||
@Serializable
|
||||
data object Done : OnboardingNoteRoute()
|
||||
}
|
||||
|
||||
internal const val ONBOARDING_NOTE_STEPS_COUNT = 2
|
||||
internal const val ONBOARDING_NOTE_STEPS_COUNT = 1
|
||||
|
|
@ -2,5 +2,4 @@ package com.tangem.features.onboarding.v2.note.impl.route
|
|||
|
||||
internal fun OnboardingNoteRoute.stepNum() = when (this) {
|
||||
OnboardingNoteRoute.CreateWallet -> 1
|
||||
OnboardingNoteRoute.Done -> 2
|
||||
}
|
||||
|
|
@ -2,10 +2,9 @@ package com.tangem.features.send.v2.send.success.ui
|
|||
|
||||
import androidx.compose.animation.*
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.gestures.Orientation
|
||||
import androidx.compose.foundation.gestures.scrollable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
|
|
@ -54,10 +53,7 @@ internal fun SendConfirmSuccessContent(sendUM: SendUM, destinationBlockComponent
|
|||
Column(
|
||||
modifier = Modifier
|
||||
.padding(horizontal = TangemTheme.dimens.spacing16)
|
||||
.scrollable(
|
||||
state = rememberScrollState(),
|
||||
orientation = Orientation.Vertical,
|
||||
),
|
||||
.verticalScroll(rememberScrollState()),
|
||||
verticalArrangement = Arrangement.spacedBy(12.dp),
|
||||
) {
|
||||
if (sendUM.confirmUM is ConfirmUM.Success) {
|
||||
|
|
@ -81,7 +77,7 @@ internal fun SendConfirmSuccessContent(sendUM: SendUM, destinationBlockComponent
|
|||
)
|
||||
destinationBlockComponent.Content(modifier = Modifier)
|
||||
FeeBlock(feeSelectorUM = sendUM.feeSelectorUM)
|
||||
Spacer(Modifier.height(60.dp))
|
||||
Spacer(Modifier.height(128.dp))
|
||||
}
|
||||
BottomFade(Modifier.align(Alignment.BottomCenter), TangemTheme.colors.background.tertiary)
|
||||
NavigationButtonsBlockV2(
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ internal fun NFTSendSuccessContent(
|
|||
nftDetailsBlockComponent.Content(modifier = Modifier)
|
||||
destinationBlockComponent.Content(modifier = Modifier)
|
||||
FeeBlock(feeSelectorUM = nftSendUM.feeSelectorUM)
|
||||
Spacer(Modifier.height(60.dp))
|
||||
Spacer(Modifier.height(128.dp))
|
||||
}
|
||||
BottomFade(Modifier.align(Alignment.BottomCenter), TangemTheme.colors.background.tertiary)
|
||||
NavigationButtonsBlockV2(
|
||||
|
|
|
|||
|
|
@ -121,11 +121,7 @@ private fun LazyListScope.addressItem(
|
|||
) {
|
||||
item(key = ADDRESS_FIELD_KEY) {
|
||||
FooterContainer(
|
||||
footer = if (isRedesignEnabled) {
|
||||
buildHighlightedFooterText(networkName)
|
||||
} else {
|
||||
resourceReference(R.string.send_recipient_address_footer, wrappedList(networkName))
|
||||
},
|
||||
footer = resourceReference(R.string.send_recipient_address_footer, wrappedList(networkName)),
|
||||
) {
|
||||
InputRowRecipient(
|
||||
value = address.value,
|
||||
|
|
@ -150,33 +146,6 @@ private fun LazyListScope.addressItem(
|
|||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun buildHighlightedFooterText(networkName: String): TextReference {
|
||||
return annotatedReference(
|
||||
buildAnnotatedString {
|
||||
val styledText = stringResourceSafe(
|
||||
R.string.send_recipient_address_footer_highlighted_part,
|
||||
networkName,
|
||||
)
|
||||
val styledColor = TangemTheme.colors.text.secondary
|
||||
appendWithStyledPlaceholder(
|
||||
template = stringResourceSafe(
|
||||
R.string.send_recipient_address_footer_v2,
|
||||
networkName,
|
||||
),
|
||||
placeholder = networkName,
|
||||
) {
|
||||
withStyle(SpanStyle(fontWeight = FontWeight.Medium)) {
|
||||
appendColored(
|
||||
text = styledText,
|
||||
color = styledColor,
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
private fun LazyListScope.memoField(
|
||||
memoField: DestinationTextFieldUM.RecipientMemo?,
|
||||
onMemoChange: (String, Boolean) -> Unit,
|
||||
|
|
|
|||
|
|
@ -57,11 +57,7 @@ internal class SwapAmountFieldConverter(
|
|||
title = if (isSingleWallet) {
|
||||
resourceReference(R.string.send_from_title)
|
||||
} else {
|
||||
combinedReference(
|
||||
resourceReference(R.string.send_from_wallet_android),
|
||||
stringReference(" "),
|
||||
stringReference(userWallet.name),
|
||||
)
|
||||
resourceReference(R.string.send_from_wallet_name, wrappedList(userWallet.name))
|
||||
},
|
||||
value = "",
|
||||
),
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import com.tangem.features.swap.v2.impl.choosetoken.fromSupported.model.SwapChoo
|
|||
import com.tangem.features.swap.v2.impl.choosetoken.fromSupported.model.transformers.SwapChooseContentStateTransformer
|
||||
import com.tangem.features.swap.v2.impl.choosetoken.fromSupported.model.transformers.SwapChooseErrorStateTransformer
|
||||
import com.tangem.features.swap.v2.impl.common.SwapUtils.SEND_WITH_SWAP_PROVIDER_TYPES
|
||||
import com.tangem.features.swap.v2.impl.sendviaswap.analytics.SendWithSwapAnalyticEvents
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import com.tangem.utils.transformer.update
|
||||
import kotlinx.coroutines.delay
|
||||
|
|
@ -97,6 +98,14 @@ internal class SwapChooseTokenNetworkModel @Inject constructor(
|
|||
return@launch
|
||||
}
|
||||
delay(MINIMUM_LOADING_TIME)
|
||||
if (pairs.fromGroup.available.isEmpty()) {
|
||||
analyticsEventHandler.send(
|
||||
SendWithSwapAnalyticEvents.NoticeCanNotSwapToken(
|
||||
fromToken = params.initialCurrency,
|
||||
toTokenSymbol = params.token.symbol,
|
||||
),
|
||||
)
|
||||
}
|
||||
uiState.update(
|
||||
SwapChooseContentStateTransformer(
|
||||
pairs = pairs,
|
||||
|
|
|
|||
|
|
@ -32,4 +32,16 @@ internal sealed class SendWithSwapAnalyticEvents(
|
|||
RECEIVE_BLOCKCHAIN to toToken.network.name,
|
||||
),
|
||||
)
|
||||
|
||||
data class NoticeCanNotSwapToken(
|
||||
val fromToken: CryptoCurrency,
|
||||
val toTokenSymbol: String,
|
||||
) : SendWithSwapAnalyticEvents(
|
||||
event = "Notice - Can`t Swap This Token",
|
||||
params = mapOf(
|
||||
SEND_TOKEN to fromToken.symbol,
|
||||
RECEIVE_TOKEN to toTokenSymbol,
|
||||
SEND_BLOCKCHAIN to fromToken.network.name,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
@ -101,7 +101,7 @@ internal fun SendWithSwapSuccessContent(sendWithSwapUM: SendWithSwapUM) {
|
|||
)
|
||||
DestinationBlock(destinationUM.addressTextField)
|
||||
FeeBlock(feeSelectorUM = feeSelectorUM)
|
||||
Spacer(Modifier.height(60.dp))
|
||||
Spacer(Modifier.height(128.dp))
|
||||
}
|
||||
BottomFade(Modifier.align(Alignment.BottomCenter), TangemTheme.colors.background.tertiary)
|
||||
NavigationButtonsBlockV2(
|
||||
|
|
|
|||
|
|
@ -55,13 +55,9 @@ import com.tangem.domain.tokens.*
|
|||
import com.tangem.domain.tokens.legacy.TradeCryptoAction
|
||||
import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason
|
||||
import com.tangem.domain.tokens.model.TokenActionsState
|
||||
import com.tangem.domain.tokens.model.analytics.TokenReceiveAnalyticsEvent
|
||||
import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource
|
||||
import com.tangem.domain.tokens.model.analytics.TokenReceiveNewAnalyticsEvent
|
||||
import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent
|
||||
import com.tangem.domain.tokens.model.analytics.*
|
||||
import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent.Companion.toReasonAnalyticsText
|
||||
import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent.DetailsScreenOpened.TokenBalance
|
||||
import com.tangem.domain.tokens.model.analytics.TokenSwapPromoAnalyticsEvent
|
||||
import com.tangem.domain.transaction.error.AssociateAssetError
|
||||
import com.tangem.domain.transaction.error.IncompleteTransactionError
|
||||
import com.tangem.domain.transaction.error.OpenTrustlineError
|
||||
|
|
@ -1098,9 +1094,8 @@ internal class TokenDetailsModel @Inject constructor(
|
|||
return
|
||||
}
|
||||
}
|
||||
is CryptoCurrencyStatus.NoAccount,
|
||||
is CryptoCurrencyStatus.MissedDerivation,
|
||||
-> TokenBalance.NoAddress
|
||||
is CryptoCurrencyStatus.NoAccount -> TokenBalance.Empty
|
||||
is CryptoCurrencyStatus.MissedDerivation -> TokenBalance.NoAddress
|
||||
|
||||
is CryptoCurrencyStatus.NoAmount,
|
||||
is CryptoCurrencyStatus.Unreachable,
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.tangem.features.walletconnect.transaction.model
|
|||
import androidx.compose.runtime.Stable
|
||||
import com.arkivanov.decompose.router.stack.StackNavigation
|
||||
import com.arkivanov.decompose.router.stack.pushNew
|
||||
import com.domain.blockaid.models.dapp.CheckDAppResult
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
|
|
@ -132,7 +133,7 @@ internal class WcAddNetworkModel @Inject constructor(
|
|||
rawRequest = useCase.rawSdkRequest,
|
||||
network = useCase.network,
|
||||
emulationStatus = null,
|
||||
securityStatus = null,
|
||||
securityStatus = CheckDAppResult.FAILED_TO_VERIFY,
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import arrow.core.Either
|
|||
import com.arkivanov.decompose.router.stack.StackNavigation
|
||||
import com.arkivanov.decompose.router.stack.pop
|
||||
import com.arkivanov.decompose.router.stack.pushNew
|
||||
import com.domain.blockaid.models.dapp.CheckDAppResult
|
||||
import com.domain.blockaid.models.transaction.SimulationResult
|
||||
import com.domain.blockaid.models.transaction.ValidationResult
|
||||
import com.tangem.blockchain.common.TransactionData
|
||||
|
|
@ -94,6 +95,8 @@ internal class WcSendTransactionModel @Inject constructor(
|
|||
private var sign: () -> Unit = {}
|
||||
private val feeReloadState = MutableStateFlow(false)
|
||||
private val signatureReceivedAnalyticsSendState = MutableStateFlow(false)
|
||||
private val securityStatusState =
|
||||
MutableStateFlow<Lce<Throwable, BlockAidTransactionCheck.Result>>(Lce.Loading(partialContent = null))
|
||||
|
||||
init {
|
||||
@Suppress("UnusedPrivateMember")
|
||||
|
|
@ -130,6 +133,7 @@ internal class WcSendTransactionModel @Inject constructor(
|
|||
.collectLatest { (signState, securityCheck) ->
|
||||
if (signingIsDone(signState, useCase)) return@collectLatest
|
||||
|
||||
securityStatusState.value = securityCheck
|
||||
sendSignatureReceivedAnalytics(useCase, securityCheck)
|
||||
|
||||
this@WcSendTransactionModel.signState = signState
|
||||
|
|
@ -372,6 +376,12 @@ internal class WcSendTransactionModel @Inject constructor(
|
|||
false
|
||||
}
|
||||
is Either.Right<String> -> {
|
||||
val event = WcAnalyticEvents.SignatureRequestHandled(
|
||||
rawRequest = useCase.rawSdkRequest,
|
||||
network = useCase.network,
|
||||
securityStatus = securityStatusState.value.toCheckDAppResult(),
|
||||
)
|
||||
analytics.send(event)
|
||||
showSuccessSignMessage()
|
||||
router.pop()
|
||||
true
|
||||
|
|
@ -408,10 +418,22 @@ internal class WcSendTransactionModel @Inject constructor(
|
|||
rawRequest = useCase.rawSdkRequest,
|
||||
network = useCase.network,
|
||||
emulationStatus = emulationStatus,
|
||||
securityStatus = useCase.session.securityStatus,
|
||||
securityStatus = securityCheck.toCheckDAppResult(),
|
||||
),
|
||||
)
|
||||
|
||||
signatureReceivedAnalyticsSendState.value = true
|
||||
}
|
||||
|
||||
private fun Lce<Throwable, BlockAidTransactionCheck.Result>.toCheckDAppResult(): CheckDAppResult {
|
||||
return when (this) {
|
||||
is Lce.Content -> when (this.content.result.validation) {
|
||||
ValidationResult.SAFE -> CheckDAppResult.SAFE
|
||||
ValidationResult.UNSAFE, ValidationResult.WARNING -> CheckDAppResult.UNSAFE
|
||||
ValidationResult.FAILED_TO_VALIDATE -> CheckDAppResult.FAILED_TO_VERIFY
|
||||
}
|
||||
is Lce.Error -> CheckDAppResult.FAILED_TO_VERIFY
|
||||
is Lce.Loading -> CheckDAppResult.FAILED_TO_VERIFY
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ import androidx.compose.runtime.Stable
|
|||
import com.arkivanov.decompose.router.stack.StackNavigation
|
||||
import com.arkivanov.decompose.router.stack.pop
|
||||
import com.arkivanov.decompose.router.stack.pushNew
|
||||
import com.domain.blockaid.models.dapp.CheckDAppResult
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
|
|
@ -133,6 +134,12 @@ internal class WcSignTransactionModel @Inject constructor(
|
|||
private fun signingIsDone(signState: WcSignState<*>): Boolean {
|
||||
(signState.domainStep as? WcSignStep.Result)?.result?.let { result ->
|
||||
if (result.isRight()) {
|
||||
val event = WcAnalyticEvents.SignatureRequestHandled(
|
||||
rawRequest = useCase.rawSdkRequest,
|
||||
network = useCase.network,
|
||||
securityStatus = CheckDAppResult.FAILED_TO_VERIFY,
|
||||
)
|
||||
analytics.send(event)
|
||||
showSuccessSignMessage()
|
||||
}
|
||||
router.pop()
|
||||
|
|
@ -158,7 +165,7 @@ internal class WcSignTransactionModel @Inject constructor(
|
|||
rawRequest = useCase.rawSdkRequest,
|
||||
network = useCase.network,
|
||||
emulationStatus = null,
|
||||
securityStatus = null,
|
||||
securityStatus = CheckDAppResult.FAILED_TO_VERIFY,
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue