feat(ui): explain mining addresses everywhere and stop offering them for payment
Follow-up to 5246898. A transparent address only ever receives mining
rewards on DragonX (private chain), so:
- One explainer ("Receives solo-mining rewards only - the network rejects
payments to it. Rewards are shielded automatically once they mature.")
on the Overview row hover, the Receive picker hover, the Receive card
and the Validate Address result (now typed "Mining address
(transparent)").
- Receive: a selected mining address shows the explainer and a "Use a
shielded address" button (creates one if none exists) instead of the
payment request, and a "Not for payments" panel instead of a QR code.
The default selection prefers a shielded address; the "All" filter
hides empty mining addresses unless solo mining or marked as a mining
address; the filter reads All / Shielded / Mining.
- Request Payment: no transparent section, never prefilled with one.
- Overview: no "Mining - Mining" tag on a marked transparent row.
- FAQ: address answers rewritten; the send and memo answers no longer
imply you can pay a transparent address. All 8 languages.
i18n: 4 new keys, 6 FAQ answers updated in place, 2 dead keys removed,
CJK subset rebuilt. UI sweep: receive-mining-address and
modal-validate-mining targets.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "Hilfe & FAQ",
|
||||
"faq_search_hint": "FAQ durchsuchen…",
|
||||
"faq_title": "Hilfe & FAQ",
|
||||
"faq_w_addr_1_a": "Transparente Adressen (sie beginnen mit R oder t) funktionieren wie bei den meisten Coins: Beträge und Adressen sind öffentlich auf der Blockchain einsehbar.\n\nGeschützte Adressen (z-Adressen, beginnend mit zs) nutzen Zero-Knowledge-Kryptografie — Betrag, Absender und Empfänger sind on-chain verschlüsselt. Guthaben auf geschützten Adressen sind privat.",
|
||||
"faq_w_addr_1_a": "Abgeschirmte Adressen (z-Adressen, beginnend mit zs) sind die Adressen, die Sie bei DragonX verwenden. Sie nutzen Zero-Knowledge-Kryptografie: Betrag, Absender und Empfänger werden on-chain verschlüsselt, und Ihr Guthaben bleibt privat.\n\nTransparente Adressen (beginnend mit R) sind Mining-Adressen. DragonX ist eine vollständig private Chain, daher können sie nur Mining-Belohnungen empfangen – das Netzwerk lehnt jede an sie gesendete Zahlung ab. Dort eingehende Belohnungen sind öffentlich, bis sie abgeschirmt werden, was die Wallet automatisch erledigt.",
|
||||
"faq_w_addr_1_q": "Was ist der Unterschied zwischen transparenten und geschützten Adressen?",
|
||||
"faq_w_addr_2_a": "Bevorzugen Sie wann immer möglich geschützte (z-)Adressen — sie halten Ihr Guthaben und Ihren Zahlungsverlauf privat. DragonX ist eine Privacy-Coin, und geschützt ist die Standardeinstellung für empfangene Gelder.\n\nVerwenden Sie eine transparente Adresse nur, wenn ein Dienst, mit dem Sie interagieren, keine geschützten Adressen verarbeiten kann.",
|
||||
"faq_w_addr_2_a": "Verwenden Sie für alles, was Sie senden und empfangen, eine abgeschirmte (zs-)Adresse – bei DragonX ist sie die einzige Art, an die gezahlt werden kann.\n\nTransparente (Mining-)Adressen sind nur für Solo-Mining-Belohnungen da. Geben Sie nie eine für eine Zahlung heraus: Das Netzwerk würde sie ablehnen.",
|
||||
"faq_w_addr_2_q": "Welchen Adresstyp sollte ich verwenden?",
|
||||
"faq_w_addr_3_a": "Bei geschützten Adressen ist die Wiederverwendung unbedenklich und gibt keinen Verlauf preis. Bei transparenten Adressen verbessert eine neue Adresse pro Zahlung die Privatsphäre. Neue Adressen erstellen Sie im Tab Empfangen.",
|
||||
"faq_w_addr_3_a": "Eine abgeschirmte Adresse wiederzuverwenden ist unbedenklich und verrät nichts über Ihren Verlauf. Sie können trotzdem im Tab „Empfangen“ neue anlegen, zum Beispiel eine pro Kontakt, um zu sehen, wer Sie bezahlt hat. Mining-Adressen sind nur für Mining-Belohnungen da; eine neue brauchen Sie selten.",
|
||||
"faq_w_addr_3_q": "Sollte ich eine Adresse wiederverwenden oder eine neue erstellen?",
|
||||
"faq_w_addr_4_a": "Beim Schützen werden Coins von einer transparenten Adresse in eine geschützte verschoben und dadurch privat gemacht. Neu geschürfte Coins kommen transparent an und werden automatisch für Sie geschützt.\n\nSie können auch manuell aus der Wallet heraus schützen; ein Schutzvorgang ist einfach eine spezielle Transaktion und benötigt daher die normale Bestätigungszeit.",
|
||||
"faq_w_addr_4_a": "Beim Abschirmen werden Coins von einer transparenten (Mining-)Adresse auf eine abgeschirmte verschoben und damit privat. Neu geminte Coins kommen auf einer Mining-Adresse an und werden automatisch abgeschirmt, sobald sie gereift sind.\n\nSie können auch manuell in der Wallet abschirmen; eine Abschirmung ist nur eine besondere Transaktion und braucht daher die übliche Bestätigungszeit.",
|
||||
"faq_w_addr_4_q": "Was bedeutet „Schützen“?",
|
||||
"faq_w_addr_title": "Adressen & Privatsphäre",
|
||||
"faq_w_bal_1_a": "Solange Ihre Wallet noch synchronisiert, ist Ihr Guthaben unvollständig und kann 0 anzeigen — es wurden noch nicht alle Transaktionen gescannt. Es füllt sich, sobald die Synchronisierung abgeschlossen ist.\n\nBeobachten Sie die Statusleiste unten: Sie zeigt den Verbindungsstatus und die Blockhöhe an. Sobald die Synchronisierung abgeschlossen ist, ist Ihr Guthaben korrekt.",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "Ihre Seed-Phrase ist die primäre Sicherung und reicht aus, um alles wiederherzustellen. Eine Kopie Ihrer Wallet-Datei ist eine praktische zusätzliche Sicherung, die außerdem Bezeichnungen und Einstellungen erhält. Bewahren Sie jede Sicherung offline und privat auf.",
|
||||
"faq_w_seed_4_q": "Sollte ich auch wallet.dat sichern?",
|
||||
"faq_w_seed_title": "Seed-Phrase & Sicherung",
|
||||
"faq_w_send_1_a": "Öffnen Sie den Tab Senden, fügen Sie die Adresse des Empfängers ein, geben Sie einen Betrag ein und bestätigen Sie. Wenn die Wallet verschlüsselt ist, werden Sie gebeten, sie für die Transaktion zu entsperren.\n\nSendungen an geschützte Adressen sind privat; Sendungen an transparente Adressen sind öffentlich.",
|
||||
"faq_w_send_1_a": "Öffnen Sie den Tab Senden, fügen Sie die Adresse des Empfängers ein, geben Sie einen Betrag ein und bestätigen Sie. Wenn die Wallet verschlüsselt ist, werden Sie gebeten, sie für die Transaktion zu entsperren.\n\nZahlungen gehen an abgeschirmte (zs-)Adressen und bleiben privat. Die Wallet sendet nicht an eine transparente (Mining-)Adresse: Das Netzwerk lehnt Zahlungen an sie ab.",
|
||||
"faq_w_send_1_q": "Wie sende ich Gelder?",
|
||||
"faq_w_send_2_a": "DragonX-Gebühren sind sehr niedrig und werden automatisch festgelegt. Die Gebühr wird angezeigt, bevor Sie bestätigen. Normalerweise müssen Sie sie nicht ändern.",
|
||||
"faq_w_send_2_q": "Welche Gebühr zahle ich?",
|
||||
"faq_w_send_3_a": "Ja — beim Senden an eine geschützte (z-)Adresse können Sie ein verschlüsseltes Memo anhängen. Nur der Empfänger kann es lesen. Transparente Adressen unterstützen keine Memos.",
|
||||
"faq_w_send_3_a": "Ja — beim Senden an eine geschützte (z-)Adresse können Sie ein verschlüsseltes Memo anhängen. Nur der Empfänger kann es lesen.",
|
||||
"faq_w_send_3_q": "Kann ich einer Zahlung eine Nachricht beifügen?",
|
||||
"faq_w_send_4_a": "Eine Transaktion ist „ausstehend“, bis sie in einen Block aufgenommen wird und Bestätigungen erhält. Das dauert normalerweise ein bis zwei Minuten. Geschützte Transaktionen erfordern außerdem, dass Ihre Wallet synchronisiert ist, um den Beweis zu erstellen.\n\nBleibt eine Sendung ungewöhnlich lange ausstehend, prüfen Sie, ob Ihre Wallet verbunden und synchronisiert ist (siehe die Statusleiste unten im Fenster).",
|
||||
"faq_w_send_4_q": "Ich habe eine Zahlung gesendet, aber sie zeigt „ausstehend“ — warum?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "Miner-Gebühr",
|
||||
"mining": "Mining",
|
||||
"mining_active": "Aktiv",
|
||||
"mining_addr_explainer": "Empfängt nur Solo-Mining-Belohnungen – das Netzwerk lehnt Zahlungen an diese Adresse ab. Belohnungen werden automatisch abgeschirmt, sobald sie gereift sind.",
|
||||
"mining_address": "Mining-Adresse",
|
||||
"mining_address_copied": "Mining-Adresse kopiert",
|
||||
"mining_all_time": "Gesamt",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "Wallet: %.1f GB",
|
||||
"ram_wallet_mb": "Wallet: %.0f MB",
|
||||
"receive": "Empfangen",
|
||||
"receive_not_for_payments": "Nicht für Zahlungen",
|
||||
"receive_use_shielded": "Abgeschirmte Adresse verwenden",
|
||||
"received": "empfangen",
|
||||
"received_filter": "Empfangen",
|
||||
"received_label": "Empfangen",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "Adresse auswählen...",
|
||||
"request_shielded_addrs": "-- Abgeschirmte Adressen --",
|
||||
"request_title": "Zahlung anfordern",
|
||||
"request_transparent_addrs": "-- Transparente Adressen --",
|
||||
"request_uri_copied": "Zahlungs-URI in Zwischenablage kopiert",
|
||||
"rescan": "Neu scannen",
|
||||
"rescan_bootstrapped_msg": "Ihr Node wurde per Bootstrap eingerichtet, daher liegen Blöcke unterhalb des Snapshots nicht auf der Festplatte und ein Neuscan ab dem Genesis-Block würde fehlschlagen. Führen Sie den Neuscan ab einer Höhe durch, die Ihr Snapshot umfasst, um das ausgegebene Guthaben Ihrer Wallet abzugleichen. Ihre wallet.dat und Ihre Blockchain-Daten werden nicht gelöscht.",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "Geben Sie eine DragonX-Adresse ein, um zu prüfen, ob sie gültig ist und ob sie zu dieser Wallet gehört.",
|
||||
"validate_invalid": "UNGÜLTIG",
|
||||
"validate_is_mine": "Diese Wallet besitzt diese Adresse",
|
||||
"validate_mining_type": "Mining-Adresse (transparent)",
|
||||
"validate_not_mine": "Nicht im Besitz dieser Wallet",
|
||||
"validate_ownership": "Eigentum:",
|
||||
"validate_results": "Ergebnisse:",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "Abgeschirmt (z-Adresse)",
|
||||
"validate_status": "Status:",
|
||||
"validate_title": "Adresse validieren",
|
||||
"validate_transparent_type": "Transparent (t-Adresse)",
|
||||
"validate_type": "Typ:",
|
||||
"validate_valid": "GÜLTIG",
|
||||
"validating": "Validiere...",
|
||||
|
||||
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "Ayuda y preguntas frecuentes",
|
||||
"faq_search_hint": "Buscar en las preguntas frecuentes…",
|
||||
"faq_title": "Ayuda y preguntas frecuentes",
|
||||
"faq_w_addr_1_a": "Las direcciones transparentes (empiezan con R o t) funcionan como la mayoría de las monedas: los montos y las direcciones son públicos en la cadena de bloques.\n\nLas direcciones blindadas (direcciones z, empiezan con zs) usan criptografía de conocimiento cero: el monto, el remitente y el destinatario quedan cifrados en la cadena. Los saldos en direcciones blindadas son privados.",
|
||||
"faq_w_addr_1_a": "Las direcciones blindadas (direcciones z, que empiezan por zs) son las que usas en DragonX. Utilizan criptografía de conocimiento cero, así que el importe, el remitente y el destinatario se cifran en la cadena y tu saldo sigue siendo privado.\n\nLas direcciones transparentes (que empiezan por R) son direcciones de minería. DragonX es una cadena totalmente privada, por lo que solo pueden recibir recompensas de minería; la red rechaza cualquier pago enviado a ellas. Las recompensas que llegan allí son públicas hasta que se blindan, algo que la cartera hace automáticamente.",
|
||||
"faq_w_addr_1_q": "¿Cuál es la diferencia entre direcciones transparentes y blindadas?",
|
||||
"faq_w_addr_2_a": "Prefiere las direcciones blindadas (z) siempre que sea posible: mantienen privados tu saldo y tu historial de pagos. DragonX es una moneda de privacidad y lo blindado es la opción predeterminada para los fondos recibidos.\n\nUsa una dirección transparente solo cuando un servicio con el que interactúas no admita direcciones blindadas.",
|
||||
"faq_w_addr_2_a": "Usa una dirección blindada (zs) para todo lo que envíes y recibas; en DragonX es el único tipo al que se puede pagar.\n\nLas direcciones transparentes (de minería) son solo para recompensas de minería en solitario. Nunca des una para recibir un pago: la red lo rechazará.",
|
||||
"faq_w_addr_2_q": "¿Qué tipo de dirección debería usar?",
|
||||
"faq_w_addr_3_a": "Para las direcciones blindadas, reutilizarlas está bien y no filtra el historial. Para las direcciones transparentes, usar una dirección nueva por cada pago mejora la privacidad. Crea nuevas direcciones desde la pestaña Recibir.",
|
||||
"faq_w_addr_3_a": "Reutilizar una dirección blindada no es un problema y no revela tu historial. Aun así puedes crear otras nuevas en la pestaña Recibir, por ejemplo una por contacto para saber quién te ha pagado. Las direcciones de minería son solo para recompensas de minería; rara vez necesitarás una nueva.",
|
||||
"faq_w_addr_3_q": "¿Debería reutilizar una dirección o crear una nueva?",
|
||||
"faq_w_addr_4_a": "Blindar mueve monedas de una dirección transparente a una blindada, haciéndolas privadas. Las monedas recién minadas llegan transparentes y se blindan automáticamente por ti.\n\nTambién puedes blindar manualmente desde la cartera; blindar es solo una transacción especial, así que tarda el tiempo de confirmación normal en completarse.",
|
||||
"faq_w_addr_4_a": "Blindar mueve monedas de una dirección transparente (de minería) a una blindada, haciéndolas privadas. Las monedas recién minadas llegan a una dirección de minería y se blindan automáticamente cuando maduran.\n\nTambién puedes blindar manualmente desde la cartera; un blindaje es solo una transacción especial, así que tarda el tiempo normal de confirmación.",
|
||||
"faq_w_addr_4_q": "¿Qué es \"blindar\"?",
|
||||
"faq_w_addr_title": "Direcciones y privacidad",
|
||||
"faq_w_bal_1_a": "Mientras tu cartera aún se está sincronizando, tu saldo está incompleto y puede mostrar 0 — todavía no ha escaneado todas tus transacciones. Se completa cuando termina la sincronización.\n\nObserva la barra de estado en la parte inferior: muestra el estado de la conexión y la altura de bloque. Una vez que la sincronización termina, tu saldo es exacto.",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "Tu frase de recuperación es el respaldo principal y basta para restaurarlo todo. Una copia de tu archivo de cartera es un respaldo secundario práctico que además conserva las etiquetas y la configuración. Mantén cualquier respaldo sin conexión y privado.",
|
||||
"faq_w_seed_4_q": "¿Debería respaldar también wallet.dat?",
|
||||
"faq_w_seed_title": "Frase de recuperación y copia de seguridad",
|
||||
"faq_w_send_1_a": "Abre la pestaña Enviar, pega la dirección del destinatario, ingresa un monto y confirma. Si la cartera está cifrada, se te pedirá desbloquearla para la transacción.\n\nLos envíos a direcciones blindadas son privados; los envíos a direcciones transparentes son públicos.",
|
||||
"faq_w_send_1_a": "Abre la pestaña Enviar, pega la dirección del destinatario, ingresa un monto y confirma. Si la cartera está cifrada, se te pedirá desbloquearla para la transacción.\n\nLos pagos van a direcciones blindadas (zs) y son privados. La cartera no envía a una dirección transparente (de minería): la red rechaza los pagos a ellas.",
|
||||
"faq_w_send_1_q": "¿Cómo envío fondos?",
|
||||
"faq_w_send_2_a": "Las comisiones de DragonX son muy bajas y se establecen automáticamente. La comisión se muestra antes de confirmar. Normalmente no necesitas cambiarla.",
|
||||
"faq_w_send_2_q": "¿Qué comisión pago?",
|
||||
"faq_w_send_3_a": "Sí — al enviar a una dirección blindada (z) puedes incluir un memo cifrado. Solo el destinatario puede leerlo. Las direcciones transparentes no admiten memos.",
|
||||
"faq_w_send_3_a": "Sí — al enviar a una dirección blindada (z) puedes incluir un memo cifrado. Solo el destinatario puede leerlo.",
|
||||
"faq_w_send_3_q": "¿Puedo adjuntar un mensaje a un pago?",
|
||||
"faq_w_send_4_a": "Una transacción está \"pendiente\" hasta que se mina en un bloque y obtiene confirmaciones. Esto suele tardar uno o dos minutos. Las transacciones blindadas también necesitan que tu cartera esté sincronizada para construir la prueba.\n\nSi un envío permanece pendiente durante un tiempo inusualmente largo, verifica que tu cartera esté conectada y sincronizada (mira la barra de estado en la parte inferior de la ventana).",
|
||||
"faq_w_send_4_q": "Envié un pago pero dice pendiente — ¿por qué?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "Tarifa de minero",
|
||||
"mining": "Minería",
|
||||
"mining_active": "Activo",
|
||||
"mining_addr_explainer": "Solo recibe recompensas de minería en solitario; la red rechaza los pagos a esta dirección. Las recompensas se blindan automáticamente cuando maduran.",
|
||||
"mining_address": "Dirección de minería",
|
||||
"mining_address_copied": "Dirección de minería copiada",
|
||||
"mining_all_time": "Todo el Tiempo",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "Billetera: %.1f GB",
|
||||
"ram_wallet_mb": "Billetera: %.0f MB",
|
||||
"receive": "Recibir",
|
||||
"receive_not_for_payments": "No para pagos",
|
||||
"receive_use_shielded": "Usar una dirección blindada",
|
||||
"received": "recibido",
|
||||
"received_filter": "Recibido",
|
||||
"received_label": "Recibido",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "Seleccionar dirección...",
|
||||
"request_shielded_addrs": "-- Direcciones Protegidas --",
|
||||
"request_title": "Solicitar Pago",
|
||||
"request_transparent_addrs": "-- Direcciones Transparentes --",
|
||||
"request_uri_copied": "URI de pago copiada al portapapeles",
|
||||
"rescan": "Re-escanear",
|
||||
"rescan_bootstrapped_msg": "Tu nodo se inicializó con un bootstrap, por lo que los bloques anteriores a la instantánea no están en disco y un reescaneo desde el génesis fallaría. Reescanea desde una altura que incluya tu instantánea para reconciliar el saldo gastado de tu cartera. Tu wallet.dat y los datos de la cadena no se eliminan.",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "Ingresa una dirección DragonX para verificar si es válida y si pertenece a esta cartera.",
|
||||
"validate_invalid": "INVÁLIDA",
|
||||
"validate_is_mine": "Esta cartera es dueña de esta dirección",
|
||||
"validate_mining_type": "Dirección de minería (transparente)",
|
||||
"validate_not_mine": "No es propiedad de esta cartera",
|
||||
"validate_ownership": "Propiedad:",
|
||||
"validate_results": "Resultados:",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "Protegida (dirección z)",
|
||||
"validate_status": "Estado:",
|
||||
"validate_title": "Validar Dirección",
|
||||
"validate_transparent_type": "Transparente (dirección t)",
|
||||
"validate_type": "Tipo:",
|
||||
"validate_valid": "VÁLIDA",
|
||||
"validating": "Validando...",
|
||||
|
||||
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "Aide et FAQ",
|
||||
"faq_search_hint": "Rechercher dans la FAQ…",
|
||||
"faq_title": "Aide et FAQ",
|
||||
"faq_w_addr_1_a": "Les adresses transparentes (elles commencent par R ou t) fonctionnent comme la plupart des cryptomonnaies : les montants et adresses sont publics sur la blockchain.\n\nLes adresses blindées (adresses Z, commençant par zs) utilisent la cryptographie à divulgation nulle de connaissance — le montant, l'expéditeur et le destinataire sont chiffrés sur la chaîne. Les soldes détenus sur des adresses blindées sont privés.",
|
||||
"faq_w_addr_1_a": "Les adresses blindées (adresses z, commençant par zs) sont celles que vous utilisez sur DragonX. Elles reposent sur une cryptographie à divulgation nulle de connaissance : le montant, l'expéditeur et le destinataire sont chiffrés sur la blockchain, et votre solde reste privé.\n\nLes adresses transparentes (commençant par R) sont des adresses de minage. DragonX est une blockchain entièrement privée : elles ne peuvent recevoir que des récompenses de minage — le réseau refuse tout paiement qui leur est envoyé. Les récompenses qui y arrivent sont publiques jusqu'à ce qu'elles soient blindées, ce que le portefeuille fait automatiquement.",
|
||||
"faq_w_addr_1_q": "Quelle est la différence entre les adresses transparentes et blindées ?",
|
||||
"faq_w_addr_2_a": "Privilégiez les adresses blindées (Z) autant que possible — elles préservent la confidentialité de votre solde et de votre historique de paiements. DragonX est une cryptomonnaie axée sur la confidentialité, et le blindage est le mode par défaut pour les fonds reçus.\n\nN'utilisez une adresse transparente que lorsqu'un service avec lequel vous interagissez ne peut pas gérer les adresses blindées.",
|
||||
"faq_w_addr_2_a": "Utilisez une adresse blindée (zs) pour tout ce que vous envoyez et recevez — sur DragonX, c'est le seul type d'adresse qui puisse être payé.\n\nLes adresses transparentes (de minage) servent uniquement aux récompenses de minage en solo. Ne la communiquez jamais pour un paiement : le réseau le refuserait.",
|
||||
"faq_w_addr_2_q": "Quel type d'adresse dois-je utiliser ?",
|
||||
"faq_w_addr_3_a": "Pour les adresses blindées, la réutilisation ne pose aucun problème et ne révèle pas l'historique. Pour les adresses transparentes, utiliser une nouvelle adresse à chaque paiement améliore la confidentialité. Créez de nouvelles adresses depuis l'onglet Recevoir.",
|
||||
"faq_w_addr_3_a": "Réutiliser une adresse blindée ne pose aucun problème et ne révèle pas votre historique. Vous pouvez tout de même en créer de nouvelles depuis l'onglet Recevoir, par exemple une par contact pour savoir qui vous a payé. Les adresses de minage servent uniquement aux récompenses de minage ; vous aurez rarement besoin d'en créer une nouvelle.",
|
||||
"faq_w_addr_3_q": "Dois-je réutiliser une adresse ou en créer une nouvelle ?",
|
||||
"faq_w_addr_4_a": "Le blindage déplace des pièces d'une adresse transparente vers une adresse blindée, les rendant privées. Les pièces nouvellement minées arrivent en transparent et sont blindées automatiquement pour vous.\n\nVous pouvez aussi blinder manuellement depuis le portefeuille ; un blindage est simplement une transaction spéciale, il faut donc un temps de confirmation normal pour qu'elle se termine.",
|
||||
"faq_w_addr_4_a": "Le blindage déplace des pièces d'une adresse transparente (de minage) vers une adresse blindée, ce qui les rend privées. Les pièces fraîchement minées arrivent sur une adresse de minage et sont blindées automatiquement une fois arrivées à maturité.\n\nVous pouvez aussi blinder manuellement depuis le portefeuille ; un blindage n'est qu'une transaction particulière, il prend donc le temps de confirmation habituel.",
|
||||
"faq_w_addr_4_q": "Qu'est-ce que le « blindage » ?",
|
||||
"faq_w_addr_title": "Adresses et confidentialité",
|
||||
"faq_w_bal_1_a": "Tant que votre portefeuille est encore en cours de synchronisation, votre solde est incomplet et peut afficher 0 — il n'a pas encore analysé toutes vos transactions. Il se complète une fois la synchronisation terminée.\n\nSurveillez la barre d'état en bas : elle indique l'état de la connexion et la hauteur de bloc. Une fois la synchronisation terminée, votre solde est exact.",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "Votre phrase de récupération est la sauvegarde principale et suffit à tout restaurer. Une copie de votre fichier de portefeuille est une sauvegarde secondaire pratique qui conserve aussi les libellés et les paramètres. Conservez toute sauvegarde hors ligne et en lieu privé.",
|
||||
"faq_w_seed_4_q": "Dois-je aussi sauvegarder wallet.dat ?",
|
||||
"faq_w_seed_title": "Phrase de récupération et sauvegarde",
|
||||
"faq_w_send_1_a": "Ouvrez l'onglet Envoyer, collez l'adresse du destinataire, saisissez un montant et confirmez. Si le portefeuille est chiffré, on vous demandera de le déverrouiller pour la transaction.\n\nLes envois vers des adresses blindées sont privés ; les envois vers des adresses transparentes sont publics.",
|
||||
"faq_w_send_1_a": "Ouvrez l'onglet Envoyer, collez l'adresse du destinataire, saisissez un montant et confirmez. Si le portefeuille est chiffré, on vous demandera de le déverrouiller pour la transaction.\n\nLes paiements vont vers des adresses blindées (zs) et restent privés. Le portefeuille n'envoie pas vers une adresse transparente (de minage) : le réseau refuse les paiements vers elles.",
|
||||
"faq_w_send_1_q": "Comment envoyer des fonds ?",
|
||||
"faq_w_send_2_a": "Les frais DragonX sont très faibles et définis automatiquement. Les frais sont affichés avant que vous ne confirmiez. Vous n'avez normalement pas besoin de les modifier.",
|
||||
"faq_w_send_2_q": "Quels frais dois-je payer ?",
|
||||
"faq_w_send_3_a": "Oui — lors de l'envoi vers une adresse blindée (Z), vous pouvez inclure un mémo chiffré. Seul le destinataire peut le lire. Les adresses transparentes ne prennent pas en charge les mémos.",
|
||||
"faq_w_send_3_a": "Oui — lors de l'envoi vers une adresse blindée (Z), vous pouvez inclure un mémo chiffré. Seul le destinataire peut le lire.",
|
||||
"faq_w_send_3_q": "Puis-je joindre un message à un paiement ?",
|
||||
"faq_w_send_4_a": "Une transaction est « en attente » jusqu'à ce qu'elle soit minée dans un bloc et gagne des confirmations. Cela prend généralement une minute ou deux. Les transactions blindées nécessitent aussi que votre portefeuille soit synchronisé pour construire la preuve.\n\nSi un envoi reste en attente anormalement longtemps, vérifiez que votre portefeuille est connecté et synchronisé (voir la barre d'état en bas de la fenêtre).",
|
||||
"faq_w_send_4_q": "J'ai envoyé un paiement mais il indique « en attente » — pourquoi ?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "Frais de mineur",
|
||||
"mining": "Minage",
|
||||
"mining_active": "Actif",
|
||||
"mining_addr_explainer": "Ne reçoit que des récompenses de minage en solo — le réseau refuse les paiements vers cette adresse. Les récompenses sont blindées automatiquement une fois arrivées à maturité.",
|
||||
"mining_address": "Adresse de minage",
|
||||
"mining_address_copied": "Adresse de minage copiée",
|
||||
"mining_all_time": "Tout le temps",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "Portefeuille : %.1f Go",
|
||||
"ram_wallet_mb": "Portefeuille : %.0f Mo",
|
||||
"receive": "Recevoir",
|
||||
"receive_not_for_payments": "Pas pour les paiements",
|
||||
"receive_use_shielded": "Utiliser une adresse blindée",
|
||||
"received": "reçu",
|
||||
"received_filter": "Reçu",
|
||||
"received_label": "Reçu",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "Sélectionner une adresse...",
|
||||
"request_shielded_addrs": "-- Adresses blindées --",
|
||||
"request_title": "Demander un paiement",
|
||||
"request_transparent_addrs": "-- Adresses transparentes --",
|
||||
"request_uri_copied": "URI de paiement copiée dans le presse-papiers",
|
||||
"rescan": "Re-scanner",
|
||||
"rescan_bootstrapped_msg": "Votre nœud a été initialisé par bootstrap, les blocs situés en dessous de l'instantané ne sont donc pas sur le disque et un rescan depuis la genèse échouerait. Effectuez un rescan à partir d'une hauteur incluse dans votre instantané pour réconcilier le solde dépensé de votre portefeuille. Votre fichier wallet.dat et vos données de chaîne ne sont pas supprimés.",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "Entrez une adresse DragonX pour vérifier si elle est valide et si elle appartient à ce portefeuille.",
|
||||
"validate_invalid": "INVALIDE",
|
||||
"validate_is_mine": "Ce portefeuille possède cette adresse",
|
||||
"validate_mining_type": "Adresse de minage (transparente)",
|
||||
"validate_not_mine": "N'appartient pas à ce portefeuille",
|
||||
"validate_ownership": "Propriété :",
|
||||
"validate_results": "Résultats :",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "Blindée (z-adresse)",
|
||||
"validate_status": "Statut :",
|
||||
"validate_title": "Valider l'adresse",
|
||||
"validate_transparent_type": "Transparente (t-adresse)",
|
||||
"validate_type": "Type :",
|
||||
"validate_valid": "VALIDE",
|
||||
"validating": "Validation...",
|
||||
|
||||
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "ヘルプ&FAQ",
|
||||
"faq_search_hint": "FAQを検索…",
|
||||
"faq_title": "ヘルプ&FAQ",
|
||||
"faq_w_addr_1_a": "透明アドレス(RまたはtまたはR始まり)はほとんどのコインと同様に動作します。金額とアドレスはブロックチェーン上で公開されます。\n\nシールドアドレス(zアドレス、zsで始まる)はゼロ知識暗号を使用し、金額・送信者・受信者はチェーン上で暗号化されます。シールドアドレスに保有された残高は非公開です。",
|
||||
"faq_w_addr_1_a": "シールドアドレス(zs で始まる z アドレス)は、DragonX で使用するアドレスです。ゼロ知識暗号を使用するため、金額・送信者・受信者はチェーン上で暗号化され、残高は非公開に保たれます。\n\n透明アドレス(R で始まる)はマイニングアドレスです。DragonX は完全にプライベートなチェーンのため、マイニング報酬しか受け取れず、送られた支払いはネットワークによって拒否されます。そこに届いた報酬はシールドされるまで公開されますが、シールドはウォレットが自動的に行います。",
|
||||
"faq_w_addr_1_q": "透明アドレスとシールドアドレスの違いは何ですか?",
|
||||
"faq_w_addr_2_a": "できる限りシールド(z)アドレスを使用してください。残高と支払い履歴を非公開に保てます。DragonXはプライバシーコインであり、受け取る資金はデフォルトでシールドされます。\n\n透明アドレスは、やり取りするサービスがシールドアドレスに対応していない場合のみ使用してください。",
|
||||
"faq_w_addr_2_a": "送受信にはすべてシールド(zs)アドレスを使用してください。DragonX で支払いを受け取れるのはこの種類だけです。\n\n透明(マイニング)アドレスはソロマイニング報酬専用です。支払いのために他人に教えないでください。ネットワークが拒否します。",
|
||||
"faq_w_addr_2_q": "どちらのアドレスタイプを使うべきですか?",
|
||||
"faq_w_addr_3_a": "シールドアドレスは再利用しても問題なく、履歴が漏れることもありません。透明アドレスは支払いごとに新しいアドレスを使うとプライバシーが向上します。新しいアドレスは受信タブから作成できます。",
|
||||
"faq_w_addr_3_a": "シールドアドレスを再利用しても問題はなく、履歴が漏れることもありません。それでも「受信」タブで新しいアドレスを作成できます。たとえば連絡先ごとに 1 つ作れば、誰が支払ったかがわかります。マイニングアドレスはマイニング報酬専用で、新しく作る必要はほとんどありません。",
|
||||
"faq_w_addr_3_q": "アドレスは使い回すべきですか、それとも新しく作るべきですか?",
|
||||
"faq_w_addr_4_a": "シールド化とは、コインを透明アドレスからシールドアドレスへ移し、非公開にすることです。新しくマイニングされたコインは透明な状態で届き、自動的にシールドされます。\n\n手動でシールドすることもできます。シールドは特別な種類のトランザクションにすぎないため、完了までに通常の確認時間がかかります。",
|
||||
"faq_w_addr_4_a": "シールドとは、透明(マイニング)アドレスのコインをシールドアドレスに移して非公開にすることです。新たにマイニングされたコインはマイニングアドレスに届き、成熟すると自動的にシールドされます。\n\nウォレットから手動でシールドすることもできます。シールドは特別なトランザクションにすぎないため、通常の承認時間がかかります。",
|
||||
"faq_w_addr_4_q": "「シールド化」とは何ですか?",
|
||||
"faq_w_addr_title": "アドレスとプライバシー",
|
||||
"faq_w_bal_1_a": "ウォレットがまだ同期中の場合、残高は不完全で0と表示されることがあります。まだすべてのトランザクションをスキャンしていないためです。同期が完了すると反映されます。\n\n画面下部のステータスバーを確認してください。接続状態とブロック高が表示されます。同期が完了すれば残高は正確になります。",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "シードフレーズは主要なバックアップであり、これだけですべてを復元できます。ウォレットファイルのコピーは便利な二次バックアップで、ラベルや設定も保持されます。どちらのバックアップもオフラインかつ非公開の場所に保管してください。",
|
||||
"faq_w_seed_4_q": "wallet.dat もバックアップすべきですか?",
|
||||
"faq_w_seed_title": "シードフレーズとバックアップ",
|
||||
"faq_w_send_1_a": "送金タブを開き、受取人のアドレスを貼り付け、金額を入力して確認してください。ウォレットが暗号化されている場合、トランザクションのためにロック解除を求められます。\n\nシールドアドレスへの送金は非公開、透明アドレスへの送金は公開されます。",
|
||||
"faq_w_send_1_a": "送金タブを開き、受取人のアドレスを貼り付け、金額を入力して確認してください。ウォレットが暗号化されている場合、トランザクションのためにロック解除を求められます。\n\n支払いはシールド(zs)アドレスに送られ、非公開に保たれます。ウォレットは透明(マイニング)アドレスには送金しません。ネットワークがそのアドレスへの支払いを拒否するためです。",
|
||||
"faq_w_send_1_q": "資金を送金するにはどうすればよいですか?",
|
||||
"faq_w_send_2_a": "DragonXの手数料は非常に低く、自動的に設定されます。手数料は確認前に表示されます。通常は変更する必要はありません。",
|
||||
"faq_w_send_2_q": "どのくらいの手数料がかかりますか?",
|
||||
"faq_w_send_3_a": "はい — シールド(z)アドレスへ送金する際は、暗号化されたメモを添付できます。読めるのは受取人だけです。透明アドレスはメモに対応していません。",
|
||||
"faq_w_send_3_a": "はい — シールド(z)アドレスへ送金する際は、暗号化されたメモを添付できます。読めるのは受取人だけです。",
|
||||
"faq_w_send_3_q": "支払いにメッセージを添付できますか?",
|
||||
"faq_w_send_4_a": "トランザクションはブロックに取り込まれ、確認数を得るまで「保留中」となります。通常1~2分ほどかかります。シールドトランザクションでは、証明を生成するためにウォレットが同期済みである必要もあります。\n\n送金が異常に長く保留中のままの場合は、ウォレットが接続され、同期済みであることを確認してください(ウィンドウ下部のステータスバーを参照)。",
|
||||
"faq_w_send_4_q": "支払いを送りましたが「保留中」のままです — なぜですか?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "マイナー手数料",
|
||||
"mining": "マイニング",
|
||||
"mining_active": "アクティブ",
|
||||
"mining_addr_explainer": "ソロマイニング報酬のみを受け取ります。ネットワークはこのアドレスへの支払いを拒否します。報酬は成熟すると自動的にシールドされます。",
|
||||
"mining_address": "マイニングアドレス",
|
||||
"mining_address_copied": "マイニングアドレスをコピーしました",
|
||||
"mining_all_time": "全期間",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "ウォレット:%.1f GB",
|
||||
"ram_wallet_mb": "ウォレット:%.0f MB",
|
||||
"receive": "受信",
|
||||
"receive_not_for_payments": "支払いには使えません",
|
||||
"receive_use_shielded": "シールドアドレスを使う",
|
||||
"received": "受信済み",
|
||||
"received_filter": "受信済み",
|
||||
"received_label": "受信済み",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "アドレスを選択...",
|
||||
"request_shielded_addrs": "-- シールドアドレス --",
|
||||
"request_title": "支払いを請求",
|
||||
"request_transparent_addrs": "-- 透明アドレス --",
|
||||
"request_uri_copied": "支払いURIをクリップボードにコピーしました",
|
||||
"rescan": "再スキャン",
|
||||
"rescan_bootstrapped_msg": "ノードはブートストラップされているため、スナップショットより下のブロックはディスク上になく、ジェネシスからの再スキャンは失敗します。ウォレットの使用済み残高を照合するには、スナップショットに含まれる高さから再スキャンしてください。wallet.dat とチェーンデータは削除されません。",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "DragonXアドレスを入力して、有効かどうか、そしてこのウォレットに属しているかどうかを確認します。",
|
||||
"validate_invalid": "無効",
|
||||
"validate_is_mine": "このウォレットがこのアドレスを所有しています",
|
||||
"validate_mining_type": "マイニングアドレス(透明)",
|
||||
"validate_not_mine": "このウォレットに属していません",
|
||||
"validate_ownership": "所有者:",
|
||||
"validate_results": "結果:",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "シールド(zアドレス)",
|
||||
"validate_status": "ステータス:",
|
||||
"validate_title": "アドレスを検証",
|
||||
"validate_transparent_type": "透明(tアドレス)",
|
||||
"validate_type": "タイプ:",
|
||||
"validate_valid": "有効",
|
||||
"validating": "検証中...",
|
||||
|
||||
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "도움말 및 FAQ",
|
||||
"faq_search_hint": "FAQ 검색…",
|
||||
"faq_title": "도움말 및 FAQ",
|
||||
"faq_w_addr_1_a": "투명 주소(R 또는 t로 시작)는 대부분의 코인처럼 작동합니다. 금액과 주소가 블록체인에 공개됩니다.\n\n보호 주소(zs로 시작하는 z-주소)는 영지식 암호화를 사용합니다 — 금액, 발신자, 수신자가 체인상에서 암호화됩니다. 보호 주소에 보관된 잔액은 비공개입니다.",
|
||||
"faq_w_addr_1_a": "차폐 주소(zs로 시작하는 z 주소)는 DragonX에서 사용하는 주소입니다. 영지식 암호를 사용하므로 금액, 보낸 사람, 받는 사람이 체인에서 암호화되고 잔액이 비공개로 유지됩니다.\n\n투명 주소(R로 시작)는 채굴 주소입니다. DragonX는 완전한 프라이빗 체인이므로 이 주소는 채굴 보상만 받을 수 있으며, 네트워크가 이 주소로 보내는 모든 결제를 거부합니다. 그곳에 들어온 보상은 차폐되기 전까지 공개되며, 차폐는 지갑이 자동으로 처리합니다.",
|
||||
"faq_w_addr_1_q": "투명 주소와 보호 주소의 차이는 무엇인가요?",
|
||||
"faq_w_addr_2_a": "가능하면 항상 보호(z) 주소를 사용하세요 — 잔액과 결제 내역이 비공개로 유지됩니다. DragonX는 프라이버시 코인이며, 수신 자금의 기본값은 보호 주소입니다.\n\n상대방 서비스가 보호 주소를 처리할 수 없는 경우에만 투명 주소를 사용하세요.",
|
||||
"faq_w_addr_2_a": "보내고 받는 모든 거래에 차폐(zs) 주소를 사용하세요. DragonX에서는 이 주소만 결제를 받을 수 있습니다.\n\n투명(채굴) 주소는 솔로 채굴 보상 전용입니다. 결제용으로 절대 알려주지 마세요. 네트워크가 거부합니다.",
|
||||
"faq_w_addr_2_q": "어떤 주소 유형을 사용해야 하나요?",
|
||||
"faq_w_addr_3_a": "보호 주소는 재사용해도 괜찮으며 내역이 노출되지 않습니다. 투명 주소는 결제마다 새 주소를 사용하는 것이 프라이버시에 좋습니다. 수신 탭에서 새 주소를 만들 수 있습니다.",
|
||||
"faq_w_addr_3_a": "차폐 주소는 재사용해도 괜찮으며 기록이 노출되지 않습니다. 그래도 받기 탭에서 새 주소를 만들 수 있습니다. 예를 들어 연락처마다 하나씩 만들면 누가 보냈는지 알 수 있습니다. 채굴 주소는 채굴 보상 전용이라 새로 만들 일은 거의 없습니다.",
|
||||
"faq_w_addr_3_q": "주소를 재사용해야 하나요, 아니면 새로 만들어야 하나요?",
|
||||
"faq_w_addr_4_a": "보호(shielding)는 코인을 투명 주소에서 보호 주소로 옮겨 비공개로 만드는 것입니다. 새로 채굴된 코인은 투명 상태로 도착하며 자동으로 보호 처리됩니다.\n\n지갑에서 수동으로 보호 처리할 수도 있습니다. 보호는 일반 트랜잭션의 일종이므로 완료까지 일반적인 확인 시간이 걸립니다.",
|
||||
"faq_w_addr_4_a": "차폐는 투명(채굴) 주소의 코인을 차폐 주소로 옮겨 비공개로 만드는 것입니다. 새로 채굴된 코인은 채굴 주소로 들어오며, 성숙하면 자동으로 차폐됩니다.\n\n지갑에서 직접 차폐할 수도 있습니다. 차폐는 특별한 트랜잭션일 뿐이라 일반적인 확인 시간이 걸립니다.",
|
||||
"faq_w_addr_4_q": "'보호(shielding)'란 무엇인가요?",
|
||||
"faq_w_addr_title": "주소 및 프라이버시",
|
||||
"faq_w_bal_1_a": "지갑이 아직 동기화 중일 때는 잔액이 불완전하며 0으로 표시될 수 있습니다 — 아직 모든 트랜잭션을 스캔하지 않았기 때문입니다. 동기화가 끝나면 채워집니다.\n\n하단 상태 표시줄을 확인하세요. 연결 상태와 블록 높이가 표시됩니다. 동기화가 완료되면 잔액이 정확해집니다.",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "시드 문구는 기본 백업이며 모든 것을 복원하기에 충분합니다. 지갑 파일 사본은 라벨과 설정까지 보존하는 편리한 보조 백업입니다. 모든 백업은 오프라인에 비공개로 보관하세요.",
|
||||
"faq_w_seed_4_q": "wallet.dat도 백업해야 하나요?",
|
||||
"faq_w_seed_title": "시드 문구 및 백업",
|
||||
"faq_w_send_1_a": "전송 탭을 열고 받는 사람의 주소를 붙여넣은 다음 금액을 입력하고 확인하세요. 지갑이 암호화되어 있다면 트랜잭션을 위해 잠금 해제를 요청받습니다.\n\n보호 주소로의 전송은 비공개이며, 투명 주소로의 전송은 공개됩니다.",
|
||||
"faq_w_send_1_a": "전송 탭을 열고 받는 사람의 주소를 붙여넣은 다음 금액을 입력하고 확인하세요. 지갑이 암호화되어 있다면 트랜잭션을 위해 잠금 해제를 요청받습니다.\n\n결제는 차폐(zs) 주소로 보내지며 비공개로 유지됩니다. 지갑은 투명(채굴) 주소로는 보내지 않습니다. 네트워크가 그런 주소로의 결제를 거부하기 때문입니다.",
|
||||
"faq_w_send_1_q": "자금은 어떻게 보내나요?",
|
||||
"faq_w_send_2_a": "DragonX 수수료는 매우 낮으며 자동으로 설정됩니다. 확인 전에 수수료가 표시되며, 보통 변경할 필요는 없습니다.",
|
||||
"faq_w_send_2_q": "어떤 수수료를 내나요?",
|
||||
"faq_w_send_3_a": "네 — 보호(z) 주소로 전송할 때 암호화된 메모를 첨부할 수 있습니다. 받는 사람만 읽을 수 있습니다. 투명 주소는 메모를 지원하지 않습니다.",
|
||||
"faq_w_send_3_a": "네 — 보호(z) 주소로 전송할 때 암호화된 메모를 첨부할 수 있습니다. 받는 사람만 읽을 수 있습니다.",
|
||||
"faq_w_send_3_q": "결제에 메시지를 첨부할 수 있나요?",
|
||||
"faq_w_send_4_a": "트랜잭션은 블록에 채굴되어 확인을 얻기 전까지 '대기 중'입니다. 보통 1~2분 정도 걸립니다. 보호 트랜잭션은 증명을 생성하기 위해 지갑이 동기화되어 있어야 합니다.\n\n전송이 유난히 오래 대기 중이라면 지갑이 연결되고 동기화되어 있는지 확인하세요(창 하단의 상태 표시줄 참고).",
|
||||
"faq_w_send_4_q": "결제를 보냈는데 대기 중이라고 나와요 — 왜 그런가요?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "채굴 수수료",
|
||||
"mining": "채굴",
|
||||
"mining_active": "활성",
|
||||
"mining_addr_explainer": "솔로 채굴 보상만 받습니다. 네트워크가 이 주소로의 결제를 거부합니다. 보상은 성숙하면 자동으로 차폐됩니다.",
|
||||
"mining_address": "채굴 주소",
|
||||
"mining_address_copied": "채굴 주소가 복사되었습니다",
|
||||
"mining_all_time": "전체 기간",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "지갑: %.1f GB",
|
||||
"ram_wallet_mb": "지갑: %.0f MB",
|
||||
"receive": "수신",
|
||||
"receive_not_for_payments": "결제용이 아님",
|
||||
"receive_use_shielded": "차폐 주소 사용",
|
||||
"received": "수신됨",
|
||||
"received_filter": "수신됨",
|
||||
"received_label": "수신됨",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "주소 선택...",
|
||||
"request_shielded_addrs": "-- 차폐 주소 --",
|
||||
"request_title": "결제 요청",
|
||||
"request_transparent_addrs": "-- 투명 주소 --",
|
||||
"request_uri_copied": "결제 URI가 클립보드에 복사되었습니다",
|
||||
"rescan": "재스캔",
|
||||
"rescan_bootstrapped_msg": "노드가 부트스트랩되어 스냅샷 이전 블록은 디스크에 없으므로 제네시스부터의 재스캔은 실패합니다. 지갑의 사용된 잔액을 조정하려면 스냅샷에 포함된 높이부터 재스캔하세요. wallet.dat과 체인 데이터는 삭제되지 않습니다.",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "DragonX 주소를 입력하여 유효한지 그리고 이 지갑에 속하는지 확인합니다.",
|
||||
"validate_invalid": "유효하지 않음",
|
||||
"validate_is_mine": "이 지갑이 이 주소를 소유합니다",
|
||||
"validate_mining_type": "채굴 주소(투명)",
|
||||
"validate_not_mine": "이 지갑에 속하지 않음",
|
||||
"validate_ownership": "소유자:",
|
||||
"validate_results": "결과:",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "차폐 (z 주소)",
|
||||
"validate_status": "상태:",
|
||||
"validate_title": "주소 검증",
|
||||
"validate_transparent_type": "투명 (t 주소)",
|
||||
"validate_type": "유형:",
|
||||
"validate_valid": "유효함",
|
||||
"validating": "검증 중...",
|
||||
|
||||
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "Ajuda e FAQ",
|
||||
"faq_search_hint": "Buscar no FAQ…",
|
||||
"faq_title": "Ajuda e FAQ",
|
||||
"faq_w_addr_1_a": "Endereços transparentes (começam com R ou t) funcionam como a maioria das moedas: os valores e endereços são públicos na blockchain.\n\nEndereços blindados (endereços-z, começam com zs) usam criptografia de conhecimento zero — o valor, remetente e destinatário são encriptados on-chain. Saldos em endereços blindados são privados.",
|
||||
"faq_w_addr_1_a": "Os endereços blindados (endereços z, que começam com zs) são os que você usa no DragonX. Eles usam criptografia de conhecimento zero, então o valor, o remetente e o destinatário são criptografados na blockchain e seu saldo permanece privado.\n\nOs endereços transparentes (que começam com R) são endereços de mineração. O DragonX é uma blockchain totalmente privada, então eles só podem receber recompensas de mineração — a rede rejeita qualquer pagamento enviado a eles. As recompensas que chegam ali são públicas até serem blindadas, o que a carteira faz automaticamente.",
|
||||
"faq_w_addr_1_q": "Qual a diferença entre endereços transparentes e blindados?",
|
||||
"faq_w_addr_2_a": "Prefira endereços blindados (z) sempre que possível — eles mantêm seu saldo e histórico de pagamentos privados. DragonX é uma moeda de privacidade, e blindado é o padrão para fundos recebidos.\n\nUse um endereço transparente apenas quando um serviço com o qual você interage não conseguir lidar com endereços blindados.",
|
||||
"faq_w_addr_2_a": "Use um endereço blindado (zs) para tudo o que você envia e recebe — no DragonX é o único tipo que pode receber pagamentos.\n\nEndereços transparentes (de mineração) servem apenas para recompensas de mineração solo. Nunca passe um para receber um pagamento: a rede vai rejeitá-lo.",
|
||||
"faq_w_addr_2_q": "Qual tipo de endereço devo usar?",
|
||||
"faq_w_addr_3_a": "Para endereços blindados, reutilizar é tranquilo e não expõe o histórico. Para endereços transparentes, usar um endereço novo a cada pagamento melhora a privacidade. Crie novos endereços na aba Receber.",
|
||||
"faq_w_addr_3_a": "Reutilizar um endereço blindado não tem problema e não revela seu histórico. Você ainda pode criar novos na aba Receber, por exemplo um por contato para saber quem pagou você. Endereços de mineração servem apenas para recompensas de mineração; raramente você precisará de um novo.",
|
||||
"faq_w_addr_3_q": "Devo reutilizar um endereço ou criar um novo?",
|
||||
"faq_w_addr_4_a": "Blindar move moedas de um endereço transparente para um blindado, tornando-as privadas. Moedas recém-mineradas chegam transparentes e são blindadas automaticamente para você.\n\nVocê também pode blindar manualmente pela carteira; um blindamento é apenas uma transação especial, então leva o tempo normal de confirmação para ser concluído.",
|
||||
"faq_w_addr_4_a": "Blindar move moedas de um endereço transparente (de mineração) para um blindado, tornando-as privadas. Moedas recém-mineradas chegam a um endereço de mineração e são blindadas automaticamente quando amadurecem.\n\nVocê também pode blindar manualmente pela carteira; uma blindagem é apenas uma transação especial, então leva o tempo normal de confirmação.",
|
||||
"faq_w_addr_4_q": "O que é \"blindar\"?",
|
||||
"faq_w_addr_title": "Endereços e Privacidade",
|
||||
"faq_w_bal_1_a": "Enquanto sua carteira ainda está sincronizando, seu saldo está incompleto e pode aparecer como 0 — ainda não foram escaneadas todas as suas transações. Ele se completa assim que a sincronização terminar.\n\nObserve a barra de status na parte inferior: ela mostra o estado da conexão e a altura do bloco. Quando a sincronização estiver completa, seu saldo estará correto.",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "Sua frase de recuperação é o backup principal e é suficiente para restaurar tudo. Uma cópia do arquivo da sua carteira é um backup secundário conveniente que também preserva rótulos e configurações. Mantenha qualquer backup offline e privado.",
|
||||
"faq_w_seed_4_q": "Devo também fazer backup do wallet.dat?",
|
||||
"faq_w_seed_title": "Frase de Recuperação e Backup",
|
||||
"faq_w_send_1_a": "Abra a aba Enviar, cole o endereço do destinatário, informe um valor e confirme. Se a carteira estiver encriptada, você será solicitado a desbloqueá-la para a transação.\n\nEnvios para endereços blindados são privados; envios para endereços transparentes são públicos.",
|
||||
"faq_w_send_1_a": "Abra a aba Enviar, cole o endereço do destinatário, informe um valor e confirme. Se a carteira estiver encriptada, você será solicitado a desbloqueá-la para a transação.\n\nOs pagamentos vão para endereços blindados (zs) e continuam privados. A carteira não envia para um endereço transparente (de mineração): a rede rejeita pagamentos para eles.",
|
||||
"faq_w_send_1_q": "Como eu envio fundos?",
|
||||
"faq_w_send_2_a": "As taxas do DragonX são muito baixas e definidas automaticamente. A taxa é mostrada antes de você confirmar. Normalmente você não precisa alterá-la.",
|
||||
"faq_w_send_2_q": "Qual taxa eu pago?",
|
||||
"faq_w_send_3_a": "Sim — ao enviar para um endereço blindado (z) você pode incluir um memo encriptado. Só o destinatário pode lê-lo. Endereços transparentes não suportam memos.",
|
||||
"faq_w_send_3_a": "Sim — ao enviar para um endereço blindado (z) você pode incluir um memo encriptado. Só o destinatário pode lê-lo.",
|
||||
"faq_w_send_3_q": "Posso anexar uma mensagem a um pagamento?",
|
||||
"faq_w_send_4_a": "Uma transação fica \"pendente\" até ser minerada em um bloco e ganhar confirmações. Isso costuma levar um ou dois minutos. Transações blindadas também precisam que sua carteira esteja sincronizada para gerar a prova.\n\nSe um envio permanecer pendente por tempo incomumente longo, verifique se sua carteira está conectada e sincronizada (veja a barra de status na parte inferior da janela).",
|
||||
"faq_w_send_4_q": "Enviei um pagamento, mas ele diz pendente — por quê?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "Taxa de Minerador",
|
||||
"mining": "Mineração",
|
||||
"mining_active": "Ativo",
|
||||
"mining_addr_explainer": "Recebe apenas recompensas de mineração solo — a rede rejeita pagamentos para este endereço. As recompensas são blindadas automaticamente quando amadurecem.",
|
||||
"mining_address": "Endereço de mineração",
|
||||
"mining_address_copied": "Endereço de mineração copiado",
|
||||
"mining_all_time": "Todo o Tempo",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "Carteira: %.1f GB",
|
||||
"ram_wallet_mb": "Carteira: %.0f MB",
|
||||
"receive": "Receber",
|
||||
"receive_not_for_payments": "Não é para pagamentos",
|
||||
"receive_use_shielded": "Usar um endereço blindado",
|
||||
"received": "recebido",
|
||||
"received_filter": "Recebido",
|
||||
"received_label": "Recebido",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "Selecionar endereço...",
|
||||
"request_shielded_addrs": "-- Endereços Blindados --",
|
||||
"request_title": "Solicitar Pagamento",
|
||||
"request_transparent_addrs": "-- Endereços Transparentes --",
|
||||
"request_uri_copied": "URI de pagamento copiada para a área de transferência",
|
||||
"rescan": "Reescanear",
|
||||
"rescan_bootstrapped_msg": "Seu nó foi inicializado por bootstrap, então os blocos abaixo do snapshot não estão em disco e um reescaneamento a partir do gênesis falharia. Reescaneie a partir de uma altura que seu snapshot inclua para reconciliar o saldo gasto da sua carteira. Seu wallet.dat e os dados da cadeia não são excluídos.",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "Digite um endereço DragonX para verificar se é válido e se pertence a esta carteira.",
|
||||
"validate_invalid": "INVÁLIDO",
|
||||
"validate_is_mine": "Esta carteira possui este endereço",
|
||||
"validate_mining_type": "Endereço de mineração (transparente)",
|
||||
"validate_not_mine": "Não pertence a esta carteira",
|
||||
"validate_ownership": "Propriedade:",
|
||||
"validate_results": "Resultados:",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "Blindado (z-endereço)",
|
||||
"validate_status": "Status:",
|
||||
"validate_title": "Validar Endereço",
|
||||
"validate_transparent_type": "Transparente (t-endereço)",
|
||||
"validate_type": "Tipo:",
|
||||
"validate_valid": "VÁLIDO",
|
||||
"validating": "Validando...",
|
||||
|
||||
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "Справка и FAQ",
|
||||
"faq_search_hint": "Поиск по FAQ…",
|
||||
"faq_title": "Справка и FAQ",
|
||||
"faq_w_addr_1_a": "Прозрачные адреса (начинаются с R или t) работают как в большинстве монет: суммы и адреса видны в блокчейне.\n\nЗащищённые адреса (Z-адреса, начинаются с zs) используют криптографию с нулевым разглашением — сумма, отправитель и получатель зашифрованы в цепочке. Балансы на защищённых адресах приватны.",
|
||||
"faq_w_addr_1_a": "Экранированные адреса (z-адреса, начинаются с zs) — это адреса, которыми вы пользуетесь в DragonX. Они используют криптографию с нулевым разглашением: сумма, отправитель и получатель шифруются в блокчейне, а ваш баланс остаётся приватным.\n\nПрозрачные адреса (начинаются с R) — это адреса для майнинга. DragonX — полностью приватная сеть, поэтому они могут получать только награды за майнинг: сеть отклоняет любой платёж на такой адрес. Поступившие туда награды остаются публичными, пока их не экранируют, а кошелёк делает это автоматически.",
|
||||
"faq_w_addr_1_q": "В чём разница между прозрачными и защищёнными адресами?",
|
||||
"faq_w_addr_2_a": "По возможности используйте защищённые (Z) адреса — они сохраняют приватность вашего баланса и истории платежей. DragonX — приватная монета, и защищённый адрес используется по умолчанию для получения средств.\n\nПрозрачный адрес стоит использовать только если сервис, с которым вы работаете, не поддерживает защищённые адреса.",
|
||||
"faq_w_addr_2_a": "Используйте экранированный (zs) адрес для всего, что отправляете и получаете, — в DragonX только на такой адрес можно заплатить.\n\nПрозрачные адреса (для майнинга) предназначены только для наград за соло-майнинг. Никогда не давайте такой адрес для платежа: сеть его отклонит.",
|
||||
"faq_w_addr_2_q": "Какой тип адреса мне использовать?",
|
||||
"faq_w_addr_3_a": "Для защищённых адресов повторное использование допустимо и не раскрывает историю. Для прозрачных адресов использование нового адреса для каждого платежа повышает приватность. Создавайте новые адреса на вкладке «Получить».",
|
||||
"faq_w_addr_3_a": "Повторно использовать экранированный адрес безопасно — это не раскрывает вашу историю. При желании можно создавать новые на вкладке «Получить», например по одному на контакт, чтобы видеть, кто вам заплатил. Адреса для майнинга нужны только для наград за майнинг; новый понадобится редко.",
|
||||
"faq_w_addr_3_q": "Использовать один адрес повторно или создавать новый?",
|
||||
"faq_w_addr_4_a": "Экранирование перемещает монеты с прозрачного адреса на защищённый, делая их приватными. Новые добытые монеты поступают как прозрачные и экранируются автоматически.\n\nВы также можете экранировать монеты вручную из кошелька — экранирование — это обычная транзакция, поэтому она подтверждается за обычное время.",
|
||||
"faq_w_addr_4_a": "Экранирование переводит монеты с прозрачного адреса (для майнинга) на экранированный, делая их приватными. Новые намайненные монеты приходят на адрес для майнинга и экранируются автоматически, когда созревают.\n\nЭкранировать можно и вручную в кошельке; экранирование — это обычная транзакция особого вида, поэтому подтверждается в обычные сроки.",
|
||||
"faq_w_addr_4_q": "Что такое «экранирование»?",
|
||||
"faq_w_addr_title": "Адреса и приватность",
|
||||
"faq_w_bal_1_a": "Пока кошелёк синхронизируется, ваш баланс неполный и может отображаться как 0 — не все транзакции ещё просканированы. Он заполнится после завершения синхронизации.\n\nСледите за строкой состояния внизу окна: она показывает состояние соединения и высоту блока. После завершения синхронизации баланс будет точным.",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "Ваша сид-фраза — это основная резервная копия, и её достаточно для полного восстановления. Копия файла кошелька — удобная дополнительная резервная копия, которая также сохраняет метки и настройки. Храните любые резервные копии офлайн и в тайне.",
|
||||
"faq_w_seed_4_q": "Нужно ли также сохранять резервную копию wallet.dat?",
|
||||
"faq_w_seed_title": "Сид-фраза и резервное копирование",
|
||||
"faq_w_send_1_a": "Откройте вкладку «Отправить», вставьте адрес получателя, укажите сумму и подтвердите. Если кошелёк зашифрован, вам предложат разблокировать его для транзакции.\n\nОтправка на защищённые адреса приватна; отправка на прозрачные адреса публична.",
|
||||
"faq_w_send_1_a": "Откройте вкладку «Отправить», вставьте адрес получателя, укажите сумму и подтвердите. Если кошелёк зашифрован, вам предложат разблокировать его для транзакции.\n\nПлатежи отправляются на экранированные (zs) адреса и остаются приватными. Кошелёк не отправляет на прозрачный адрес (для майнинга): сеть отклоняет платежи на такие адреса.",
|
||||
"faq_w_send_1_q": "Как отправить средства?",
|
||||
"faq_w_send_2_a": "Комиссии DragonX очень низкие и устанавливаются автоматически. Комиссия показывается перед подтверждением. Обычно менять её не нужно.",
|
||||
"faq_w_send_2_q": "Какую комиссию я плачу?",
|
||||
"faq_w_send_3_a": "Да — при отправке на защищённый (Z) адрес можно приложить зашифрованную заметку. Прочитать её сможет только получатель. Прозрачные адреса не поддерживают заметки.",
|
||||
"faq_w_send_3_a": "Да — при отправке на защищённый (Z) адрес можно приложить зашифрованную заметку. Прочитать её сможет только получатель.",
|
||||
"faq_w_send_3_q": "Можно ли прикрепить сообщение к платежу?",
|
||||
"faq_w_send_4_a": "Транзакция остаётся «в ожидании», пока не будет добыта в блок и не получит подтверждения. Обычно это занимает минуту-две. Защищённым транзакциям также нужно, чтобы кошелёк был синхронизирован, для построения доказательства.\n\nЕсли отправка необычно долго остаётся в ожидании, проверьте, что кошелёк подключён и синхронизирован (см. строку состояния внизу окна).",
|
||||
"faq_w_send_4_q": "Я отправил платёж, но он в статусе «в ожидании» — почему?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "Комиссия майнера",
|
||||
"mining": "Майнинг",
|
||||
"mining_active": "Активен",
|
||||
"mining_addr_explainer": "Принимает только награды за соло-майнинг — сеть отклоняет платежи на этот адрес. Награды экранируются автоматически, когда созревают.",
|
||||
"mining_address": "Адрес для майнинга",
|
||||
"mining_address_copied": "Адрес майнинга скопирован",
|
||||
"mining_all_time": "За всё время",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "Кошелёк: %.1f ГБ",
|
||||
"ram_wallet_mb": "Кошелёк: %.0f МБ",
|
||||
"receive": "Получить",
|
||||
"receive_not_for_payments": "Не для платежей",
|
||||
"receive_use_shielded": "Использовать экранированный адрес",
|
||||
"received": "получено",
|
||||
"received_filter": "Получено",
|
||||
"received_label": "Получено",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "Выбрать адрес...",
|
||||
"request_shielded_addrs": "-- Экранированные адреса --",
|
||||
"request_title": "Запрос оплаты",
|
||||
"request_transparent_addrs": "-- Прозрачные адреса --",
|
||||
"request_uri_copied": "URI платежа скопирован в буфер обмена",
|
||||
"rescan": "Пересканировать",
|
||||
"rescan_bootstrapped_msg": "Ваш узел был инициализирован из бутстрапа, поэтому блоки ниже снимка отсутствуют на диске, и пересканирование с генезиса не удастся. Пересканируйте с высоты, входящей в ваш снимок, чтобы согласовать потраченный баланс кошелька. Ваш wallet.dat и данные блокчейна не удаляются.",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "Введите адрес DragonX, чтобы проверить его действительность и принадлежность к этому кошельку.",
|
||||
"validate_invalid": "НЕДЕЙСТВИТЕЛЕН",
|
||||
"validate_is_mine": "Этот кошелёк владеет этим адресом",
|
||||
"validate_mining_type": "Адрес для майнинга (прозрачный)",
|
||||
"validate_not_mine": "Не принадлежит этому кошельку",
|
||||
"validate_ownership": "Принадлежность:",
|
||||
"validate_results": "Результаты:",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "Экранированный (z-адрес)",
|
||||
"validate_status": "Статус:",
|
||||
"validate_title": "Проверить адрес",
|
||||
"validate_transparent_type": "Прозрачный (t-адрес)",
|
||||
"validate_type": "Тип:",
|
||||
"validate_valid": "ДЕЙСТВИТЕЛЕН",
|
||||
"validating": "Проверка...",
|
||||
|
||||
+10
-8
@@ -786,13 +786,13 @@
|
||||
"faq_open_tooltip": "帮助与常见问题",
|
||||
"faq_search_hint": "搜索常见问题…",
|
||||
"faq_title": "帮助与常见问题",
|
||||
"faq_w_addr_1_a": "透明地址(以 R 或 t 开头)的工作方式与大多数币种相同:金额和地址在区块链上是公开的。\n\n隐私地址(z 地址,以 zs 开头)使用零知识加密技术——金额、发送方和接收方都在链上加密。存放在隐私地址中的余额是私密的。",
|
||||
"faq_w_addr_1_a": "屏蔽地址(z 地址,以 zs 开头)是您在 DragonX 上使用的地址。它们采用零知识密码学,金额、发送方和接收方在链上都是加密的,您的余额保持私密。\n\n透明地址(以 R 开头)是挖矿地址。DragonX 是完全私密的链,因此它们只能接收挖矿奖励——网络会拒绝任何发送给它们的付款。到达那里的奖励在被屏蔽之前是公开的,而钱包会自动完成屏蔽。",
|
||||
"faq_w_addr_1_q": "透明地址和隐私地址有什么区别?",
|
||||
"faq_w_addr_2_a": "请尽量使用隐私(z)地址——它们能保护您的余额和支付记录不被公开。DragonX 是一种隐私币,收款默认使用隐私地址。\n\n只有在您使用的服务无法处理隐私地址时,才使用透明地址。",
|
||||
"faq_w_addr_2_a": "收发任何款项都请使用屏蔽(zs)地址——在 DragonX 上只有这种地址可以接收付款。\n\n透明(挖矿)地址仅用于单人挖矿奖励。切勿把它提供给他人用于付款:网络会拒绝该付款。",
|
||||
"faq_w_addr_2_q": "应该使用哪种地址类型?",
|
||||
"faq_w_addr_3_a": "对于隐私地址,重复使用没有问题,也不会泄露历史记录。对于透明地址,每次付款使用新地址可以提升隐私性。可以在“接收”标签页创建新地址。",
|
||||
"faq_w_addr_3_a": "重复使用屏蔽地址没有问题,也不会泄露您的历史记录。您仍可以在“接收”页创建新地址,例如为每个联系人各建一个,以便知道是谁付的款。挖矿地址仅用于挖矿奖励,您很少需要新建。",
|
||||
"faq_w_addr_3_q": "应该重复使用地址,还是新建一个?",
|
||||
"faq_w_addr_4_a": "屏蔽会将币从透明地址转移到隐私地址,使其变为私密。新挖出的币到账时是透明的,会自动为您屏蔽。\n\n您也可以手动屏蔽;屏蔽只是一种特殊交易,因此需要正常的确认时间才能完成。",
|
||||
"faq_w_addr_4_a": "屏蔽是把币从透明(挖矿)地址转移到屏蔽地址,使其变为私密。新挖出的币会到达挖矿地址,并在成熟后自动屏蔽。\n\n您也可以在钱包中手动屏蔽;屏蔽只是一种特殊交易,因此需要正常的确认时间。",
|
||||
"faq_w_addr_4_q": "什么是“屏蔽”?",
|
||||
"faq_w_addr_title": "地址与隐私",
|
||||
"faq_w_bal_1_a": "在钱包同步完成之前,您的余额是不完整的,可能显示为 0——因为它还没有扫描完您的所有交易。同步完成后余额会自动补齐。\n\n请留意窗口底部的状态栏:它显示连接状态和区块高度。同步完成后,余额即为准确值。",
|
||||
@@ -836,11 +836,11 @@
|
||||
"faq_w_seed_4_a": "助记词是主要备份,足以恢复一切。钱包文件的副本是一个便捷的次要备份,还能保留标签和设置。请将所有备份妥善离线私密保管。",
|
||||
"faq_w_seed_4_q": "我还需要备份 wallet.dat 吗?",
|
||||
"faq_w_seed_title": "助记词与备份",
|
||||
"faq_w_send_1_a": "打开“发送”标签页,粘贴收款方地址,输入金额并确认。如果钱包已加密,系统会要求您解锁以完成交易。\n\n发送到隐私地址是私密的;发送到透明地址是公开的。",
|
||||
"faq_w_send_1_a": "打开“发送”标签页,粘贴收款方地址,输入金额并确认。如果钱包已加密,系统会要求您解锁以完成交易。\n\n付款发送到屏蔽(zs)地址,并保持私密。钱包不会向透明(挖矿)地址发送:网络会拒绝向此类地址付款。",
|
||||
"faq_w_send_1_q": "如何发送资金?",
|
||||
"faq_w_send_2_a": "DragonX 的手续费非常低,并且是自动设置的。手续费会在您确认前显示。通常无需手动更改。",
|
||||
"faq_w_send_2_q": "我需要支付多少手续费?",
|
||||
"faq_w_send_3_a": "可以——向隐私(z)地址发送时,您可以附加一条加密备注。只有收款方能够读取它。透明地址不支持备注。",
|
||||
"faq_w_send_3_a": "可以——向隐私(z)地址发送时,您可以附加一条加密备注。只有收款方能够读取它。",
|
||||
"faq_w_send_3_q": "我可以在付款时附加消息吗?",
|
||||
"faq_w_send_4_a": "交易在被打包进区块并获得确认之前处于「待处理」状态。这通常需要一两分钟。屏蔽交易还需要您的钱包已完成同步才能生成证明。\n\n如果一笔发款长时间处于待处理状态,请检查您的钱包是否已连接并同步(见窗口底部的状态栏)。",
|
||||
"faq_w_send_4_q": "我发送了一笔付款,但显示待处理——为什么?",
|
||||
@@ -1226,6 +1226,7 @@
|
||||
"miner_fee": "矿工费",
|
||||
"mining": "挖矿",
|
||||
"mining_active": "活跃",
|
||||
"mining_addr_explainer": "仅接收单人挖矿奖励——网络会拒绝向此地址付款。奖励成熟后会自动屏蔽。",
|
||||
"mining_address": "挖矿地址",
|
||||
"mining_address_copied": "挖矿地址已复制",
|
||||
"mining_all_time": "所有时间",
|
||||
@@ -1522,6 +1523,8 @@
|
||||
"ram_wallet_gb": "钱包:%.1f GB",
|
||||
"ram_wallet_mb": "钱包:%.0f MB",
|
||||
"receive": "接收",
|
||||
"receive_not_for_payments": "不用于付款",
|
||||
"receive_use_shielded": "使用屏蔽地址",
|
||||
"received": "已接收",
|
||||
"received_filter": "已接收",
|
||||
"received_label": "已接收",
|
||||
@@ -1550,7 +1553,6 @@
|
||||
"request_select_address": "选择地址...",
|
||||
"request_shielded_addrs": "-- 屏蔽地址 --",
|
||||
"request_title": "请求付款",
|
||||
"request_transparent_addrs": "-- 透明地址 --",
|
||||
"request_uri_copied": "付款 URI 已复制到剪贴板",
|
||||
"rescan": "重新扫描",
|
||||
"rescan_bootstrapped_msg": "您的节点使用了引导程序,因此快照以下的区块不在磁盘上,从创世区块重新扫描将失败。请从快照所包含的高度开始重新扫描,以核对钱包的已花费余额。您的 wallet.dat 和区块链数据不会被删除。",
|
||||
@@ -2134,6 +2136,7 @@
|
||||
"validate_description": "输入一个 DragonX 地址来检查它是否有效以及是否属于此钱包。",
|
||||
"validate_invalid": "无效",
|
||||
"validate_is_mine": "此钱包拥有该地址",
|
||||
"validate_mining_type": "挖矿地址(透明)",
|
||||
"validate_not_mine": "不属于此钱包",
|
||||
"validate_ownership": "所有权:",
|
||||
"validate_results": "结果:",
|
||||
@@ -2141,7 +2144,6 @@
|
||||
"validate_shielded_type": "屏蔽(z 地址)",
|
||||
"validate_status": "状态:",
|
||||
"validate_title": "验证地址",
|
||||
"validate_transparent_type": "透明(t 地址)",
|
||||
"validate_type": "类型:",
|
||||
"validate_valid": "有效",
|
||||
"validating": "验证中...",
|
||||
|
||||
@@ -25,6 +25,46 @@ def load_english_keys():
|
||||
|
||||
# All translations for the 158 missing keys
|
||||
TRANSLATIONS = {
|
||||
"mining_addr_explainer": {
|
||||
"de": "Empfängt nur Solo-Mining-Belohnungen – das Netzwerk lehnt Zahlungen an diese Adresse ab. Belohnungen werden automatisch abgeschirmt, sobald sie gereift sind.",
|
||||
"es": "Solo recibe recompensas de minería en solitario; la red rechaza los pagos a esta dirección. Las recompensas se blindan automáticamente cuando maduran.",
|
||||
"fr": "Ne reçoit que des récompenses de minage en solo — le réseau refuse les paiements vers cette adresse. Les récompenses sont blindées automatiquement une fois arrivées à maturité.",
|
||||
"pt": "Recebe apenas recompensas de mineração solo — a rede rejeita pagamentos para este endereço. As recompensas são blindadas automaticamente quando amadurecem.",
|
||||
"ru": "Принимает только награды за соло-майнинг — сеть отклоняет платежи на этот адрес. Награды экранируются автоматически, когда созревают.",
|
||||
"zh": "仅接收单人挖矿奖励——网络会拒绝向此地址付款。奖励成熟后会自动屏蔽。",
|
||||
"ja": "ソロマイニング報酬のみを受け取ります。ネットワークはこのアドレスへの支払いを拒否します。報酬は成熟すると自動的にシールドされます。",
|
||||
"ko": "솔로 채굴 보상만 받습니다. 네트워크가 이 주소로의 결제를 거부합니다. 보상은 성숙하면 자동으로 차폐됩니다.",
|
||||
},
|
||||
"receive_use_shielded": {
|
||||
"de": "Abgeschirmte Adresse verwenden",
|
||||
"es": "Usar una dirección blindada",
|
||||
"fr": "Utiliser une adresse blindée",
|
||||
"pt": "Usar um endereço blindado",
|
||||
"ru": "Использовать экранированный адрес",
|
||||
"zh": "使用屏蔽地址",
|
||||
"ja": "シールドアドレスを使う",
|
||||
"ko": "차폐 주소 사용",
|
||||
},
|
||||
"receive_not_for_payments": {
|
||||
"de": "Nicht für Zahlungen",
|
||||
"es": "No para pagos",
|
||||
"fr": "Pas pour les paiements",
|
||||
"pt": "Não é para pagamentos",
|
||||
"ru": "Не для платежей",
|
||||
"zh": "不用于付款",
|
||||
"ja": "支払いには使えません",
|
||||
"ko": "결제용이 아님",
|
||||
},
|
||||
"validate_mining_type": {
|
||||
"de": "Mining-Adresse (transparent)",
|
||||
"es": "Dirección de minería (transparente)",
|
||||
"fr": "Adresse de minage (transparente)",
|
||||
"pt": "Endereço de mineração (transparente)",
|
||||
"ru": "Адрес для майнинга (прозрачный)",
|
||||
"zh": "挖矿地址(透明)",
|
||||
"ja": "マイニングアドレス(透明)",
|
||||
"ko": "채굴 주소(투명)",
|
||||
},
|
||||
"send_mining_addr_short": {
|
||||
"de": "Mining-Adresse – kann keine Zahlungen empfangen",
|
||||
"es": "Dirección de minería: no puede recibir pagos",
|
||||
|
||||
+9
-1
@@ -19,6 +19,7 @@
|
||||
#include "ui/notifications.h"
|
||||
#include "ui/sidebar.h"
|
||||
#include "ui/windows/send_tab.h"
|
||||
#include "ui/windows/receive_tab.h"
|
||||
#include "ui/windows/wallets_dialog.h"
|
||||
#include "ui/windows/export_transactions_dialog.h"
|
||||
#include "ui/windows/export_all_keys_dialog.h"
|
||||
@@ -102,7 +103,7 @@ void seedSweepContacts(App& a)
|
||||
s_contactsSweepBackup = a.addressBook().entries();
|
||||
data::AddressBookEntry e1("drgx pool payout address", kDemoZAddr, "mining pool payouts"); // Z, global
|
||||
e1.avatar = "icon:account_balance"; // icon avatar (verifies the icon-badge render path)
|
||||
data::AddressBookEntry e2("exchange deposit", "t1DemoTransparentAddressForUiSweep00000", ""); // T
|
||||
data::AddressBookEntry e2("mining rig", "t1DemoTransparentAddressForUiSweep00000", ""); // T (mining only)
|
||||
// Scope to the active wallet so it's visible (the tab hides contacts not in the active wallet);
|
||||
// non-empty hash also keeps it non-global -> no globe badge, so the list shows a global/non-global mix.
|
||||
e2.scope = a.activeWalletIdentityHash();
|
||||
@@ -370,6 +371,13 @@ void App::buildSweepCatalog()
|
||||
add("modal-validate-address", ui::NavPage::Receive,
|
||||
[](App&) { ui::ValidateAddressDialog::show(); },
|
||||
[](App&) { ui::ValidateAddressDialog::hide(); });
|
||||
add("modal-validate-mining", ui::NavPage::Receive,
|
||||
[](App&) { ui::ValidateAddressDialog::sweepShowMiningResult("t1DemoTransparentAddressForUiSweep00000"); },
|
||||
[](App&) { ui::ValidateAddressDialog::hide(); });
|
||||
// A mining (transparent) address selected on Receive: no payment request, no QR — the explainer instead.
|
||||
add("receive-mining-address", ui::NavPage::Receive,
|
||||
[](App& a) { ui::SweepSelectReceiveAddress(&a, "t1DemoTransparentAddressForUiSweep00000"); },
|
||||
[](App& a) { ui::SweepSelectReceiveAddress(&a, nullptr); });
|
||||
add("modal-address-label", ui::NavPage::Overview,
|
||||
[](App& a) { ui::AddressLabelDialog::show(&a, kDemoZAddr, true); },
|
||||
[](App&) { ui::AddressLabelDialog::hide(); });
|
||||
|
||||
@@ -546,7 +546,8 @@ void RenderSharedAddressList(App* app, float listH, float availW,
|
||||
{
|
||||
const char* typeLabel = row.isZ ? TR("shielded") : TR("addr_type_mining");
|
||||
const char* hiddenTag = row.hidden ? TR("hidden_tag") : "";
|
||||
const char* miningTag = row.mining ? TR("mining_tag") : "";
|
||||
// A transparent row is already typed "Mining"; the tag is for shielded payout addresses.
|
||||
const char* miningTag = (row.mining && row.isZ) ? TR("mining_tag") : "";
|
||||
char typeBuf[64];
|
||||
snprintf(typeBuf, sizeof(typeBuf), "%s%s%s", typeLabel, hiddenTag, miningTag);
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(labelX, cy), typeCol, typeBuf);
|
||||
@@ -655,7 +656,8 @@ void RenderSharedAddressList(App* app, float listH, float availW,
|
||||
ImGui::SetCursorScreenPos(ImVec2(rowPos.x, rowY[row_idx]));
|
||||
ImGui::InvisibleButton("##addr", ImVec2(innerW, rowH));
|
||||
if (ImGui::IsItemHovered() && !s_dragActive) {
|
||||
material::Tooltip("%s", addr.address.c_str());
|
||||
if (row.isZ) material::Tooltip("%s", addr.address.c_str());
|
||||
else material::Tooltip("%s\n\n%s", addr.address.c_str(), TR("mining_addr_explainer"));
|
||||
}
|
||||
|
||||
// Context menu
|
||||
|
||||
+299
-207
@@ -130,13 +130,17 @@ static void RenderAddressDropdown(App* app, float width) {
|
||||
// Header row: label + address type toggle buttons
|
||||
Type().textColored(TypeStyle::Overline, OnSurfaceMedium(), TR("address_upper"));
|
||||
|
||||
// All / Shielded / Mining: each segment as wide as the widest label (they are words, not Z/T).
|
||||
const char* filterLabels[] = { TR("all_filter"), TR("shielded"), TR("addr_type_mining") };
|
||||
float toggleBtnW = std::max(schema::UI().drawElement("tabs.receive", "toggle-btn-min-width").size, schema::UI().drawElement("tabs.receive", "toggle-btn-width").size * Layout::hScale(width));
|
||||
for (const char* lbl : filterLabels)
|
||||
toggleBtnW = std::max(toggleBtnW, Type().caption()->CalcTextSizeA(Type().caption()->LegacySize, FLT_MAX, 0, lbl).x +
|
||||
2.0f * Layout::spacingMd());
|
||||
float toggleGap = schema::UI().drawElement("tabs.receive", "toggle-gap").size;
|
||||
float toggleTotalW = toggleBtnW * 3 + toggleGap * 2;
|
||||
float segH = ImGui::GetFrameHeight();
|
||||
ImGui::SameLine(width - toggleTotalW);
|
||||
ImVec2 segOrigin = ImGui::GetCursorScreenPos();
|
||||
const char* filterLabels[] = { TR("all_filter"), "Z", "T" };
|
||||
int segClk = material::SegmentedControl(ImGui::GetWindowDrawList(), segOrigin, toggleTotalW, segH,
|
||||
filterLabels, 3, s_addr_type_filter, Type().caption(),
|
||||
"##addrFilter", Layout::dpiScale());
|
||||
@@ -147,14 +151,18 @@ static void RenderAddressDropdown(App* app, float width) {
|
||||
|
||||
TrackNewAddresses(state);
|
||||
|
||||
// Auto-select address with the largest balance on first load
|
||||
// Auto-select the shielded address with the largest balance on first load. A mining (transparent)
|
||||
// address can't be paid, so it is picked only when the wallet has no shielded address yet.
|
||||
if (!s_auto_selected && app->isConnected() && !state.addresses.empty()) {
|
||||
int bestIdx = -1;
|
||||
double bestBal = -1.0;
|
||||
bool bestIsZ = false;
|
||||
for (size_t i = 0; i < state.addresses.size(); i++) {
|
||||
if (state.addresses[i].balance > bestBal) {
|
||||
const bool z = state.addresses[i].type == "shielded";
|
||||
if ((z && !bestIsZ) || (z == bestIsZ && state.addresses[i].balance > bestBal)) {
|
||||
bestBal = state.addresses[i].balance;
|
||||
bestIdx = static_cast<int>(i);
|
||||
bestIsZ = z;
|
||||
}
|
||||
}
|
||||
if (bestIdx >= 0) {
|
||||
@@ -222,6 +230,12 @@ static void RenderAddressDropdown(App* app, float width) {
|
||||
bool isZ = state.addresses[i].type == "shielded";
|
||||
if (s_addr_type_filter == 1 && !isZ) continue;
|
||||
if (s_addr_type_filter == 2 && isZ) continue;
|
||||
// "All" lists a mining address only when it matters: it holds rewards, it is marked as a
|
||||
// mining address, we are solo mining, or it is the one selected. The Mining filter lists all.
|
||||
if (s_addr_type_filter == 0 && !isZ && state.addresses[i].balance < 1e-9 &&
|
||||
!app->isMiningAddress(state.addresses[i].address) && !state.mining.generate &&
|
||||
s_selected_address_idx != static_cast<int>(i))
|
||||
continue;
|
||||
sortedIdx.push_back(i);
|
||||
}
|
||||
std::sort(sortedIdx.begin(), sortedIdx.end(),
|
||||
@@ -272,9 +286,12 @@ static void RenderAddressDropdown(App* app, float width) {
|
||||
s_cached_qr_data.clear(); // Force QR regeneration
|
||||
}
|
||||
if (ImGui::IsItemHovered()) {
|
||||
material::Tooltip(TR("grpb_tooltip_address_balance"),
|
||||
addr.address.c_str(), addr.balance, DRAGONX_TICKER,
|
||||
isCurrent ? TR("grpb_selected_suffix") : "");
|
||||
char tip[512];
|
||||
snprintf(tip, sizeof(tip), TR("grpb_tooltip_address_balance"),
|
||||
addr.address.c_str(), addr.balance, DRAGONX_TICKER,
|
||||
isCurrent ? TR("grpb_selected_suffix") : "");
|
||||
if (isZ) material::Tooltip("%s", tip);
|
||||
else material::Tooltip("%s\n\n%s", tip, TR("mining_addr_explainer"));
|
||||
}
|
||||
ImGui::PopID();
|
||||
}
|
||||
@@ -337,6 +354,60 @@ static void RenderAddressDropdown(App* app, float width) {
|
||||
ImGui::EndDisabled();
|
||||
}
|
||||
|
||||
void SweepSelectReceiveAddress(App* app, const char* address) {
|
||||
(void)app;
|
||||
if (address) {
|
||||
s_pending_select_address = address;
|
||||
s_addr_type_filter = 0;
|
||||
} else {
|
||||
s_auto_selected = false; // re-run the default (shielded-first) choice
|
||||
}
|
||||
s_cached_qr_data.clear();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Mining address notice (instead of a payment request)
|
||||
// ============================================================================
|
||||
// A mining (transparent) address only ever receives mining rewards: the network rejects payments to it.
|
||||
// So it gets no payment request and no QR code — just what it is for, and a way to a shielded address.
|
||||
static void RenderMiningAddressNotice(App* app, const WalletState& state, float width) {
|
||||
Type().textColored(TypeStyle::Overline, Warning(), TR("mining_address"));
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingSm()));
|
||||
ImGui::PushTextWrapPos(ImGui::GetCursorPosX() + width);
|
||||
Type().textWrapped(TypeStyle::Body2, TR("mining_addr_explainer"));
|
||||
ImGui::PopTextWrapPos();
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingMd()));
|
||||
|
||||
int bestZ = -1;
|
||||
double bestBal = -1.0;
|
||||
for (size_t i = 0; i < state.addresses.size(); i++) {
|
||||
if (state.addresses[i].type == "shielded" && state.addresses[i].balance > bestBal) {
|
||||
bestBal = state.addresses[i].balance;
|
||||
bestZ = static_cast<int>(i);
|
||||
}
|
||||
}
|
||||
ImGui::BeginDisabled(bestZ < 0 && (!app->isConnected() || s_generating_address));
|
||||
if (TactileButton(TrId("receive_use_shielded", "mining").c_str(), ImVec2(0, 0), schema::UI().resolveFont("button"))) {
|
||||
if (bestZ >= 0) {
|
||||
s_selected_address_idx = bestZ;
|
||||
s_cached_qr_data.clear();
|
||||
} else {
|
||||
s_generating_address = true; // no shielded address yet: make one, as "New" does
|
||||
app->createNewZAddress([](const std::string& addr) {
|
||||
s_generating_address = false;
|
||||
if (addr.empty())
|
||||
Notifications::instance().error(TR("failed_create_shielded"));
|
||||
else {
|
||||
s_pending_select_address = addr;
|
||||
Notifications::instance().success(TR("new_shielded_created"));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
ImGui::EndDisabled();
|
||||
ImGui::Dummy(ImVec2(width, Layout::spacingSm()));
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Helpers: DrawRecvIcon (local copy — original is static in send_tab).
|
||||
// Relative time uses the shared util::formatTimeAgoShort ("14d ago"), matching Overview/Send.
|
||||
@@ -580,9 +651,9 @@ void RenderReceiveTab(App* app)
|
||||
const AddressInfo& selected = state.addresses[s_selected_address_idx];
|
||||
bool isZ = selected.type == "shielded";
|
||||
|
||||
// Generate QR data
|
||||
std::string qr_data = selected.address;
|
||||
if (s_request_amount > 0) {
|
||||
// Generate QR data — shielded only: a mining (transparent) address can't be paid, so it gets no QR.
|
||||
std::string qr_data = isZ ? selected.address : std::string();
|
||||
if (isZ && s_request_amount > 0) {
|
||||
// Canonical, URL-encoded "drgx:" URI via the shared builder. The old inline code emitted an
|
||||
// unparseable "dragonx:" scheme and appended the memo raw (spaces/&/= corrupted the QR).
|
||||
qr_data = util::buildPaymentUri(selected.address, s_request_amount, "",
|
||||
@@ -593,8 +664,10 @@ void RenderReceiveTab(App* app)
|
||||
FreeQRTexture(s_qr_texture);
|
||||
s_qr_texture = 0;
|
||||
}
|
||||
int w, h;
|
||||
s_qr_texture = GenerateQRTexture(qr_data.c_str(), &w, &h);
|
||||
if (!qr_data.empty()) {
|
||||
int w, h;
|
||||
s_qr_texture = GenerateQRTexture(qr_data.c_str(), &w, &h);
|
||||
}
|
||||
s_cached_qr_data = qr_data;
|
||||
}
|
||||
|
||||
@@ -644,205 +717,210 @@ void RenderReceiveTab(App* app)
|
||||
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingMd()));
|
||||
|
||||
// ---- PAYMENT REQUEST ----
|
||||
Type().textColored(TypeStyle::Overline, OnSurfaceMedium(), TR("payment_request"));
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingSm()));
|
||||
|
||||
// Amount input with currency toggle
|
||||
float toggleW = S.drawElement("tabs.receive", "currency-toggle-width").size * Layout::dpiScale();
|
||||
float amtInputW = addrColW - toggleW - Layout::spacingMd();
|
||||
if (amtInputW < S.drawElement("tabs.receive", "amount-input-min-width").size) amtInputW = S.drawElement("tabs.receive", "amount-input-min-width").size;
|
||||
double usd_price = state.market.price_usd;
|
||||
|
||||
ImGui::PushFont(body2);
|
||||
if (s_request_usd_mode && usd_price > 0) {
|
||||
ImGui::PushItemWidth(amtInputW);
|
||||
if (ImGui::InputDouble("##RequestAmountUSD", &s_request_usd_amount, 0, 0, "$%.2f")) {
|
||||
if (s_request_usd_amount < 0) s_request_usd_amount = 0;
|
||||
s_request_amount = s_request_usd_amount / usd_price;
|
||||
}
|
||||
{
|
||||
ImVec2 iMin = ImGui::GetItemRectMin();
|
||||
ImVec2 iMax = ImGui::GetItemRectMax();
|
||||
snprintf(buf, sizeof(buf), "\xe2\x89\x88 %.4f %s", s_request_amount, DRAGONX_TICKER);
|
||||
ImVec2 sz = capFont->CalcTextSizeA(capFont->LegacySize, 10000, 0, buf);
|
||||
float tx = iMax.x - sz.x - ImGui::GetStyle().FramePadding.x;
|
||||
float ty = iMin.y + (iMax.y - iMin.y - sz.y) * 0.5f;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(tx, ty),
|
||||
IM_COL32(255, 255, 255, (int)S.drawElement("tabs.receive", "input-overlay-text-alpha").size), buf);
|
||||
}
|
||||
ImGui::PopItemWidth();
|
||||
} else {
|
||||
ImGui::PushItemWidth(amtInputW);
|
||||
if (ImGui::InputDouble("##RequestAmount", &s_request_amount, 0, 0, "%.8f")) {
|
||||
if (s_request_amount < 0) s_request_amount = 0;
|
||||
if (usd_price > 0)
|
||||
s_request_usd_amount = s_request_amount * usd_price;
|
||||
}
|
||||
if (usd_price > 0 && s_request_amount > 0) {
|
||||
ImVec2 iMin = ImGui::GetItemRectMin();
|
||||
ImVec2 iMax = ImGui::GetItemRectMax();
|
||||
double usd_value = s_request_amount * usd_price;
|
||||
if (usd_value >= 0.01)
|
||||
snprintf(buf, sizeof(buf), "\xe2\x89\x88 $%.2f", usd_value);
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "\xe2\x89\x88 $%.6f", usd_value);
|
||||
ImVec2 sz = capFont->CalcTextSizeA(capFont->LegacySize, 10000, 0, buf);
|
||||
float tx = iMax.x - sz.x - ImGui::GetStyle().FramePadding.x;
|
||||
float ty = iMin.y + (iMax.y - iMin.y - sz.y) * 0.5f;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(tx, ty),
|
||||
IM_COL32(255, 255, 255, (int)S.drawElement("tabs.receive", "input-overlay-text-alpha").size), buf);
|
||||
}
|
||||
ImGui::PopItemWidth();
|
||||
}
|
||||
|
||||
// Toggle button
|
||||
ImGui::SameLine(0, Layout::spacingMd());
|
||||
{
|
||||
const char* currLabel = s_request_usd_mode ? "DRGX" : "USD";
|
||||
bool canToggle = (usd_price > 0);
|
||||
ImGui::BeginDisabled(!canToggle);
|
||||
if (TactileButton("##ToggleCurrencyRecv", ImVec2(toggleW, 0), S.resolveFont("button"))) {
|
||||
s_request_usd_mode = !s_request_usd_mode;
|
||||
if (s_request_usd_mode && usd_price > 0)
|
||||
s_request_usd_amount = s_request_amount * usd_price;
|
||||
}
|
||||
{
|
||||
ImVec2 bMin = ImGui::GetItemRectMin();
|
||||
ImVec2 bMax = ImGui::GetItemRectMax();
|
||||
float bH = bMax.y - bMin.y;
|
||||
ImFont* font = ImGui::GetFont();
|
||||
ImVec2 textSz = font->CalcTextSizeA(font->LegacySize, 10000, 0, currLabel);
|
||||
float iconW = schema::UI().drawElement("tabs.receive", "currency-icon-width").size * Layout::dpiScale();
|
||||
float iconGap2 = schema::UI().drawElement("tabs.receive", "currency-icon-gap").size * Layout::dpiScale();
|
||||
float totalW2 = iconW + iconGap2 + textSz.x;
|
||||
float startX = bMin.x + ((bMax.x - bMin.x) - totalW2) * 0.5f;
|
||||
float cy = bMin.y + bH * 0.5f;
|
||||
ImU32 iconCol = ImGui::GetColorU32(ImGuiCol_Text);
|
||||
float ss = iconW * 0.5f;
|
||||
float cx = startX + ss;
|
||||
float ag = S.drawElement("tabs.receive", "swap-icon-arrow-gap").size * cardDp;
|
||||
float al = ss * S.drawElement("tabs.receive", "swap-icon-arrow-length-ratio").size;
|
||||
float hss = S.drawElement("tabs.receive", "swap-icon-arrowhead-size").size * cardDp;
|
||||
float ay1 = cy - ag;
|
||||
dl->AddLine(ImVec2(cx - al, ay1), ImVec2(cx + al, ay1), iconCol, S.drawElement("tabs.receive", "swap-icon-line-thickness").size * cardDp);
|
||||
dl->AddTriangleFilled(
|
||||
ImVec2(cx + al, ay1),
|
||||
ImVec2(cx + al - hss, ay1 - hss),
|
||||
ImVec2(cx + al - hss, ay1 + hss), iconCol);
|
||||
float ay2 = cy + ag;
|
||||
dl->AddLine(ImVec2(cx + al, ay2), ImVec2(cx - al, ay2), iconCol, S.drawElement("tabs.receive", "swap-icon-line-thickness").size * cardDp);
|
||||
dl->AddTriangleFilled(
|
||||
ImVec2(cx - al, ay2),
|
||||
ImVec2(cx - al + hss, ay2 - hss),
|
||||
ImVec2(cx - al + hss, ay2 + hss), iconCol);
|
||||
float tx = startX + iconW + iconGap2;
|
||||
float ty = cy - textSz.y * 0.5f;
|
||||
dl->AddText(font, font->LegacySize, ImVec2(tx, ty), iconCol, currLabel);
|
||||
}
|
||||
ImGui::EndDisabled();
|
||||
}
|
||||
ImGui::PopFont();
|
||||
|
||||
// Preset amount chips
|
||||
{
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingXs()));
|
||||
|
||||
float chipRound = schema::UI().drawElement("tabs.receive", "chip-rounding").size;
|
||||
float chipGap = schema::UI().drawElement("tabs.receive", "chip-gap").size * cardDp;
|
||||
float chipH = schema::UI().drawElement("tabs.receive", "chip-height").size * cardDp;
|
||||
|
||||
struct Preset { const char* label; double amount; };
|
||||
Preset presets[] = {
|
||||
{ "0.1", 0.1 },
|
||||
{ "1", 1.0 },
|
||||
{ "10", 10.0 },
|
||||
{ "100", 100.0 },
|
||||
{ "1K", 1000.0 },
|
||||
{ "10K", 10000.0 },
|
||||
{ "50K", 50000.0 },
|
||||
{ "100K", 100000.0 },
|
||||
};
|
||||
constexpr int presetCount = 8;
|
||||
|
||||
// Calculate equal chip widths to span full addrColW
|
||||
float totalGap = chipGap * (presetCount - 1);
|
||||
float chipW = (addrColW - totalGap) / presetCount;
|
||||
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, chipRound);
|
||||
|
||||
ImFont* chipFont = S.resolveFont("button");
|
||||
|
||||
for (int ci = 0; ci < presetCount; ci++) {
|
||||
if (ci > 0) ImGui::SameLine(0, chipGap);
|
||||
|
||||
bool active = false;
|
||||
if (s_request_usd_mode) {
|
||||
active = (usd_price > 0 && std::abs(s_request_usd_amount - presets[ci].amount) < 0.001);
|
||||
} else {
|
||||
active = (std::abs(s_request_amount - presets[ci].amount) < 1e-8);
|
||||
}
|
||||
|
||||
if (active) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, ImGui::ColorConvertU32ToFloat4(IM_COL32(255, 255, 255, (int)S.drawElement("tabs.receive", "chip-active-bg-alpha").size)));
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::ColorConvertU32ToFloat4(Primary()));
|
||||
}
|
||||
|
||||
char chipId[32];
|
||||
snprintf(chipId, sizeof(chipId), "%s##presetAmt%d", presets[ci].label, ci);
|
||||
if (TactileButton(chipId, ImVec2(chipW, chipH), chipFont)) {
|
||||
if (s_request_usd_mode) {
|
||||
s_request_usd_amount = presets[ci].amount;
|
||||
if (usd_price > 0)
|
||||
s_request_amount = s_request_usd_amount / usd_price;
|
||||
} else {
|
||||
s_request_amount = presets[ci].amount;
|
||||
if (usd_price > 0)
|
||||
s_request_usd_amount = s_request_amount * usd_price;
|
||||
}
|
||||
}
|
||||
|
||||
if (active) ImGui::PopStyleColor(2);
|
||||
}
|
||||
|
||||
ImGui::PopStyleVar();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
|
||||
// Memo (z-addresses only)
|
||||
if (isZ) {
|
||||
// ---- PAYMENT REQUEST ----
|
||||
Type().textColored(TypeStyle::Overline, OnSurfaceMedium(), TR("payment_request"));
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingSm()));
|
||||
Type().textColored(TypeStyle::Overline, OnSurfaceMedium(), TR("memo_optional"));
|
||||
ImGui::Dummy(ImVec2(0, S.drawElement("tabs.receive", "memo-label-gap").size));
|
||||
|
||||
float memoInputH = std::max(schema::UI().drawElement("tabs.receive", "memo-input-min-height").size, schema::UI().drawElement("tabs.receive", "memo-input-height").size * vScale);
|
||||
ImGui::PushItemWidth(addrColW);
|
||||
ImGui::InputTextMultiline("##RequestMemo", s_request_memo, sizeof(s_request_memo),
|
||||
ImVec2(addrColW, memoInputH));
|
||||
ImGui::PopItemWidth();
|
||||
// Amount input with currency toggle
|
||||
float toggleW = S.drawElement("tabs.receive", "currency-toggle-width").size * Layout::dpiScale();
|
||||
float amtInputW = addrColW - toggleW - Layout::spacingMd();
|
||||
if (amtInputW < S.drawElement("tabs.receive", "amount-input-min-width").size) amtInputW = S.drawElement("tabs.receive", "amount-input-min-width").size;
|
||||
double usd_price = state.market.price_usd;
|
||||
|
||||
// The Sapling memo limit is in BYTES and matches the enforced buffer size
|
||||
// (InputTextMultiline caps at sizeof(s_request_memo)); count against that, not the
|
||||
// old display-only 256 value, and warn in colour once the field is at its cap.
|
||||
size_t memo_len = strlen(s_request_memo);
|
||||
size_t memoMax = (size_t)S.drawElement("business", "memo-max-length").size;
|
||||
bool memoAtCap = memo_len + 1 >= memoMax;
|
||||
snprintf(buf, sizeof(buf), TR("byte_count_fmt"), memo_len, memoMax);
|
||||
Type().textColored(TypeStyle::Caption, memoAtCap ? Warning() : OnSurfaceDisabled(), buf);
|
||||
}
|
||||
ImGui::PushFont(body2);
|
||||
if (s_request_usd_mode && usd_price > 0) {
|
||||
ImGui::PushItemWidth(amtInputW);
|
||||
if (ImGui::InputDouble("##RequestAmountUSD", &s_request_usd_amount, 0, 0, "$%.2f")) {
|
||||
if (s_request_usd_amount < 0) s_request_usd_amount = 0;
|
||||
s_request_amount = s_request_usd_amount / usd_price;
|
||||
}
|
||||
{
|
||||
ImVec2 iMin = ImGui::GetItemRectMin();
|
||||
ImVec2 iMax = ImGui::GetItemRectMax();
|
||||
snprintf(buf, sizeof(buf), "\xe2\x89\x88 %.4f %s", s_request_amount, DRAGONX_TICKER);
|
||||
ImVec2 sz = capFont->CalcTextSizeA(capFont->LegacySize, 10000, 0, buf);
|
||||
float tx = iMax.x - sz.x - ImGui::GetStyle().FramePadding.x;
|
||||
float ty = iMin.y + (iMax.y - iMin.y - sz.y) * 0.5f;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(tx, ty),
|
||||
IM_COL32(255, 255, 255, (int)S.drawElement("tabs.receive", "input-overlay-text-alpha").size), buf);
|
||||
}
|
||||
ImGui::PopItemWidth();
|
||||
} else {
|
||||
ImGui::PushItemWidth(amtInputW);
|
||||
if (ImGui::InputDouble("##RequestAmount", &s_request_amount, 0, 0, "%.8f")) {
|
||||
if (s_request_amount < 0) s_request_amount = 0;
|
||||
if (usd_price > 0)
|
||||
s_request_usd_amount = s_request_amount * usd_price;
|
||||
}
|
||||
if (usd_price > 0 && s_request_amount > 0) {
|
||||
ImVec2 iMin = ImGui::GetItemRectMin();
|
||||
ImVec2 iMax = ImGui::GetItemRectMax();
|
||||
double usd_value = s_request_amount * usd_price;
|
||||
if (usd_value >= 0.01)
|
||||
snprintf(buf, sizeof(buf), "\xe2\x89\x88 $%.2f", usd_value);
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "\xe2\x89\x88 $%.6f", usd_value);
|
||||
ImVec2 sz = capFont->CalcTextSizeA(capFont->LegacySize, 10000, 0, buf);
|
||||
float tx = iMax.x - sz.x - ImGui::GetStyle().FramePadding.x;
|
||||
float ty = iMin.y + (iMax.y - iMin.y - sz.y) * 0.5f;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(tx, ty),
|
||||
IM_COL32(255, 255, 255, (int)S.drawElement("tabs.receive", "input-overlay-text-alpha").size), buf);
|
||||
}
|
||||
ImGui::PopItemWidth();
|
||||
}
|
||||
|
||||
// URI preview
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingSm()));
|
||||
if (s_request_amount > 0 && !s_cached_qr_data.empty()) {
|
||||
float uriWrapW = addrColW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImGui::GetCursorScreenPos(),
|
||||
OnSurfaceDisabled(), s_cached_qr_data.c_str(), nullptr, uriWrapW);
|
||||
ImVec2 uriSz = capFont->CalcTextSizeA(capFont->LegacySize, FLT_MAX,
|
||||
uriWrapW, s_cached_qr_data.c_str());
|
||||
ImGui::Dummy(ImVec2(addrColW, uriSz.y + Layout::spacingSm()));
|
||||
// Toggle button
|
||||
ImGui::SameLine(0, Layout::spacingMd());
|
||||
{
|
||||
const char* currLabel = s_request_usd_mode ? "DRGX" : "USD";
|
||||
bool canToggle = (usd_price > 0);
|
||||
ImGui::BeginDisabled(!canToggle);
|
||||
if (TactileButton("##ToggleCurrencyRecv", ImVec2(toggleW, 0), S.resolveFont("button"))) {
|
||||
s_request_usd_mode = !s_request_usd_mode;
|
||||
if (s_request_usd_mode && usd_price > 0)
|
||||
s_request_usd_amount = s_request_amount * usd_price;
|
||||
}
|
||||
{
|
||||
ImVec2 bMin = ImGui::GetItemRectMin();
|
||||
ImVec2 bMax = ImGui::GetItemRectMax();
|
||||
float bH = bMax.y - bMin.y;
|
||||
ImFont* font = ImGui::GetFont();
|
||||
ImVec2 textSz = font->CalcTextSizeA(font->LegacySize, 10000, 0, currLabel);
|
||||
float iconW = schema::UI().drawElement("tabs.receive", "currency-icon-width").size * Layout::dpiScale();
|
||||
float iconGap2 = schema::UI().drawElement("tabs.receive", "currency-icon-gap").size * Layout::dpiScale();
|
||||
float totalW2 = iconW + iconGap2 + textSz.x;
|
||||
float startX = bMin.x + ((bMax.x - bMin.x) - totalW2) * 0.5f;
|
||||
float cy = bMin.y + bH * 0.5f;
|
||||
ImU32 iconCol = ImGui::GetColorU32(ImGuiCol_Text);
|
||||
float ss = iconW * 0.5f;
|
||||
float cx = startX + ss;
|
||||
float ag = S.drawElement("tabs.receive", "swap-icon-arrow-gap").size * cardDp;
|
||||
float al = ss * S.drawElement("tabs.receive", "swap-icon-arrow-length-ratio").size;
|
||||
float hss = S.drawElement("tabs.receive", "swap-icon-arrowhead-size").size * cardDp;
|
||||
float ay1 = cy - ag;
|
||||
dl->AddLine(ImVec2(cx - al, ay1), ImVec2(cx + al, ay1), iconCol, S.drawElement("tabs.receive", "swap-icon-line-thickness").size * cardDp);
|
||||
dl->AddTriangleFilled(
|
||||
ImVec2(cx + al, ay1),
|
||||
ImVec2(cx + al - hss, ay1 - hss),
|
||||
ImVec2(cx + al - hss, ay1 + hss), iconCol);
|
||||
float ay2 = cy + ag;
|
||||
dl->AddLine(ImVec2(cx + al, ay2), ImVec2(cx - al, ay2), iconCol, S.drawElement("tabs.receive", "swap-icon-line-thickness").size * cardDp);
|
||||
dl->AddTriangleFilled(
|
||||
ImVec2(cx - al, ay2),
|
||||
ImVec2(cx - al + hss, ay2 - hss),
|
||||
ImVec2(cx - al + hss, ay2 + hss), iconCol);
|
||||
float tx = startX + iconW + iconGap2;
|
||||
float ty = cy - textSz.y * 0.5f;
|
||||
dl->AddText(font, font->LegacySize, ImVec2(tx, ty), iconCol, currLabel);
|
||||
}
|
||||
ImGui::EndDisabled();
|
||||
}
|
||||
ImGui::PopFont();
|
||||
|
||||
// Preset amount chips
|
||||
{
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingXs()));
|
||||
|
||||
float chipRound = schema::UI().drawElement("tabs.receive", "chip-rounding").size;
|
||||
float chipGap = schema::UI().drawElement("tabs.receive", "chip-gap").size * cardDp;
|
||||
float chipH = schema::UI().drawElement("tabs.receive", "chip-height").size * cardDp;
|
||||
|
||||
struct Preset { const char* label; double amount; };
|
||||
Preset presets[] = {
|
||||
{ "0.1", 0.1 },
|
||||
{ "1", 1.0 },
|
||||
{ "10", 10.0 },
|
||||
{ "100", 100.0 },
|
||||
{ "1K", 1000.0 },
|
||||
{ "10K", 10000.0 },
|
||||
{ "50K", 50000.0 },
|
||||
{ "100K", 100000.0 },
|
||||
};
|
||||
constexpr int presetCount = 8;
|
||||
|
||||
// Calculate equal chip widths to span full addrColW
|
||||
float totalGap = chipGap * (presetCount - 1);
|
||||
float chipW = (addrColW - totalGap) / presetCount;
|
||||
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, chipRound);
|
||||
|
||||
ImFont* chipFont = S.resolveFont("button");
|
||||
|
||||
for (int ci = 0; ci < presetCount; ci++) {
|
||||
if (ci > 0) ImGui::SameLine(0, chipGap);
|
||||
|
||||
bool active = false;
|
||||
if (s_request_usd_mode) {
|
||||
active = (usd_price > 0 && std::abs(s_request_usd_amount - presets[ci].amount) < 0.001);
|
||||
} else {
|
||||
active = (std::abs(s_request_amount - presets[ci].amount) < 1e-8);
|
||||
}
|
||||
|
||||
if (active) {
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, ImGui::ColorConvertU32ToFloat4(IM_COL32(255, 255, 255, (int)S.drawElement("tabs.receive", "chip-active-bg-alpha").size)));
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::ColorConvertU32ToFloat4(Primary()));
|
||||
}
|
||||
|
||||
char chipId[32];
|
||||
snprintf(chipId, sizeof(chipId), "%s##presetAmt%d", presets[ci].label, ci);
|
||||
if (TactileButton(chipId, ImVec2(chipW, chipH), chipFont)) {
|
||||
if (s_request_usd_mode) {
|
||||
s_request_usd_amount = presets[ci].amount;
|
||||
if (usd_price > 0)
|
||||
s_request_amount = s_request_usd_amount / usd_price;
|
||||
} else {
|
||||
s_request_amount = presets[ci].amount;
|
||||
if (usd_price > 0)
|
||||
s_request_usd_amount = s_request_amount * usd_price;
|
||||
}
|
||||
}
|
||||
|
||||
if (active) ImGui::PopStyleColor(2);
|
||||
}
|
||||
|
||||
ImGui::PopStyleVar();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
|
||||
// Memo (z-addresses only)
|
||||
if (isZ) {
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingSm()));
|
||||
Type().textColored(TypeStyle::Overline, OnSurfaceMedium(), TR("memo_optional"));
|
||||
ImGui::Dummy(ImVec2(0, S.drawElement("tabs.receive", "memo-label-gap").size));
|
||||
|
||||
float memoInputH = std::max(schema::UI().drawElement("tabs.receive", "memo-input-min-height").size, schema::UI().drawElement("tabs.receive", "memo-input-height").size * vScale);
|
||||
ImGui::PushItemWidth(addrColW);
|
||||
ImGui::InputTextMultiline("##RequestMemo", s_request_memo, sizeof(s_request_memo),
|
||||
ImVec2(addrColW, memoInputH));
|
||||
ImGui::PopItemWidth();
|
||||
|
||||
// The Sapling memo limit is in BYTES and matches the enforced buffer size
|
||||
// (InputTextMultiline caps at sizeof(s_request_memo)); count against that, not the
|
||||
// old display-only 256 value, and warn in colour once the field is at its cap.
|
||||
size_t memo_len = strlen(s_request_memo);
|
||||
size_t memoMax = (size_t)S.drawElement("business", "memo-max-length").size;
|
||||
bool memoAtCap = memo_len + 1 >= memoMax;
|
||||
snprintf(buf, sizeof(buf), TR("byte_count_fmt"), memo_len, memoMax);
|
||||
Type().textColored(TypeStyle::Caption, memoAtCap ? Warning() : OnSurfaceDisabled(), buf);
|
||||
}
|
||||
|
||||
// URI preview
|
||||
ImGui::Dummy(ImVec2(0, Layout::spacingSm()));
|
||||
if (s_request_amount > 0 && !s_cached_qr_data.empty()) {
|
||||
float uriWrapW = addrColW;
|
||||
dl->AddText(capFont, capFont->LegacySize, ImGui::GetCursorScreenPos(),
|
||||
OnSurfaceDisabled(), s_cached_qr_data.c_str(), nullptr, uriWrapW);
|
||||
ImVec2 uriSz = capFont->CalcTextSizeA(capFont->LegacySize, FLT_MAX,
|
||||
uriWrapW, s_cached_qr_data.c_str());
|
||||
ImGui::Dummy(ImVec2(addrColW, uriSz.y + Layout::spacingSm()));
|
||||
} else {
|
||||
ImGui::Dummy(ImVec2(addrColW, capFont->LegacySize + Layout::spacingSm()));
|
||||
}
|
||||
} else {
|
||||
ImGui::Dummy(ImVec2(addrColW, capFont->LegacySize + Layout::spacingSm()));
|
||||
// A mining (transparent) address can't be paid: no payment request and no QR code.
|
||||
RenderMiningAddressNotice(app, state, addrColW);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -874,7 +952,21 @@ void RenderReceiveTab(App* app)
|
||||
DrawGlassPanel(dl, qrPanelMin, qrPanelMax, qrGlass);
|
||||
|
||||
ImGui::SetCursorScreenPos(ImVec2(qrPanelMin.x + qrPadding, qrPanelMin.y + qrPadding));
|
||||
if (s_qr_texture) {
|
||||
if (!isZ) {
|
||||
// A mining address: nothing to scan. Mark the panel so the empty square isn't a puzzle.
|
||||
ImGui::Dummy(ImVec2(qrSize, qrSize));
|
||||
ImFont* iconF = Type().iconXL();
|
||||
const char* noPay = TR("receive_not_for_payments");
|
||||
ImVec2 iSz = iconF->CalcTextSizeA(iconF->LegacySize, FLT_MAX, 0, ICON_MD_CONSTRUCTION);
|
||||
ImVec2 tSz = capFont->CalcTextSizeA(capFont->LegacySize, FLT_MAX, qrSize, noPay);
|
||||
const float blockH = iSz.y + Layout::spacingSm() + tSz.y;
|
||||
const float cx = qrPanelMin.x + totalQrSize * 0.5f;
|
||||
const float top = qrPanelMin.y + (totalQrSize - blockH) * 0.5f;
|
||||
dl->AddText(iconF, iconF->LegacySize, ImVec2(cx - iSz.x * 0.5f, top), WithAlpha(Warning(), 200),
|
||||
ICON_MD_CONSTRUCTION);
|
||||
dl->AddText(capFont, capFont->LegacySize, ImVec2(cx - tSz.x * 0.5f, top + iSz.y + Layout::spacingSm()),
|
||||
OnSurfaceDisabled(), noPay, nullptr, qrSize);
|
||||
} else if (s_qr_texture) {
|
||||
RenderQRCode(s_qr_texture, qrSize);
|
||||
} else {
|
||||
ImGui::Dummy(ImVec2(qrSize, qrSize));
|
||||
@@ -886,12 +978,12 @@ void RenderReceiveTab(App* app)
|
||||
|
||||
ImGui::SetCursorScreenPos(qrPanelMin);
|
||||
ImGui::InvisibleButton("##QRClickCopy", ImVec2(totalQrSize, totalQrSize));
|
||||
if (ImGui::IsItemHovered()) {
|
||||
if (isZ && ImGui::IsItemHovered()) {
|
||||
ImGui::SetMouseCursor(ImGuiMouseCursor_Hand);
|
||||
material::Tooltip("%s",
|
||||
s_request_amount > 0 ? TR("click_copy_uri") : TR("click_copy_address"));
|
||||
}
|
||||
if (ImGui::IsItemClicked()) {
|
||||
if (isZ && ImGui::IsItemClicked()) {
|
||||
ImGui::SetClipboardText(qr_data.c_str());
|
||||
Notifications::instance().info(s_request_amount > 0
|
||||
? TR("payment_uri_copied") : TR("address_copied"));
|
||||
|
||||
@@ -14,6 +14,8 @@ namespace ui {
|
||||
* Shows addresses for receiving funds with QR codes
|
||||
*/
|
||||
void RenderReceiveTab(App* app);
|
||||
// UI sweep: select `address` on the Receive tab (nullptr: back to the default choice).
|
||||
void SweepSelectReceiveAddress(App* app, const char* address);
|
||||
|
||||
} // namespace ui
|
||||
} // namespace dragonx
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "../../app.h"
|
||||
#include "../../util/i18n.h"
|
||||
#include "../../util/payment_uri.h"
|
||||
#include "../../util/address_validation.h"
|
||||
#include "../notifications.h"
|
||||
#include "../schema/ui_schema.h"
|
||||
#include "../widgets/qr_code.h"
|
||||
@@ -47,8 +48,10 @@ void RequestPaymentDialog::show(const std::string& address)
|
||||
s_label[0] = '\0';
|
||||
s_uri_dirty = true;
|
||||
|
||||
if (!address.empty()) {
|
||||
// Only a shielded address can be paid (DragonX is a private chain): never prefill a mining address.
|
||||
if (!address.empty() && !util::isTransparentAddress(address)) {
|
||||
strncpy(s_address, address.c_str(), sizeof(s_address) - 1);
|
||||
s_address[sizeof(s_address) - 1] = '\0';
|
||||
} else {
|
||||
s_address[0] = '\0';
|
||||
}
|
||||
@@ -78,9 +81,6 @@ void RequestPaymentDialog::render(App* app)
|
||||
auto zAddrLbl = S.label("dialogs.request-payment", "z-addr-label");
|
||||
auto zAddrFrontLbl = S.label("dialogs.request-payment", "z-addr-front-label");
|
||||
auto zAddrBackLbl = S.label("dialogs.request-payment", "z-addr-back-label");
|
||||
auto tAddrLbl = S.label("dialogs.request-payment", "t-addr-label");
|
||||
auto tAddrFrontLbl = S.label("dialogs.request-payment", "t-addr-front-label");
|
||||
auto tAddrBackLbl = S.label("dialogs.request-payment", "t-addr-back-label");
|
||||
auto amountInput = S.input("dialogs.request-payment", "amount-input");
|
||||
auto memoInput = S.input("dialogs.request-payment", "memo-input");
|
||||
auto qr = S.drawElement("dialogs.request-payment", "qr-code");
|
||||
@@ -124,22 +124,8 @@ void RequestPaymentDialog::render(App* app)
|
||||
}
|
||||
}
|
||||
|
||||
// T-addresses
|
||||
if (!state.t_addresses.empty()) {
|
||||
ImGui::TextDisabled("%s", TR("request_transparent_addrs"));
|
||||
for (size_t i = 0; i < state.t_addresses.size(); i++) {
|
||||
const auto& addr = state.t_addresses[i];
|
||||
std::string label = addr.address;
|
||||
if (label.length() > static_cast<size_t>(tAddrLbl.truncate)) {
|
||||
label = label.substr(0, tAddrFrontLbl.truncate) + "..." + label.substr(label.length() - tAddrBackLbl.truncate);
|
||||
}
|
||||
|
||||
if (ImGui::Selectable(label.c_str(), addr.address == s_address)) {
|
||||
strncpy(s_address, addr.address.c_str(), sizeof(s_address) - 1);
|
||||
s_uri_dirty = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// No mining (transparent) addresses: they only receive mining rewards, so a request to one
|
||||
// could never be paid.
|
||||
ImGui::EndCombo();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ bool ValidateAddressDialog::s_validating = false;
|
||||
char ValidateAddressDialog::s_address_input[512] = "";
|
||||
bool ValidateAddressDialog::s_is_valid = false;
|
||||
bool ValidateAddressDialog::s_is_mine = false;
|
||||
bool ValidateAddressDialog::s_is_mining = false;
|
||||
std::string ValidateAddressDialog::s_address_type;
|
||||
std::string ValidateAddressDialog::s_error_message;
|
||||
|
||||
@@ -33,10 +34,22 @@ void ValidateAddressDialog::show()
|
||||
s_address_input[0] = '\0';
|
||||
s_is_valid = false;
|
||||
s_is_mine = false;
|
||||
s_is_mining = false;
|
||||
s_address_type.clear();
|
||||
s_error_message.clear();
|
||||
}
|
||||
|
||||
void ValidateAddressDialog::sweepShowMiningResult(const char* address)
|
||||
{
|
||||
show();
|
||||
snprintf(s_address_input, sizeof(s_address_input), "%s", address);
|
||||
s_validated = true;
|
||||
s_is_valid = true;
|
||||
s_is_mine = true;
|
||||
s_is_mining = true;
|
||||
s_address_type = TR("validate_mining_type");
|
||||
}
|
||||
|
||||
bool ValidateAddressDialog::isOpen()
|
||||
{
|
||||
return s_open;
|
||||
@@ -112,6 +125,7 @@ void ValidateAddressDialog::render(App* app)
|
||||
s_is_valid = valid;
|
||||
s_is_mine = mine;
|
||||
s_address_type = TR("validate_shielded_type");
|
||||
s_is_mining = false;
|
||||
} else {
|
||||
s_error_message = error;
|
||||
s_is_valid = false;
|
||||
@@ -138,7 +152,8 @@ void ValidateAddressDialog::render(App* app)
|
||||
if (error.empty()) {
|
||||
s_is_valid = valid;
|
||||
s_is_mine = mine;
|
||||
s_address_type = TR("validate_transparent_type");
|
||||
s_address_type = TR("validate_mining_type");
|
||||
s_is_mining = true;
|
||||
} else {
|
||||
s_error_message = error;
|
||||
s_is_valid = false;
|
||||
@@ -204,6 +219,12 @@ void ValidateAddressDialog::render(App* app)
|
||||
} else {
|
||||
ImGui::TextDisabled("%s", TR("validate_not_mine"));
|
||||
}
|
||||
if (s_is_mining) { // valid, but not for payments
|
||||
ImGui::Spacing();
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, ImGui::ColorConvertU32ToFloat4(material::Warning()));
|
||||
ImGui::TextWrapped("%s", TR("mining_addr_explainer"));
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!app->isConnected()) {
|
||||
|
||||
@@ -38,6 +38,9 @@ public:
|
||||
*/
|
||||
static void hide();
|
||||
|
||||
/** UI sweep: show the result for a valid mining (transparent) address of ours. */
|
||||
static void sweepShowMiningResult(const char* address);
|
||||
|
||||
private:
|
||||
static bool s_open;
|
||||
static bool s_validated;
|
||||
@@ -47,6 +50,7 @@ private:
|
||||
// Validation results
|
||||
static bool s_is_valid;
|
||||
static bool s_is_mine;
|
||||
static bool s_is_mining; // a valid transparent (mining) address: explain it can't be paid
|
||||
static std::string s_address_type;
|
||||
static std::string s_error_message;
|
||||
};
|
||||
|
||||
+10
-8
@@ -1632,21 +1632,21 @@ void I18n::loadBuiltinEnglish()
|
||||
|
||||
// Wallet > Addresses & Privacy
|
||||
strings_["faq_w_addr_1_q"] = "What's the difference between transparent and shielded addresses?";
|
||||
strings_["faq_w_addr_1_a"] = "Transparent addresses (they start with R or t) work like most coins: the amounts and addresses are public on the blockchain.\n\nShielded addresses (z-addresses, starting with zs) use zero-knowledge cryptography \xE2\x80\x94 the amount, sender, and receiver are encrypted on-chain. Balances held in shielded addresses are private.";
|
||||
strings_["faq_w_addr_1_a"] = "Shielded addresses (z-addresses, starting with zs) are the ones you use on DragonX. They use zero-knowledge cryptography, so the amount, sender and receiver are encrypted on-chain and your balance stays private.\n\nTransparent addresses (starting with R) are mining addresses. DragonX is a fully private chain, so they can only receive mining rewards — the network rejects any payment sent to one. Rewards that arrive there are public until they are shielded, which the wallet does automatically.";
|
||||
strings_["faq_w_addr_2_q"] = "Which address type should I use?";
|
||||
strings_["faq_w_addr_2_a"] = "Prefer shielded (z) addresses whenever possible \xE2\x80\x94 they keep your balance and payment history private. DragonX is a privacy coin and shielded is the default for received funds.\n\nUse a transparent address only when a service you interact with cannot handle shielded addresses.";
|
||||
strings_["faq_w_addr_2_a"] = "Use a shielded (zs) address for everything you send and receive — on DragonX it is the only kind that can be paid.\n\nTransparent (mining) addresses are only for solo-mining rewards. Never give one out for a payment: the network will reject it.";
|
||||
strings_["faq_w_addr_3_q"] = "Should I reuse an address or make a new one?";
|
||||
strings_["faq_w_addr_3_a"] = "For shielded addresses, reuse is fine and does not leak history. For transparent addresses, using a fresh address per payment improves privacy. Create new addresses from the Receive tab.";
|
||||
strings_["faq_w_addr_3_a"] = "Reusing a shielded address is fine and does not leak your history. You can still create new ones from the Receive tab, for example one per contact to see who paid you. Mining addresses are only for mining rewards; you rarely need a new one.";
|
||||
strings_["faq_w_addr_4_q"] = "What is 'shielding'?";
|
||||
strings_["faq_w_addr_4_a"] = "Shielding moves coins from a transparent address into a shielded one, making them private. Newly mined coins arrive transparent and are shielded for you automatically.\n\nYou can also shield manually from the wallet; a shield is just a special transaction, so it takes a normal confirmation time to complete.";
|
||||
strings_["faq_w_addr_4_a"] = "Shielding moves coins from a transparent (mining) address into a shielded one, making them private. Newly mined coins arrive at a mining address and are shielded for you automatically once they mature.\n\nYou can also shield manually from the wallet; a shield is just a special transaction, so it takes a normal confirmation time to complete.";
|
||||
|
||||
// Wallet > Sending & Receiving
|
||||
strings_["faq_w_send_1_q"] = "How do I send funds?";
|
||||
strings_["faq_w_send_1_a"] = "Open the Send tab, paste the recipient's address, enter an amount, and confirm. If the wallet is encrypted you'll be asked to unlock it for the transaction.\n\nSends to shielded addresses are private; sends to transparent addresses are public.";
|
||||
strings_["faq_w_send_1_a"] = "Open the Send tab, paste the recipient's address, enter an amount, and confirm. If the wallet is encrypted you'll be asked to unlock it for the transaction.\n\nPayments go to shielded (zs) addresses and stay private. The wallet won't send to a transparent (mining) address: the network rejects payments to one.";
|
||||
strings_["faq_w_send_2_q"] = "What fee do I pay?";
|
||||
strings_["faq_w_send_2_a"] = "DragonX fees are very low and are set automatically. The fee is shown before you confirm. You do not normally need to change it.";
|
||||
strings_["faq_w_send_3_q"] = "Can I attach a message to a payment?";
|
||||
strings_["faq_w_send_3_a"] = "Yes \xE2\x80\x94 when sending to a shielded (z) address you can include an encrypted memo. Only the recipient can read it. Transparent addresses do not support memos.";
|
||||
strings_["faq_w_send_3_a"] = "Yes — when sending to a shielded (z) address you can include an encrypted memo. Only the recipient can read it.";
|
||||
strings_["faq_w_send_4_q"] = "I sent a payment but it says pending \xE2\x80\x94 why?";
|
||||
strings_["faq_w_send_4_a"] = "A transaction is 'pending' until it is mined into a block and gains confirmations. This usually takes a minute or two. Shielded transactions also need your wallet to be synced to build the proof.\n\nIf a send stays pending unusually long, check that your wallet is connected and synced (see the status bar at the bottom of the window).";
|
||||
|
||||
@@ -2181,6 +2181,10 @@ void I18n::loadBuiltinEnglish()
|
||||
strings_["contact_chip_mining"] = "Mining only";
|
||||
strings_["failed_create_mining_address"] = "Failed to create mining address";
|
||||
strings_["new_mining_address_created"] = "New mining address created";
|
||||
strings_["mining_addr_explainer"] = "Receives solo-mining rewards only — the network rejects payments to it. Rewards are shielded automatically once they mature.";
|
||||
strings_["receive_use_shielded"] = "Use a shielded address";
|
||||
strings_["receive_not_for_payments"] = "Not for payments";
|
||||
strings_["validate_mining_type"] = "Mining address (transparent)";
|
||||
strings_["mining_est_daily_pool_sub"] = "rough solo-equivalent, before pool fee";
|
||||
strings_["mining_generate_z_address_hint"] = "Generate a Z address in the Receive tab to use as your payout address";
|
||||
strings_["mining_pool_needs_payout_tooltip"] = "Enter a payout address first (generate a Z address)";
|
||||
@@ -2414,7 +2418,6 @@ void I18n::loadBuiltinEnglish()
|
||||
strings_["request_select_address"] = "Select address...";
|
||||
strings_["request_shielded_addrs"] = "-- Shielded Addresses --";
|
||||
strings_["request_title"] = "Request Payment";
|
||||
strings_["request_transparent_addrs"] = "-- Transparent Addresses --";
|
||||
strings_["request_uri_copied"] = "Payment URI copied to clipboard";
|
||||
|
||||
// --- Send Tab ---
|
||||
@@ -2542,7 +2545,6 @@ void I18n::loadBuiltinEnglish()
|
||||
strings_["validate_shielded_type"] = "Shielded (z-address)";
|
||||
strings_["validate_status"] = "Status:";
|
||||
strings_["validate_title"] = "Validate Address";
|
||||
strings_["validate_transparent_type"] = "Transparent (t-address)";
|
||||
strings_["validate_type"] = "Type:";
|
||||
strings_["validate_valid"] = "VALID";
|
||||
|
||||
|
||||
@@ -4464,7 +4464,8 @@ void testMiningAddressStringsTranslated()
|
||||
"tt_new_mining_address", "mining_address", "addr_type_mining", "mining_rewards", "mining_rewards_unshielded",
|
||||
"baltab_mining_addresses_count", "baltab_mining_amount", "balance_mining_fmt", "mining_card_tooltip",
|
||||
"mining_card_click_to_shield", "contact_chip_mining", "failed_create_mining_address",
|
||||
"new_mining_address_created",
|
||||
"new_mining_address_created", "mining_addr_explainer", "receive_use_shielded", "receive_not_for_payments",
|
||||
"validate_mining_type", "faq_w_addr_1_a", "faq_w_addr_2_a", "faq_w_addr_3_a", "faq_w_addr_4_a", "faq_w_send_1_a", "faq_w_send_3_a",
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user