mirror of
https://github.com/Qortal/qortal-ui.git
synced 2025-03-14 19:52:31 +00:00
Compare commits
100 Commits
v4.5.5-pre
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
9d72f4539d | ||
|
060390da23 | ||
|
2547025d9e | ||
|
665d708563 | ||
|
c686a12c3a | ||
|
e2d6d83fd8 | ||
|
78f25607e2 | ||
|
502952550c | ||
|
7cae21d8ed | ||
|
6e648ece9d | ||
|
b74cd40cd3 | ||
|
d7708259de | ||
|
3837973ba8 | ||
|
af8dcae748 | ||
|
8b64c80019 | ||
|
1ded359b7a | ||
|
2e3a02458d | ||
|
8b8ad3015f | ||
|
d16781e73b | ||
|
d6e0846d58 | ||
|
003eb5c45a | ||
|
f7971f7026 | ||
|
d3f9e0878b | ||
|
585d133143 | ||
|
4457215a0e | ||
|
d915b25b47 | ||
|
5011917a68 | ||
|
137dc4d0b3 | ||
|
aca57727a1 | ||
|
72ec9fc092 | ||
|
a0a1fb34f1 | ||
|
d822c65fc5 | ||
|
80d4ce82f1 | ||
|
db71257c02 | ||
|
2483163b6e | ||
|
82dfabd6c0 | ||
|
baeb25e8bf | ||
|
9b54fde947 | ||
|
10c38b3c40 | ||
|
c0e2935d9b | ||
|
525f866447 | ||
|
162ac0fda3 | ||
|
7c39de10fd | ||
|
c9a4133013 | ||
|
6ad91d6934 | ||
|
1041964df4 | ||
|
04a91efcac | ||
|
d2cb1e9d1c | ||
|
18c85674d9 | ||
|
f261a7d4d7 | ||
|
9ab7f77292 | ||
|
34cb1bcb38 | ||
|
4fa85d4923 | ||
|
4d35a7d6c0 | ||
|
f3874fdc72 | ||
|
800884302d | ||
|
2450c6326f | ||
|
950d098249 | ||
|
7a8bbab6d1 | ||
|
bf3d968c18 | ||
|
b89a424131 | ||
|
6debf5fd72 | ||
|
e9ab20a451 | ||
|
aa902563dd | ||
|
599df66c88 | ||
|
2871d3d4c5 | ||
|
e2e358c748 | ||
|
a645d76b10 | ||
|
a696444978 | ||
|
eade77c98b | ||
|
79e9080f6e | ||
|
694e4e6f92 | ||
|
38d4c38393 | ||
|
53c3006482 | ||
|
5b46191945 | ||
|
95e5c8a752 | ||
|
bd9d74892b | ||
|
0eff3c3d15 | ||
|
3667db0616 | ||
|
7c2e74b03b | ||
|
cdb363c8c7 | ||
|
d36c006f21 | ||
|
54061dcf2b | ||
|
d980dae71a | ||
|
591269ee1e | ||
|
ae2cc2b3d1 | ||
|
287f582275 | ||
|
0a6e2b7f85 | ||
|
d86e3134c0 | ||
|
edf1160d27 | ||
|
1ca2cd3652 | ||
|
8b14cd2aa2 | ||
|
caa745ab4c | ||
|
a4a5af8928 | ||
|
f887bc6b4f | ||
|
3fc0281655 | ||
|
3b378c6e56 | ||
|
b5a9be475e | ||
|
3edea9fe8c | ||
|
d212bf95ae |
@ -26,8 +26,8 @@ Easiest way to install the lastest required packages on Linux is via nvm.
|
|||||||
``` source ~/.profile ``` (For Debian based distro) <br/>
|
``` source ~/.profile ``` (For Debian based distro) <br/>
|
||||||
``` source ~/.bashrc ``` (For Fedora / CentOS) <br/>
|
``` source ~/.bashrc ``` (For Fedora / CentOS) <br/>
|
||||||
``` nvm ls-remote ``` (Fetch list of available versions) <br/>
|
``` nvm ls-remote ``` (Fetch list of available versions) <br/>
|
||||||
``` nvm install v18.20.3 ``` (Latest LTS: Hydrogen supported by Electron V31) <br/>
|
``` nvm install v20.16.0 ``` (Latest LTS: Iron supported by Electron V32) <br/>
|
||||||
``` npm --location=global install npm@10.8.1 ``` <br/>
|
``` npm --location=global install npm@10.9.2 ``` <br/>
|
||||||
|
|
||||||
Adding via binary package mirror will only work if you have set the package path. You can do a node or java build via ports instead by downloading ports with portsnap fetch method.
|
Adding via binary package mirror will only work if you have set the package path. You can do a node or java build via ports instead by downloading ports with portsnap fetch method.
|
||||||
|
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Empfänger",
|
"rchange6": "Empfänger",
|
||||||
"rchange7": "Aktion",
|
"rchange7": "Aktion",
|
||||||
"rchange8": "Typ",
|
"rchange8": "Typ",
|
||||||
"rchange9": "Die Stufen 1–4 können nur Self-Share-(Minting-)Schlüssel erstellen. Nur Level 5 oder höher kann einen Prämienanteil erstellen!",
|
"rchange9": "Die Stufen 0–4 können nur Self-Share-(Minting-)Schlüssel erstellen. Nur Level 5 oder höher kann einen Prämienanteil erstellen!",
|
||||||
"rchange10": "Öffentlicher Schlüssel des Empfängers",
|
"rchange10": "Öffentlicher Schlüssel des Empfängers",
|
||||||
"rchange11": "Belohnungsanteil in Prozent",
|
"rchange11": "Belohnungsanteil in Prozent",
|
||||||
"rchange12": "Angeforderter Befehl wird ausgeführt...",
|
"rchange12": "Angeforderter Befehl wird ausgeführt...",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Um die Änderungen zu übermitteln, vergessen Sie nicht, auf ‚Profil aktualisieren‘ zu klicken",
|
"bchange51": "Um die Änderungen zu übermitteln, vergessen Sie nicht, auf ‚Profil aktualisieren‘ zu klicken",
|
||||||
"bchange52": "Erteilen Sie dieser Anwendung die Berechtigung, Ihre Wallet-Informationen abzurufen?",
|
"bchange52": "Erteilen Sie dieser Anwendung die Berechtigung, Ihre Wallet-Informationen abzurufen?",
|
||||||
"bchange53": "Erlaube immer, dass deine Freundesliste automatisch von allen Apps abgerufen wird",
|
"bchange53": "Erlaube immer, dass deine Freundesliste automatisch von allen Apps abgerufen wird",
|
||||||
"bchange54": "Erteilen Sie dieser Anwendung die Berechtigung, auf Ihre Freundesliste zuzugreifen?"
|
"bchange54": "Erteilen Sie dieser Anwendung die Berechtigung, auf Ihre Freundesliste zuzugreifen?",
|
||||||
|
"bchange55": "Geben Sie dieser Anwendung die Erlaubnis, diesen Befehl zu senden?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Datenmanagement",
|
"dchange1": "Datenmanagement",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Schriftgröße der Chat-Nachricht",
|
"cs6": "Schriftgröße der Chat-Nachricht",
|
||||||
"cs7": "Standard",
|
"cs7": "Standard",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Alle angeforderten ATs müssen von derselben ausländischen Blockchain sein.",
|
||||||
|
"mpchange2": "Geben Sie dieser Anwendung die Berechtigung, einen Kaufauftrag auszuführen?",
|
||||||
|
"mpchange3": "Kaufauftrag erfolgreich erstellt",
|
||||||
|
"mpchange4": "Bitte warten Sie, bis Kaufauftrag ausgeführt wurde",
|
||||||
|
"mpchange5": "Kaufauftrag konnte nicht übermittelt werden.",
|
||||||
|
"mpchange6": "Geben Sie dieser Anwendung die Berechtigung, einen Verkaufsauftrag auszuführen?",
|
||||||
|
"mpchange7": "Für:",
|
||||||
|
"mpchange8": "Verkaufsauftrag wurde erfolgreich erstellt.",
|
||||||
|
"mpchange9": "Bitte warten Sie, bis der Verkaufsauftrag aufgelistet wird.",
|
||||||
|
"mpchange10": "Verkaufsauftrag konnte nicht übermittelt werden.",
|
||||||
|
"mpchange11": "AT-Informationen können nicht gefunden werden.",
|
||||||
|
"mpchange12": "Geben Sie dieser Anwendung die Berechtigung, einen Verkaufsauftrag zu stornieren?",
|
||||||
|
"mpchange13": "Verkaufsauftrag wurde erfolgreich storniert.",
|
||||||
|
"mpchange14": "Bitte warten Sie, bis die Stornierung des Handels ausgeführt wurde.",
|
||||||
|
"mpchange15": "Verkaufsauftrag konnte nicht storniert werden.",
|
||||||
|
"mpchange16": "Fehler beim Abrufen der Liste.",
|
||||||
|
"mpchange17": "Fehler beim Hinzufügen zur Liste.",
|
||||||
|
"mpchange18": "Fehler beim Löschen der Liste.",
|
||||||
|
"mpchange19": "Fehler beim Abrufen der Freundesliste.",
|
||||||
|
"mpchange20": "Anzahl ist keine Zahl.",
|
||||||
|
"mpchange21": "Anzahl fehlt.",
|
||||||
|
"mpchange22": "Es wurden keine Daten oder Dateien übermittelt.",
|
||||||
|
"mpchange23": "Zum Verschlüsseln von Daten sind öffentliche Schlüssel erforderlich.",
|
||||||
|
"mpchange24": "Nur verschlüsselte Daten können in private Dienste gelangen.",
|
||||||
|
"mpchange25": "Upload aufgrund fehlgeschlagener Verschlüsselung fehlgeschlagen.",
|
||||||
|
"mpchange26": "Upload fehlgeschlagen.",
|
||||||
|
"mpchange27": "Ungültige Daten.",
|
||||||
|
"mpchange28": "Keine Ressourcen zum Veröffentlichen.",
|
||||||
|
"mpchange29": "Unbekannter Fehler.",
|
||||||
|
"mpchange30": "Umfrage nicht gefunden.",
|
||||||
|
"mpchange31": "Bei der Umfrage konnte nicht abgestimmt werden.",
|
||||||
|
"mpchange32": "Umfrage konnte nicht erstellt werden.",
|
||||||
|
"mpchange33": "Bitte geben Sie einen Qortal-Link ein - qortal://...",
|
||||||
|
"mpchange34": "Ungültiger Qortal-Link.",
|
||||||
|
"mpchange35": "Fehler beim Senden der Benachrichtigung.",
|
||||||
|
"mpchange36": "Nachricht konnte nicht gesendet werden.",
|
||||||
|
"mpchange37": "An diesen Benutzer kann keine verschlüsselte Nachricht gesendet werden, da sein öffentlicher Schlüssel nicht in der Kette vorhanden ist.",
|
||||||
|
"mpchange38": "Anforderung konnte nicht erfüllt werden.",
|
||||||
|
"mpchange39": "Gruppe nicht gefunden.",
|
||||||
|
"mpchange40": "Geben Sie dieser Anwendung die Berechtigung, eine Gruppenbeitrittsanforderung auszuführen?",
|
||||||
|
"mpchange41": "Gruppenname:",
|
||||||
|
"mpchange42": "Gruppen-ID:",
|
||||||
|
"mpchange43": "Gruppenbeitrittsanforderung erfolgreich erstellt.",
|
||||||
|
"mpchange44": "Fehler beimbeitreten der Gruppe.",
|
||||||
|
"mpchange45": "Ein MIME-Typ konnte nicht abgeleitet werden.",
|
||||||
|
"mpchange46": "Eine Dateierweiterung konnte nicht abgeleitet werden.",
|
||||||
|
"mpchange47": "Benutzer hat den Download abgelehnt.",
|
||||||
|
"mpchange48": "Download konnte nicht gestartet werden.",
|
||||||
|
"mpchange49": "AT konnte nicht bereitgestellt werden.",
|
||||||
|
"mpchange50": "Benutzer hat kein Profil.",
|
||||||
|
"mpchange51": "Angeforderte Daten konnten nicht gefunden werden.",
|
||||||
|
"mpchange52": "Profildaten konnten nicht abgerufen werden.",
|
||||||
|
"mpchange53": "Eigenschaft konnte nicht festgelegt werden.",
|
||||||
|
"mpchange54": "Profil konnte nicht geöffnet werden.",
|
||||||
|
"mpchange55": "Fehler beim Abrufen der Serverinformationen.",
|
||||||
|
"mpchange56": "Fehler in der Zusammenfassung der Sendeaktivität.",
|
||||||
|
"mpchange57": "Fehler beim Abrufen der ausländischen Gebühr.",
|
||||||
|
"mpchange58": "Fehler beim Aktualisieren der ausländischen Gebühr.",
|
||||||
|
"mpchange59": "Fehler beim Abrufen des Serververbindungsverlaufs.",
|
||||||
|
"mpchange60": "Fehler beim Festlegen des aktuellen Servers.",
|
||||||
|
"mpchange61": "Fehler beim Hinzufügen des Servers.",
|
||||||
|
"mpchange62": "Fehler beim Entfernen des Servers.",
|
||||||
|
"mpchange63": "Fehler beim Abrufen der Zusammenfassung.",
|
||||||
|
"mpchange64": "Transaktion konnte nicht dekodiert werden.",
|
||||||
|
"mpchange65": "Geben Sie dieser Anwendung die Berechtigung, eine Transaktion zu signieren und zu verarbeiten?",
|
||||||
|
"mpchange66": "Geben Sie dieser Anwendung die Berechtigung, eine Transaktion zu signieren?",
|
||||||
|
"mpchange67": "Lesen Sie die Transaktion sorgfältig durch, bevor Sie sie akzeptieren.",
|
||||||
|
"mpchange68": "Tx-Typ:",
|
||||||
|
"mpchange69": "TX-Daten:",
|
||||||
|
"mpchange70": "Transaktion verarbeiten wurde nicht angefordert.",
|
||||||
|
"mpchange71": "Signierte Bytes sind: ",
|
||||||
|
"mpchange72": "Transaktion erfolgreich signiert und verarbeitet.",
|
||||||
|
"mpchange73": "Transaktion wurde kann nicht verarbeitet werden.",
|
||||||
|
"mpchange74": "QORT-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||||
|
"mpchange75": "Münze konnte nicht gesendet werden.",
|
||||||
|
"mpchange76": "BTC-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||||
|
"mpchange77": "LTC-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||||
|
"mpchange78": "DOGE-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||||
|
"mpchange79": "DGB-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||||
|
"mpchange80": "RVN-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||||
|
"mpchange81": "ARRR-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||||
|
"mpchange82": "FEHLENDE FELDER",
|
||||||
|
"mpchange83": "ABGELEHNT",
|
||||||
|
"mpchange84": "FEHLER",
|
||||||
|
"mpchange85": "ERFOLGREICH",
|
||||||
|
"mpchange86": "Immer automatisches Abrufen des Wallet-Guthabens zulassen",
|
||||||
|
"mpchange87": "Bitte geben Sie die Gruppen-ID ein"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Receptor",
|
"rchange6": "Receptor",
|
||||||
"rchange7": "Acción",
|
"rchange7": "Acción",
|
||||||
"rchange8": "Tipo",
|
"rchange8": "Tipo",
|
||||||
"rchange9": "Los niveles 1 a 4 solo pueden crear claves Self-Share (acuñación). ¡Solo el nivel 5 o superior puede crear una recompensa compartida!",
|
"rchange9": "Los niveles 0 a 4 solo pueden crear claves Self-Share (acuñación). ¡Solo el nivel 5 o superior puede crear una recompensa compartida!",
|
||||||
"rchange10": "Clave pública del receptor",
|
"rchange10": "Clave pública del receptor",
|
||||||
"rchange11": "Porcentaje de Reward share",
|
"rchange11": "Porcentaje de Reward share",
|
||||||
"rchange12": "Ejecutando el comando solicitado",
|
"rchange12": "Ejecutando el comando solicitado",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Para enviar los cambios no olvides hacer clic en 'Actualizar perfil'",
|
"bchange51": "Para enviar los cambios no olvides hacer clic en 'Actualizar perfil'",
|
||||||
"bchange52": "¿Le das permiso a esta aplicación para obtener la información de tu billetera?",
|
"bchange52": "¿Le das permiso a esta aplicación para obtener la información de tu billetera?",
|
||||||
"bchange53": "Permitir siempre que todas las aplicaciones recuperen automáticamente tu lista de amigos",
|
"bchange53": "Permitir siempre que todas las aplicaciones recuperen automáticamente tu lista de amigos",
|
||||||
"bchange54": "¿Le das permiso a esta aplicación para acceder a tu lista de amigos?"
|
"bchange54": "¿Le das permiso a esta aplicación para acceder a tu lista de amigos?",
|
||||||
|
"bchange55": "¿Le das permiso a esta aplicación para enviar este comando?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Gestión de datos",
|
"dchange1": "Gestión de datos",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Tamaño de fuente del mensaje de chat",
|
"cs6": "Tamaño de fuente del mensaje de chat",
|
||||||
"cs7": "Estándar",
|
"cs7": "Estándar",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Todos los AT solicitados deben ser de la misma Blockchain extranjera.",
|
||||||
|
"mpchange2": "¿Le da permiso a esta aplicación para ejecutar una orden de compra?",
|
||||||
|
"mpchange3": "Orden de compra creada con éxito",
|
||||||
|
"mpchange4": "Espere hasta que se complete la orden de compra",
|
||||||
|
"mpchange5": "Error al enviar la orden de compra.",
|
||||||
|
"mpchange6": "¿Le da permiso a esta aplicación para ejecutar una orden de venta?",
|
||||||
|
"mpchange7": "Para:",
|
||||||
|
"mpchange8": "Orden de venta creada con éxito.",
|
||||||
|
"mpchange9": "Espere hasta que se incluya la orden de venta.",
|
||||||
|
"mpchange10": "Error al enviar la orden de venta.",
|
||||||
|
"mpchange11": "No se puede encontrar la información del AT.",
|
||||||
|
"mpchange12": "¿Le da permiso a esta aplicación para ejecutar la cancelación de una orden de venta?",
|
||||||
|
"mpchange13": "Orden de venta cancelada con éxito.",
|
||||||
|
"mpchange14": "Espere hasta que se complete la cancelación de la operación cumplido.",
|
||||||
|
"mpchange15": "Error al cancelar la orden de venta.",
|
||||||
|
"mpchange16": "Error al recuperar la lista.",
|
||||||
|
"mpchange17": "Error al agregar a la lista.",
|
||||||
|
"mpchange18": "Error al eliminar la lista.",
|
||||||
|
"mpchange19": "Error al recuperar la lista de amigos.",
|
||||||
|
"mpchange20": "El recuento no es un número.",
|
||||||
|
"mpchange21": "Falta el recuento.",
|
||||||
|
"mpchange22": "No se enviaron datos ni archivos.",
|
||||||
|
"mpchange23": "El cifrado de datos requiere claves públicas.",
|
||||||
|
"mpchange24": "Solo los datos cifrados pueden ingresar a servicios privados.",
|
||||||
|
"mpchange25": "Error de carga debido a un cifrado fallido.",
|
||||||
|
"mpchange26": "Error de carga.",
|
||||||
|
"mpchange27": "Datos no válidos.",
|
||||||
|
"mpchange28": "No hay recursos para publicar.",
|
||||||
|
"mpchange29": "Error desconocido.",
|
||||||
|
"mpchange30": "Encuesta no encontrada.",
|
||||||
|
"mpchange31": "Error al votar en la encuesta.",
|
||||||
|
"mpchange32": "Error al crear la encuesta.",
|
||||||
|
"mpchange33": "Por favor, introduzca un enlace qortal - qortal://...",
|
||||||
|
"mpchange34": "Enlace qortal no válido.",
|
||||||
|
"mpchange35": "Error al enviar la notificación.",
|
||||||
|
"mpchange36": "No se pudo enviar el mensaje.",
|
||||||
|
"mpchange37": "No se puede enviar un mensaje cifrado a este usuario ya que no tiene su clave pública en la cadena.",
|
||||||
|
"mpchange38": "No se pudo completar la solicitud.",
|
||||||
|
"mpchange39": "Grupo no encontrado.",
|
||||||
|
"mpchange40": "¿Le da permiso a esta aplicación para realizar una solicitud de unirse a un grupo?",
|
||||||
|
"mpchange41": "Nombre del grupo:",
|
||||||
|
"mpchange42": "ID del grupo:",
|
||||||
|
"mpchange43": "Solicitud de unirse a un grupo creada correctamente.",
|
||||||
|
"mpchange44": "Error al unirse al grupo.",
|
||||||
|
"mpchange45": "No se pudo derivar un tipo mime.",
|
||||||
|
"mpchange46": "No se pudo derivar una extensión de archivo.",
|
||||||
|
"mpchange47": "El usuario rechazó la descarga.",
|
||||||
|
"mpchange48": "Error al iniciar la descarga.",
|
||||||
|
"mpchange49": "Error al implementar AT.",
|
||||||
|
"mpchange50": "El usuario no tiene un perfil.",
|
||||||
|
"mpchange51": "No se pueden encontrar los datos solicitados.",
|
||||||
|
"mpchange52": "Error al obtener los datos del perfil.",
|
||||||
|
"mpchange53": "Error al establecer la propiedad.",
|
||||||
|
"mpchange54": "Error al abrir el perfil.",
|
||||||
|
"mpchange55": "Error al recuperar la información del servidor.",
|
||||||
|
"mpchange56": "Error en el resumen de la actividad de la transacción.",
|
||||||
|
"mpchange57": "Error al obtener la tarifa extranjera.",
|
||||||
|
"mpchange58": "Error en la actualización de la tarifa extranjera.",
|
||||||
|
"mpchange59": "Error al obtener el historial de conexión del servidor.",
|
||||||
|
"mpchange60": "Error al establecer el servidor actual.",
|
||||||
|
"mpchange61": "Error al agregar servidor.",
|
||||||
|
"mpchange62": "Error al eliminar servidor.",
|
||||||
|
"mpchange63": "Error al recuperar el resumen.",
|
||||||
|
"mpchange64": "Error al decodificar la transacción.",
|
||||||
|
"mpchange65": "¿Le da permiso a esta aplicación para firmar y procesar una transacción?",
|
||||||
|
"mpchange66": "¿Le da permiso a esta aplicación para firmar una transacción?",
|
||||||
|
"mpchange67": "Lea la transacción cuidadosamente antes de aceptarla.",
|
||||||
|
"mpchange68": "Tipo de transacción:",
|
||||||
|
"mpchange69": "Datos de la transacción:",
|
||||||
|
"mpchange70": "No se solicitó procesar la transacción.",
|
||||||
|
"mpchange71": "Los bytes firmados son: ",
|
||||||
|
"mpchange72": "Transacción firmada y procesada exitosamente.",
|
||||||
|
"mpchange73": "No se pudo procesar la transacción.",
|
||||||
|
"mpchange74": "Error al obtener el saldo de QORT. ¡Inténtalo de nuevo!",
|
||||||
|
"mpchange75": "No se pudo enviar la moneda.",
|
||||||
|
"mpchange76": "Error al obtener el saldo de BTC. ¡Inténtalo de nuevo!",
|
||||||
|
"mpchange77": "Error al obtener el saldo de LTC. ¡Inténtalo de nuevo!",
|
||||||
|
"mpchange78": "Error al obtener el saldo de DOGE. ¡Inténtalo de nuevo!",
|
||||||
|
"mpchange79": "Error al obtener el saldo de DGB. ¡Inténtalo de nuevo!",
|
||||||
|
"mpchange80": "Error al obtener el saldo de RVN. ¡Inténtalo de nuevo!",
|
||||||
|
"mpchange81": "Error al obtener el saldo de ARRR. ¡Inténtalo de nuevo!",
|
||||||
|
"mpchange82": "CAMPOS FALTANTES",
|
||||||
|
"mpchange83": "RECHAZADO",
|
||||||
|
"mpchange84": "ERROR",
|
||||||
|
"mpchange85": "ÉXITO",
|
||||||
|
"mpchange86": "Permitir siempre obtener el saldo de la billetera automáticamente",
|
||||||
|
"mpchange87": "Por favor, introduzca el ID del grupo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Saaja",
|
"rchange6": "Saaja",
|
||||||
"rchange7": "Tegevus",
|
"rchange7": "Tegevus",
|
||||||
"rchange8": "Tüüp",
|
"rchange8": "Tüüp",
|
||||||
"rchange9": "Tase 1 - 4 saab luua iseseiseva jagamise. Tase 5 või kõrgem saab luua Preemiajagamise!",
|
"rchange9": "Tase 0 - 4 saab luua iseseiseva jagamise. Tase 5 või kõrgem saab luua Preemiajagamise!",
|
||||||
"rchange10": "Saaja avalik võti",
|
"rchange10": "Saaja avalik võti",
|
||||||
"rchange11": "Preemiajagamise protsent",
|
"rchange11": "Preemiajagamise protsent",
|
||||||
"rchange12": "Teeb midagi maitsvat",
|
"rchange12": "Teeb midagi maitsvat",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Muudatuste esitamiseks ärge unustage klõpsata Uuenda profiili",
|
"bchange51": "Muudatuste esitamiseks ärge unustage klõpsata Uuenda profiili",
|
||||||
"bchange52": "Kas annate sellele rakendusele loa oma rahakoti teabe hankimiseks?",
|
"bchange52": "Kas annate sellele rakendusele loa oma rahakoti teabe hankimiseks?",
|
||||||
"bchange53": "Luba alati oma sõprade loendit kõikidel rakendustel automaatselt laadida",
|
"bchange53": "Luba alati oma sõprade loendit kõikidel rakendustel automaatselt laadida",
|
||||||
"bchange54": "Kas annate sellele rakendusele loa juurdepääsuks oma sõbraloendile?"
|
"bchange54": "Kas annate sellele rakendusele loa juurdepääsuks oma sõbraloendile?",
|
||||||
|
"bchange55": "Kas annad sellele rakendusele loa selle käsu saatmiseks?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Andmete haldamine",
|
"dchange1": "Andmete haldamine",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Vestlussõnumi fondi suurus",
|
"cs6": "Vestlussõnumi fondi suurus",
|
||||||
"cs7": "Standardne",
|
"cs7": "Standardne",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Kõik taotletud AT peavad olema samast välismaisest plokiahelast.",
|
||||||
|
"mpchange2": "Kas annate sellele rakendusele loa ostutellimuse täitmiseks?",
|
||||||
|
"mpchange3": "Ostutellimuse loomine õnnestus",
|
||||||
|
"mpchange4": "Palun oodake, kuni ostutellimus täidetakse",
|
||||||
|
"mpchange5": "Ostutellimuse esitamine ebaõnnestus.",
|
||||||
|
"mpchange6": "Kas annate sellele rakendusele loa müügitellimuse täitmiseks?",
|
||||||
|
"mpchange7": "For:",
|
||||||
|
"mpchange8": "Müügitellimuse loomine õnnestus.",
|
||||||
|
"mpchange9": "Palun oodake, kuni müügitellimus loetletakse.",
|
||||||
|
"mpchange10": "Müügitellimuse esitamine ebaõnnestus.",
|
||||||
|
"mpchange11": "Ei leia AT-teavet.",
|
||||||
|
"mpchange12": "Kas annate sellele rakendusele loa müügitellimuse tühistamiseks?",
|
||||||
|
"mpchange13": "Müügitellimus on edukalt tühistatud.",
|
||||||
|
"mpchange14": "Palun oodake, kuni tehingu tühistamine täidetakse.",
|
||||||
|
"mpchange15": "Müügitellimuse tühistamine ebaõnnestus.",
|
||||||
|
"mpchange16": "Viga loendi toomisel.",
|
||||||
|
"mpchange17": "Viga loendisse lisamisel.",
|
||||||
|
"mpchange18": "Viga kustutamisloendis.",
|
||||||
|
"mpchange19": "Viga sõbraloendi toomisel.",
|
||||||
|
"mpchange20": "Arv ei ole arv.",
|
||||||
|
"mpchange21": "Puuduv arv.",
|
||||||
|
"mpchange22": "Andmeid ega faili ei esitatud.",
|
||||||
|
"mpchange23": "Andmete krüptimiseks on vaja avalikke võtmeid.",
|
||||||
|
"mpchange24": "Privaatteenustesse saab minna ainult krüptitud andmeid.",
|
||||||
|
"mpchange25": "Üleslaadimine nurjus krüptimise ebaõnnestumise tõttu.",
|
||||||
|
"mpchange26": "Üleslaadimine ebaõnnestus.",
|
||||||
|
"mpchange27": "Valed andmed.",
|
||||||
|
"mpchange28": "Avaldamiseks pole ressursse.",
|
||||||
|
"mpchange29": "Tundmatu viga.",
|
||||||
|
"mpchange30": "Küsitlust ei leitud.",
|
||||||
|
"mpchange31": "Küsitluses hääletamine ebaõnnestus.",
|
||||||
|
"mpchange32": "Küsitluse loomine ebaõnnestus.",
|
||||||
|
"mpchange33": "Palun sisestage qortali link - qortal://...",
|
||||||
|
"mpchange34": "Vigane qortal link.",
|
||||||
|
"mpchange35": "Viga teatise tõukamisel.",
|
||||||
|
"mpchange36": "Sõnumit ei saanud saata.",
|
||||||
|
"mpchange37": "Sellele kasutajale ei saa krüpteeritud sõnumit saata, kuna tal pole avalikku võtit ketis.",
|
||||||
|
"mpchange38": "Taotlust ei saanud täita.",
|
||||||
|
"mpchange39": "Grupi ei leitud.",
|
||||||
|
"mpchange40": "Kas annate sellele rakendusele loa grupiga liitumise taotluse täitmiseks?",
|
||||||
|
"mpchange41": "Rühma nimi:",
|
||||||
|
"mpchange42": "Grupi ID:",
|
||||||
|
"mpchange43": "Grupiga liitumistaotluse loomine õnnestus.",
|
||||||
|
"mpchange44": "Grupiga liitumine ebaõnnestus.",
|
||||||
|
"mpchange45": "Mime tüüpi ei saanud tuletada.",
|
||||||
|
"mpchange46": "Faililaiendit ei saanud tuletada.",
|
||||||
|
"mpchange47": "Kasutaja keeldus allalaadimisest.",
|
||||||
|
"mpchange48": "Allalaadimine ebaõnnestus.",
|
||||||
|
"mpchange49": "AT juurutamine ebaõnnestus.",
|
||||||
|
"mpchange50": "Kasutajal pole profiili.",
|
||||||
|
"mpchange51": "Ei leia nõutud andmeid.",
|
||||||
|
"mpchange52": "Profiiliandmete hankimine ebaõnnestus.",
|
||||||
|
"mpchange53": "Atribuudi määramine nurjus.",
|
||||||
|
"mpchange54": "Profiili avamine nurjus.",
|
||||||
|
"mpchange55": "Viga serveri teabe hankimisel.",
|
||||||
|
"mpchange56": "Viga tx-tegevuse kokkuvõttes.",
|
||||||
|
"mpchange57": "Viga välistasu hankimisel.",
|
||||||
|
"mpchange58": "Viga välistasu värskendamisel.",
|
||||||
|
"mpchange59": "Viga serveri ühenduse ajaloo hankimisel.",
|
||||||
|
"mpchange60": "Viga praeguse serveri määramisel.",
|
||||||
|
"mpchange61": "Viga serveri lisamisel.",
|
||||||
|
"mpchange62": "Viga serveri eemaldamisel.",
|
||||||
|
"mpchange63": "Viga kokkuvõtte toomisel.",
|
||||||
|
"mpchange64": "Tehingu dekodeerimine ebaõnnestus.",
|
||||||
|
"mpchange65": "Kas annate sellele rakendusele loa tehingu allkirjastamiseks ja töötlemiseks?",
|
||||||
|
"mpchange66": "Kas annate sellele rakendusele loa tehingu allkirjastamiseks?",
|
||||||
|
"mpchange67": "Enne aktsepteerimist lugege tehing hoolikalt läbi.",
|
||||||
|
"mpchange68": "Tx tüüp:",
|
||||||
|
"mpchange69": "TX andmed:",
|
||||||
|
"mpchange70": "Protsessi tehingut ei taotletud.",
|
||||||
|
"mpchange71": "Allkirjastatud baidid on: ",
|
||||||
|
"mpchange72": "Tehing on allkirjastatud ja edukalt töödeldud.",
|
||||||
|
"mpchange73": "Tehingut ei saanud töödelda.",
|
||||||
|
"mpchange74": "QORT saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||||
|
"mpchange75": "Münti ei saanud saata.",
|
||||||
|
"mpchange76": "BTC saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||||
|
"mpchange77": "LTC saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||||
|
"mpchange78": "DOGE saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||||
|
"mpchange79": "DGB tasakaalu toomine ebaõnnestus. Proovige uuesti!",
|
||||||
|
"mpchange80": "RVN-i saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||||
|
"mpchange81": "ARRR-i saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||||
|
"mpchange82": "PUUDUVAD VÄLJAD",
|
||||||
|
"mpchange83": "DECLINED",
|
||||||
|
"mpchange84": "FAILURE",
|
||||||
|
"mpchange85": "EDU",
|
||||||
|
"mpchange86": "Luba alati rahakoti saldo automaatne hankimine",
|
||||||
|
"mpchange87": "Palun sisestage grupi ID"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Vastaanottaja",
|
"rchange6": "Vastaanottaja",
|
||||||
"rchange7": "Toiminta",
|
"rchange7": "Toiminta",
|
||||||
"rchange8": "Tyyppi",
|
"rchange8": "Tyyppi",
|
||||||
"rchange9": "Tasot 1 - 4 voivat luoda erillisen jaon. Taso 5 tai korkeampi voi luoda palkintoosuuden!",
|
"rchange9": "Tasot 0 - 4 voivat luoda erillisen jaon. Taso 5 tai korkeampi voi luoda palkintoosuuden!",
|
||||||
"rchange10": "Vastaanottajan julkinen avain",
|
"rchange10": "Vastaanottajan julkinen avain",
|
||||||
"rchange11": "Palkintojen jakoprosentti",
|
"rchange11": "Palkintojen jakoprosentti",
|
||||||
"rchange12": "Tekee jotain herkullista",
|
"rchange12": "Tekee jotain herkullista",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Älä unohda napsauttaa Päivitä profiili lähettääksesi muutokset",
|
"bchange51": "Älä unohda napsauttaa Päivitä profiili lähettääksesi muutokset",
|
||||||
"bchange52": "Sallitko tämän sovelluksen saada lompakkosi tiedot?",
|
"bchange52": "Sallitko tämän sovelluksen saada lompakkosi tiedot?",
|
||||||
"bchange53": "Anna aina kaikkien sovellusten ladata ystäväluettelosi automaattisesti",
|
"bchange53": "Anna aina kaikkien sovellusten ladata ystäväluettelosi automaattisesti",
|
||||||
"bchange54": "Sallitko tämän sovelluksen käyttää ystäväluetteloasi?"
|
"bchange54": "Sallitko tämän sovelluksen käyttää ystäväluetteloasi?",
|
||||||
|
"bchange55": "Sallitko tämän sovelluksen lähettää tämän komennon?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Tiedonhallinta",
|
"dchange1": "Tiedonhallinta",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Chat-viestin kirjasinkoko",
|
"cs6": "Chat-viestin kirjasinkoko",
|
||||||
"cs7": "Vakio",
|
"cs7": "Vakio",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Kaikkien pyydettyjen AT:iden on oltava samasta ulkomaisesta lohkoketjusta.",
|
||||||
|
"mpchange2": "Annatko tälle sovellukselle luvan tehdä ostotilaus?",
|
||||||
|
"mpchange3": "Ostotilauksen luominen onnistui",
|
||||||
|
"mpchange4": "Odota, kunnes ostotilaus on täytetty",
|
||||||
|
"mpchange5": "Ostotilauksen lähettäminen epäonnistui.",
|
||||||
|
"mpchange6": "Annatko tälle sovellukselle luvan suorittaa myyntitilaus?",
|
||||||
|
"mpchange7": "For:",
|
||||||
|
"mpchange8": "Myyntitilauksen luominen onnistui.",
|
||||||
|
"mpchange9": "Odota, kunnes myyntitilaus tulee listalle.",
|
||||||
|
"mpchange10": "Myyntitilauksen lähettäminen epäonnistui.",
|
||||||
|
"mpchange11": "AT-tietoja ei löydy.",
|
||||||
|
"mpchange12": "Annatko tälle sovellukselle luvan peruuttaa myyntitilaus?",
|
||||||
|
"mpchange13": "Myyntitilaus peruutettu onnistuneesti.",
|
||||||
|
"mpchange14": "Odota, kunnes kaupan peruutus toteutuu.",
|
||||||
|
"mpchange15": "Myyntitilauksen peruuttaminen epäonnistui.",
|
||||||
|
"mpchange16": "Virhe haettaessa luetteloa.",
|
||||||
|
"mpchange17": "Virhe lisättäessä luetteloon.",
|
||||||
|
"mpchange18": "Virhe poistoluettelossa.",
|
||||||
|
"mpchange19": "Virhe haettaessa ystäväluetteloa.",
|
||||||
|
"mpchange20": "Laskuri ei ole luku.",
|
||||||
|
"mpchange21": "Puuttuva määrä.",
|
||||||
|
"mpchange22": "Tietoja tai tiedostoa ei lähetetty.",
|
||||||
|
"mpchange23": "Tietojen salaus vaatii julkisia avaimia.",
|
||||||
|
"mpchange24": "Vain salattu data voi mennä yksityisiin palveluihin.",
|
||||||
|
"mpchange25": "Lataus epäonnistui epäonnistuneen salauksen takia.",
|
||||||
|
"mpchange26": "Lataus epäonnistui.",
|
||||||
|
"mpchange27": "Virheelliset tiedot.",
|
||||||
|
"mpchange28": "Ei resursseja julkaistavaksi.",
|
||||||
|
"mpchange29": "Tuntematon virhe.",
|
||||||
|
"mpchange30": "Kyselyä ei löydy.",
|
||||||
|
"mpchange31": "Äänestys kyselyssä epäonnistui.",
|
||||||
|
"mpchange32": "Kyselyn luominen epäonnistui.",
|
||||||
|
"mpchange33": "Anna qortal-linkki - qortal://...",
|
||||||
|
"mpchange34": "Virheellinen qortal-linkki.",
|
||||||
|
"mpchange35": "Virhe lähetettäessä ilmoitusta.",
|
||||||
|
"mpchange36": "Viestiä ei voitu lähettää.",
|
||||||
|
"mpchange37": "Tälle käyttäjälle ei voi lähettää salattua viestiä, koska hänellä ei ole julkista avainta ketjussa.",
|
||||||
|
"mpchange38": "Pyyntöä ei voitu täyttää.",
|
||||||
|
"mpchange39": "Ryhmää ei löydy.",
|
||||||
|
"mpchange40": "Annatko tälle sovellukselle luvan suorittaa liittymispyyntö?",
|
||||||
|
"mpchange41": "Ryhmän nimi:",
|
||||||
|
"mpchange42": "Ryhmätunnus:",
|
||||||
|
"mpchange43": "Ryhmään liittymispyyntö luotu onnistuneesti.",
|
||||||
|
"mpchange44": "Ryhmään liittyminen epäonnistui.",
|
||||||
|
"mpchange45": "Mime-tyyppiä ei voitu johtaa.",
|
||||||
|
"mpchange46": "Tiedostotunnistetta ei voitu johtaa.",
|
||||||
|
"mpchange47": "Käyttäjä hylkäsi latauksen.",
|
||||||
|
"mpchange48": "Latauksen aloittaminen epäonnistui.",
|
||||||
|
"mpchange49": "AT:n käyttöönotto epäonnistui.",
|
||||||
|
"mpchange50": "Käyttäjällä ei ole profiilia.",
|
||||||
|
"mpchange51": "Pyydettyjä tietoja ei löydy.",
|
||||||
|
"mpchange52": "Profiilitietojen hakeminen epäonnistui.",
|
||||||
|
"mpchange53": "Ominaisuuden asettaminen epäonnistui.",
|
||||||
|
"mpchange54": "Profiilin avaaminen epäonnistui.",
|
||||||
|
"mpchange55": "Virhe haettaessa palvelintietoja.",
|
||||||
|
"mpchange56": "Virhe tx-toimintojen yhteenvedossa.",
|
||||||
|
"mpchange57": "Virhe ulkomaisen maksun saamisessa.",
|
||||||
|
"mpchange58": "Virhe ulkomaanmaksun päivityksessä.",
|
||||||
|
"mpchange59": "Virhe haettaessa palvelinyhteyshistoriaa.",
|
||||||
|
"mpchange60": "Virhe nykyisen palvelimen asettamisessa.",
|
||||||
|
"mpchange61": "Virhe lisäyspalvelimessa.",
|
||||||
|
"mpchange62": "Virhe poistopalvelimessa.",
|
||||||
|
"mpchange63": "Virhe haettaessa yhteenvetoa.",
|
||||||
|
"mpchange64": "Tapahtuman purkaminen epäonnistui.",
|
||||||
|
"mpchange65": "Annatko tälle sovellukselle luvan allekirjoittaa ja käsitellä tapahtuma?",
|
||||||
|
"mpchange66": "Annatko tälle sovellukselle luvan allekirjoittaa tapahtuma?",
|
||||||
|
"mpchange67": "Lue tapahtuma huolellisesti ennen hyväksymistä.",
|
||||||
|
"mpchange68": "Tx-tyyppi:",
|
||||||
|
"mpchange69": "TX Data:",
|
||||||
|
"mpchange70": "Prosessitapahtumaa ei pyydetty.",
|
||||||
|
"mpchange71": "Allekirjoitetut tavut ovat: ",
|
||||||
|
"mpchange72": "Tapahtuma allekirjoitettu ja käsitelty onnistuneesti.",
|
||||||
|
"mpchange73": "Tapahtumaa ei voitu käsitellä.",
|
||||||
|
"mpchange74": "QORT-saldon nouto epäonnistui. Yritä uudelleen!",
|
||||||
|
"mpchange75": "Kolikon lähettäminen ei onnistunut.",
|
||||||
|
"mpchange76": "BTC-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||||
|
"mpchange77": "LTC-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||||
|
"mpchange78": "DOGE-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||||
|
"mpchange79": "DGB-tasapainon nouto epäonnistui. Yritä uudelleen!",
|
||||||
|
"mpchange80": "RVN-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||||
|
"mpchange81": "ARRR-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||||
|
"mpchange82": "PUITTUVAT KENTÄT",
|
||||||
|
"mpchange83": "hylätty",
|
||||||
|
"mpchange84": "FAILURE",
|
||||||
|
"mpchange85": "SUCCESS",
|
||||||
|
"mpchange86": "Salli aina saada lompakon saldo automaattisesti",
|
||||||
|
"mpchange87": "Anna ryhmän tunnus"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Destinataire",
|
"rchange6": "Destinataire",
|
||||||
"rchange7": "Action",
|
"rchange7": "Action",
|
||||||
"rchange8": "Type",
|
"rchange8": "Type",
|
||||||
"rchange9": "Niveau 1 - 4 peuvent créer un autopartage et niveau 5 et supérieur peuvent créer un partage de récompense!",
|
"rchange9": "Niveau 0 - 4 peuvent créer un autopartage et niveau 5 et supérieur peuvent créer un partage de récompense!",
|
||||||
"rchange10": "Clé publique du bénéficiaire",
|
"rchange10": "Clé publique du bénéficiaire",
|
||||||
"rchange11": "Pourcentage du partage de récompense",
|
"rchange11": "Pourcentage du partage de récompense",
|
||||||
"rchange12": "Faire quelque chose de délicieux",
|
"rchange12": "Faire quelque chose de délicieux",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Pour soumettre les modifications n'oubliez pas de cliquer sur 'Mettre à jour le profil'",
|
"bchange51": "Pour soumettre les modifications n'oubliez pas de cliquer sur 'Mettre à jour le profil'",
|
||||||
"bchange52": "Autorisez-vous cette application à obtenir les informations de votre portefeuille ?",
|
"bchange52": "Autorisez-vous cette application à obtenir les informations de votre portefeuille ?",
|
||||||
"bchange53": "Toujours autoriser la récupération automatique de votre liste d'amis par toutes les applications",
|
"bchange53": "Toujours autoriser la récupération automatique de votre liste d'amis par toutes les applications",
|
||||||
"bchange54": "Autorisez-vous cette application à accéder à votre liste d'amis ?"
|
"bchange54": "Autorisez-vous cette application à accéder à votre liste d'amis ?",
|
||||||
|
"bchange55": "Autorisez-vous cette application à envoyer cette commande ?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Gestion de données",
|
"dchange1": "Gestion de données",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Taille de la police des messages de discussion",
|
"cs6": "Taille de la police des messages de discussion",
|
||||||
"cs7": "Standard",
|
"cs7": "Standard",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Tous les AT demandés doivent être de la même Blockchain étrangère.",
|
||||||
|
"mpchange2": "Donnez-vous à cette application la permission d'exécuter un ordre d'achat ?",
|
||||||
|
"mpchange3": "Ordre d'achat créé avec succès",
|
||||||
|
"mpchange4": "Veuillez patienter jusqu'à ce que l'ordre d'achat soit exécuté",
|
||||||
|
"mpchange5": "Échec de la soumission de l'ordre d'achat.",
|
||||||
|
"mpchange6": "Donnez-vous à cette application la permission d'exécuter un ordre de vente ?",
|
||||||
|
"mpchange7": "Pour :",
|
||||||
|
"mpchange8": "Ordre de vente créé avec succès.",
|
||||||
|
"mpchange9": "Veuillez patienter jusqu'à ce que l'ordre de vente soit répertorié.",
|
||||||
|
"mpchange10": "Échec de la soumission de l'ordre de vente.",
|
||||||
|
"mpchange11": "Impossible de trouver les informations AT.",
|
||||||
|
"mpchange12": "Donnez-vous à cette application la permission d'exécuter l'annulation d'un ordre de vente ?",
|
||||||
|
"mpchange13": "Ordre de vente annulé avec succès.",
|
||||||
|
"mpchange14": "Veuillez patienter jusqu'à ce que l'annulation de la transaction soit terminée exécuté.",
|
||||||
|
"mpchange15": "Échec de l'annulation de l'ordre de vente.",
|
||||||
|
"mpchange16": "Erreur lors de la récupération de la liste.",
|
||||||
|
"mpchange17": "Erreur lors de l'ajout à la liste.",
|
||||||
|
"mpchange18": "Erreur lors de la suppression de la liste.",
|
||||||
|
"mpchange19": "Erreur lors de la récupération de la liste d'amis.",
|
||||||
|
"mpchange20": "Le nombre n'est pas un nombre.",
|
||||||
|
"mpchange21": "Nombre manquant.",
|
||||||
|
"mpchange22": "Aucune donnée ou fichier n'a été soumis.",
|
||||||
|
"mpchange23": "Le chiffrement des données nécessite des clés publiques.",
|
||||||
|
"mpchange24": "Seules les données chiffrées peuvent être envoyées dans des services privés.",
|
||||||
|
"mpchange25": "Le téléchargement a échoué en raison d'un chiffrement échoué.",
|
||||||
|
"mpchange26": "Le téléchargement a échoué.",
|
||||||
|
"mpchange27": "Données non valides.",
|
||||||
|
"mpchange28": "Aucune ressource à publier.",
|
||||||
|
"mpchange29": "Inconnu erreur.",
|
||||||
|
"mpchange30": "Sondage non trouvé.",
|
||||||
|
"mpchange31": "Échec du vote sur le sondage.",
|
||||||
|
"mpchange32": "Échec de la création du sondage.",
|
||||||
|
"mpchange33": "Veuillez saisir un lien qortal - qortal://...",
|
||||||
|
"mpchange34": "Lien qortal non valide.",
|
||||||
|
"mpchange35": "Erreur lors de l'envoi de la notification.",
|
||||||
|
"mpchange36": "Impossible d'envoyer le message.",
|
||||||
|
"mpchange37": "Impossible d'envoyer un message chiffré à cet utilisateur car il n'a pas sa clé publique sur la chaîne.",
|
||||||
|
"mpchange38": "La demande n'a pas pu être satisfaite.",
|
||||||
|
"mpchange39": "Groupe non trouvé.",
|
||||||
|
"mpchange40": "Donnez-vous à cette application l'autorisation d'effectuer une demande de participation à un groupe ?",
|
||||||
|
"mpchange41": "Nom du groupe :",
|
||||||
|
"mpchange42": "ID du groupe :",
|
||||||
|
"mpchange43": "Demande de participation à un groupe créée avec succès.",
|
||||||
|
"mpchange44": "Impossible de rejoindre le groupe.",
|
||||||
|
"mpchange45": "Un type MIME n'a pas pu être dérivé.",
|
||||||
|
"mpchange46": "Une extension de fichier n'a pas pu être dérivée.",
|
||||||
|
"mpchange47": "L'utilisateur a refusé le téléchargement.",
|
||||||
|
"mpchange48": "Échec du lancement du téléchargement.",
|
||||||
|
"mpchange49": "Échec du déploiement d'AT.",
|
||||||
|
"mpchange50": "L'utilisateur n'a pas de profil.",
|
||||||
|
"mpchange51": "Impossible de trouver les données demandées.",
|
||||||
|
"mpchange52": "Échec de l'obtention des données de profil.",
|
||||||
|
"mpchange53": "Échec de la définition de la propriété.",
|
||||||
|
"mpchange54": "Échec de l'ouverture du profil.",
|
||||||
|
"mpchange55": "Erreur lors de la récupération des informations du serveur.",
|
||||||
|
"mpchange56": "Erreur dans le résumé de l'activité de tx.",
|
||||||
|
"mpchange57": "Erreur lors de l'obtention des frais étrangers.",
|
||||||
|
"mpchange58": "Erreur lors de la mise à jour des frais étrangers.",
|
||||||
|
"mpchange59": "Erreur lors de l'obtention de l'historique de connexion au serveur.",
|
||||||
|
"mpchange60": "Erreur lors de la définition du serveur actuel.",
|
||||||
|
"mpchange61": "Erreur lors de l'ajout d'un serveur.",
|
||||||
|
"mpchange62": "Erreur lors de la suppression d'un serveur.",
|
||||||
|
"mpchange63": "Erreur lors de la récupération du résumé.",
|
||||||
|
"mpchange64": "Échec du décodage de la transaction.",
|
||||||
|
"mpchange65": "Donnez-vous à cette application l'autorisation de signer et de traiter une transaction ?",
|
||||||
|
"mpchange66": "Donnez-vous à cette application l'autorisation de signer une transaction ?",
|
||||||
|
"mpchange67": "Lisez attentivement la transaction avant d'accepter.",
|
||||||
|
"mpchange68": "Type de Tx :",
|
||||||
|
"mpchange69": "Données de Tx :",
|
||||||
|
"mpchange70": "Le traitement de la transaction n'a pas été demandé.",
|
||||||
|
"mpchange71": "Les octets signés sont : ",
|
||||||
|
"mpchange72": "Transaction signée et traité avec succès.",
|
||||||
|
"mpchange73": "La transaction n'a pas pu être traitée.",
|
||||||
|
"mpchange74": "Échec de la récupération du solde QORT. Réessayez !",
|
||||||
|
"mpchange75": "Impossible d'envoyer la pièce.",
|
||||||
|
"mpchange76": "Échec de la récupération du solde BTC. Réessayez !",
|
||||||
|
"mpchange77": "Échec de la récupération du solde LTC. Réessayez !",
|
||||||
|
"mpchange78": "Échec de la récupération du solde DOGE. Réessayez !",
|
||||||
|
"mpchange79": "Échec de la récupération du solde DGB. Réessayez !",
|
||||||
|
"mpchange80": "Échec de la récupération du solde RVN. Réessayez !",
|
||||||
|
"mpchange81": "Échec de la récupération du solde ARRR. Réessayez !",
|
||||||
|
"mpchange82": "CHAMPS MANQUANTS",
|
||||||
|
"mpchange83": "REFUSÉ",
|
||||||
|
"mpchange84": "ÉCHEC",
|
||||||
|
"mpchange85": "SUCCÈS",
|
||||||
|
"mpchange86": "Toujours autoriser l'obtention automatique du solde du portefeuille",
|
||||||
|
"mpchange87": "Veuillez saisir l'ID du groupe"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "प्राप्तकर्ता",
|
"rchange6": "प्राप्तकर्ता",
|
||||||
"rchange7": "कार्रवाई",
|
"rchange7": "कार्रवाई",
|
||||||
"rchange8": "टाइप",
|
"rchange8": "टाइप",
|
||||||
"rchange9": "लेवल 1 - 4 एक सेल्फ शेयर बना सकता है और लेवल 5 या उससे ऊपर एक रिवॉर्ड शेयर बना सकता है!",
|
"rchange9": "लेवल 0 - 4 एक सेल्फ शेयर बना सकता है और लेवल 5 या उससे ऊपर एक रिवॉर्ड शेयर बना सकता है!",
|
||||||
"rchange10": "प्राप्तकर्ता सार्वजनिक कुंजी",
|
"rchange10": "प्राप्तकर्ता सार्वजनिक कुंजी",
|
||||||
"rchange11": "रिवॉर्ड शेयर प्रतिशत",
|
"rchange11": "रिवॉर्ड शेयर प्रतिशत",
|
||||||
"rchange12": "कुछ स्वादिष्ट करना",
|
"rchange12": "कुछ स्वादिष्ट करना",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "परिवर्तन सबमिट करने के लिए 'अपडेट प्रोफ़ाइल' पर क्लिक करना न भूलें",
|
"bchange51": "परिवर्तन सबमिट करने के लिए 'अपडेट प्रोफ़ाइल' पर क्लिक करना न भूलें",
|
||||||
"bchange52": "क्या आप इस एप्लिकेशन को अपने वॉलेट की जानकारी प्राप्त करने की अनुमति देते हैं?",
|
"bchange52": "क्या आप इस एप्लिकेशन को अपने वॉलेट की जानकारी प्राप्त करने की अनुमति देते हैं?",
|
||||||
"bchange53": "हमेशा अपनी मित्र सूची को सभी ऐप्स द्वारा स्वचालित रूप से पुनर्प्राप्त करने की अनुमति दें",
|
"bchange53": "हमेशा अपनी मित्र सूची को सभी ऐप्स द्वारा स्वचालित रूप से पुनर्प्राप्त करने की अनुमति दें",
|
||||||
"bchange54": "क्या आप इस एप्लिकेशन को अपनी मित्र सूची तक पहुंचने की अनुमति देते हैं?"
|
"bchange54": "क्या आप इस एप्लिकेशन को अपनी मित्र सूची तक पहुंचने की अनुमति देते हैं?",
|
||||||
|
"bchange55": "क्या आप इस एप्लिकेशन को यह कमांड भेजने की अनुमति देते हैं?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "डाटा प्रबंधन",
|
"dchange1": "डाटा प्रबंधन",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "चैट संदेश फ़ॉन्ट आकार",
|
"cs6": "चैट संदेश फ़ॉन्ट आकार",
|
||||||
"cs7": "मानक",
|
"cs7": "मानक",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "सभी अनुरोधित ATs एक ही विदेशी ब्लॉकचेन के होने चाहिए।",
|
||||||
|
"mpchange2": "क्या आप इस एप्लिकेशन को खरीद ऑर्डर निष्पादित करने की अनुमति देते हैं?",
|
||||||
|
"mpchange3": "खरीद ऑर्डर सफलतापूर्वक बनाया गया",
|
||||||
|
"mpchange4": "कृपया खरीद ऑर्डर पूरा होने तक प्रतीक्षा करें",
|
||||||
|
"mpchange5": "खरीद ऑर्डर सबमिट करने में विफल रहा।",
|
||||||
|
"mpchange6": "क्या आप इस एप्लिकेशन को बिक्री ऑर्डर निष्पादित करने की अनुमति देते हैं?",
|
||||||
|
"mpchange7": "के लिए:",
|
||||||
|
"mpchange8": "बिक्री ऑर्डर सफलतापूर्वक बनाया गया।",
|
||||||
|
"mpchange9": "कृपया बिक्री ऑर्डर सूचीबद्ध होने तक प्रतीक्षा करें।",
|
||||||
|
"mpchange10": "बिक्री ऑर्डर सबमिट करने में विफल रहा।",
|
||||||
|
"mpchange11": "AT जानकारी नहीं मिल पा रही है।",
|
||||||
|
"mpchange12": "क्या आप इस एप्लिकेशन को बिक्री ऑर्डर रद्द करने की अनुमति देते हैं?",
|
||||||
|
"mpchange13": "बिक्री ऑर्डर सफलतापूर्वक रद्द किया गया।",
|
||||||
|
"mpchange14": "कृपया तब तक प्रतीक्षा करें जब तक कि व्यापार रद्द करने की प्रक्रिया पूरी न हो जाए।",
|
||||||
|
"mpchange15": "बिक्री आदेश रद्द करने में विफल।",
|
||||||
|
"mpchange16": "सूची प्राप्त करने में त्रुटि।",
|
||||||
|
"mpchange17": "सूची में जोड़ने में त्रुटि।",
|
||||||
|
"mpchange18": "सूची हटाने में त्रुटि।",
|
||||||
|
"mpchange19": "मित्र सूची प्राप्त करने में त्रुटि।",
|
||||||
|
"mpchange20": "गणना कोई संख्या नहीं है।",
|
||||||
|
"mpchange21": "गणना गुम है।",
|
||||||
|
"mpchange22": "कोई डेटा या फ़ाइल सबमिट नहीं की गई।",
|
||||||
|
"mpchange23": "डेटा एन्क्रिप्ट करने के लिए सार्वजनिक कुंजी की आवश्यकता होती है।",
|
||||||
|
"mpchange24": "केवल एन्क्रिप्ट किया गया डेटा ही निजी सेवाओं में जा सकता है।",
|
||||||
|
"mpchange25": "एन्क्रिप्शन विफल होने के कारण अपलोड विफल हुआ।",
|
||||||
|
"mpchange26": "अपलोड विफल हुआ।",
|
||||||
|
"mpchange27": "अमान्य डेटा।",
|
||||||
|
"mpchange28": "प्रकाशित करने के लिए कोई संसाधन नहीं।",
|
||||||
|
"mpchange29": "अज्ञात त्रुटि।",
|
||||||
|
"mpchange30": "मतदान नहीं मिला।",
|
||||||
|
"mpchange31": "मतदान पर वोट करने में विफल।",
|
||||||
|
"mpchange32": "मतदान बनाने में विफल।",
|
||||||
|
"mpchange33": "कृपया एक qortal लिंक दर्ज करें - qortal://...",
|
||||||
|
"mpchange34": "अमान्य qortal लिंक।",
|
||||||
|
"mpchange35": "सूचना पुश करने में त्रुटि।",
|
||||||
|
"mpchange36": "संदेश नहीं भेजा जा सका।",
|
||||||
|
"mpchange37": "इस उपयोगकर्ता को एन्क्रिप्टेड संदेश नहीं भेजा जा सकता क्योंकि उनके पास चेन पर उनकी पब्लिककी नहीं है।",
|
||||||
|
"mpchange38": "अनुरोध पूरा नहीं किया जा सका।",
|
||||||
|
"mpchange39": "समूह नहीं मिला।",
|
||||||
|
"mpchange40": "क्या आप इस एप्लिकेशन को समूह में शामिल होने का अनुरोध करने की अनुमति देते हैं?",
|
||||||
|
"mpchange41": "समूह का नाम:",
|
||||||
|
"mpchange42": "समूह आईडी:",
|
||||||
|
"mpchange43": "समूह में शामिल होने का अनुरोध सफलतापूर्वक बनाया गया।",
|
||||||
|
"mpchange44": "समूह में शामिल होने में विफल रहा।",
|
||||||
|
"mpchange45": "एक माइम प्रकार प्राप्त नहीं किया जा सका।",
|
||||||
|
"mpchange46": "फ़ाइल एक्सटेंशन प्राप्त नहीं किया जा सका।",
|
||||||
|
"mpchange47": "उपयोगकर्ता ने डाउनलोड अस्वीकार कर दिया।",
|
||||||
|
"mpchange48": "डाउनलोड आरंभ करने में विफल रहा।",
|
||||||
|
"mpchange49": "AT को तैनात करने में विफल रहा।",
|
||||||
|
"mpchange50": "उपयोगकर्ता के पास प्रोफ़ाइल नहीं है।",
|
||||||
|
"mpchange51": "अनुरोधित डेटा नहीं मिल सका।",
|
||||||
|
"mpchange52": "प्रोफ़ाइल डेटा प्राप्त करने में विफल रहा।",
|
||||||
|
"mpchange53": "संपत्ति सेट करने में विफल रहा।",
|
||||||
|
"mpchange54": "प्रोफ़ाइल खोलने में विफल रहा।",
|
||||||
|
"mpchange55": "सर्वर जानकारी प्राप्त करने में त्रुटि।",
|
||||||
|
"mpchange56": "tx गतिविधि सारांश में त्रुटि।",
|
||||||
|
"mpchange57": "विदेशी शुल्क प्राप्त करने में त्रुटि।",
|
||||||
|
"mpchange58": "विदेशी शुल्क अपडेट करने में त्रुटि।",
|
||||||
|
"mpchange59": "सर्वर कनेक्शन इतिहास प्राप्त करने में त्रुटि।",
|
||||||
|
"mpchange60": "वर्तमान सर्वर सेट करने में त्रुटि।",
|
||||||
|
"mpchange61": "सर्वर जोड़ने में त्रुटि।",
|
||||||
|
"mpchange62": "सर्वर हटाने में त्रुटि।",
|
||||||
|
"mpchange63": "सारांश प्राप्त करने में त्रुटि।",
|
||||||
|
"mpchange64": "लेनदेन को डिकोड करने में विफल।",
|
||||||
|
"mpchange65": "क्या आप इस एप्लिकेशन को लेनदेन पर हस्ताक्षर करने और उसे संसाधित करने की अनुमति देते हैं?",
|
||||||
|
"mpchange66": "क्या आप इस एप्लिकेशन को लेनदेन पर हस्ताक्षर करने की अनुमति देते हैं?",
|
||||||
|
"mpchange67": "स्वीकार करने से पहले लेनदेन को ध्यान से पढ़ें।",
|
||||||
|
"mpchange68": "Tx प्रकार:",
|
||||||
|
"mpchange69": "TX डेटा:",
|
||||||
|
"mpchange70": "प्रक्रिया लेनदेन का अनुरोध नहीं किया गया था।",
|
||||||
|
"mpchange71": "हस्ताक्षरित बाइट्स हैं: ",
|
||||||
|
"mpchange72": "लेनदेन हस्ताक्षरित और सफलतापूर्वक संसाधित हुआ।",
|
||||||
|
"mpchange73": "लेनदेन संसाधित नहीं हो पाया।",
|
||||||
|
"mpchange74": "QORT बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||||
|
"mpchange75": "कॉइन नहीं भेजा जा सका।",
|
||||||
|
"mpchange76": "BTC बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||||
|
"mpchange77": "LTC बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||||
|
"mpchange78": "DOGE बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||||
|
"mpchange79": "DGB बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||||
|
"mpchange80": "RVN बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||||
|
"mpchange81": "ARRR बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||||
|
"mpchange82": "फ़ील्ड गुम",
|
||||||
|
"mpchange83": "अस्वीकृत",
|
||||||
|
"mpchange84": "विफल",
|
||||||
|
"mpchange85": "सफल",
|
||||||
|
"mpchange86": "हमेशा वॉलेट बैलेंस को स्वचालित रूप से प्राप्त करने की अनुमति दें",
|
||||||
|
"mpchange87": "कृपया ग्रुप आईडी दर्ज करें"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Primatelj",
|
"rchange6": "Primatelj",
|
||||||
"rchange7": "Akcija",
|
"rchange7": "Akcija",
|
||||||
"rchange8": "Vrsta",
|
"rchange8": "Vrsta",
|
||||||
"rchange9": "Level 1 - 4 može stvoriti samo vlastiti udio a level 5 ili više može stvoriti nagradni udio!",
|
"rchange9": "Level 0 - 4 može stvoriti samo vlastiti udio a level 5 ili više može stvoriti nagradni udio!",
|
||||||
"rchange10": "Primateljov javni ključ",
|
"rchange10": "Primateljov javni ključ",
|
||||||
"rchange11": "Nagradni udio postotak",
|
"rchange11": "Nagradni udio postotak",
|
||||||
"rchange12": "Radiš nešto ukusno :-)",
|
"rchange12": "Radiš nešto ukusno :-)",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Za slanje promjena ne zaboravite kliknuti 'Ažuriraj profil'",
|
"bchange51": "Za slanje promjena ne zaboravite kliknuti 'Ažuriraj profil'",
|
||||||
"bchange52": "Dajete li ovoj aplikaciji dopuštenje da dobije podatke o vašem novčaniku?",
|
"bchange52": "Dajete li ovoj aplikaciji dopuštenje da dobije podatke o vašem novčaniku?",
|
||||||
"bchange53": "Uvijek dopusti da sve aplikacije automatski dohvate tvoj popis prijatelja",
|
"bchange53": "Uvijek dopusti da sve aplikacije automatski dohvate tvoj popis prijatelja",
|
||||||
"bchange54": "Dajete li ovoj aplikaciji dopuštenje za pristup vašem popisu prijatelja?"
|
"bchange54": "Dajete li ovoj aplikaciji dopuštenje za pristup vašem popisu prijatelja?",
|
||||||
|
"bchange55": "Dajete li ovoj aplikaciji dopuštenje da pošalje ovu naredbu?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Upravljanje podacima",
|
"dchange1": "Upravljanje podacima",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Veličina fonta poruke chata",
|
"cs6": "Veličina fonta poruke chata",
|
||||||
"cs7": "Standardno",
|
"cs7": "Standardno",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Svi zatraženi AT-ovi moraju biti istog stranog lanca blokova.",
|
||||||
|
"mpchange2": "Dajete li ovoj aplikaciji dopuštenje za izvršavanje naloga za kupnju?",
|
||||||
|
"mpchange3": "Uspješno kreiran nalog za kupnju",
|
||||||
|
"mpchange4": "Molimo pričekajte dok se narudžba ne ispuni",
|
||||||
|
"mpchange5": "Neuspješno slanje narudžbe za kupnju.",
|
||||||
|
"mpchange6": "Dajete li ovoj aplikaciji dopuštenje za izvršavanje naloga za prodaju?",
|
||||||
|
"mpchange7": "Za:",
|
||||||
|
"mpchange8": "Uspješno kreiran prodajni nalog.",
|
||||||
|
"mpchange9": "Molimo pričekajte dok se nalog za prodaju ne pojavi na popisu.",
|
||||||
|
"mpchange10": "Neuspješno podnošenje naloga za prodaju.",
|
||||||
|
"mpchange11": "Ne mogu pronaći AT informacije.",
|
||||||
|
"mpchange12": "Dajete li ovoj aplikaciji dopuštenje za otkazivanje prodajnog naloga?",
|
||||||
|
"mpchange13": "Uspješno otkazan prodajni nalog.",
|
||||||
|
"mpchange14": "Molimo pričekajte dok se otkazivanje trgovine ne ispuni.",
|
||||||
|
"mpchange15": "Nije uspjelo otkazivanje naloga za prodaju.",
|
||||||
|
"mpchange16": "Pogreška u dohvaćanju popisa.",
|
||||||
|
"mpchange17": "Greška pri dodavanju na popis.",
|
||||||
|
"mpchange18": "Pogreška u popisu brisanja.",
|
||||||
|
"mpchange19": "Greška u dohvaćanju popisa prijatelja.",
|
||||||
|
"mpchange20": "Broj nije broj.",
|
||||||
|
"mpchange21": "Nedostaje broj.",
|
||||||
|
"mpchange22": "Nisu poslani nikakvi podaci ili datoteke.",
|
||||||
|
"mpchange23": "Šifriranje podataka zahtijeva javne ključeve.",
|
||||||
|
"mpchange24": "Samo šifrirani podaci mogu ići u privatne usluge.",
|
||||||
|
"mpchange25": "Prijenos nije uspio zbog neuspješne enkripcije.",
|
||||||
|
"mpchange26": "Prijenos nije uspio.",
|
||||||
|
"mpchange27": "Nevažeći podaci.",
|
||||||
|
"mpchange28": "Nema resursa za objavljivanje.",
|
||||||
|
"mpchange29": "Nepoznata pogreška.",
|
||||||
|
"mpchange30": "Anketa nije pronađena.",
|
||||||
|
"mpchange31": "Glasovanje u anketi nije uspjelo.",
|
||||||
|
"mpchange32": "Kreiranje ankete nije uspjelo.",
|
||||||
|
"mpchange33": "Molimo unesite qortal vezu - qortal://...",
|
||||||
|
"mpchange34": "Nevažeća qortalna veza.",
|
||||||
|
"mpchange35": "Pogreška u slanju obavijesti.",
|
||||||
|
"mpchange36": "Nije moguće poslati poruku.",
|
||||||
|
"mpchange37": "Ne mogu poslati šifriranu poruku ovom korisniku jer nemaju svoj javni ključ u lancu.",
|
||||||
|
"mpchange38": "Zahtjev nije moguće ispuniti.",
|
||||||
|
"mpchange39": "Grupa nije pronađena.",
|
||||||
|
"mpchange40": "Dajete li ovoj aplikaciji dopuštenje za izvođenje zahtjeva za pridruživanje grupi?",
|
||||||
|
"mpchange41": "Naziv grupe:",
|
||||||
|
"mpchange42": "ID grupe:",
|
||||||
|
"mpchange43": "Uspješno kreiran zahtjev za pridruživanje grupi.",
|
||||||
|
"mpchange44": "Nije uspjelo pridruživanje grupi.",
|
||||||
|
"mpchange45": "Mime tip nije mogao biti izveden.",
|
||||||
|
"mpchange46": "Ekstenzija datoteke nije mogla biti izvedena.",
|
||||||
|
"mpchange47": "Korisnik je odbio preuzimanje.",
|
||||||
|
"mpchange48": "Nije uspjelo preuzimanje.",
|
||||||
|
"mpchange49": "Implementacija AT-a nije uspjela.",
|
||||||
|
"mpchange50": "Korisnik nema profil.",
|
||||||
|
"mpchange51": "Ne mogu pronaći tražene podatke.",
|
||||||
|
"mpchange52": "Nije uspjelo dobivanje podataka profila.",
|
||||||
|
"mpchange53": "Neuspješno postavljanje svojstva.",
|
||||||
|
"mpchange54": "Nije uspjelo otvaranje profila.",
|
||||||
|
"mpchange55": "Pogreška u dohvaćanju informacija o poslužitelju.",
|
||||||
|
"mpchange56": "Pogreška u sažetku aktivnosti prijenosa.",
|
||||||
|
"mpchange57": "Pogreška u dobivanju inozemne naknade.",
|
||||||
|
"mpchange58": "Pogreška u ažuriranju inozemne naknade.",
|
||||||
|
"mpchange59": "Pogreška u dohvaćanju povijesti povezivanja poslužitelja.",
|
||||||
|
"mpchange60": "Pogreška u postavljanju trenutnog poslužitelja.",
|
||||||
|
"mpchange61": "Greška u dodavanju poslužitelja.",
|
||||||
|
"mpchange62": "Greška pri uklanjanju poslužitelja.",
|
||||||
|
"mpchange63": "Pogreška u dohvaćanju sažetka.",
|
||||||
|
"mpchange64": "Dekodiranje transakcije nije uspjelo.",
|
||||||
|
"mpchange65": "Dajete li ovoj aplikaciji dopuštenje za potpisivanje i obradu transakcije?",
|
||||||
|
"mpchange66": "Dajete li ovoj aplikaciji dopuštenje za potpisivanje transakcije?",
|
||||||
|
"mpchange67": "Pažljivo pročitajte transakciju prije prihvaćanja.",
|
||||||
|
"mpchange68": "Tx prijenos:",
|
||||||
|
"mpchange69": "TX podaci:",
|
||||||
|
"mpchange70": "Obrada transakcije nije zatražena.",
|
||||||
|
"mpchange71": "Bajtovi s predznakom su: ",
|
||||||
|
"mpchange72": "Transakcija je uspješno potpisana i obrađena.",
|
||||||
|
"mpchange73": "Transakcija nije mogla biti obrađena.",
|
||||||
|
"mpchange74": "Nije uspjelo dohvaćanje QORT stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange75": "Nije moguće poslati novčić.",
|
||||||
|
"mpchange76": "Neuspješno dohvaćanje BTC stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange77": "Nije uspjelo dohvaćanje LTC stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange78": "Nije uspjelo dohvaćanje DOGE stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange79": "Nije uspjelo dohvaćanje DGB stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange80": "Nije uspjelo dohvaćanje RVN stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange81": "Nije uspjelo dohvaćanje ARRR stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange82": "NEDOSTAJUĆA POLJA",
|
||||||
|
"mpchange83": "ODBIJENO",
|
||||||
|
"mpchange84": "GREŠKA",
|
||||||
|
"mpchange85": "USPJEH",
|
||||||
|
"mpchange86": "Uvijek dopusti automatsko dobivanje stanja novčanika",
|
||||||
|
"mpchange87": "Molimo unesite ID grupe"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Címzett",
|
"rchange6": "Címzett",
|
||||||
"rchange7": "Akció",
|
"rchange7": "Akció",
|
||||||
"rchange8": "Típus",
|
"rchange8": "Típus",
|
||||||
"rchange9": "Az 1- 4. szint létrehozhat egy önmegosztást, és az 5. vagy annál magasabb szint jutalommegosztást hozhat létre!",
|
"rchange9": "Az 0- 4. szint létrehozhat egy önmegosztást, és az 5. vagy annál magasabb szint jutalommegosztást hozhat létre!",
|
||||||
"rchange10": "Címzett Nyilvános Kulcsa",
|
"rchange10": "Címzett Nyilvános Kulcsa",
|
||||||
"rchange11": "Jutalomrészesedési Százalék",
|
"rchange11": "Jutalomrészesedési Százalék",
|
||||||
"rchange12": "Valami Finomat Csinálni",
|
"rchange12": "Valami Finomat Csinálni",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "A módosítások elküldéséhez ne felejtsen el a 'Profil frissítése' gombra kattintani",
|
"bchange51": "A módosítások elküldéséhez ne felejtsen el a 'Profil frissítése' gombra kattintani",
|
||||||
"bchange52": "Engedélyt ad ennek az alkalmazásnak a pénztárca adatainak lekérésére?",
|
"bchange52": "Engedélyt ad ennek az alkalmazásnak a pénztárca adatainak lekérésére?",
|
||||||
"bchange53": "Mindig engedélyezze, hogy az összes alkalmazás automatikusan lekérje a barátlistáját",
|
"bchange53": "Mindig engedélyezze, hogy az összes alkalmazás automatikusan lekérje a barátlistáját",
|
||||||
"bchange54": "Engedélyt ad ennek az alkalmazásnak, hogy hozzáférjen a barátlistájához?"
|
"bchange54": "Engedélyt ad ennek az alkalmazásnak, hogy hozzáférjen a barátlistájához?",
|
||||||
|
"bchange55": "Engedélyt ad ennek az alkalmazásnak, hogy elküldje ezt a parancsot?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Adatkezelés",
|
"dchange1": "Adatkezelés",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Csevegési üzenet betűmérete",
|
"cs6": "Csevegési üzenet betűmérete",
|
||||||
"cs7": "Normál",
|
"cs7": "Normál",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Minden kért AT-nak ugyanabból az idegen blokkláncból kell lennie.",
|
||||||
|
"mpchange2": "Engedélyt ad ennek az alkalmazásnak vételi rendelés végrehajtására?",
|
||||||
|
"mpchange3": "Vételi megrendelés sikeresen létrehozva",
|
||||||
|
"mpchange4": "Kérjük, várjon, amíg a vásárlási rendelés teljesül",
|
||||||
|
"mpchange5": "Nem sikerült elküldeni a vásárlási rendelést.",
|
||||||
|
"mpchange6": "Engedélyt ad ennek az alkalmazásnak eladási megbízás végrehajtására?",
|
||||||
|
"mpchange7": "For:",
|
||||||
|
"mpchange8": "Eladási megbízás sikeresen létrehozva.",
|
||||||
|
"mpchange9": "Kérjük, várjon, amíg az eladási megbízás felkerül a listára.",
|
||||||
|
"mpchange10": "Nem sikerült elküldeni az eladási megbízást.",
|
||||||
|
"mpchange11": "Nem található AT információ.",
|
||||||
|
"mpchange12": "Engedélyt ad ennek az alkalmazásnak eladási megbízás törlésére?",
|
||||||
|
"mpchange13": "Eladási megbízás sikeresen törölve.",
|
||||||
|
"mpchange14": "Kérjük, várjon, amíg a kereskedés törlése teljesül.",
|
||||||
|
"mpchange15": "Nem sikerült törölni az eladási rendelést.",
|
||||||
|
"mpchange16": "Hiba a lista lekérésekor.",
|
||||||
|
"mpchange17": "Hiba a listához való hozzáadáskor.",
|
||||||
|
"mpchange18": "Hiba a törlési listában.",
|
||||||
|
"mpchange19": "Hiba az ismerőslista lekérésekor.",
|
||||||
|
"mpchange20": "A szám nem szám.",
|
||||||
|
"mpchange21": "Hiányzó szám.",
|
||||||
|
"mpchange22": "Nem küldtek be adatot vagy fájlt.",
|
||||||
|
"mpchange23": "Az adatok titkosításához nyilvános kulcsok szükségesek.",
|
||||||
|
"mpchange24": "Csak titkosított adatok kerülhetnek a privát szolgáltatásokba.",
|
||||||
|
"mpchange25": "A feltöltés sikertelen titkosítás miatt.",
|
||||||
|
"mpchange26": "A feltöltés nem sikerült.",
|
||||||
|
"mpchange27": "Érvénytelen adat.",
|
||||||
|
"mpchange28": "Nincs közzétehető forrás.",
|
||||||
|
"mpchange29": "Ismeretlen hiba.",
|
||||||
|
"mpchange30": "Szavazás nem található.",
|
||||||
|
"mpchange31": "Nem sikerült szavazni a szavazáson.",
|
||||||
|
"mpchange32": "Nem sikerült létrehozni a szavazást.",
|
||||||
|
"mpchange33": "Kérjük, adjon meg egy qortal hivatkozást - qortal://...",
|
||||||
|
"mpchange34": "Érvénytelen qortal link.",
|
||||||
|
"mpchange35": "Hiba az értesítés leküldésekor.",
|
||||||
|
"mpchange36": "Nem sikerült elküldeni az üzenetet.",
|
||||||
|
"mpchange37": "Ennek a felhasználónak nem lehet titkosított üzenetet küldeni, mivel nincs nyilvános kulcsa a láncon.",
|
||||||
|
"mpchange38": "A kérést nem sikerült teljesíteni.",
|
||||||
|
"mpchange39": "A csoport nem található.",
|
||||||
|
"mpchange40": "Engedélyt ad ennek az alkalmazásnak a csoporthoz való csatlakozási kérelem végrehajtására?",
|
||||||
|
"mpchange41": "Csoport neve:",
|
||||||
|
"mpchange42": "Csoportazonosító:",
|
||||||
|
"mpchange43": "A csoporthoz való csatlakozási kérelem sikeresen létrehozva.",
|
||||||
|
"mpchange44": "Nem sikerült csatlakozni a csoporthoz.",
|
||||||
|
"mpchange45": "A mime típust nem lehetett származtatni.",
|
||||||
|
"mpchange46": "A fájlkiterjesztés nem származtatható.",
|
||||||
|
"mpchange47": "A felhasználó elutasította a letöltést.",
|
||||||
|
"mpchange48": "Nem sikerült elindítani a letöltést.",
|
||||||
|
"mpchange49": "Nem sikerült az AT telepítése.",
|
||||||
|
"mpchange50": "A felhasználónak nincs profilja.",
|
||||||
|
"mpchange51": "Nem találhatók a kért adatok.",
|
||||||
|
"mpchange52": "Nem sikerült lekérni a profiladatokat.",
|
||||||
|
"mpchange53": "Nem sikerült beállítani a tulajdonságot.",
|
||||||
|
"mpchange54": "Nem sikerült megnyitni a profilt.",
|
||||||
|
"mpchange55": "Hiba a kiszolgáló információinak lekérésekor.",
|
||||||
|
"mpchange56": "Hiba a tx tevékenység összefoglalójában.",
|
||||||
|
"mpchange57": "Hiba a külföldi díj lekérésekor.",
|
||||||
|
"mpchange58": "Hiba a külföldi díj frissítésében.",
|
||||||
|
"mpchange59": "Hiba a szerver csatlakozási előzményeinek lekérésében.",
|
||||||
|
"mpchange60": "Hiba az aktuális kiszolgáló beállításánál.",
|
||||||
|
"mpchange61": "Hiba a szerver hozzáadásakor.",
|
||||||
|
"mpchange62": "Hiba a kiszolgáló eltávolítása során.",
|
||||||
|
"mpchange63": "Hiba az összefoglaló lekérésekor.",
|
||||||
|
"mpchange64": "Nem sikerült dekódolni a tranzakciót.",
|
||||||
|
"mpchange65": "Engedélyt ad ennek az alkalmazásnak egy tranzakció aláírására és feldolgozására?",
|
||||||
|
"mpchange66": "Engedélyt ad ennek az alkalmazásnak egy tranzakció aláírására?",
|
||||||
|
"mpchange67": "Elfogadás előtt olvassa el figyelmesen a tranzakciót.",
|
||||||
|
"mpchange68": "Tx típus:",
|
||||||
|
"mpchange69": "TX adatok:",
|
||||||
|
"mpchange70": "A feldolgozási tranzakciót nem kérték.",
|
||||||
|
"mpchange71": "Az aláírt bájtok a következők: ",
|
||||||
|
"mpchange72": "A tranzakció aláírása és feldolgozása sikeresen megtörtént.",
|
||||||
|
"mpchange73": "A tranzakciót nem sikerült feldolgozni.",
|
||||||
|
"mpchange74": "Nem sikerült lekérni a QORT-egyenleget. Próbáld újra!",
|
||||||
|
"mpchange75": "Nem sikerült elküldeni az érmét.",
|
||||||
|
"mpchange76": "Nem sikerült lekérni a BTC-egyenleget. Próbáld újra!",
|
||||||
|
"mpchange77": "Nem sikerült lekérni az LTC-egyenleget. Próbáld újra!",
|
||||||
|
"mpchange78": "Nem sikerült lekérni a DOGE-egyenleget. Próbáld újra!",
|
||||||
|
"mpchange79": "Nem sikerült lekérni a DGB-egyenleget. Próbáld újra!",
|
||||||
|
"mpchange80": "Nem sikerült lekérni az RVN-egyenleget. Próbáld újra!",
|
||||||
|
"mpchange81": "Nem sikerült lekérni az ARRR egyenleget. Próbáld újra!",
|
||||||
|
"mpchange82": "HIÁNYZÓ MEZŐK",
|
||||||
|
"mpchange83": "Elutasítva",
|
||||||
|
"mpchange84": "FAILURE",
|
||||||
|
"mpchange85": "SIKER",
|
||||||
|
"mpchange86": "Mindig engedélyezze a pénztárcaegyenleg automatikus lekérését",
|
||||||
|
"mpchange87": "Kérjük, adja meg a csoport azonosítóját"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Destinatario",
|
"rchange6": "Destinatario",
|
||||||
"rchange7": "Azione",
|
"rchange7": "Azione",
|
||||||
"rchange8": "Tipo",
|
"rchange8": "Tipo",
|
||||||
"rchange9": "Level 1 - 4 can create a Self Share and Level 5 or above can create a Reward Share!",
|
"rchange9": "Level 0 - 4 can create a Self Share and Level 5 or above can create a Reward Share!",
|
||||||
"rchange10": "Chiave pubblica del destinatario",
|
"rchange10": "Chiave pubblica del destinatario",
|
||||||
"rchange11": "Percentuale di quota premio",
|
"rchange11": "Percentuale di quota premio",
|
||||||
"rchange12": "Fare qualcosa di delizioso",
|
"rchange12": "Fare qualcosa di delizioso",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Per inviare le modifiche non dimenticare di fare clic su 'Aggiorna profilo'",
|
"bchange51": "Per inviare le modifiche non dimenticare di fare clic su 'Aggiorna profilo'",
|
||||||
"bchange52": "Concedi a questa applicazione il permesso di ottenere informazioni sul tuo portafoglio?",
|
"bchange52": "Concedi a questa applicazione il permesso di ottenere informazioni sul tuo portafoglio?",
|
||||||
"bchange53": "Consenti sempre che la tua lista amici venga recuperata automaticamente da tutte le app",
|
"bchange53": "Consenti sempre che la tua lista amici venga recuperata automaticamente da tutte le app",
|
||||||
"bchange54": "Concedi a questa applicazione il permesso di accedere alla tua lista di amici?"
|
"bchange54": "Concedi a questa applicazione il permesso di accedere alla tua lista di amici?",
|
||||||
|
"bchange55": "Concedi a questa applicazione il permesso di inviare questo comando?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Gestione dati",
|
"dchange1": "Gestione dati",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Dimensione carattere messaggio chat",
|
"cs6": "Dimensione carattere messaggio chat",
|
||||||
"cs7": "Standard",
|
"cs7": "Standard",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Tutti gli AT richiesti devono appartenere alla stessa Blockchain esterna.",
|
||||||
|
"mpchange2": "Concedi a questa applicazione l'autorizzazione per eseguire un ordine di acquisto?",
|
||||||
|
"mpchange3": "Ordine di acquisto creato correttamente",
|
||||||
|
"mpchange4": "Attendi che l'ordine di acquisto venga evaso",
|
||||||
|
"mpchange5": "Impossibile inviare l'ordine di acquisto.",
|
||||||
|
"mpchange6": "Concedi a questa applicazione l'autorizzazione per eseguire un ordine di vendita?",
|
||||||
|
"mpchange7": "Per:",
|
||||||
|
"mpchange8": "Ordine di vendita creato correttamente.",
|
||||||
|
"mpchange9": "Attendi che l'ordine di vendita venga elencato.",
|
||||||
|
"mpchange10": "Impossibile inviare l'ordine di vendita.",
|
||||||
|
"mpchange11": "Impossibile trovare le informazioni AT.",
|
||||||
|
"mpchange12": "Concedi a questa applicazione l'autorizzazione per eseguire l'annullamento di un ordine di vendita?",
|
||||||
|
"mpchange13": "Ordine di vendita annullato correttamente.",
|
||||||
|
"mpchange14": "Attendi che la transazione annullando get fulfilled.",
|
||||||
|
"mpchange15": "Impossibile annullare l'ordine di vendita.",
|
||||||
|
"mpchange16": "Errore nel recupero dell'elenco.",
|
||||||
|
"mpchange17": "Errore nell'aggiunta all'elenco.",
|
||||||
|
"mpchange18": "Errore nell'eliminazione dell'elenco.",
|
||||||
|
"mpchange19": "Errore nel recupero dell'elenco degli amici.",
|
||||||
|
"mpchange20": "Il conteggio non è un numero.",
|
||||||
|
"mpchange21": "Conteggio mancante.",
|
||||||
|
"mpchange22": "Nessun dato o file inviato.",
|
||||||
|
"mpchange23": "La crittografia dei dati richiede chiavi pubbliche.",
|
||||||
|
"mpchange24": "Solo i dati crittografati possono essere inseriti nei servizi privati.",
|
||||||
|
"mpchange25": "Caricamento non riuscito a causa di crittografia non riuscita.",
|
||||||
|
"mpchange26": "Caricamento non riuscito.",
|
||||||
|
"mpchange27": "Dati non validi.",
|
||||||
|
"mpchange28": "Nessuna risorsa da pubblicare.",
|
||||||
|
"mpchange29": "Sconosciuto errore.",
|
||||||
|
"mpchange30": "Sondaggio non trovato.",
|
||||||
|
"mpchange31": "Impossibile votare per il sondaggio.",
|
||||||
|
"mpchange32": "Impossibile creare il sondaggio.",
|
||||||
|
"mpchange33": "Inserisci un collegamento qortal - qortal://...",
|
||||||
|
"mpchange34": "Collegamento qortal non valido.",
|
||||||
|
"mpchange35": "Errore nella notifica push.",
|
||||||
|
"mpchange36": "Impossibile inviare il messaggio.",
|
||||||
|
"mpchange37": "Impossibile inviare un messaggio crittografato a questo utente perché non ha la sua chiave pubblica sulla catena.",
|
||||||
|
"mpchange38": "Impossibile soddisfare la richiesta.",
|
||||||
|
"mpchange39": "Gruppo non trovato.",
|
||||||
|
"mpchange40": "Concedi a questa applicazione l'autorizzazione per eseguire una richiesta di adesione al gruppo?",
|
||||||
|
"mpchange41": "Nome gruppo:",
|
||||||
|
"mpchange42": "ID gruppo:",
|
||||||
|
"mpchange43": "Richiesta di adesione al gruppo creata correttamente.",
|
||||||
|
"mpchange44": "Impossibile unirsi al gruppo.",
|
||||||
|
"mpchange45": "Impossibile derivare un tipo MIME.",
|
||||||
|
"mpchange46": "Impossibile derivare un'estensione file.",
|
||||||
|
"mpchange47": "L'utente ha rifiutato il download.",
|
||||||
|
"mpchange48": "Impossibile avviare il download.",
|
||||||
|
"mpchange49": "Impossibile distribuire AT.",
|
||||||
|
"mpchange50": "L'utente non ha un profilo.",
|
||||||
|
"mpchange51": "Impossibile trovare i dati richiesti.",
|
||||||
|
"mpchange52": "Impossibile ottenere i dati del profilo.",
|
||||||
|
"mpchange53": "Impossibile impostare la proprietà.",
|
||||||
|
"mpchange54": "Impossibile aprire il profilo.",
|
||||||
|
"mpchange55": "Errore nel recupero delle informazioni del server.",
|
||||||
|
"mpchange56": "Errore nel riepilogo delle attività di tx.",
|
||||||
|
"mpchange57": "Errore nel get foreign fee.",
|
||||||
|
"mpchange58": "Errore nel aggiorna tariffa estera.",
|
||||||
|
"mpchange59": "Errore nella cronologia delle connessioni al server.",
|
||||||
|
"mpchange60": "Errore nell'impostazione del server corrente.",
|
||||||
|
"mpchange61": "Errore nell'aggiunta del server.",
|
||||||
|
"mpchange62": "Errore nella rimozione del server.",
|
||||||
|
"mpchange63": "Errore nel recupero del riepilogo.",
|
||||||
|
"mpchange64": "Impossibile decodificare la transazione.",
|
||||||
|
"mpchange65": "Concedi a questa applicazione l'autorizzazione a firmare ed elaborare una transazione?",
|
||||||
|
"mpchange66": "Concedi a questa applicazione l'autorizzazione a firmare una transazione?",
|
||||||
|
"mpchange67": "Leggi attentamente la transazione prima di accettare.",
|
||||||
|
"mpchange68": "Tipo Tx:",
|
||||||
|
"mpchange69": "Dati TX:",
|
||||||
|
"mpchange70": "La transazione di processo non è stata richiesta.",
|
||||||
|
"mpchange71": "I byte firmati sono: ",
|
||||||
|
"mpchange72": "Transazione firmata ed elaborata correttamente.",
|
||||||
|
"mpchange73": "Impossibile elaborare la transazione.",
|
||||||
|
"mpchange74": "Impossibile recuperare il saldo QORT. Riprova!",
|
||||||
|
"mpchange75": "Impossibile inviare la moneta.",
|
||||||
|
"mpchange76": "Impossibile recuperare il saldo BTC. Riprova!",
|
||||||
|
"mpchange77": "Impossibile recuperare il saldo LTC. Riprova!",
|
||||||
|
"mpchange78": "Impossibile recuperare il saldo DOGE. Riprova!",
|
||||||
|
"mpchange79": "Impossibile recuperare il saldo DGB. Riprova!",
|
||||||
|
"mpchange80": "Impossibile recuperare il saldo RVN. Riprova!",
|
||||||
|
"mpchange81": "Impossibile recuperare il saldo ARRR. Riprova!",
|
||||||
|
"mpchange82": "CAMPI MANCANTI",
|
||||||
|
"mpchange83": "RIFIUTATO",
|
||||||
|
"mpchange84": "FALLITO",
|
||||||
|
"mpchange85": "RIUSCITO",
|
||||||
|
"mpchange86": "Consenti sempre di ottenere automaticamente il saldo del portafoglio",
|
||||||
|
"mpchange87": "Inserisci l'ID del gruppo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "受取人",
|
"rchange6": "受取人",
|
||||||
"rchange7": "アクション",
|
"rchange7": "アクション",
|
||||||
"rchange8": "タイプ",
|
"rchange8": "タイプ",
|
||||||
"rchange9": "レベル 1 ~ 4 は自己シェアを、レベル 5 以上は報酬シェアを作成出来ます!",
|
"rchange9": "レベル 0 ~ 4 は自己シェアを、レベル 5 以上は報酬シェアを作成出来ます!",
|
||||||
"rchange10": "受取人の公開鍵",
|
"rchange10": "受取人の公開鍵",
|
||||||
"rchange11": "報酬シェア率",
|
"rchange11": "報酬シェア率",
|
||||||
"rchange12": "おいしいことをしています",
|
"rchange12": "おいしいことをしています",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "変更を送信するには、[プロフィールを更新] をクリックすることを忘れないでください。",
|
"bchange51": "変更を送信するには、[プロフィールを更新] をクリックすることを忘れないでください。",
|
||||||
"bchange52": "ウォレット情報を取得する許可をこのアプリケーションに与えますか?",
|
"bchange52": "ウォレット情報を取得する許可をこのアプリケーションに与えますか?",
|
||||||
"bchange53": "すべてのアプリによる友達リストの自動取得を常に許可します",
|
"bchange53": "すべてのアプリによる友達リストの自動取得を常に許可します",
|
||||||
"bchange54": "このアプリケーションに友達リストへのアクセスを許可しますか?"
|
"bchange54": "このアプリケーションに友達リストへのアクセスを許可しますか?",
|
||||||
|
"bchange55": "このアプリケーションにこのコマンドを送信する許可を与えますか?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "データ管理",
|
"dchange1": "データ管理",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "チャットメッセージのフォントサイズ",
|
"cs6": "チャットメッセージのフォントサイズ",
|
||||||
"cs7": "標準",
|
"cs7": "標準",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "要求されたすべての AT は同じ外部ブロックチェーンである必要があります。",
|
||||||
|
"mpchange2": "このアプリケーションに購入注文を実行する権限を与えますか?",
|
||||||
|
"mpchange3": "購入注文が正常に作成されました",
|
||||||
|
"mpchange4": "購入注文が履行されるまでお待ちください",
|
||||||
|
"mpchange5": "購入注文の送信に失敗しました。",
|
||||||
|
"mpchange6": "このアプリケーションに売り注文を実行する権限を与えますか?",
|
||||||
|
"mpchange7": "対象:",
|
||||||
|
"mpchange8": "売り注文が正常に作成されました。",
|
||||||
|
"mpchange9": "売り注文がリストされるまでお待ちください。",
|
||||||
|
"mpchange10": "売り注文の送信に失敗しました。",
|
||||||
|
"mpchange11": "AT 情報が見つかりません。",
|
||||||
|
"mpchange12": "このアプリケーションに売り注文のキャンセルを実行する権限を与えますか?",
|
||||||
|
"mpchange13": "売り注文が正常にキャンセルされました。",
|
||||||
|
"mpchange14": "取引キャンセルが完了するまでお待ちください。完了しました。",
|
||||||
|
"mpchange15": "売り注文のキャンセルに失敗しました。",
|
||||||
|
"mpchange16": "リストの取得中にエラーが発生しました。",
|
||||||
|
"mpchange17": "リストへの追加中にエラーが発生しました。",
|
||||||
|
"mpchange18": "リストの削除中にエラーが発生しました。",
|
||||||
|
"mpchange19": "友達リストの取得中にエラーが発生しました。",
|
||||||
|
"mpchange20": "カウントが数値ではありません。",
|
||||||
|
"mpchange21": "カウントがありません。",
|
||||||
|
"mpchange22": "データまたはファイルが送信されていません。",
|
||||||
|
"mpchange23": "データの暗号化には公開キーが必要です。",
|
||||||
|
"mpchange24": "プライベートサービスに使用できるのは暗号化されたデータのみです。",
|
||||||
|
"mpchange25": "暗号化に失敗したためアップロードに失敗しました。",
|
||||||
|
"mpchange26": "アップロードに失敗しました。",
|
||||||
|
"mpchange27": "無効なデータです。",
|
||||||
|
"mpchange28": "公開するリソースがありません。",
|
||||||
|
"mpchange29": "不明なエラーです。",
|
||||||
|
"mpchange30": "投票が見つかりません。",
|
||||||
|
"mpchange31": "投票に失敗しました。",
|
||||||
|
"mpchange32": "投票を作成できませんでした。",
|
||||||
|
"mpchange33": "qortal リンクを入力してください - qortal://...",
|
||||||
|
"mpchange34": "無効な qortal リンクです。",
|
||||||
|
"mpchange35": "通知のプッシュ中にエラーが発生しました。",
|
||||||
|
"mpchange36": "メッセージを送信できませんでした。",
|
||||||
|
"mpchange37": "このユーザーには公開鍵がチェーン上にないため、暗号化されたメッセージを送信できません。",
|
||||||
|
"mpchange38": "リクエストを処理できませんでした。",
|
||||||
|
"mpchange39": "グループが見つかりません。",
|
||||||
|
"mpchange40": "このアプリケーションにグループ参加リクエストを実行する権限を与えますか?",
|
||||||
|
"mpchange41": "グループ名:",
|
||||||
|
"mpchange42": "グループ ID:",
|
||||||
|
"mpchange43": "グループ参加リクエストが正常に作成されました。",
|
||||||
|
"mpchange44": "失敗しましたグループに参加します。",
|
||||||
|
"mpchange45": "MIME タイプを取得できませんでした。",
|
||||||
|
"mpchange46": "ファイル拡張子を取得できませんでした。",
|
||||||
|
"mpchange47": "ユーザーがダウンロードを拒否しました。",
|
||||||
|
"mpchange48": "ダウンロードを開始できませんでした。",
|
||||||
|
"mpchange49": "AT を展開できませんでした。",
|
||||||
|
"mpchange50": "ユーザーにはプロファイルがありません。",
|
||||||
|
"mpchange51": "要求されたデータが見つかりません。",
|
||||||
|
"mpchange52": "プロファイル データを取得できませんでした。",
|
||||||
|
"mpchange53": "プロパティを設定できませんでした。",
|
||||||
|
"mpchange54": "プロファイルを開けませんでした。",
|
||||||
|
"mpchange55": "サーバー情報の取得中にエラーが発生しました。",
|
||||||
|
"mpchange56": "tx アクティビティ サマリーでエラーが発生しました。",
|
||||||
|
"mpchange57": "外国手数料の取得中にエラーが発生しました。",
|
||||||
|
"mpchange58": "外国手数料の更新中にエラーが発生しました。",
|
||||||
|
"mpchange59": "サーバー接続の取得中にエラーが発生しました履歴。",
|
||||||
|
"mpchange60": "現在のサーバーの設定中にエラーが発生しました。",
|
||||||
|
"mpchange61": "サーバーの追加中にエラーが発生しました。",
|
||||||
|
"mpchange62": "サーバーの削除中にエラーが発生しました。",
|
||||||
|
"mpchange63": "概要の取得中にエラーが発生しました。",
|
||||||
|
"mpchange64": "トランザクションのデコードに失敗しました。",
|
||||||
|
"mpchange65": "このアプリケーションにトランザクションの署名と処理の権限を与えますか?",
|
||||||
|
"mpchange66": "このアプリケーションにトランザクションの署名の権限を与えますか?",
|
||||||
|
"mpchange67": "承認する前にトランザクションをよくお読みください。",
|
||||||
|
"mpchange68": "Tx タイプ:",
|
||||||
|
"mpchange69": "TX データ:",
|
||||||
|
"mpchange70": "トランザクションの処理が要求されていません。",
|
||||||
|
"mpchange71": "署名されたバイト数: ",
|
||||||
|
"mpchange72": "トランザクションは正常に署名され、処理されました。",
|
||||||
|
"mpchange73": "トランザクションを処理できませんでした。",
|
||||||
|
"mpchange74": "QORT の取得に失敗しました残高。もう一度お試しください!",
|
||||||
|
"mpchange75": "コインを送信できませんでした。",
|
||||||
|
"mpchange76": "BTC 残高の取得に失敗しました。もう一度お試しください!",
|
||||||
|
"mpchange77": "LTC 残高の取得に失敗しました。もう一度お試しください!",
|
||||||
|
"mpchange78": "DOGE 残高の取得に失敗しました。もう一度お試しください!",
|
||||||
|
"mpchange79": "DGB 残高の取得に失敗しました。もう一度お試しください!",
|
||||||
|
"mpchange80": "RVN 残高の取得に失敗しました。もう一度お試しください!",
|
||||||
|
"mpchange81": "ARRR 残高の取得に失敗しました。もう一度お試しください!",
|
||||||
|
"mpchange82": "フィールドがありません",
|
||||||
|
"mpchange83": "拒否されました",
|
||||||
|
"mpchange84": "失敗",
|
||||||
|
"mpchange85": "成功",
|
||||||
|
"mpchange86": "ウォレット残高の自動取得を常に許可する",
|
||||||
|
"mpchange87": "グループ ID を入力してください"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "받는사람",
|
"rchange6": "받는사람",
|
||||||
"rchange7": "액션",
|
"rchange7": "액션",
|
||||||
"rchange8": "유형",
|
"rchange8": "유형",
|
||||||
"rchange9": "레벨 1 - 4는 자체 공유를 생성할 수 있으며 레벨 5 이상은 보상 공유를 생성할 수 있습니다.",
|
"rchange9": "레벨 0 - 4는 자체 공유를 생성할 수 있으며 레벨 5 이상은 보상 공유를 생성할 수 있습니다.",
|
||||||
"rchange10": "수신자 공개 키",
|
"rchange10": "수신자 공개 키",
|
||||||
"rchange11": "보상공유율",
|
"rchange11": "보상공유율",
|
||||||
"rchange12": "맛있는 거 하기",
|
"rchange12": "맛있는 거 하기",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "변경 사항을 제출하려면 '프로필 업데이트'를 클릭하는 것을 잊지 마세요.",
|
"bchange51": "변경 사항을 제출하려면 '프로필 업데이트'를 클릭하는 것을 잊지 마세요.",
|
||||||
"bchange52": "이 애플리케이션에 지갑 정보를 얻을 수 있는 권한을 부여하시겠습니까?",
|
"bchange52": "이 애플리케이션에 지갑 정보를 얻을 수 있는 권한을 부여하시겠습니까?",
|
||||||
"bchange53": "항상 모든 앱에서 친구 목록을 자동으로 검색하도록 허용",
|
"bchange53": "항상 모든 앱에서 친구 목록을 자동으로 검색하도록 허용",
|
||||||
"bchange54": "이 애플리케이션에 친구 목록에 접근할 수 있는 권한을 부여하시겠습니까?"
|
"bchange54": "이 애플리케이션에 친구 목록에 접근할 수 있는 권한을 부여하시겠습니까?",
|
||||||
|
"bchange55": "이 애플리케이션이 이 명령을 보내도록 허락하시겠습니까?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "데이터 관리",
|
"dchange1": "데이터 관리",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "채팅 메시지 글꼴 크기",
|
"cs6": "채팅 메시지 글꼴 크기",
|
||||||
"cs7": "표준",
|
"cs7": "표준",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "요청된 모든 AT는 동일한 외국 블록체인이어야 합니다.",
|
||||||
|
"mpchange2": "이 애플리케이션에 매수 주문을 수행할 권한을 부여하시겠습니까?",
|
||||||
|
"mpchange3": "매수 주문이 성공적으로 생성되었습니다.",
|
||||||
|
"mpchange4": "매수 주문이 이행될 때까지 기다려 주십시오.",
|
||||||
|
"mpchange5": "매수 주문을 제출하지 못했습니다.",
|
||||||
|
"mpchange6": "이 애플리케이션에 매도 주문을 수행할 권한을 부여하시겠습니까?",
|
||||||
|
"mpchange7": "대상:",
|
||||||
|
"mpchange8": "매도 주문을 성공적으로 생성했습니다.",
|
||||||
|
"mpchange9": "매도 주문이 등록될 때까지 기다려 주십시오.",
|
||||||
|
"mpchange10": "매도 주문을 제출하지 못했습니다.",
|
||||||
|
"mpchange11": "AT 정보를 찾을 수 없습니다.",
|
||||||
|
"mpchange12": "이 애플리케이션에 매도 주문 취소 권한을 부여하시겠습니까?",
|
||||||
|
"mpchange13": "매도 주문을 성공적으로 취소했습니다.",
|
||||||
|
"mpchange14": "거래 취소가 완료될 때까지 기다려 주세요.",
|
||||||
|
"mpchange15": "판매 주문을 취소하지 못했습니다.",
|
||||||
|
"mpchange16": "목록을 검색하는 중 오류가 발생했습니다.",
|
||||||
|
"mpchange17": "목록에 추가하는 중 오류가 발생했습니다.",
|
||||||
|
"mpchange18": "목록 삭제 중 오류가 발생했습니다.",
|
||||||
|
"mpchange19": "친구 목록을 검색하는 중 오류가 발생했습니다.",
|
||||||
|
"mpchange20": "개수가 숫자가 아닙니다.",
|
||||||
|
"mpchange21": "개수가 없습니다.",
|
||||||
|
"mpchange22": "제출된 데이터나 파일이 없습니다.",
|
||||||
|
"mpchange23": "데이터 암호화에는 공개 키가 필요합니다.",
|
||||||
|
"mpchange24": "암호화된 데이터만 개인 서비스에 들어갈 수 있습니다.",
|
||||||
|
"mpchange25": "암호화에 실패하여 업로드에 실패했습니다.",
|
||||||
|
"mpchange26": "업로드에 실패했습니다.",
|
||||||
|
"mpchange27": "잘못된 데이터입니다.",
|
||||||
|
"mpchange28": "아니요 게시할 리소스입니다.",
|
||||||
|
"mpchange29": "알 수 없는 오류입니다.",
|
||||||
|
"mpchange30": "투표를 찾을 수 없습니다.",
|
||||||
|
"mpchange31": "투표에 투표하지 못했습니다.",
|
||||||
|
"mpchange32": "투표를 만들지 못했습니다.",
|
||||||
|
"mpchange33": "qortal 링크를 입력하세요 - qortal://...",
|
||||||
|
"mpchange34": "잘못된 qortal 링크입니다.",
|
||||||
|
"mpchange35": "알림을 푸시하는 중 오류가 발생했습니다.",
|
||||||
|
"mpchange36": "메시지를 보낼 수 없습니다.",
|
||||||
|
"mpchange37": "체인에 공개 키가 없으므로 이 사용자에게 암호화된 메시지를 보낼 수 없습니다.",
|
||||||
|
"mpchange38": "요청을 이행할 수 없습니다.",
|
||||||
|
"mpchange39": "그룹을 찾을 수 없습니다.",
|
||||||
|
"mpchange40": "이 애플리케이션에 그룹 가입 요청을 수행할 수 있는 권한을 부여하시겠습니까?",
|
||||||
|
"mpchange41": "그룹 이름:",
|
||||||
|
"mpchange42": "그룹 ID:",
|
||||||
|
"mpchange43": "그룹 가입 요청을 성공적으로 생성했습니다.",
|
||||||
|
"mpchange44": "그룹에 가입하지 못했습니다.",
|
||||||
|
"mpchange45": "MIME 유형을 파생할 수 없습니다.",
|
||||||
|
"mpchange46": "파일 확장자를 파생할 수 없습니다.",
|
||||||
|
"mpchange47": "사용자가 다운로드를 거부했습니다.",
|
||||||
|
"mpchange48": "다운로드를 시작하지 못했습니다.",
|
||||||
|
"mpchange49": "AT를 배포하지 못했습니다.",
|
||||||
|
"mpchange50": "사용자에게 프로필이 없습니다.",
|
||||||
|
"mpchange51": "요청한 데이터를 찾을 수 없습니다.",
|
||||||
|
"mpchange52": "프로필 데이터를 가져오지 못했습니다.",
|
||||||
|
"mpchange53": "속성을 설정하지 못했습니다.",
|
||||||
|
"mpchange54": "프로필을 열지 못했습니다.",
|
||||||
|
"mpchange55": "서버 정보를 검색하는 중 오류가 발생했습니다.",
|
||||||
|
"mpchange56": " tx 활동 요약.",
|
||||||
|
"mpchange57": "외국 수수료 가져오기 오류.",
|
||||||
|
"mpchange58": "외국 수수료 업데이트 오류.",
|
||||||
|
"mpchange59": "서버 연결 기록 가져오기 오류.",
|
||||||
|
"mpchange60": "현재 서버 설정 오류.",
|
||||||
|
"mpchange61": "서버 추가 오류.",
|
||||||
|
"mpchange62": "서버 제거 오류.",
|
||||||
|
"mpchange63": "요약 검색 오류.",
|
||||||
|
"mpchange64": "거래 디코딩 실패.",
|
||||||
|
"mpchange65": "이 애플리케이션에 거래 서명 및 처리 권한 부여?",
|
||||||
|
"mpchange66": "이 애플리케이션에 거래 서명 권한 부여?",
|
||||||
|
"mpchange67": "수락하기 전에 거래를 주의 깊게 읽어보세요.",
|
||||||
|
"mpchange68": "거래 유형:",
|
||||||
|
"mpchange69": "TX 데이터:",
|
||||||
|
"mpchange70": "거래 처리가 요청되지 않았습니다.",
|
||||||
|
"mpchange71": "서명된 바이트는 다음과 같습니다. ",
|
||||||
|
"mpchange72": "거래가 서명되고 성공적으로 처리되었습니다.",
|
||||||
|
"mpchange73": "거래를 처리할 수 없습니다.",
|
||||||
|
"mpchange74": "QORT 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||||
|
"mpchange75": "코인을 보낼 수 없습니다.",
|
||||||
|
"mpchange76": "BTC 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||||
|
"mpchange77": "LTC 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||||
|
"mpchange78": "DOGE 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||||
|
"mpchange79": "DGB 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||||
|
"mpchange80": "RVN 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||||
|
"mpchange81": "ARRR 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||||
|
"mpchange82": "누락된 필드",
|
||||||
|
"mpchange83": "거부됨",
|
||||||
|
"mpchange84": "실패",
|
||||||
|
"mpchange85": "성공",
|
||||||
|
"mpchange86": "항상 지갑 잔액을 자동으로 가져오도록 허용",
|
||||||
|
"mpchange87": "그룹 ID를 입력하세요"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,11 +111,11 @@
|
|||||||
"areyousure": "Weet U zeker dat U deze portefeuille uit de opgeslagen portefeuilles wilt verwijderen? (Als het wordt verwijderd en er geen backup-bestand bestaat, kan het account voor altijd verloren gaan! Zorg ervoor dat U over een backup-bestand beschikt voor U dit doet!)",
|
"areyousure": "Weet U zeker dat U deze portefeuille uit de opgeslagen portefeuilles wilt verwijderen? (Als het wordt verwijderd en er geen backup-bestand bestaat, kan het account voor altijd verloren gaan! Zorg ervoor dat U over een backup-bestand beschikt voor U dit doet!)",
|
||||||
"error1": "De backup moet een geldig JSON formaat zijn",
|
"error1": "De backup moet een geldig JSON formaat zijn",
|
||||||
"error2": "Geen aanmeld-optie geselecteerd",
|
"error2": "Geen aanmeld-optie geselecteerd",
|
||||||
"createwelcome": "Welkom bij Qortal! Uw gedecentraliseerde digitale toekomst wacht op u! Binnen Qortal bent U de enige die toegang heeft tot uw gegevens. Qortal biedt de laagdrempelige infrastructuur van een nieuwe, en volledig door de gebruiker bestuurde digitale wereld.",
|
"createwelcome": "Welkom bij Qortal! Uw gedecentraliseerde digitale toekomst wacht op jou! Binnen Qortal bent U de enige die toegang heeft tot uw gegevens. Qortal biedt de laagdrempelige infrastructuur van een nieuwe, en volledig door de gebruiker bestuurde digitale wereld.",
|
||||||
"createa": "Een willekeurige",
|
"createa": "Een willekeurige",
|
||||||
"click": "Klik hier om uw memo-zin zichtbaar te maken",
|
"click": "Klik hier om uw memo-zin zichtbaar te maken",
|
||||||
"confirmpass": "Wachtwoord bevestigen",
|
"confirmpass": "Wachtwoord bevestigen",
|
||||||
"willbe": "wordt willekeurig op de achtergrond gegenereerd. Als u de memo-zin wilt BEKIJKEN, klikt u op de gemarkeerde 'memo-zin' in deze tekst. Dit wordt gebruikt als privé-sleutel-generator voor uw blockchain-account in Qortal. Uit veiligheidsoverwegingen worden memo-zinnen niet weergegeven, tenzij dit specifiek is gekozen.",
|
"willbe": "wordt willekeurig op de achtergrond gegenereerd. Als U de memo-zin wilt BEKIJKEN, klikt U op de gemarkeerde 'memo-zin' in deze tekst. Dit wordt gebruikt als privé-sleutel-generator voor uw blockchain-account in Qortal. Uit veiligheidsoverwegingen worden memo-zinnen niet weergegeven, tenzij dit specifiek is gekozen.",
|
||||||
"clicknext": "Klik hieronder op VERDER om jouw Qortal-account aan te maken.",
|
"clicknext": "Klik hieronder op VERDER om jouw Qortal-account aan te maken.",
|
||||||
"ready": "Uw account is nu klaar om te worden aangemaakt. Het wordt standaard in gecodeerde vorm opgeslagen binnen deze kopie van de Qortal-gebruikersinterface. Als U niet wilt dat uw nieuwe account hierin wordt opgeslagen, kunt U dit hieronder uitschakelen. U kunt nog steeds inloggen met uw nieuwe account (na het uitloggen), met behulp van uw Qortal-backup-bestand, dat U daarom MOET opslaan bij het aanmaken van uw account.",
|
"ready": "Uw account is nu klaar om te worden aangemaakt. Het wordt standaard in gecodeerde vorm opgeslagen binnen deze kopie van de Qortal-gebruikersinterface. Als U niet wilt dat uw nieuwe account hierin wordt opgeslagen, kunt U dit hieronder uitschakelen. U kunt nog steeds inloggen met uw nieuwe account (na het uitloggen), met behulp van uw Qortal-backup-bestand, dat U daarom MOET opslaan bij het aanmaken van uw account.",
|
||||||
"welmessage": "Welkom bij Qortal",
|
"welmessage": "Welkom bij Qortal",
|
||||||
@ -259,7 +259,7 @@
|
|||||||
"gchange4": "Geabonneerde collecties",
|
"gchange4": "Geabonneerde collecties",
|
||||||
"gchange5": "Jouw GIF-bestanden opladen",
|
"gchange5": "Jouw GIF-bestanden opladen",
|
||||||
"gchange6": "Bestand moet .GIF zijn",
|
"gchange6": "Bestand moet .GIF zijn",
|
||||||
"gchange7": "Collectie upladen",
|
"gchange7": "Collectie opladen",
|
||||||
"gchange8": "Naam van collectie is verplicht!",
|
"gchange8": "Naam van collectie is verplicht!",
|
||||||
"gchange9": "Naam van collectie",
|
"gchange9": "Naam van collectie",
|
||||||
"gchange10": "GIF-bestand werd opgeladen!",
|
"gchange10": "GIF-bestand werd opgeladen!",
|
||||||
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Ontvanger",
|
"rchange6": "Ontvanger",
|
||||||
"rchange7": "Actie",
|
"rchange7": "Actie",
|
||||||
"rchange8": "Type",
|
"rchange8": "Type",
|
||||||
"rchange9": "Level 1 - 4 kunnen een zelf-beloning aanmaken en Level 5 en hoger kunnen een belonings-deel toekennen!",
|
"rchange9": "Level 0 - 4 kunnen een zelf-beloning aanmaken en Level 5 en hoger kunnen een belonings-deel toekennen!",
|
||||||
"rchange10": "Publieke sleutel van de ontvanger",
|
"rchange10": "Publieke sleutel van de ontvanger",
|
||||||
"rchange11": "Belonings-deel in procent",
|
"rchange11": "Belonings-deel in procent",
|
||||||
"rchange12": "Doe iets heerlijk",
|
"rchange12": "Doe iets heerlijk",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Vergeet niet te klikken op 'Profiel bijwerken' om de wijziging door te voeren.",
|
"bchange51": "Vergeet niet te klikken op 'Profiel bijwerken' om de wijziging door te voeren.",
|
||||||
"bchange52": "Geeft U deze applicatie toelating om uw portefeuille-info op te vragen?",
|
"bchange52": "Geeft U deze applicatie toelating om uw portefeuille-info op te vragen?",
|
||||||
"bchange53": "Maak de vriendenlijst automatisch opvraagbaar voor alle apps",
|
"bchange53": "Maak de vriendenlijst automatisch opvraagbaar voor alle apps",
|
||||||
"bchange54": "Geeft U deze applicatie toegang tot uw vriendenlijst?"
|
"bchange54": "Geeft U deze applicatie toegang tot uw vriendenlijst?",
|
||||||
|
"bchange55": "Geeft U deze applicatie toelating om dit commando te verzenden?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Data-beheer",
|
"dchange1": "Data-beheer",
|
||||||
@ -856,22 +857,22 @@
|
|||||||
"cchange95": "Enkel mijn gegevens",
|
"cchange95": "Enkel mijn gegevens",
|
||||||
"cchange96": "Groep-beheer openen",
|
"cchange96": "Groep-beheer openen",
|
||||||
"cchange97": "Link voor lid-aanvraag naar klembord gekopieerd",
|
"cchange97": "Link voor lid-aanvraag naar klembord gekopieerd",
|
||||||
"cchange98": "Bestand uploaden. Dit kan enkele minuten duren.",
|
"cchange98": "Bestand opladen. Dit kan enkele minuten duren.",
|
||||||
"cchange99": "Bestand verwijderen. Dit kan maximaal één minuut duren.",
|
"cchange99": "Bestand verwijderen. Dit kan maximaal één minuut duren.",
|
||||||
"cchange100": "Bestandsgrootte is groter dan 125 MB",
|
"cchange100": "Bestandsgrootte is groter dan 125 MB",
|
||||||
"cchange101": "Weet u zeker dat u dit bestand wilt verwijderen?",
|
"cchange101": "Weet je zeker dat je dit bestand wil verwijderen?",
|
||||||
"cchange102": "Dit bestand is verwijderd",
|
"cchange102": "Dit bestand is verwijderd",
|
||||||
"cchange103": "Gif uploaden. Dit kan maximaal een minuut duren.",
|
"cchange103": "GIF opladen. Dit kan maximaal een minuut duren.",
|
||||||
"cchange104": "Gif verwijderen. Dit kan maximaal een minuut duren.",
|
"cchange104": "GIF verwijderen. Dit kan maximaal een minuut duren.",
|
||||||
"cchange105": "Bestandsgrootte is groter dan 3 MB",
|
"cchange105": "Bestandsgrootte is groter dan 3 MB",
|
||||||
"cchange106": "Weet je zeker dat je deze gif wilt verwijderen?",
|
"cchange106": "Weet je zeker dat je deze GIF wil verwijderen?",
|
||||||
"cchange107": "Deze gif is verwijderd",
|
"cchange107": "Deze GIF is verwijderd",
|
||||||
"cchange108": "Het downloaden gaat door op de achtergrond, er kan slechts ÉÉN Q-Chat-bestand tegelijkertijd worden gedownload.",
|
"cchange108": "Het downloaden gaat door op de achtergrond. Er kan slechts ÉÉN Q-Chat-bestand tegelijkertijd worden gedownload.",
|
||||||
"cchange109": "Bestandstype niet ondersteund!",
|
"cchange109": "Bestandstype niet ondersteund!",
|
||||||
"cchange110": "AFBEELDING UPLOADEN",
|
"cchange110": "AFBEELDING OPLADEN",
|
||||||
"cchange111": "GIF-UPLOAD",
|
"cchange111": "GIF OPLADEN",
|
||||||
"cchange112": "BIJLAGE UPLOADEN",
|
"cchange112": "BIJLAGE OPLADEN",
|
||||||
"cchange113": "BESTAND UPLOADEN",
|
"cchange113": "BESTAND OPLADEN",
|
||||||
"cchange114": "Schrijf iets ..."
|
"cchange114": "Schrijf iets ..."
|
||||||
},
|
},
|
||||||
"welcomepage": {
|
"welcomepage": {
|
||||||
@ -1032,15 +1033,15 @@
|
|||||||
"nchange32": "Stop-aanvraag werd verzonden!",
|
"nchange32": "Stop-aanvraag werd verzonden!",
|
||||||
"nchange33": "Node herstarten",
|
"nchange33": "Node herstarten",
|
||||||
"nchange34": "Herstart-aanvraag werd verzonden!",
|
"nchange34": "Herstart-aanvraag werd verzonden!",
|
||||||
"nchange35": "Startknooppunt",
|
"nchange35": "Start node",
|
||||||
"nchange36": "Succesvol gestart knooppunt!",
|
"nchange36": "Node succesvol opgestart!",
|
||||||
"nchange37": "Als u op Doorgaan klikt, wordt uw Qortal Core vernieuwd, wordt uw database verwijderd en downloadt u een nieuwe kopie van de database, genaamd bootstrapping.",
|
"nchange37": "Als U op 'Doorgaan' klikt, wordt uw Qortal Core vernieuwd, de database verwijderd en vervangen door een nieuwe kopie van de database; Die noemen we 'bootstrapping' van de node.",
|
||||||
"nchange38": "LTC-portemonnee repareren",
|
"nchange38": "LTC-portefeuille herstellen",
|
||||||
"nchange39": "Hiermee worden LTC-portefeuilles gerepareerd die een saldo vertonen dat niet kan worden uitgegeven. Er moet een enkele transactie worden uitgevoerd op het Litecoin-netwerk, na bevestiging zal het portemonnee-saldo functioneel zijn en zal het probleem zich niet opnieuw voordoen.",
|
"nchange39": "Hiermee worden LTC-portefeuilles hersteld die een saldo vertonen dat niet kan worden uitgegeven. Er moet een transactie worden uitgevoerd op het Litecoin-netwerk, en na bevestiging zal het portefeuille-saldo terug functioneel zijn; Daarna zal het probleem zich niet opnieuw voordoen.",
|
||||||
"nchange40": "Voor deze transactie worden kleine LTC-kosten in rekening gebracht. Doorgaan?",
|
"nchange40": "Voor deze transactie worden kleine LTC-kosten in rekening gebracht. Doorgaan?",
|
||||||
"nchange41": "Probeert te repareren. Even geduld a.u.b....",
|
"nchange41": "Herstelling is bezig. Even geduld graag...",
|
||||||
"nchange42": "LTC-portemonnee succesvol gerepareerd!",
|
"nchange42": "LTC-portefeuille werd succesvol hersteld!",
|
||||||
"nchange43": "Er is een fout opgetreden bij het repareren van de LTC-portemonnee. Probeer het opnieuw!"
|
"nchange43": "Er is een fout opgetreden bij het herstellen van de LTC-portefeuille. Probeer het opnieuw!"
|
||||||
},
|
},
|
||||||
"transpage": {
|
"transpage": {
|
||||||
"tchange1": "Transactie-aanvraag",
|
"tchange1": "Transactie-aanvraag",
|
||||||
@ -1207,7 +1208,7 @@
|
|||||||
"inf7": "Informatie over automatische aankoop",
|
"inf7": "Informatie over automatische aankoop",
|
||||||
"inf8": "Info over automatische aankoop sluiten",
|
"inf8": "Info over automatische aankoop sluiten",
|
||||||
"inf9": "'Automatische aamkoop' is een functie waarmee je 'aankoop-orders' op het handelsportaal kan plaatsen. Die 'aankoop-orders' zijn enkel zichtbaar voor de persoon die ze plaatst. Het zijn geen 'publiek zichtbare orders' zoals de 'open-markt-verkoop-orders' en ze worden NIET op de Qortal blockchain bewaard. 'Automatische aankoop' is een UI-functie, die bij gevolg enkel werkt zolang de UI blijft draaien.",
|
"inf9": "'Automatische aamkoop' is een functie waarmee je 'aankoop-orders' op het handelsportaal kan plaatsen. Die 'aankoop-orders' zijn enkel zichtbaar voor de persoon die ze plaatst. Het zijn geen 'publiek zichtbare orders' zoals de 'open-markt-verkoop-orders' en ze worden NIET op de Qortal blockchain bewaard. 'Automatische aankoop' is een UI-functie, die bij gevolg enkel werkt zolang de UI blijft draaien.",
|
||||||
"inf10": "Om via 'Automatiche aankoop' een bestelling te plaatsen, klikt U op de knop 'auto-aankoop toevoegen' en vult U het vakje in dat verschijnt. Voer het BEDRAG VAN QORT in dat U wilt KOPEN of het aantal LTC dat U wilt gebruiken, en de PRIJS waartoe u bereid bent te KOPEN. Zodra de bestelling actief is, koopt 'Automatische aankoop' TOT dat bedrag QORT voor U, tegen TOT de prijs die U instelt (beginnend bij de laagste bestelling en hogerop in het verkoop-orderboek).",
|
"inf10": "Om via 'Automatiche aankoop' een bestelling te plaatsen, klikt U op de knop 'auto-aankoop toevoegen' en vult U het vakje in dat verschijnt. Voer het BEDRAG VAN QORT in dat U wilt KOPEN of het aantal LTC dat U wilt gebruiken, en de PRIJS waartoe U bereid bent te KOPEN. Zodra de bestelling actief is, koopt 'Automatische aankoop' TOT dat bedrag QORT voor U, tegen TOT de prijs die U instelt (beginnend bij de laagste bestelling en hogerop in het verkoop-orderboek).",
|
||||||
"inf11": "Laat vervolgens de UI gewoon open staan, en de 'auto aankoop' functie doet de rest, volledig automatisch!",
|
"inf11": "Laat vervolgens de UI gewoon open staan, en de 'auto aankoop' functie doet de rest, volledig automatisch!",
|
||||||
"inf12": "Je KAN ondertussen ook gewoon andere Qortal UI plugins gebruiken (Q-Chat, Portefeuille, etc), maar je mag DE UI NIET SLUITEN, als je wil dat 'Auto aankoop' functie blijft werken. De UI 'minimized' zetten (op de 'taskbar' of 'panel') mag wel. Zolang UI actief is, blijft de 'Auto aankoop' functie werken.",
|
"inf12": "Je KAN ondertussen ook gewoon andere Qortal UI plugins gebruiken (Q-Chat, Portefeuille, etc), maar je mag DE UI NIET SLUITEN, als je wil dat 'Auto aankoop' functie blijft werken. De UI 'minimized' zetten (op de 'taskbar' of 'panel') mag wel. Zolang UI actief is, blijft de 'Auto aankoop' functie werken.",
|
||||||
"inf13": "Automatisch aankopen",
|
"inf13": "Automatisch aankopen",
|
||||||
@ -1323,11 +1324,100 @@
|
|||||||
"chatsettings": {
|
"chatsettings": {
|
||||||
"cs1": "Chatinstellingen",
|
"cs1": "Chatinstellingen",
|
||||||
"cs2": "Algemene chatinstellingen",
|
"cs2": "Algemene chatinstellingen",
|
||||||
"cs3": "Tijdstempel van chatbericht",
|
"cs3": "Tijdstip van chatbericht",
|
||||||
"cs4": "Tijd geleden",
|
"cs4": "Tijd geleden",
|
||||||
"cs5": "Lokale tijd",
|
"cs5": "Lokale tijd",
|
||||||
"cs6": "Lettergrootte chatbericht",
|
"cs6": "Lettergrootte chatbericht",
|
||||||
"cs7": "Standaard",
|
"cs7": "Standaard",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Alle aangevraagde AT's moeten van dezelfde buitenlandse Blockchain zijn.",
|
||||||
|
"mpchange2": "Geeft u deze applicatie toestemming om een kooporder uit te voeren?",
|
||||||
|
"mpchange3": "Kooporder succesvol aangemaakt",
|
||||||
|
"mpchange4": "Wacht tot kooporder is uitgevoerd",
|
||||||
|
"mpchange5": "Kooporder mislukt.",
|
||||||
|
"mpchange6": "Geeft u deze applicatie toestemming om een verkooporder uit te voeren?",
|
||||||
|
"mpchange7": "Voor:",
|
||||||
|
"mpchange8": "Verkooporder succesvol aangemaakt.",
|
||||||
|
"mpchange9": "Wacht tot verkooporder is vermeld.",
|
||||||
|
"mpchange10": "Verkooporder mislukt.",
|
||||||
|
"mpchange11": "AT-info niet gevonden.",
|
||||||
|
"mpchange12": "Geeft u deze applicatie toestemming om een verkooporder te annuleren?",
|
||||||
|
"mpchange13": "Verkooporder succesvol geannuleerd.",
|
||||||
|
"mpchange14": "Wacht tot de annulering van de transactie is voltooid.",
|
||||||
|
"mpchange15": "Verkooporder kan niet worden geannuleerd.",
|
||||||
|
"mpchange16": "Fout bij het ophalen van de lijst.",
|
||||||
|
"mpchange17": "Fout bij het toevoegen aan de lijst.",
|
||||||
|
"mpchange18": "Fout bij het verwijderen van de lijst.",
|
||||||
|
"mpchange19": "Fout bij het ophalen van de vriendenlijst.",
|
||||||
|
"mpchange20": "Aantal is geen getal.",
|
||||||
|
"mpchange21": "Aantal ontbreekt.",
|
||||||
|
"mpchange22": "Er zijn geen gegevens of bestanden verzonden.",
|
||||||
|
"mpchange23": "Voor het versleutelen van gegevens zijn openbare sleutels nodig.",
|
||||||
|
"mpchange24": "Alleen versleutelde gegevens kunnen naar privéservices gaan.",
|
||||||
|
"mpchange25": "Upload mislukt vanwege mislukte versleuteling.",
|
||||||
|
"mpchange26": "Upload mislukt.",
|
||||||
|
"mpchange27": "Ongeldige gegevens.",
|
||||||
|
"mpchange28": "Geen bronnen om te publiceren.",
|
||||||
|
"mpchange29": "Onbekende fout.",
|
||||||
|
"mpchange30": "Poll niet gevonden.",
|
||||||
|
"mpchange31": "Kan niet stemmen op de poll.",
|
||||||
|
"mpchange32": "Kan poll niet maken.",
|
||||||
|
"mpchange33": "Voer een qortal-link in - qortal://...",
|
||||||
|
"mpchange34": "Ongeldige qortal-link.",
|
||||||
|
"mpchange35": "Fout bij pushen van melding.",
|
||||||
|
"mpchange36": "Kan bericht niet verzenden.",
|
||||||
|
"mpchange37": "Kan geen gecodeerd bericht verzenden naar deze gebruiker omdat deze geen openbare sleutel op de keten heeft.",
|
||||||
|
"mpchange38": "Aanvraag kon niet worden uitgevoerd.",
|
||||||
|
"mpchange39": "Groep niet gevonden.",
|
||||||
|
"mpchange40": "Geeft u deze toepassing toestemming om een verzoek tot deelname aan een groep uit te voeren?",
|
||||||
|
"mpchange41": "Groepsnaam:",
|
||||||
|
"mpchange42": "Groeps-ID:",
|
||||||
|
"mpchange43": "Aanvraag voor deelname aan groep succesvol aangemaakt.",
|
||||||
|
"mpchange44": "Aanmelding voor groep mislukt.",
|
||||||
|
"mpchange45": "Een mime-type kon niet worden afgeleid.",
|
||||||
|
"mpchange46": "Een bestandsextensie kon niet worden afgeleid.",
|
||||||
|
"mpchange47": "Gebruiker heeft de download geweigerd.",
|
||||||
|
"mpchange48": "Downloaden mislukt.",
|
||||||
|
"mpchange49": "AT implementeren mislukt.",
|
||||||
|
"mpchange50": "Gebruiker heeft geen profiel.",
|
||||||
|
"mpchange51": "Gevraagde gegevens kunnen niet worden gevonden.",
|
||||||
|
"mpchange52": "Profielgegevens ophalen mislukt.",
|
||||||
|
"mpchange53": "Eigenschap instellen mislukt.",
|
||||||
|
"mpchange54": "Profiel openen mislukt.",
|
||||||
|
"mpchange55": "Fout bij het ophalen van serverinfo.",
|
||||||
|
"mpchange56": "Fout in tx-activiteitssamenvatting.",
|
||||||
|
"mpchange57": "Fout bij ophalen buitenlandse vergoeding.",
|
||||||
|
"mpchange58": "Fout bij bijwerken buitenlandse vergoeding.",
|
||||||
|
"mpchange59": "Fout bij ophalen serververbindingsgeschiedenis.",
|
||||||
|
"mpchange60": "Fout bij instellen huidige server.",
|
||||||
|
"mpchange61": "Fout bij toevoegen server.",
|
||||||
|
"mpchange62": "Fout bij verwijderen server.",
|
||||||
|
"mpchange63": "Fout bij ophalen samenvatting.",
|
||||||
|
"mpchange64": "Decoderen transactie mislukt.",
|
||||||
|
"mpchange65": "Geeft u deze toepassing toestemming om een transactie te ondertekenen en te verwerken?",
|
||||||
|
"mpchange66": "Geeft u deze toepassing toestemming om een transactie te ondertekenen?",
|
||||||
|
"mpchange67": "Lees de transactie zorgvuldig door voordat u deze accepteert.",
|
||||||
|
"mpchange68": "Tx type:",
|
||||||
|
"mpchange69": "TX Data:",
|
||||||
|
"mpchange70": "Transactie verwerken is niet aangevraagd.",
|
||||||
|
"mpchange71": "Getekende bytes zijn:",
|
||||||
|
"mpchange72": "Transactie ondertekend en verwerkt.",
|
||||||
|
"mpchange73": "Transactie kon niet worden verwerkt.",
|
||||||
|
"mpchange74": "QORT-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||||
|
"mpchange75": "Kon geen munt verzenden.",
|
||||||
|
"mpchange76": "BTC-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||||
|
"mpchange77": "LTC-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||||
|
"mpchange78": "DOGE-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||||
|
"mpchange79": "DGB-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||||
|
"mpchange80": "RVN-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||||
|
"mpchange81": "Kan ARRR-saldo niet ophalen. Probeer het opnieuw!",
|
||||||
|
"mpchange82": "ONTBREKENDE VELDEN",
|
||||||
|
"mpchange83": "GEWEIGERD",
|
||||||
|
"mpchange84": "MISLUKT",
|
||||||
|
"mpchange85": "SUCCES",
|
||||||
|
"mpchange86": "Altijd toestaan om automatisch saldo in portemonnee op te halen",
|
||||||
|
"mpchange87": "Voer de groeps-ID in"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Mottaker",
|
"rchange6": "Mottaker",
|
||||||
"rchange7": "Handling",
|
"rchange7": "Handling",
|
||||||
"rchange8": "Type",
|
"rchange8": "Type",
|
||||||
"rchange9": "Nivå 1 - 4 kan opprette en selvdel og nivå 5 eller høyere kan opprette en belønningsdel!",
|
"rchange9": "Nivå 0 - 4 kan opprette en selvdel og nivå 5 eller høyere kan opprette en belønningsdel!",
|
||||||
"rchange10": "Mottaker offentlig nøkkel",
|
"rchange10": "Mottaker offentlig nøkkel",
|
||||||
"rchange11": "Belønningsdel prosent",
|
"rchange11": "Belønningsdel prosent",
|
||||||
"rchange12": "Gjøre noe nydelig",
|
"rchange12": "Gjøre noe nydelig",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "For å sende inn endringene, ikke glem å klikke på 'Oppdater profil'",
|
"bchange51": "For å sende inn endringene, ikke glem å klikke på 'Oppdater profil'",
|
||||||
"bchange52": "Gir du dette programmet tillatelse til å få lommebokinformasjon?",
|
"bchange52": "Gir du dette programmet tillatelse til å få lommebokinformasjon?",
|
||||||
"bchange53": "La alltid vennelisten din hentes automatisk av alle apper",
|
"bchange53": "La alltid vennelisten din hentes automatisk av alle apper",
|
||||||
"bchange54": "Gir du dette programmet tillatelse til å få tilgang til vennelisten din?"
|
"bchange54": "Gir du dette programmet tillatelse til å få tilgang til vennelisten din?",
|
||||||
|
"bchange55": "Gir du denne applikasjonen tillatelse til å sende denne kommandoen?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Data-administrasjon",
|
"dchange1": "Data-administrasjon",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Skriftstørrelse for chatmelding",
|
"cs6": "Skriftstørrelse for chatmelding",
|
||||||
"cs7": "Standard",
|
"cs7": "Standard",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Alle forespurte AT-er må være av samme utenlandske blokkjede.",
|
||||||
|
"mpchange2": "Gir du dette programmet tillatelse til å utføre en kjøpsordre?",
|
||||||
|
"mpchange3": "Kjøpsordre ble opprettet",
|
||||||
|
"mpchange4": "Vennligst vent til kjøpsordre blir oppfylt",
|
||||||
|
"mpchange5": "Kunne ikke sende inn kjøpsordre.",
|
||||||
|
"mpchange6": "Gir du denne applikasjonen tillatelse til å utføre en salgsordre?",
|
||||||
|
"mpchange7": "For:",
|
||||||
|
"mpchange8": "Vellykket opprettet salgsordre.",
|
||||||
|
"mpchange9": "Vennligst vent til salgsordren er oppført.",
|
||||||
|
"mpchange10": "Kunne ikke sende inn salgsordre.",
|
||||||
|
"mpchange11": "Kan ikke finne AT-informasjon.",
|
||||||
|
"mpchange12": "Gir du dette programmet tillatelse til å kansellere en salgsordre?",
|
||||||
|
"mpchange13": "Vellykket kansellert salgsordre.",
|
||||||
|
"mpchange14": "Vennligst vent til kanselleringen av handelen er oppfylt.",
|
||||||
|
"mpchange15": "Kunne ikke kansellere salgsordren.",
|
||||||
|
"mpchange16": "Feil under henting av liste.",
|
||||||
|
"mpchange17": "Feil ved å legge til listen.",
|
||||||
|
"mpchange18": "Feil i slettelisten.",
|
||||||
|
"mpchange19": "Feil under henting av venneliste.",
|
||||||
|
"mpchange20": "Tall er ikke et tall.",
|
||||||
|
"mpchange21": "Mangler antall.",
|
||||||
|
"mpchange22": "Ingen data eller fil ble sendt inn.",
|
||||||
|
"mpchange23": "Kryptering av data krever offentlige nøkler.",
|
||||||
|
"mpchange24": "Bare krypterte data kan gå inn i private tjenester.",
|
||||||
|
"mpchange25": "Opplastning mislyktes på grunn av mislykket kryptering.",
|
||||||
|
"mpchange26": "Opplastning mislyktes.",
|
||||||
|
"mpchange27": "Ugyldige data.",
|
||||||
|
"mpchange28": "Ingen ressurser å publisere.",
|
||||||
|
"mpchange29": "Ukjent feil.",
|
||||||
|
"mpchange30": "Undersøkelsen ble ikke funnet.",
|
||||||
|
"mpchange31": "Kunne ikke stemme på avstemningen.",
|
||||||
|
"mpchange32": "Kunne ikke opprette avstemningen.",
|
||||||
|
"mpchange33": "Vennligst skriv inn en qortal-lenke - qortal://...",
|
||||||
|
"mpchange34": "Ugyldig qortal link.",
|
||||||
|
"mpchange35": "Feil under trykking av varsling.",
|
||||||
|
"mpchange36": "Kunne ikke sende melding.",
|
||||||
|
"mpchange37": "Kan ikke sende en kryptert melding til denne brukeren siden de ikke har sin offentlige nøkkel på kjede.",
|
||||||
|
"mpchange38": "Forespørselen kunne ikke oppfylles.",
|
||||||
|
"mpchange39": "Gruppe ikke funnet.",
|
||||||
|
"mpchange40": "Gir du denne applikasjonen tillatelse til å utføre en forespørsel om å bli med i en gruppe?",
|
||||||
|
"mpchange41": "Gruppenavn:",
|
||||||
|
"mpchange42": "Gruppe ID:",
|
||||||
|
"mpchange43": "Bli med gruppeforespørsel ble opprettet.",
|
||||||
|
"mpchange44": "Kunne ikke bli med i gruppen.",
|
||||||
|
"mpchange45": "En mime-type kunne ikke utledes.",
|
||||||
|
"mpchange46": "En filtype kunne ikke utledes.",
|
||||||
|
"mpchange47": "Bruker avviste nedlastingen.",
|
||||||
|
"mpchange48": "Kunne ikke starte nedlastingen.",
|
||||||
|
"mpchange49": "Kunne ikke distribuere AT.",
|
||||||
|
"mpchange50": "Bruker har ikke en profil.",
|
||||||
|
"mpchange51": "Kan ikke finne forespurte data.",
|
||||||
|
"mpchange52": "Kunne ikke hente profildata.",
|
||||||
|
"mpchange53": "Kunne ikke angi egenskap.",
|
||||||
|
"mpchange54": "Kunne ikke åpne profilen.",
|
||||||
|
"mpchange55": "Feil under henting av serverinfo.",
|
||||||
|
"mpchange56": "Feil i TX-aktivitetssammendraget.",
|
||||||
|
"mpchange57": "Feil i hente utenlandsgebyr.",
|
||||||
|
"mpchange58": "Feil ved oppdatering av utenlandsk gebyr.",
|
||||||
|
"mpchange59": "Feil i hente logg for servertilkobling.",
|
||||||
|
"mpchange60": "Feil i innstilt gjeldende server.",
|
||||||
|
"mpchange61": "Feil i legg til server.",
|
||||||
|
"mpchange62": "Feil ved fjerning av server.",
|
||||||
|
"mpchange63": "Feil under henting av sammendrag.",
|
||||||
|
"mpchange64": "Kunne ikke dekode transaksjonen.",
|
||||||
|
"mpchange65": "Gir du denne applikasjonen tillatelse til å signere og behandle en transaksjon?",
|
||||||
|
"mpchange66": "Gir du denne applikasjonen tillatelse til å signere en transaksjon?",
|
||||||
|
"mpchange67": "Les transaksjonen nøye før du godtar.",
|
||||||
|
"mpchange68": "Tx-type:",
|
||||||
|
"mpchange69": "TX-data:",
|
||||||
|
"mpchange70": "Prosesstransaksjonen ble ikke forespurt.",
|
||||||
|
"mpchange71": "Signerte byte er: ",
|
||||||
|
"mpchange72": "Transaksjonen er signert og behandlet vellykket.",
|
||||||
|
"mpchange73": "Transaksjonen kunne ikke behandles.",
|
||||||
|
"mpchange74": "Kunne ikke hente QORT-saldo. Prøv igjen!",
|
||||||
|
"mpchange75": "Kunne ikke sende mynt.",
|
||||||
|
"mpchange76": "Kunne ikke hente BTC-saldoen. Prøv igjen!",
|
||||||
|
"mpchange77": "Kunne ikke hente LTC-saldoen. Prøv igjen!",
|
||||||
|
"mpchange78": "Kunne ikke hente DOGE-saldo. Prøv igjen!",
|
||||||
|
"mpchange79": "Kunne ikke hente DGB-saldoen. Prøv igjen!",
|
||||||
|
"mpchange80": "Kunne ikke hente RVN-saldo. Prøv igjen!",
|
||||||
|
"mpchange81": "Kunne ikke hente ARRR-saldo. Prøv igjen!",
|
||||||
|
"mpchange82": "MANGLER FELT",
|
||||||
|
"mpchange83": "AVSLAGT",
|
||||||
|
"mpchange84": "FEIL",
|
||||||
|
"mpchange85": "SUKSESS",
|
||||||
|
"mpchange86": "Tillat alltid få lommeboksaldo automatisk",
|
||||||
|
"mpchange87": "Vennligst skriv inn gruppe-ID"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Odbiorca",
|
"rchange6": "Odbiorca",
|
||||||
"rchange7": "Akcja",
|
"rchange7": "Akcja",
|
||||||
"rchange8": "Typ",
|
"rchange8": "Typ",
|
||||||
"rchange9": "Poziomy 1 - 4 mogą tworzyć Self Share, a poziom 5 lub wyższy może tworzyć Reward Share!",
|
"rchange9": "Poziomy 0 - 4 mogą tworzyć Self Share, a poziom 5 lub wyższy może tworzyć Reward Share!",
|
||||||
"rchange10": "Publiczny klucz odbiorcy",
|
"rchange10": "Publiczny klucz odbiorcy",
|
||||||
"rchange11": "Procent udziału w nagrodzie",
|
"rchange11": "Procent udziału w nagrodzie",
|
||||||
"rchange12": "Robimy coś pysznego",
|
"rchange12": "Robimy coś pysznego",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Aby przesłać zmiany, nie zapomnij kliknąć 'Aktualizuj profil'",
|
"bchange51": "Aby przesłać zmiany, nie zapomnij kliknąć 'Aktualizuj profil'",
|
||||||
"bchange52": "Czy dajesz tej aplikacji pozwolenie na uzyskanie informacji o Twoim portfelu?",
|
"bchange52": "Czy dajesz tej aplikacji pozwolenie na uzyskanie informacji o Twoim portfelu?",
|
||||||
"bchange53": "Zawsze zezwalaj na automatyczne pobieranie listy znajomych przez wszystkie aplikacje",
|
"bchange53": "Zawsze zezwalaj na automatyczne pobieranie listy znajomych przez wszystkie aplikacje",
|
||||||
"bchange54": "Czy dajesz tej aplikacji uprawnienia dostępu do listy znajomych?"
|
"bchange54": "Czy dajesz tej aplikacji uprawnienia dostępu do listy znajomych?",
|
||||||
|
"bchange55": "Czy dajesz tej aplikacji pozwolenie na wysłanie tego polecenia?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Zarządzanie danymi",
|
"dchange1": "Zarządzanie danymi",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Rozmiar czcionki wiadomości czatu",
|
"cs6": "Rozmiar czcionki wiadomości czatu",
|
||||||
"cs7": "Standardowy",
|
"cs7": "Standardowy",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Wszystkie żądane AT muszą być tego samego obcego Blockchain.",
|
||||||
|
"mpchange2": "Czy udzielasz tej aplikacji pozwolenia na wykonanie zlecenia kupna?",
|
||||||
|
"mpchange3": "Pomyślnie utworzono zlecenie kupna",
|
||||||
|
"mpchange4": "Proszę czekać, aż zlecenie kupna zostanie zrealizowane",
|
||||||
|
"mpchange5": "Nie udało się przesłać zlecenia kupna.",
|
||||||
|
"mpchange6": "Czy udzielasz tej aplikacji pozwolenia na wykonanie zlecenia sprzedaży?",
|
||||||
|
"mpchange7": "Dla:",
|
||||||
|
"mpchange8": "Pomyślnie utworzono zlecenie sprzedaży.",
|
||||||
|
"mpchange9": "Proszę czekać, aż zlecenie sprzedaży zostanie wystawione na sprzedaż.",
|
||||||
|
"mpchange10": "Nie udało się przesłać zlecenia sprzedaży.",
|
||||||
|
"mpchange11": "Nie można znaleźć informacji o AT.",
|
||||||
|
"mpchange12": "Czy udzielasz tej aplikacji pozwolenia na wykonanie anulowania zlecenia sprzedaży?",
|
||||||
|
"mpchange13": "Pomyślnie anulowano zlecenie sprzedaży.",
|
||||||
|
"mpchange14": "Proszę czekać, aż anulowanie transakcji zostanie zrealizowane.",
|
||||||
|
"mpchange15": "Nie udało się anulować zlecenia sprzedaży.",
|
||||||
|
"mpchange16": "Błąd podczas pobierania listy.",
|
||||||
|
"mpchange17": "Błąd podczas dodawania do listy.",
|
||||||
|
"mpchange18": "Błąd podczas usuwania listy.",
|
||||||
|
"mpchange19": "Błąd podczas pobierania listy znajomych.",
|
||||||
|
"mpchange20": "Liczba nie jest liczbą.",
|
||||||
|
"mpchange21": "Brak liczby.",
|
||||||
|
"mpchange22": "Nie przesłano żadnych danych ani pliku.",
|
||||||
|
"mpchange23": "Szyfrowanie danych wymaga kluczy publicznych.",
|
||||||
|
"mpchange24": "Do usług prywatnych można przesyłać tylko zaszyfrowane dane.",
|
||||||
|
"mpchange25": "Przesyłanie nie powiodło się z powodu nieudanego szyfrowania.",
|
||||||
|
"mpchange26": "Przesyłanie nie powiodło się.",
|
||||||
|
"mpchange27": "Nieprawidłowe dane.",
|
||||||
|
"mpchange28": "Brak zasobów do opublikowania.",
|
||||||
|
"mpchange29": "Nieznany błąd.",
|
||||||
|
"mpchange30": "Nie znaleziono ankiety.",
|
||||||
|
"mpchange31": "Nie udało się zagłosować w ankiecie.",
|
||||||
|
"mpchange32": "Nie udało się utworzyć ankiety.",
|
||||||
|
"mpchange33": "Wprowadź link qortal - qortal://...",
|
||||||
|
"mpchange34": "Nieprawidłowy link qortal.",
|
||||||
|
"mpchange35": "Błąd w wysyłaniu powiadomienia.",
|
||||||
|
"mpchange36": "Nie można wysłać wiadomości.",
|
||||||
|
"mpchange37": "Nie można wysłać zaszyfrowanej wiadomości do tego użytkownika, ponieważ nie ma on klucza publicznego w łańcuchu.",
|
||||||
|
"mpchange38": "Żądanie nie mogło zostać zrealizowane.",
|
||||||
|
"mpchange39": "Nie znaleziono grupy.",
|
||||||
|
"mpchange40": "Czy udzielasz tej aplikacji uprawnień do wykonać żądanie dołączenia do grupy?",
|
||||||
|
"mpchange41": "Nazwa grupy:",
|
||||||
|
"mpchange42": "Identyfikator grupy:",
|
||||||
|
"mpchange43": "Pomyślnie utworzono żądanie dołączenia do grupy.",
|
||||||
|
"mpchange44": "Nie udało się dołączyć do grupy.",
|
||||||
|
"mpchange45": "Nie można było wyprowadzić typu MIME.",
|
||||||
|
"mpchange46": "Nie można było wyprowadzić rozszerzenia pliku.",
|
||||||
|
"mpchange47": "Użytkownik odrzucił pobieranie.",
|
||||||
|
"mpchange48": "Nie udało się zainicjować pobierania.",
|
||||||
|
"mpchange49": "Nie udało się wdrożyć AT.",
|
||||||
|
"mpchange50": "Użytkownik nie ma profilu.",
|
||||||
|
"mpchange51": "Nie można znaleźć żądanych danych.",
|
||||||
|
"mpchange52": "Nie udało się pobrać danych profilu.",
|
||||||
|
"mpchange53": "Nie udało się ustawić właściwości.",
|
||||||
|
"mpchange54": "Nie udało się otworzyć profilu.",
|
||||||
|
"mpchange55": "Błąd podczas pobierania informacji o serwerze.",
|
||||||
|
"mpchange56": "Błąd w podsumowaniu aktywności transakcji.",
|
||||||
|
"mpchange57": "Błąd podczas pobierania opłaty zagranicznej.",
|
||||||
|
"mpchange58": "Błąd podczas aktualizacji opłaty zagranicznej.",
|
||||||
|
"mpchange59": "Błąd podczas pobierania historii połączeń z serwerem.",
|
||||||
|
"mpchange60": "Błąd podczas ustawiania bieżącego serwera.",
|
||||||
|
"mpchange61": "Błąd podczas dodawania serwera.",
|
||||||
|
"mpchange62": "Błąd podczas usuwania serwera.",
|
||||||
|
"mpchange63": "Błąd podczas pobierania podsumowania.",
|
||||||
|
"mpchange64": "Nie udało się zdekodować transakcji.",
|
||||||
|
"mpchange65": "Czy udzielasz tej aplikacji uprawnień do podpisywania i przetwarzania transakcji?",
|
||||||
|
"mpchange66": "Czy udzielasz tej aplikacji uprawnień do podpisywania transakcji?",
|
||||||
|
"mpchange67": "Przeczytaj uważnie transakcję przed accepting.",
|
||||||
|
"mpchange68": "Typ Tx:",
|
||||||
|
"mpchange69": "Dane TX:",
|
||||||
|
"mpchange70": "Nie zażądano przetwarzania transakcji.",
|
||||||
|
"mpchange71": "Podpisane bajty to:",
|
||||||
|
"mpchange72": "Transakcja została podpisana i przetworzona pomyślnie.",
|
||||||
|
"mpchange73": "Transakcji nie można było przetworzyć.",
|
||||||
|
"mpchange74": "Nie udało się pobrać salda QORT. Spróbuj ponownie!",
|
||||||
|
"mpchange75": "Nie można wysłać monety.",
|
||||||
|
"mpchange76": "Nie udało się pobrać salda BTC. Spróbuj ponownie!",
|
||||||
|
"mpchange77": "Nie udało się pobrać salda LTC. Spróbuj ponownie!",
|
||||||
|
"mpchange78": "Nie udało się pobrać salda DOGE. Spróbuj ponownie!",
|
||||||
|
"mpchange79": "Nie udało się pobrać salda DGB. Spróbuj ponownie!",
|
||||||
|
"mpchange80": "Nie udało się pobrać salda RVN. Spróbuj ponownie!",
|
||||||
|
"mpchange81": "Nie udało się pobrać salda ARRR. Spróbuj ponownie!",
|
||||||
|
"mpchange82": "Brakujące pola",
|
||||||
|
"mpchange83": "ODRZUCONE",
|
||||||
|
"mpchange84": "NIEPOWODZENIE",
|
||||||
|
"mpchange85": "POWODZENIE",
|
||||||
|
"mpchange86": "Zawsze zezwalaj na automatyczne pobieranie salda portfela",
|
||||||
|
"mpchange87": "Wprowadź identyfikator grupy"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Recipiente",
|
"rchange6": "Recipiente",
|
||||||
"rchange7": "Ação",
|
"rchange7": "Ação",
|
||||||
"rchange8": "Tipo",
|
"rchange8": "Tipo",
|
||||||
"rchange9": "Nível 1 - 4 podem criar Auto Ações e nível 5 ou superior podem criar Ações de Recompensa!",
|
"rchange9": "Nível 0 - 4 podem criar Auto Ações e nível 5 ou superior podem criar Ações de Recompensa!",
|
||||||
"rchange10": "Chave Pública do Destinatário",
|
"rchange10": "Chave Pública do Destinatário",
|
||||||
"rchange11": "Porcentagem das ações de recompensa",
|
"rchange11": "Porcentagem das ações de recompensa",
|
||||||
"rchange12": "Fazendo algo delicioso",
|
"rchange12": "Fazendo algo delicioso",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Para enviar as alterações não esqueça de clicar em 'Atualizar perfil'",
|
"bchange51": "Para enviar as alterações não esqueça de clicar em 'Atualizar perfil'",
|
||||||
"bchange52": "Você dá permissão a este aplicativo para obter informações da sua carteira?",
|
"bchange52": "Você dá permissão a este aplicativo para obter informações da sua carteira?",
|
||||||
"bchange53": "Sempre permita que sua lista de amigos seja recuperada automaticamente por todos os aplicativos",
|
"bchange53": "Sempre permita que sua lista de amigos seja recuperada automaticamente por todos os aplicativos",
|
||||||
"bchange54": "Você dá permissão a este aplicativo para acessar sua lista de amigos?"
|
"bchange54": "Você dá permissão a este aplicativo para acessar sua lista de amigos?",
|
||||||
|
"bchange55": "Você dá permissão a este aplicativo para enviar este comando?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Gerenciamento de Dados",
|
"dchange1": "Gerenciamento de Dados",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Tamanho da fonte da mensagem de bate-papo",
|
"cs6": "Tamanho da fonte da mensagem de bate-papo",
|
||||||
"cs7": "Padrão",
|
"cs7": "Padrão",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Todos os AT solicitados necessitam de ser do mesmo Blockchain estrangeiro.",
|
||||||
|
"mpchange2": "Dá permissão a esta aplicação para realizar um pedido de compra?",
|
||||||
|
"mpchange3": "Ordem de compra criada com sucesso",
|
||||||
|
"mpchange4": "Por favor aguarde até que o pedido de compra seja atendido",
|
||||||
|
"mpchange5": "Falha ao enviar ordem de compra.",
|
||||||
|
"mpchange6": "Dá permissão a esta aplicação para realizar uma ordem de venda?",
|
||||||
|
"mpchange7": "Para:",
|
||||||
|
"mpchange8": "Ordem de venda criada com sucesso.",
|
||||||
|
"mpchange9": "Por favor aguarde até que a ordem de venda seja listada.",
|
||||||
|
"mpchange10": "Falha ao enviar pedido de venda.",
|
||||||
|
"mpchange11": "Não foi possível encontrar informação de AT.",
|
||||||
|
"mpchange12": "Dá permissão a esta aplicação para cancelar um pedido de venda?",
|
||||||
|
"mpchange13": "Ordem de venda cancelada com sucesso.",
|
||||||
|
"mpchange14": "Aguarde até que o cancelamento da negociação esteja concluído.",
|
||||||
|
"mpchange15": "Falha ao cancelar encomenda de venda.",
|
||||||
|
"mpchange16": "Erro ao recuperar lista.",
|
||||||
|
"mpchange17": "Erro ao adicionar à lista.",
|
||||||
|
"mpchange18": "Erro na lista de exclusão.",
|
||||||
|
"mpchange19": "Erro ao recuperar lista de amigos.",
|
||||||
|
"mpchange20": "A contagem não é um número.",
|
||||||
|
"mpchange21": "Contagem em falta.",
|
||||||
|
"mpchange22": "Não foram enviados dados ou ficheiros.",
|
||||||
|
"mpchange23": "Criptografar dados requer chaves públicas.",
|
||||||
|
"mpchange24": "Apenas os dados encriptados podem entrar em serviços privados.",
|
||||||
|
"mpchange25": "Falha no upload devido a falha na encriptação.",
|
||||||
|
"mpchange26": "Falha no upload.",
|
||||||
|
"mpchange27": "Dados inválidos.",
|
||||||
|
"mpchange28": "Nenhum recurso para publicar.",
|
||||||
|
"mpchange29": "Erro desconhecido.",
|
||||||
|
"mpchange30": "Sondagem não encontrada.",
|
||||||
|
"mpchange31": "Falha ao votar na sondagem.",
|
||||||
|
"mpchange32": "Falha ao criar sondagem.",
|
||||||
|
"mpchange33": "Por favor insira um link qortal - qortal://...",
|
||||||
|
"mpchange34": "Link qortal inválido.",
|
||||||
|
"mpchange35": "Erro ao enviar notificação.",
|
||||||
|
"mpchange36": "Não foi possível enviar a mensagem.",
|
||||||
|
"mpchange37": "Não é possível enviar uma mensagem encriptada a este utilizador porque não tem a sua chave pública na cadeia.",
|
||||||
|
"mpchange38": "O pedido não pôde ser atendido.",
|
||||||
|
"mpchange39": "Grupo não encontrado.",
|
||||||
|
"mpchange40": "Dá permissão a esta aplicação para realizar um pedido de adesão ao grupo?",
|
||||||
|
"mpchange41": "Nome do grupo:",
|
||||||
|
"mpchange42": "ID do grupo:",
|
||||||
|
"mpchange43": "Pedido de adesão ao grupo criado com sucesso.",
|
||||||
|
"mpchange44": "Falha ao entrar no grupo.",
|
||||||
|
"mpchange45": "Um tipo mime não pôde ser derivado.",
|
||||||
|
"mpchange46": "Não foi possível derivar uma extensão de ficheiro.",
|
||||||
|
"mpchange47": "O utilizador recusou o download.",
|
||||||
|
"mpchange48": "Falha ao iniciar o download.",
|
||||||
|
"mpchange49": "Falha ao implantar AT.",
|
||||||
|
"mpchange50": "Utilizador não tem perfil.",
|
||||||
|
"mpchange51": "Não foi possível encontrar os dados solicitados.",
|
||||||
|
"mpchange52": "Falha ao obter os dados do perfil.",
|
||||||
|
"mpchange53": "Falha ao definir a propriedade.",
|
||||||
|
"mpchange54": "Falha ao abrir perfil.",
|
||||||
|
"mpchange55": "Erro ao recuperar informação do servidor.",
|
||||||
|
"mpchange56": "Erro no resumo da atividade tx.",
|
||||||
|
"mpchange57": "Erro ao obter taxa estrangeira.",
|
||||||
|
"mpchange58": "Erro na atualização da taxa estrangeira.",
|
||||||
|
"mpchange59": "Erro ao obter o histórico de ligação do servidor.",
|
||||||
|
"mpchange60": "Erro ao configurar o servidor atual.",
|
||||||
|
"mpchange61": "Erro ao adicionar servidor.",
|
||||||
|
"mpchange62": "Erro ao remover servidor.",
|
||||||
|
"mpchange63": "Erro ao recuperar o resumo.",
|
||||||
|
"mpchange64": "Falha ao descodificar a transação.",
|
||||||
|
"mpchange65": "Dá permissão a esta aplicação para assinar e processar uma transação?",
|
||||||
|
"mpchange66": "Dá permissão a esta aplicação para assinar uma transação?",
|
||||||
|
"mpchange67": "Leia a transação com atenção antes de aceitar.",
|
||||||
|
"mpchange68": "Tipo de transmissão:",
|
||||||
|
"mpchange69": "Dados TX:",
|
||||||
|
"mpchange70": "A transação do processo não foi solicitada.",
|
||||||
|
"mpchange71": "Os Bytes assinados são: ",
|
||||||
|
"mpchange72": "Transação assinada e processada com sucesso.",
|
||||||
|
"mpchange73": "A transação não pôde ser processada.",
|
||||||
|
"mpchange74": "Falha ao pesquisar saldo QORT. Tente novamente!",
|
||||||
|
"mpchange75": "Não foi possível enviar moeda.",
|
||||||
|
"mpchange76": "Falha ao pesquisar saldo BTC. Tente novamente!",
|
||||||
|
"mpchange77": "Falha ao pesquisar saldo LTC. Tente novamente!",
|
||||||
|
"mpchange78": "Falha ao pesquisar saldo DOGE. Tente novamente!",
|
||||||
|
"mpchange79": "Falha ao pesquisar saldo DGB. Tente novamente!",
|
||||||
|
"mpchange80": "Falha ao pesquisar saldo RVN. Tente novamente!",
|
||||||
|
"mpchange81": "Falha ao pesquisar saldo ARRR. Tente novamente!",
|
||||||
|
"mpchange82": "Campos em falta",
|
||||||
|
"mpchange83": "RECLINADO",
|
||||||
|
"mpchange84": "FALHA",
|
||||||
|
"mpchange85": "SUCESSO",
|
||||||
|
"mpchange86": "Permitir sempre obter saldo da carteira automaticamente",
|
||||||
|
"mpchange87": "Por favor introduza o ID do grupo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Destinatar",
|
"rchange6": "Destinatar",
|
||||||
"rchange7": "Actiune",
|
"rchange7": "Actiune",
|
||||||
"rchange8": "Tip",
|
"rchange8": "Tip",
|
||||||
"rchange9": "Nivelurile 1 - 4 pot crea un cota personala de recompensare, iar nivelul 5 sau mai sus pot crea o Cota de Recompensare!",
|
"rchange9": "Nivelurile 0 - 4 pot crea un cota personala de recompensare, iar nivelul 5 sau mai sus pot crea o Cota de Recompensare!",
|
||||||
"rchange10": "Cheia publica a destinatarului",
|
"rchange10": "Cheia publica a destinatarului",
|
||||||
"rchange11": "Procentul cotei de recompensa",
|
"rchange11": "Procentul cotei de recompensa",
|
||||||
"rchange12": "Se produce ceva delicios",
|
"rchange12": "Se produce ceva delicios",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Pentru a trimite modificările nu uitați să faceți clic pe Actualizați profilul",
|
"bchange51": "Pentru a trimite modificările nu uitați să faceți clic pe Actualizați profilul",
|
||||||
"bchange52": "Dați această aplicație permisiunea de a obține informațiile despre portofel?",
|
"bchange52": "Dați această aplicație permisiunea de a obține informațiile despre portofel?",
|
||||||
"bchange53": "Permiteți întotdeauna ca lista de prieteni să fie preluată automat de toate aplicațiile",
|
"bchange53": "Permiteți întotdeauna ca lista de prieteni să fie preluată automat de toate aplicațiile",
|
||||||
"bchange54": "Acordați acestei aplicații permisiunea de a vă accesa lista de prieteni?"
|
"bchange54": "Acordați acestei aplicații permisiunea de a vă accesa lista de prieteni?",
|
||||||
|
"bchange55": "Oferiți acestei aplicații permisiunea de a trimite această comandă?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Gestionare date",
|
"dchange1": "Gestionare date",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Dimensiunea fontului mesajului de chat",
|
"cs6": "Dimensiunea fontului mesajului de chat",
|
||||||
"cs7": "Standard",
|
"cs7": "Standard",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Toate AT-urile solicitate trebuie să fie din același Blockchain străin.",
|
||||||
|
"mpchange2": "Acordați acestei aplicații permisiunea de a efectua o comandă de cumpărare?",
|
||||||
|
"mpchange3": "Comandă de cumpărare creată cu succes",
|
||||||
|
"mpchange4": "Vă rugăm să așteptați până când comanda de cumpărare este îndeplinită",
|
||||||
|
"mpchange5": "Eșuat la trimiterea comenzii de cumpărare.",
|
||||||
|
"mpchange6": "Dați această aplicație permisiunea de a efectua o comandă de vânzare?",
|
||||||
|
"mpchange7": "Pentru:",
|
||||||
|
"mpchange8": "Comandă de vânzare creată cu succes.",
|
||||||
|
"mpchange9": "Vă rugăm să așteptați până când ordinul de vânzare este afișat.",
|
||||||
|
"mpchange10": "Eșuat la trimiterea comenzii de vânzare.",
|
||||||
|
"mpchange11": "Nu pot găsi informațiile AT.",
|
||||||
|
"mpchange12": "Dați această aplicație permisiunea de a efectua anularea unei comenzi de vânzare?",
|
||||||
|
"mpchange13": "Comanda de vânzare a fost anulată cu succes.",
|
||||||
|
"mpchange14": "Vă rugăm să așteptați până când anularea tranzacției este îndeplinită.",
|
||||||
|
"mpchange15": "Anularea comenzii de vânzare a eșuat.",
|
||||||
|
"mpchange16": "Eroare la preluarea listei.",
|
||||||
|
"mpchange17": "Eroare la adăugarea la listă.",
|
||||||
|
"mpchange18": "Eroare în lista de ștergere.",
|
||||||
|
"mpchange19": "Eroare la preluarea listei de prieteni.",
|
||||||
|
"mpchange20": "Numărul nu este un număr.",
|
||||||
|
"mpchange21": "Numărul lipsește.",
|
||||||
|
"mpchange22": "Nu au fost trimise date sau fișiere.",
|
||||||
|
"mpchange23": "Criptarea datelor necesită chei publice.",
|
||||||
|
"mpchange24": "Numai datele criptate pot intra în serviciile private.",
|
||||||
|
"mpchange25": "Încărcarea a eșuat din cauza criptării eșuate.",
|
||||||
|
"mpchange26": "Încărcarea a eșuat.",
|
||||||
|
"mpchange27": "Date nevalide.",
|
||||||
|
"mpchange28": "Nu există resurse de publicat.",
|
||||||
|
"mpchange29": "Eroare necunoscută.",
|
||||||
|
"mpchange30": "Sondajul nu a fost găsit.",
|
||||||
|
"mpchange31": "Nu am votat la sondaj.",
|
||||||
|
"mpchange32": "Nu s-a creat sondajul.",
|
||||||
|
"mpchange33": "Vă rugăm să introduceți un link qortal - qortal://...",
|
||||||
|
"mpchange34": "Link nevalid qortal.",
|
||||||
|
"mpchange35": "Eroare la trimiterea notificării.",
|
||||||
|
"mpchange36": "Nu s-a putut trimite mesajul.",
|
||||||
|
"mpchange37": "Nu se poate trimite un mesaj criptat acestui utilizator deoarece nu are cheia publică în lanț.",
|
||||||
|
"mpchange38": "Solicitarea nu a putut fi îndeplinită.",
|
||||||
|
"mpchange39": "Grupul nu a fost găsit.",
|
||||||
|
"mpchange40": "Acordați acestei aplicații permisiunea de a efectua o solicitare de alăturare a unui grup?",
|
||||||
|
"mpchange41": "Numele grupului:",
|
||||||
|
"mpchange42": "ID grup:",
|
||||||
|
"mpchange43": "Solicitarea de alăturare a grupului a fost creată.",
|
||||||
|
"mpchange44": "Nu s-a putut alătura grupului.",
|
||||||
|
"mpchange45": "Un tip mime nu a putut fi derivat.",
|
||||||
|
"mpchange46": "O extensie de fișier nu a putut fi derivată.",
|
||||||
|
"mpchange47": "Utilizatorul a refuzat descărcarea.",
|
||||||
|
"mpchange48": "Nu s-a inițiat descărcarea.",
|
||||||
|
"mpchange49": "A eșuat la implementarea AT.",
|
||||||
|
"mpchange50": "Utilizatorul nu are un profil.",
|
||||||
|
"mpchange51": "Nu pot găsi datele solicitate.",
|
||||||
|
"mpchange52": "Eșuat la obținerea datelor de profil.",
|
||||||
|
"mpchange53": "Nu s-a putut seta proprietatea.",
|
||||||
|
"mpchange54": "Nu s-a putut deschide profilul.",
|
||||||
|
"mpchange55": "Eroare la preluarea informațiilor serverului.",
|
||||||
|
"mpchange56": "Eroare în rezumatul activității tx.",
|
||||||
|
"mpchange57": "Eroare la obținerea taxei străine.",
|
||||||
|
"mpchange58": "Eroare la actualizarea taxei externe.",
|
||||||
|
"mpchange59": "Eroare la obținerea istoricului conexiunilor la server.",
|
||||||
|
"mpchange60": "Eroare la setarea serverului curent.",
|
||||||
|
"mpchange61": "Eroare la adăugarea serverului.",
|
||||||
|
"mpchange62": "Eroare la eliminarea serverului.",
|
||||||
|
"mpchange63": "Eroare la preluarea rezumatului.",
|
||||||
|
"mpchange64": "Nu s-a putut decoda tranzacția.",
|
||||||
|
"mpchange65": "Acordați acestei aplicații permisiunea de a semna și procesa o tranzacție?",
|
||||||
|
"mpchange66": "Acordați acestei aplicații permisiunea de a semna o tranzacție?",
|
||||||
|
"mpchange67": "Citiți tranzacția cu atenție înainte de a accepta.",
|
||||||
|
"mpchange68": "Tip Tx:",
|
||||||
|
"mpchange69": "Date TX:",
|
||||||
|
"mpchange70": "Procesul tranzacției nu a fost solicitat.",
|
||||||
|
"mpchange71": "Octeții semnați sunt: ",
|
||||||
|
"mpchange72": "Tranzacția a fost semnată și procesată cu succes.",
|
||||||
|
"mpchange73": "Tranzacția nu a putut fi procesată.",
|
||||||
|
"mpchange74": "Preluarea soldului QORT a eșuat. Încercați din nou!",
|
||||||
|
"mpchange75": "Nu s-a putut trimite moneda.",
|
||||||
|
"mpchange76": "Preluarea soldului BTC a eșuat. Încercați din nou!",
|
||||||
|
"mpchange77": "Preluarea soldului LTC a eșuat. Încercați din nou!",
|
||||||
|
"mpchange78": "Preluarea soldului DOGE a eșuat. Încercați din nou!",
|
||||||
|
"mpchange79": "Preluarea soldului DGB a eșuat. Încercați din nou!",
|
||||||
|
"mpchange80": "Preluarea soldului RVN a eșuat. Încercați din nou!",
|
||||||
|
"mpchange81": "Preluarea soldului ARRR a eșuat. Încercați din nou!",
|
||||||
|
"mpchange82": "CÂMPURI LIPSĂ",
|
||||||
|
"mpchange83": "RESFUS",
|
||||||
|
"mpchange84": "Eșec",
|
||||||
|
"mpchange85": "SUCCES",
|
||||||
|
"mpchange86": "Permiteți întotdeauna obținerea automată a soldului portofelului",
|
||||||
|
"mpchange87": "Vă rugăm să introduceți ID-ul grupului"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Primalac",
|
"rchange6": "Primalac",
|
||||||
"rchange7": "Akcija",
|
"rchange7": "Akcija",
|
||||||
"rchange8": "Tip",
|
"rchange8": "Tip",
|
||||||
"rchange9": "Nivoi 1 - 4 mogu napraviti samostalni udeo a nivoi 5 i više mogu napraviti udeo u nagradi!",
|
"rchange9": "Nivoi 0 - 4 mogu napraviti samostalni udeo a nivoi 5 i više mogu napraviti udeo u nagradi!",
|
||||||
"rchange10": "Primalac Javnog Ključa",
|
"rchange10": "Primalac Javnog Ključa",
|
||||||
"rchange11": "Procenat Udela u Nagradi",
|
"rchange11": "Procenat Udela u Nagradi",
|
||||||
"rchange12": "Rađenje nečeg slasnog",
|
"rchange12": "Rađenje nečeg slasnog",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Da biste podneli promene, ne zaboravite da kliknete na 'Ažuriraj profil'",
|
"bchange51": "Da biste podneli promene, ne zaboravite da kliknete na 'Ažuriraj profil'",
|
||||||
"bchange52": "Da li ovoj aplikaciji dajete dozvolu da dobije informacije o vašem novčaniku?",
|
"bchange52": "Da li ovoj aplikaciji dajete dozvolu da dobije informacije o vašem novčaniku?",
|
||||||
"bchange53": "Uvek dozvoli da sve aplikacije automatski preuzimaju listu prijatelja",
|
"bchange53": "Uvek dozvoli da sve aplikacije automatski preuzimaju listu prijatelja",
|
||||||
"bchange54": "Da li ovoj aplikaciji dajete dozvolu da pristupi vašoj listi prijatelja?"
|
"bchange54": "Da li ovoj aplikaciji dajete dozvolu da pristupi vašoj listi prijatelja?",
|
||||||
|
"bchange55": "Da li ovoj aplikaciji dajete dozvolu da pošalje ovu komandu?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Upravljanje podacima",
|
"dchange1": "Upravljanje podacima",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Veličina fonta poruke ćaskanja",
|
"cs6": "Veličina fonta poruke ćaskanja",
|
||||||
"cs7": "Standard",
|
"cs7": "Standard",
|
||||||
"cs8": "pk"
|
"cs8": "pk"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Svi traženi AT-ovi moraju biti na istom stranom Blockchain-u.",
|
||||||
|
"mpchange2": "Da li ovoj aplikaciji dajete dozvolu da izvrši nalog za kupovinu?",
|
||||||
|
"mpchange3": "Uspešno kreiran nalog za kupovinu",
|
||||||
|
"mpchange4": "Molimo sačekajte dok se porudžbina za kupovinu ne ispuni",
|
||||||
|
"mpchange5": "Podnošenje naloga za kupovinu nije uspelo.",
|
||||||
|
"mpchange6": "Da li ovoj aplikaciji dajete dozvolu da izvrši nalog za prodaju?",
|
||||||
|
"mpchange7": "Za:",
|
||||||
|
"mpchange8": "Uspešno kreiran nalog za prodaju.",
|
||||||
|
"mpchange9": "Molimo sačekajte dok se nalog za prodaju ne pojavi na listi.",
|
||||||
|
"mpchange10": "Podnošenje naloga za prodaju nije uspelo.",
|
||||||
|
"mpchange11": "Ne mogu pronaći AT informacije.",
|
||||||
|
"mpchange12": "Da li ovoj aplikaciji dajete dozvolu da izvrši otkazivanje naloga za prodaju?",
|
||||||
|
"mpchange13": "Uspešno otkazan nalog za prodaju.",
|
||||||
|
"mpchange14": "Molimo sačekajte dok se otkazivanje trgovine ne ispuni.",
|
||||||
|
"mpchange15": "Otkazivanje porudžbine za prodaju nije uspelo.",
|
||||||
|
"mpchange16": "Greška u preuzimanju liste.",
|
||||||
|
"mpchange17": "Greška pri dodavanju na listu.",
|
||||||
|
"mpchange18": "Greška u listi za brisanje.",
|
||||||
|
"mpchange19": "Greška pri preuzimanju liste prijatelja.",
|
||||||
|
"mpchange20": "Broj nije broj.",
|
||||||
|
"mpchange21": "Nedostaje broj.",
|
||||||
|
"mpchange22": "Nije dostavljen nijedan podatak ili datoteka.",
|
||||||
|
"mpchange23": "Šifrovanje podataka zahteva javne ključeve.",
|
||||||
|
"mpchange24": "Samo šifrovani podaci mogu da idu u privatne usluge.",
|
||||||
|
"mpchange25": "Otpremanje nije uspelo zbog neuspelog šifrovanja.",
|
||||||
|
"mpchange26": "Otpremanje nije uspelo.",
|
||||||
|
"mpchange27": "Nevažeći podaci.",
|
||||||
|
"mpchange28": "Nema resursa za objavljivanje.",
|
||||||
|
"mpchange29": "Nepoznata greška.",
|
||||||
|
"mpchange30": "Anketa nije pronađena.",
|
||||||
|
"mpchange31": "Glasanje u anketi nije uspelo.",
|
||||||
|
"mpchange32": "Kreiranje ankete nije uspelo.",
|
||||||
|
"mpchange33": "Unesite kortal link - kortal://...",
|
||||||
|
"mpchange34": "Nevažeća kortal veza.",
|
||||||
|
"mpchange35": "Greška u slanju obaveštenja.",
|
||||||
|
"mpchange36": "Ne mogu poslati poruku.",
|
||||||
|
"mpchange37": "Ne mogu poslati šifrovanu poruku ovom korisniku jer nemaju svoj javni ključ u lancu.",
|
||||||
|
"mpchange38": "Zahtev nije mogao biti ispunjen.",
|
||||||
|
"mpchange39": "Grupa nije pronađena.",
|
||||||
|
"mpchange40": "Da li ovoj aplikaciji dajete dozvolu da izvrši zahtev za pridruživanje grupi?",
|
||||||
|
"mpchange41": "Ime grupe:",
|
||||||
|
"mpchange42": "ID grupe:",
|
||||||
|
"mpchange43": "Uspešno kreiran zahtev za pridruživanje grupi.",
|
||||||
|
"mpchange44": "Pridruživanje grupi nije uspelo.",
|
||||||
|
"mpchange45": "Mime tip nije mogao biti izveden.",
|
||||||
|
"mpchange46": "Ne može se izvesti ekstenzija datoteke.",
|
||||||
|
"mpchange47": "Korisnik je odbio preuzimanje.",
|
||||||
|
"mpchange48": "Pokretanje preuzimanja nije uspelo.",
|
||||||
|
"mpchange49": "Neuspešno postavljanje AT-a.",
|
||||||
|
"mpchange50": "Korisnik nema profil.",
|
||||||
|
"mpchange51": "Ne mogu pronaći tražene podatke.",
|
||||||
|
"mpchange52": "Dobijanje podataka profila nije uspelo.",
|
||||||
|
"mpchange53": "Podešavanje svojstva nije uspelo.",
|
||||||
|
"mpchange54": "Otvaranje profila nije uspelo.",
|
||||||
|
"mpchange55": "Greška pri preuzimanju informacija o serveru.",
|
||||||
|
"mpchange56": "Greška u rezimeu tk aktivnosti.",
|
||||||
|
"mpchange57": "Greška u dobijanju inostrane naknade.",
|
||||||
|
"mpchange58": "Greška u ažuriranju inostrane naknade.",
|
||||||
|
"mpchange59": "Greška u preuzimanju istorije veze sa serverom.",
|
||||||
|
"mpchange60": "Greška u podešavanju trenutnog servera.",
|
||||||
|
"mpchange61": "Greška u dodavanju servera.",
|
||||||
|
"mpchange62": "Greška u uklanjanju servera.",
|
||||||
|
"mpchange63": "Greška pri preuzimanju rezimea.",
|
||||||
|
"mpchange64": "Dekodiranje transakcije nije uspelo.",
|
||||||
|
"mpchange65": "Da li ovoj aplikaciji dajete dozvolu da potpiše i obradi transakciju?",
|
||||||
|
"mpchange66": "Da li ovoj aplikaciji dajete dozvolu da potpiše transakciju?",
|
||||||
|
"mpchange67": "Pažljivo pročitajte transakciju pre prihvatanja.",
|
||||||
|
"mpchange68": "Tp Tk:",
|
||||||
|
"mpchange69": "TKS podaci:",
|
||||||
|
"mpchange70": "Procesna transakcija nije zatražena.",
|
||||||
|
"mpchange71": "Potpisani bajtovi su: ",
|
||||||
|
"mpchange72": "Transakcija je potpisana i uspešno obrađena.",
|
||||||
|
"mpchange73": "Transakcija nije mogla da se obradi.",
|
||||||
|
"mpchange74": "Preuzimanje KORT balansa nije uspelo. Pokušajte ponovo!",
|
||||||
|
"mpchange75": "Nije moguće poslati novčić.",
|
||||||
|
"mpchange76": "Neuspešno preuzimanje BTC stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange77": "Preuzimanje LTC stanja nije uspelo. Pokušajte ponovo!",
|
||||||
|
"mpchange78": "Neuspešno preuzimanje DOGE balansa. Pokušajte ponovo!",
|
||||||
|
"mpchange79": "Dohvaćanje DGB balansa nije uspelo. Pokušajte ponovo!",
|
||||||
|
"mpchange80": "Neuspešno preuzimanje RVN stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange81": "Neuspešno preuzimanje ARRR stanja. Pokušajte ponovo!",
|
||||||
|
"mpchange82": "POLJA NEDOSTAJU",
|
||||||
|
"mpchange83": "ODBIJENO",
|
||||||
|
"mpchange84": "GREŠKA",
|
||||||
|
"mpchange85": "USPEH",
|
||||||
|
"mpchange86": "Uvek dozvoli automatsko dobijanje stanja novčanika",
|
||||||
|
"mpchange87": "Unesite ID grupe"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Получатель",
|
"rchange6": "Получатель",
|
||||||
"rchange7": "Действие",
|
"rchange7": "Действие",
|
||||||
"rchange8": "Тип",
|
"rchange8": "Тип",
|
||||||
"rchange9": "Уровень 1–4 может создать акцию для самого себя, а уровень 5 или выше может создать акцию для других!",
|
"rchange9": "Уровень 0–4 может создать акцию для самого себя, а уровень 5 или выше может создать акцию для других!",
|
||||||
"rchange10": "Открытый ключ получателя",
|
"rchange10": "Открытый ключ получателя",
|
||||||
"rchange11": "Процент доли вознаграждения",
|
"rchange11": "Процент доли вознаграждения",
|
||||||
"rchange12": "Делаю что-нибудь вкусненькое",
|
"rchange12": "Делаю что-нибудь вкусненькое",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "Чтобы отправить изменения, не забудьте нажать Обновить профиль",
|
"bchange51": "Чтобы отправить изменения, не забудьте нажать Обновить профиль",
|
||||||
"bchange52": "Разрешаете ли вы этому приложению получать информацию о вашем кошельке?",
|
"bchange52": "Разрешаете ли вы этому приложению получать информацию о вашем кошельке?",
|
||||||
"bchange53": "Всегда разрешайте всем приложениям автоматически получать список друзей",
|
"bchange53": "Всегда разрешайте всем приложениям автоматически получать список друзей",
|
||||||
"bchange54": "Разрешаете ли вы этому приложению доступ к вашему списку друзей?"
|
"bchange54": "Разрешаете ли вы этому приложению доступ к вашему списку друзей?",
|
||||||
|
"bchange55": "Даете ли вы этому приложению разрешение на отправку этой команды?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Управление данными",
|
"dchange1": "Управление данными",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Размер шрифта сообщения чата",
|
"cs6": "Размер шрифта сообщения чата",
|
||||||
"cs7": "Стандартный",
|
"cs7": "Стандартный",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "Все запрошенные AT должны быть из одного и того же внешнего блокчейна.",
|
||||||
|
"mpchange2": "Вы даете этому приложению разрешение на выполнение заказа на покупку?",
|
||||||
|
"mpchange3": "Заказ на покупку успешно создан",
|
||||||
|
"mpchange4": "Пожалуйста, подождите, пока заказ на покупку не будет выполнен",
|
||||||
|
"mpchange5": "Не удалось отправить заказ на покупку.",
|
||||||
|
"mpchange6": "Вы даете этому приложению разрешение на выполнение заказа на продажу?",
|
||||||
|
"mpchange7": "Для:",
|
||||||
|
"mpchange8": "Заказ на продажу успешно создан",
|
||||||
|
"mpchange9": "Пожалуйста, подождите, пока заказ на продажу не будет размещен",
|
||||||
|
"mpchange10": "Не удалось отправить заказ на продажу.",
|
||||||
|
"mpchange11": "Не удалось найти информацию об AT.",
|
||||||
|
"mpchange12": "Вы даете этому приложению разрешение на выполнение отмены заказа на продажу?",
|
||||||
|
"mpchange13": "Заказ на продажу успешно отменен",
|
||||||
|
"mpchange14": "Пожалуйста дождитесь выполнения отмены сделки.",
|
||||||
|
"mpchange15": "Не удалось отменить ордер на продажу.",
|
||||||
|
"mpchange16": "Ошибка при получении списка.",
|
||||||
|
"mpchange17": "Ошибка при добавлении в список.",
|
||||||
|
"mpchange18": "Ошибка при удалении списка.",
|
||||||
|
"mpchange19": "Ошибка при получении списка друзей.",
|
||||||
|
"mpchange20": "Количество не является числом.",
|
||||||
|
"mpchange21": "Отсутствует количество.",
|
||||||
|
"mpchange22": "Данные или файл не были отправлены.",
|
||||||
|
"mpchange23": "Для шифрования данных требуются открытые ключи.",
|
||||||
|
"mpchange24": "Только зашифрованные данные могут быть отправлены в частные сервисы.",
|
||||||
|
"mpchange25": "Загрузка не удалась из-за неудачного шифрования.",
|
||||||
|
"mpchange26": "Загрузка не удалась.",
|
||||||
|
"mpchange27": "Недопустимые данные.",
|
||||||
|
"mpchange28": "Нет ресурсов для публикации.",
|
||||||
|
"mpchange29": "Неизвестно ошибка.",
|
||||||
|
"mpchange30": "Опрос не найден.",
|
||||||
|
"mpchange31": "Не удалось проголосовать в опросе.",
|
||||||
|
"mpchange32": "Не удалось создать опрос.",
|
||||||
|
"mpchange33": "Введите ссылку qortal - qortal://...",
|
||||||
|
"mpchange34": "Недопустимая ссылка qortal.",
|
||||||
|
"mpchange35": "Ошибка при отправке уведомления.",
|
||||||
|
"mpchange36": "Не удалось отправить сообщение.",
|
||||||
|
"mpchange37": "Не удалось отправить зашифрованное сообщение этому пользователю, так как у него нет открытого ключа в цепочке.",
|
||||||
|
"mpchange38": "Запрос не может быть выполнен.",
|
||||||
|
"mpchange39": "Группа не найдена.",
|
||||||
|
"mpchange40": "Вы даете этому приложению разрешение на выполнение запроса на присоединение к группе?",
|
||||||
|
"mpchange41": "Имя группы:",
|
||||||
|
"mpchange42": "Идентификатор группы:",
|
||||||
|
"mpchange43": "Успешно создано присоединение к группе запрос.",
|
||||||
|
"mpchange44": "Не удалось присоединиться к группе.",
|
||||||
|
"mpchange45": "Не удалось получить тип MIME.",
|
||||||
|
"mpchange46": "Не удалось получить расширение файла.",
|
||||||
|
"mpchange47": "Пользователь отклонил загрузку.",
|
||||||
|
"mpchange48": "Не удалось начать загрузку.",
|
||||||
|
"mpchange49": "Не удалось развернуть AT.",
|
||||||
|
"mpchange50": "У пользователя нет профиля.",
|
||||||
|
"mpchange51": "Не удалось найти запрошенные данные.",
|
||||||
|
"mpchange52": "Не удалось получить данные профиля.",
|
||||||
|
"mpchange53": "Не удалось задать свойство.",
|
||||||
|
"mpchange54": "Не удалось открыть профиль.",
|
||||||
|
"mpchange55": "Ошибка при получении информации о сервере.",
|
||||||
|
"mpchange56": "Ошибка в сводке активности tx.",
|
||||||
|
"mpchange57": "Ошибка при получении иностранной платы.",
|
||||||
|
"mpchange58": "Ошибка обновления иностранной платы",
|
||||||
|
"mpchange59": "Ошибка получения истории подключений к серверу",
|
||||||
|
"mpchange60": "Ошибка установки текущего сервера",
|
||||||
|
"mpchange61": "Ошибка добавления сервера",
|
||||||
|
"mpchange62": "Ошибка удаления сервера",
|
||||||
|
"mpchange63": "Ошибка получения сводки",
|
||||||
|
"mpchange64": "Не удалось декодировать транзакцию",
|
||||||
|
"mpchange65": "Вы даете этому приложению разрешение на подпись и обработку транзакции?",
|
||||||
|
"mpchange66": "Вы даете этому приложению разрешение на подпись транзакции?",
|
||||||
|
"mpchange67": "Внимательно прочитайте транзакцию перед ее принятием",
|
||||||
|
"mpchange68": "Тип передачи:",
|
||||||
|
"mpchange69": "Данные передачи:",
|
||||||
|
"mpchange70": "Транзакция обработки не была запрошена",
|
||||||
|
"mpchange71": "Подписанные байты:",
|
||||||
|
"mpchange72": "Транзакция подписана и успешно обработана",
|
||||||
|
"mpchange73": "Транзакция была не удалось обработать.",
|
||||||
|
"mpchange74": "Не удалось получить баланс QORT. Попробуйте еще раз!",
|
||||||
|
"mpchange75": "Не удалось отправить монету.",
|
||||||
|
"mpchange76": "Не удалось получить баланс BTC. Попробуйте еще раз!",
|
||||||
|
"mpchange77": "Не удалось получить баланс LTC. Попробуйте еще раз!",
|
||||||
|
"mpchange78": "Не удалось получить баланс DOGE. Попробуйте еще раз!",
|
||||||
|
"mpchange79": "Не удалось получить баланс DGB. Попробуйте еще раз!",
|
||||||
|
"mpchange80": "Не удалось получить баланс RVN. Попробуйте еще раз!",
|
||||||
|
"mpchange81": "Не удалось получить баланс ARRR. Попробуйте еще раз!",
|
||||||
|
"mpchange82": "ПРОПУЩЕННЫЕ ПОЛЯ",
|
||||||
|
"mpchange83": "ОТКЛОНЕНО",
|
||||||
|
"mpchange84": "НЕУДАЧА",
|
||||||
|
"mpchange85": "УСПЕШНО",
|
||||||
|
"mpchange86": "Всегда разрешать автоматически получать баланс кошелька",
|
||||||
|
"mpchange87": "Пожалуйста, введите идентификатор группы"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "Recipient",
|
"rchange6": "Recipient",
|
||||||
"rchange7": "Action",
|
"rchange7": "Action",
|
||||||
"rchange8": "Type",
|
"rchange8": "Type",
|
||||||
"rchange9": "Levels 1 - 4 can only create a Self-Share (minting) keys. Only Level 5 or above can create a Reward Share!",
|
"rchange9": "Levels 0 - 4 can only create a Self-Share (minting) keys. Only Level 5 or above can create a Reward Share!",
|
||||||
"rchange10": "Recipient's Public Key",
|
"rchange10": "Recipient's Public Key",
|
||||||
"rchange11": "Reward Share percentage",
|
"rchange11": "Reward Share percentage",
|
||||||
"rchange12": "Executing Requested Command...",
|
"rchange12": "Executing Requested Command...",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "To submit the changes don't forget to click on 'Update profile'",
|
"bchange51": "To submit the changes don't forget to click on 'Update profile'",
|
||||||
"bchange52": "Do you give this application permission to get your wallet information?",
|
"bchange52": "Do you give this application permission to get your wallet information?",
|
||||||
"bchange53": "Always allow your friends list to be retrieved automatically by all apps",
|
"bchange53": "Always allow your friends list to be retrieved automatically by all apps",
|
||||||
"bchange54": "Do you give this application permission to access your friends list?"
|
"bchange54": "Do you give this application permission to access your friends list?",
|
||||||
|
"bchange55": "Do you give this application permission to send this command?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "Data Management",
|
"dchange1": "Data Management",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "Chat Message Font Size",
|
"cs6": "Chat Message Font Size",
|
||||||
"cs7": "Standard",
|
"cs7": "Standard",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "All requested ATs need to be of the same foreign Blockchain.",
|
||||||
|
"mpchange2": "Do you give this application permission to perform a buy order?",
|
||||||
|
"mpchange3": "Successfully created buy order",
|
||||||
|
"mpchange4": "Please wait untill buy order get fulfilled",
|
||||||
|
"mpchange5": "Failed to submit buy order.",
|
||||||
|
"mpchange6": "Do you give this application permission to perform a sell order?",
|
||||||
|
"mpchange7": "For:",
|
||||||
|
"mpchange8": "Successfully created sell order.",
|
||||||
|
"mpchange9": "Please wait untill the sell order get listed.",
|
||||||
|
"mpchange10": "Failed to submit sell order.",
|
||||||
|
"mpchange11": "Cannot find AT info.",
|
||||||
|
"mpchange12": "Do you give this application permission to perform cancel a sell order?",
|
||||||
|
"mpchange13": "Successfully cancelled sell order.",
|
||||||
|
"mpchange14": "Please wait untill the trade cancelling get fulfilled.",
|
||||||
|
"mpchange15": "Failed to cancel sell order.",
|
||||||
|
"mpchange16": "Error in retrieving list.",
|
||||||
|
"mpchange17": "Error in adding to list.",
|
||||||
|
"mpchange18": "Error in delete list.",
|
||||||
|
"mpchange19": "Error in retrieving friends list.",
|
||||||
|
"mpchange20": "Count is not a number.",
|
||||||
|
"mpchange21": "Missing count.",
|
||||||
|
"mpchange22": "No data or file was submitted.",
|
||||||
|
"mpchange23": "Encrypting data requires public keys.",
|
||||||
|
"mpchange24": "Only encrypted data can go into private services.",
|
||||||
|
"mpchange25": "Upload failed due to failed encryption.",
|
||||||
|
"mpchange26": "Upload failed.",
|
||||||
|
"mpchange27": "Invalid data.",
|
||||||
|
"mpchange28": "No resources to publish.",
|
||||||
|
"mpchange29": "Unknown error.",
|
||||||
|
"mpchange30": "Poll not found.",
|
||||||
|
"mpchange31": "Failed to vote on the poll.",
|
||||||
|
"mpchange32": "Failed to created poll.",
|
||||||
|
"mpchange33": "Please enter a qortal link - qortal://...",
|
||||||
|
"mpchange34": "Invalid qortal link.",
|
||||||
|
"mpchange35": "Error in pushing notification.",
|
||||||
|
"mpchange36": "Could not send message.",
|
||||||
|
"mpchange37": "Cannot send an encrypted message to this user since they do not have their publickey on chain.",
|
||||||
|
"mpchange38": "Request could not be fulfilled.",
|
||||||
|
"mpchange39": "Group not found.",
|
||||||
|
"mpchange40": "Do you give this application permission to perform a join group request?",
|
||||||
|
"mpchange41": "Group Name:",
|
||||||
|
"mpchange42": "Group ID:",
|
||||||
|
"mpchange43": "Successfully created join group request.",
|
||||||
|
"mpchange44": "Failed to join the group.",
|
||||||
|
"mpchange45": "A mime type could not be derived.",
|
||||||
|
"mpchange46": "A file extension could not be derived.",
|
||||||
|
"mpchange47": "User declined the download.",
|
||||||
|
"mpchange48": "Failed to initiate download.",
|
||||||
|
"mpchange49": "Failed to deploy AT.",
|
||||||
|
"mpchange50": "User does not have a profile.",
|
||||||
|
"mpchange51": "Cannot find requested data.",
|
||||||
|
"mpchange52": "Failed to get profile data.",
|
||||||
|
"mpchange53": "Failed to set property.",
|
||||||
|
"mpchange54": "Failed to open profile.",
|
||||||
|
"mpchange55": "Error in retrieving server info.",
|
||||||
|
"mpchange56": "Error in tx activity summary.",
|
||||||
|
"mpchange57": "Error in get foreign fee.",
|
||||||
|
"mpchange58": "Error in update foreign fee.",
|
||||||
|
"mpchange59": "Error in get server connection history.",
|
||||||
|
"mpchange60": "Error in set current server.",
|
||||||
|
"mpchange61": "Error in add server.",
|
||||||
|
"mpchange62": "Error in remove server.",
|
||||||
|
"mpchange63": "Error in retrieving summary.",
|
||||||
|
"mpchange64": "Failed to decode transaction.",
|
||||||
|
"mpchange65": "Do you give this application permission to sign and process a transaction?",
|
||||||
|
"mpchange66": "Do you give this application permission to sign a transaction?",
|
||||||
|
"mpchange67": "Read the transaction carefully before accepting.",
|
||||||
|
"mpchange68": "Tx type:",
|
||||||
|
"mpchange69": "TX Data:",
|
||||||
|
"mpchange70": "Process transaction was not requested.",
|
||||||
|
"mpchange71": "Signed bytes are: ",
|
||||||
|
"mpchange72": "Transaction signed and processed successfully.",
|
||||||
|
"mpchange73": "Transaction was not able to be processed.",
|
||||||
|
"mpchange74": "Failed to Fetch QORT Balance. Try again!",
|
||||||
|
"mpchange75": "Could not send coin.",
|
||||||
|
"mpchange76": "Failed to Fetch BTC Balance. Try again!",
|
||||||
|
"mpchange77": "Failed to Fetch LTC Balance. Try again!",
|
||||||
|
"mpchange78": "Failed to Fetch DOGE Balance. Try again!",
|
||||||
|
"mpchange79": "Failed to Fetch DGB Balance. Try again!",
|
||||||
|
"mpchange80": "Failed to Fetch RVN Balance. Try again!",
|
||||||
|
"mpchange81": "Failed to Fetch ARRR Balance. Try again!",
|
||||||
|
"mpchange82": "MISSING FIELDS",
|
||||||
|
"mpchange83": "DECLINED",
|
||||||
|
"mpchange84": "FAILURE",
|
||||||
|
"mpchange85": "SUCCESS",
|
||||||
|
"mpchange86": "Always allow get wallet balance automatically",
|
||||||
|
"mpchange87": "Please Enter The Group ID"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "接收者",
|
"rchange6": "接收者",
|
||||||
"rchange7": "操作",
|
"rchange7": "操作",
|
||||||
"rchange8": "类型",
|
"rchange8": "类型",
|
||||||
"rchange9": "等级1-4只能创建个人铸币密钥;等级5或以上可以创建赞助码!",
|
"rchange9": "等级0-4只能创建个人铸币密钥;等级5或以上可以创建赞助码!",
|
||||||
"rchange10": "接收者的公共密钥",
|
"rchange10": "接收者的公共密钥",
|
||||||
"rchange11": "奖励分享百分比",
|
"rchange11": "奖励分享百分比",
|
||||||
"rchange12": "正在添加中...",
|
"rchange12": "正在添加中...",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "要提交更改,请不要忘记单击“更新个人资料”",
|
"bchange51": "要提交更改,请不要忘记单击“更新个人资料”",
|
||||||
"bchange52": "您是否授予此应用程序获取您的钱包信息的权限?",
|
"bchange52": "您是否授予此应用程序获取您的钱包信息的权限?",
|
||||||
"bchange53": "始终允许所有应用自动检索您的好友列表",
|
"bchange53": "始终允许所有应用自动检索您的好友列表",
|
||||||
"bchange54": "您是否授予此应用程序访问您的好友列表的权限?"
|
"bchange54": "您是否授予此应用程序访问您的好友列表的权限?",
|
||||||
|
"bchange55": "您是否授予此应用程序发送此命令?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "资料管理",
|
"dchange1": "资料管理",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "聊天消息字体大小",
|
"cs6": "聊天消息字体大小",
|
||||||
"cs7": "标准",
|
"cs7": "标准",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "所有请求的 AT 都需要属于同一个外部区块链。",
|
||||||
|
"mpchange2": "您是否授予此应用程序执行买单的权限?",
|
||||||
|
"mpchange3": "成功创建买单",
|
||||||
|
"mpchange4": "请等待买单完成",
|
||||||
|
"mpchange5": "提交买单失败。",
|
||||||
|
"mpchange6": "您是否授予此应用程序执行卖单的权限?",
|
||||||
|
"mpchange7": "对于: ",
|
||||||
|
"mpchange8": "成功创建卖单。",
|
||||||
|
"mpchange9": "请等待卖单列出。",
|
||||||
|
"mpchange10": "提交卖单失败。",
|
||||||
|
"mpchange11": "找不到 AT 信息。",
|
||||||
|
"mpchange12": "您是否授予此应用程序执行取消卖单的权限?",
|
||||||
|
"mpchange13": "成功取消卖单。",
|
||||||
|
"mpchange14": "请等待交易取消完成。",
|
||||||
|
"mpchange15": "取消卖单失败。",
|
||||||
|
"mpchange16": "获取列表时出错。",
|
||||||
|
"mpchange17": "添加列表时出错。",
|
||||||
|
"mpchange18": "删除列表时出错。",
|
||||||
|
"mpchange19": "获取好友列表时出错。",
|
||||||
|
"mpchange20": "计数不是数字。",
|
||||||
|
"mpchange21": "缺少计数。",
|
||||||
|
"mpchange22": "未提交任何数据或文件。",
|
||||||
|
"mpchange23": "加密数据需要公钥。",
|
||||||
|
"mpchange24": "只有加密数据才能进入私人服务。",
|
||||||
|
"mpchange25": "由于加密失败,上传失败。",
|
||||||
|
"mpchange26": "上传失败。",
|
||||||
|
"mpchange27": "数据无效。",
|
||||||
|
"mpchange28": "没有要发布的资源。",
|
||||||
|
"mpchange29": "未知错误。",
|
||||||
|
"mpchange30": "未找到投票。",
|
||||||
|
"mpchange31": "投票失败。",
|
||||||
|
"mpchange32": "创建投票失败。",
|
||||||
|
"mpchange33": "请输入 qortal 链接 - qortal: //...",
|
||||||
|
"mpchange34": "无效的 qortal 链接。",
|
||||||
|
"mpchange35": "推送通知时出错。",
|
||||||
|
"mpchange36": "无法发送消息。",
|
||||||
|
"mpchange37": "无法向此用户发送加密消息,因为他们没有链上的公钥。",
|
||||||
|
"mpchange38": "无法满足请求。",
|
||||||
|
"mpchange39": "未找到群组。",
|
||||||
|
"mpchange40": "您是否授予此应用程序执行加入群组请求的权限?",
|
||||||
|
"mpchange41": "群组名称: ",
|
||||||
|
"mpchange42": "群组 ID: ",
|
||||||
|
"mpchange43": "成功创建加入群组请求。",
|
||||||
|
"mpchange44": "加入群组失败。",
|
||||||
|
"mpchange45": "无法导出 MIME 类型。",
|
||||||
|
"mpchange46": "无法导出文件扩展名。",
|
||||||
|
"mpchange47": "用户拒绝下载。",
|
||||||
|
"mpchange48": "无法启动下载。",
|
||||||
|
"mpchange49": "无法部署 AT。",
|
||||||
|
"mpchange50": "用户没有配置文件。",
|
||||||
|
"mpchange51": "找不到请求的数据。",
|
||||||
|
"mpchange52": "无法获取配置文件数据。",
|
||||||
|
"mpchange53": "无法设置属性。",
|
||||||
|
"mpchange54": "无法打开配置文件。",
|
||||||
|
"mpchange55": "检索服务器信息时出错。",
|
||||||
|
"mpchange56": "tx 活动摘要中出错。",
|
||||||
|
"mpchange57": "获取国外费用时出错。",
|
||||||
|
"mpchange58": "更新国外费用时出错。",
|
||||||
|
"mpchange59": "获取服务器连接历史记录时出错。",
|
||||||
|
"mpchange60": "设置当前服务器时出错。",
|
||||||
|
"mpchange61": "添加服务器时出错。",
|
||||||
|
"mpchange62": "删除服务器时出错。",
|
||||||
|
"mpchange63": "检索摘要时出错。",
|
||||||
|
"mpchange64": "无法解码交易。",
|
||||||
|
"mpchange65": "您是否授予此应用程序签署和处理交易的权限?",
|
||||||
|
"mpchange66": "您是否授予此应用程序签署交易的权限?",
|
||||||
|
"mpchange67": "接受前请仔细阅读交易。",
|
||||||
|
"mpchange68": "交易类型: ",
|
||||||
|
"mpchange69": "交易数据: ",
|
||||||
|
"mpchange70": "未请求处理交易。",
|
||||||
|
"mpchange71": "已签名的字节为: ",
|
||||||
|
"mpchange72": "交易已成功签名并处理。",
|
||||||
|
"mpchange73": "无法处理交易。",
|
||||||
|
"mpchange74": "无法获取 QORT 余额。重试!",
|
||||||
|
"mpchange75": "无法发送硬币。",
|
||||||
|
"mpchange76": "无法获取 BTC 余额。重试!",
|
||||||
|
"mpchange77": "无法获取 LTC 余额。重试!",
|
||||||
|
"mpchange78": "无法获取 DOGE 余额。重试!",
|
||||||
|
"mpchange79": "无法获取 DGB 余额。重试!",
|
||||||
|
"mpchange80": "无法获取 RVN 余额。重试!",
|
||||||
|
"mpchange81": "无法获取 ARRR 余额。重试!",
|
||||||
|
"mpchange82": "缺少字段",
|
||||||
|
"mpchange83": "拒绝",
|
||||||
|
"mpchange84": "失败",
|
||||||
|
"mpchange85": "成功",
|
||||||
|
"mpchange86": "始终允许自动获取钱包余额",
|
||||||
|
"mpchange87": "请输入群组ID"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@
|
|||||||
"rchange6": "接收者",
|
"rchange6": "接收者",
|
||||||
"rchange7": "操作",
|
"rchange7": "操作",
|
||||||
"rchange8": "類型",
|
"rchange8": "類型",
|
||||||
"rchange9": "等級1-4只能創建個人鑄幣密鑰;等級5或以上可以創建贊助碼!",
|
"rchange9": "等級0-4只能創建個人鑄幣密鑰;等級5或以上可以創建贊助碼!",
|
||||||
"rchange10": "接收者的公共密鑰",
|
"rchange10": "接收者的公共密鑰",
|
||||||
"rchange11": "獎勵分享百分比",
|
"rchange11": "獎勵分享百分比",
|
||||||
"rchange12": "正在添加中...",
|
"rchange12": "正在添加中...",
|
||||||
@ -742,7 +742,8 @@
|
|||||||
"bchange51": "要提交更改,請不要忘記點擊「更新個人資料」",
|
"bchange51": "要提交更改,請不要忘記點擊「更新個人資料」",
|
||||||
"bchange52": "您是否授予此應用程式取得您的錢包資訊的權限?",
|
"bchange52": "您是否授予此應用程式取得您的錢包資訊的權限?",
|
||||||
"bchange53": "始終允許所有應用程式自動檢索您的好友清單",
|
"bchange53": "始終允許所有應用程式自動檢索您的好友清單",
|
||||||
"bchange54": "您是否授予此應用程式存取您的好友清單的權限?"
|
"bchange54": "您是否授予此應用程式存取您的好友清單的權限?",
|
||||||
|
"bchange55": "您是否授予此應用程式發送此指令?"
|
||||||
},
|
},
|
||||||
"datapage": {
|
"datapage": {
|
||||||
"dchange1": "資料管理",
|
"dchange1": "資料管理",
|
||||||
@ -1329,5 +1330,94 @@
|
|||||||
"cs6": "聊天訊息字體大小",
|
"cs6": "聊天訊息字體大小",
|
||||||
"cs7": "標準",
|
"cs7": "標準",
|
||||||
"cs8": "px"
|
"cs8": "px"
|
||||||
|
},
|
||||||
|
"modals": {
|
||||||
|
"mpchange1": "所有請求的 AT 都必須屬於同一個外部區塊鏈。",
|
||||||
|
"mpchange2": "您是否授予此應用程式執行購買訂單的權限?",
|
||||||
|
"mpchange3": "成功建立買入訂單",
|
||||||
|
"mpchange4": "請等待購買訂單完成",
|
||||||
|
"mpchange5": "提交購買訂單失敗。",
|
||||||
|
"mpchange6": "您是否授予此應用程式執行賣單的權限?",
|
||||||
|
"mpchange7": "對於:",
|
||||||
|
"mpchange8": "成功建立賣單。",
|
||||||
|
"mpchange9": "請等待賣單上市。",
|
||||||
|
"mpchange10": "提交賣單失敗。",
|
||||||
|
"mpchange11": "找不到 AT 訊息。",
|
||||||
|
"mpchange12": "您是否授予此應用程式執行取消賣單的權限?",
|
||||||
|
"mpchange13": "成功取消賣單。",
|
||||||
|
"mpchange14": "請等待交易取消完成。",
|
||||||
|
"mpchange15": "取消賣單失敗。",
|
||||||
|
"mpchange16": "檢索清單時發生錯誤。",
|
||||||
|
"mpchange17": "新增至清單時發生錯誤。",
|
||||||
|
"mpchange18": "刪除清單時發生錯誤。",
|
||||||
|
"mpchange19": "檢索好友清單時發生錯誤。",
|
||||||
|
"mpchange20": "計數不是數字。",
|
||||||
|
"mpchange21": "缺少計數。",
|
||||||
|
"mpchange22": "未提交資料或檔案。",
|
||||||
|
"mpchange23": "加密資料需要公鑰。",
|
||||||
|
"mpchange24": "只有加密的資料才能進入私人服務。",
|
||||||
|
"mpchange25": "由於加密失敗,上傳失敗。",
|
||||||
|
"mpchange26": "上傳失敗。",
|
||||||
|
"mpchange27": "資料無效。",
|
||||||
|
"mpchange28": "沒有可發佈的資源。",
|
||||||
|
"mpchange29": "未知錯誤。",
|
||||||
|
"mpchange30": "未找到民調。",
|
||||||
|
"mpchange31": "投票失敗。",
|
||||||
|
"mpchange32": "建立投票失敗。",
|
||||||
|
"mpchange33": "請輸入 qortal 連結 - qortal://...",
|
||||||
|
"mpchange34": "qortal 連結無效。",
|
||||||
|
"mpchange35": "推播通知時發生錯誤。",
|
||||||
|
"mpchange36": "無法傳送訊息。",
|
||||||
|
"mpchange37": "無法向該用戶發送加密訊息,因為他們沒有鏈上的公鑰。",
|
||||||
|
"mpchange38": "無法滿足請求。",
|
||||||
|
"mpchange39": "找不到群組。",
|
||||||
|
"mpchange40": "您是否授予此應用程式執行加入群組請求的權限?",
|
||||||
|
"mpchange41": "群組名稱:",
|
||||||
|
"mpchange42": "群組 ID:",
|
||||||
|
"mpchange43": "成功建立加入群組請求。",
|
||||||
|
"mpchange44": "加入群組失敗。",
|
||||||
|
"mpchange45": "無法派生 mime 類型。",
|
||||||
|
"mpchange46": "無法匯出檔案副檔名。",
|
||||||
|
"mpchange47": "使用者拒絕下載。",
|
||||||
|
"mpchange48": "啟動下載失敗。",
|
||||||
|
"mpchange49": "部署 AT 失敗。",
|
||||||
|
"mpchange50": "使用者沒有個人資料。",
|
||||||
|
"mpchange51": "找不到要求的資料。",
|
||||||
|
"mpchange52": "取得個人資料資料失敗。",
|
||||||
|
"mpchange53": "設定屬性失敗。",
|
||||||
|
"mpchange54": "開啟個人資料失敗。",
|
||||||
|
"mpchange55": "檢索伺服器資訊時發生錯誤。",
|
||||||
|
"mpchange56": "交易活動摘要出錯。",
|
||||||
|
"mpchange57": "取得國外費用時發生錯誤。",
|
||||||
|
"mpchange58": "更新國外費用時發生錯誤。",
|
||||||
|
"mpchange59": "取得伺服器連線歷史記錄時發生錯誤。",
|
||||||
|
"mpchange60": "設定目前伺服器時發生錯誤。",
|
||||||
|
"mpchange61": "新增伺服器時發生錯誤。",
|
||||||
|
"mpchange62": "刪除伺服器時發生錯誤。",
|
||||||
|
"mpchange63": "檢索摘要時發生錯誤。",
|
||||||
|
"mpchange64": "無法解碼交易。",
|
||||||
|
"mpchange65": "您是否授予此應用程式簽署和處理交易的權限?",
|
||||||
|
"mpchange66": "您是否授予此應用程式簽署交易的權限?",
|
||||||
|
"mpchange67": "接受前請仔細閱讀交易。",
|
||||||
|
"mpchange68": "傳送類型:",
|
||||||
|
"mpchange69": "傳送資料:",
|
||||||
|
"mpchange70": "未要求處理事務。",
|
||||||
|
"mpchange71": "有符號位元組是:",
|
||||||
|
"mpchange72": "交易已成功簽署並處理。",
|
||||||
|
"mpchange73": "交易無法處理。",
|
||||||
|
"mpchange74": "取得 QORT 餘額失敗。請重試!",
|
||||||
|
"mpchange75": "無法寄硬幣。",
|
||||||
|
"mpchange76": "取得BTC餘額失敗,請重試!",
|
||||||
|
"mpchange77": "取得 LTC 餘額失敗。請重試!",
|
||||||
|
"mpchange78": "取得 DOGE 餘額失敗。請重試!",
|
||||||
|
"mpchange79": "取得 DGB 餘額失敗。請重試!",
|
||||||
|
"mpchange80": "取得 RVN 餘額失敗。請重試!",
|
||||||
|
"mpchange81": "取得 ARRR 餘額失敗。請重試!",
|
||||||
|
"mpchange82": "缺少欄位",
|
||||||
|
"mpchange83": "拒絕",
|
||||||
|
"mpchange84": "失敗",
|
||||||
|
"mpchange85": "成功",
|
||||||
|
"mpchange86": "隨時允許自動取得錢包餘額",
|
||||||
|
"mpchange87": "請輸入群組 ID"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,9 @@ import {
|
|||||||
setNewNotification,
|
setNewNotification,
|
||||||
setNewTab,
|
setNewTab,
|
||||||
setSideEffectAction,
|
setSideEffectAction,
|
||||||
setTabNotifications
|
setTabNotifications,
|
||||||
|
allowQAPPAutoBalance,
|
||||||
|
removeQAPPAutoBalance
|
||||||
} from '../../redux/app/app-actions'
|
} from '../../redux/app/app-actions'
|
||||||
import settings from '../../functional-components/settings-page'
|
import settings from '../../functional-components/settings-page'
|
||||||
import './welcome-page'
|
import './welcome-page'
|
||||||
@ -52,7 +54,9 @@ window.reduxAction = {
|
|||||||
allowQAPPAutoFriendsList: allowQAPPAutoFriendsList,
|
allowQAPPAutoFriendsList: allowQAPPAutoFriendsList,
|
||||||
removeQAPPAutoFriendsList: removeQAPPAutoFriendsList,
|
removeQAPPAutoFriendsList: removeQAPPAutoFriendsList,
|
||||||
allowShowSyncIndicator: allowShowSyncIndicator,
|
allowShowSyncIndicator: allowShowSyncIndicator,
|
||||||
removeShowSyncIndicator: removeShowSyncIndicator
|
removeShowSyncIndicator: removeShowSyncIndicator,
|
||||||
|
allowQAPPAutoBalance: allowQAPPAutoBalance,
|
||||||
|
removeQAPPAutoBalance: removeQAPPAutoBalance
|
||||||
}
|
}
|
||||||
|
|
||||||
const animationDuration = 0.7 // Seconds
|
const animationDuration = 0.7 // Seconds
|
||||||
|
@ -48,6 +48,7 @@ class LogoutView extends connect(store)(LitElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async confirm(e) {
|
async confirm(e) {
|
||||||
|
localStorage.removeItem("symKeysCurrent")
|
||||||
store.dispatch(doLogout())
|
store.dispatch(doLogout())
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,12 @@ class QortThemeToggle extends LitElement {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
return html`
|
return html`
|
||||||
<input type="checkbox" @change=${() => this.toggleTheme()}/>
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
role="switch"
|
||||||
|
aria-label="Dark theme"
|
||||||
|
@change=${() => this.toggleTheme()}
|
||||||
|
/>
|
||||||
<div class="slider"></div>
|
<div class="slider"></div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<span class="sun">${svgSun}</span>
|
<span class="sun">${svgSun}</span>
|
||||||
|
@ -74,7 +74,7 @@ class SearchModal extends LitElement {
|
|||||||
openUserInfo() {
|
openUserInfo() {
|
||||||
const checkvalue = this.shadowRoot.getElementById('searchContent').value
|
const checkvalue = this.shadowRoot.getElementById('searchContent').value
|
||||||
|
|
||||||
if (checkvalue.length < 3) {
|
if (checkvalue.length < 1) {
|
||||||
let snackbar1string = get("publishpage.pchange20")
|
let snackbar1string = get("publishpage.pchange20")
|
||||||
let snackbar2string = get("welcomepage.wcchange4")
|
let snackbar2string = get("welcomepage.wcchange4")
|
||||||
|
|
||||||
|
@ -8,7 +8,9 @@ import {
|
|||||||
removeQAPPAutoAuth,
|
removeQAPPAutoAuth,
|
||||||
removeQAPPAutoFriendsList,
|
removeQAPPAutoFriendsList,
|
||||||
removeQAPPAutoLists,
|
removeQAPPAutoLists,
|
||||||
setIsOpenDevDialog
|
setIsOpenDevDialog,
|
||||||
|
allowQAPPAutoBalance,
|
||||||
|
removeQAPPAutoBalance
|
||||||
} from '../../redux/app/app-actions'
|
} from '../../redux/app/app-actions'
|
||||||
import { securityViewStyles } from '../../styles/core-css'
|
import { securityViewStyles } from '../../styles/core-css'
|
||||||
import FileSaver from 'file-saver'
|
import FileSaver from 'file-saver'
|
||||||
@ -79,6 +81,12 @@ class SecurityView extends connect(store)(LitElement) {
|
|||||||
</label>
|
</label>
|
||||||
<mwc-checkbox style="margin-right: -15px;" id="authButton" @click=${(e) => this.checkForAuth(e)} ?checked=${store.getState().app.qAPPAutoAuth}></mwc-checkbox>
|
<mwc-checkbox style="margin-right: -15px;" id="authButton" @click=${(e) => this.checkForAuth(e)} ?checked=${store.getState().app.qAPPAutoAuth}></mwc-checkbox>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="checkbox-row">
|
||||||
|
<label for="balanceButton" id="balanceButtonLabel" style="color: var(--black);">
|
||||||
|
${get('modals.mpchange86')}
|
||||||
|
</label>
|
||||||
|
<mwc-checkbox style="margin-right: -15px;" id="balanceButton" @click=${(e) => this.checkForBalance(e)} ?checked=${store.getState().app.qAPPAutoBalance}></mwc-checkbox>
|
||||||
|
</div>
|
||||||
<div class="checkbox-row">
|
<div class="checkbox-row">
|
||||||
<label for="authButton" id="authButtonLabel" style="color: var(--black);">
|
<label for="authButton" id="authButtonLabel" style="color: var(--black);">
|
||||||
${get('browserpage.bchange39')}
|
${get('browserpage.bchange39')}
|
||||||
@ -108,6 +116,14 @@ class SecurityView extends connect(store)(LitElement) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checkForBalance(e) {
|
||||||
|
if (e.target.checked) {
|
||||||
|
store.dispatch(removeQAPPAutoBalance(false))
|
||||||
|
} else {
|
||||||
|
store.dispatch(allowQAPPAutoBalance(true))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
checkForLists(e) {
|
checkForLists(e) {
|
||||||
if (e.target.checked) {
|
if (e.target.checked) {
|
||||||
store.dispatch(removeQAPPAutoLists(false))
|
store.dispatch(removeQAPPAutoLists(false))
|
||||||
|
@ -86,5 +86,16 @@ export const defaultQappsTabs = [
|
|||||||
"pluginNumber": "plugin-GGHiHzW6pe",
|
"pluginNumber": "plugin-GGHiHzW6pe",
|
||||||
"menus": [],
|
"menus": [],
|
||||||
"parent": false
|
"parent": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "myapp",
|
||||||
|
"domain": "core",
|
||||||
|
"page": "qdn/browser/index.html?name=Q-Mintership&service=APP",
|
||||||
|
"title": "Q-Mintership",
|
||||||
|
"icon": "vaadin:external-browser",
|
||||||
|
"mwcicon": "apps",
|
||||||
|
"pluginNumber": "plugin-GGJJPqW6pe",
|
||||||
|
"menus": [],
|
||||||
|
"parent": false
|
||||||
}
|
}
|
||||||
]
|
]
|
@ -24,6 +24,7 @@ const signArbitraryTransaction = api.signArbitraryTransaction
|
|||||||
const signArbitraryWithFeeTransaction = api.signArbitraryWithFeeTransaction
|
const signArbitraryWithFeeTransaction = api.signArbitraryWithFeeTransaction
|
||||||
const tradeBotCreateRequest = api.tradeBotCreateRequest
|
const tradeBotCreateRequest = api.tradeBotCreateRequest
|
||||||
const tradeBotRespondRequest = api.tradeBotRespondRequest
|
const tradeBotRespondRequest = api.tradeBotRespondRequest
|
||||||
|
const tradeBotRespondMultipleRequest = api.tradeBotRespondMultipleRequest
|
||||||
const signTradeBotTxn = api.signTradeBotTxn
|
const signTradeBotTxn = api.signTradeBotTxn
|
||||||
const deleteTradeOffer = api.deleteTradeOffer
|
const deleteTradeOffer = api.deleteTradeOffer
|
||||||
const cancelAllOffers = api.cancelAllOffers
|
const cancelAllOffers = api.cancelAllOffers
|
||||||
@ -396,6 +397,21 @@ export const routes = {
|
|||||||
return response
|
return response
|
||||||
},
|
},
|
||||||
|
|
||||||
|
tradeBotRespondMultipleRequest: async (req) => {
|
||||||
|
let response
|
||||||
|
|
||||||
|
try {
|
||||||
|
response = await tradeBotRespondMultipleRequest(req.data)
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
console.error(e.message)
|
||||||
|
|
||||||
|
response = e.message
|
||||||
|
}
|
||||||
|
|
||||||
|
return response
|
||||||
|
},
|
||||||
|
|
||||||
deleteTradeOffer: async (req) => {
|
deleteTradeOffer: async (req) => {
|
||||||
let response
|
let response
|
||||||
|
|
||||||
|
@ -24,7 +24,9 @@ import {
|
|||||||
ALLOW_QAPP_FRIENDS_LIST,
|
ALLOW_QAPP_FRIENDS_LIST,
|
||||||
REMOVE_QAPP_FRIENDS_LIST,
|
REMOVE_QAPP_FRIENDS_LIST,
|
||||||
ALLOW_SHOW_SYNC_INDICATOR,
|
ALLOW_SHOW_SYNC_INDICATOR,
|
||||||
REMOVE_SHOW_SYNC_INDICATOR
|
REMOVE_SHOW_SYNC_INDICATOR,
|
||||||
|
ALLOW_QAPP_AUTO_BALANCE,
|
||||||
|
REMOVE_QAPP_AUTO_BALANCE
|
||||||
} from '../app-action-types'
|
} from '../app-action-types'
|
||||||
|
|
||||||
export const doUpdateBlockInfo = (blockObj) => {
|
export const doUpdateBlockInfo = (blockObj) => {
|
||||||
@ -120,6 +122,20 @@ export const removeQAPPAutoAuth = (payload) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const allowQAPPAutoBalance = (payload) => {
|
||||||
|
return {
|
||||||
|
type: ALLOW_QAPP_AUTO_BALANCE,
|
||||||
|
payload
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const removeQAPPAutoBalance = (payload) => {
|
||||||
|
return {
|
||||||
|
type: REMOVE_QAPP_AUTO_BALANCE,
|
||||||
|
payload
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const allowQAPPAutoLists = (payload) => {
|
export const allowQAPPAutoLists = (payload) => {
|
||||||
return {
|
return {
|
||||||
type: ALLOW_QAPP_AUTO_LISTS,
|
type: ALLOW_QAPP_AUTO_LISTS,
|
||||||
|
@ -39,3 +39,5 @@ export const ALLOW_QAPP_FRIENDS_LIST = 'ALLOW_QAPP_FRIENDS_LIST'
|
|||||||
export const REMOVE_QAPP_FRIENDS_LIST = 'REMOVE_QAPP_FRIENDS_LIST'
|
export const REMOVE_QAPP_FRIENDS_LIST = 'REMOVE_QAPP_FRIENDS_LIST'
|
||||||
export const ALLOW_SHOW_SYNC_INDICATOR = 'ALLOW_SHOW_SYNC_INDICATOR'
|
export const ALLOW_SHOW_SYNC_INDICATOR = 'ALLOW_SHOW_SYNC_INDICATOR'
|
||||||
export const REMOVE_SHOW_SYNC_INDICATOR = 'REMOVE_SHOW_SYNC_INDICATOR'
|
export const REMOVE_SHOW_SYNC_INDICATOR = 'REMOVE_SHOW_SYNC_INDICATOR'
|
||||||
|
export const ALLOW_QAPP_AUTO_BALANCE = 'ALLOW_QAPP_AUTO_BALANCE'
|
||||||
|
export const REMOVE_QAPP_AUTO_BALANCE = 'REMOVE_QAPP_AUTO_BALANCE'
|
||||||
|
@ -40,7 +40,9 @@ import {
|
|||||||
ALLOW_QAPP_FRIENDS_LIST,
|
ALLOW_QAPP_FRIENDS_LIST,
|
||||||
REMOVE_QAPP_FRIENDS_LIST,
|
REMOVE_QAPP_FRIENDS_LIST,
|
||||||
ALLOW_SHOW_SYNC_INDICATOR,
|
ALLOW_SHOW_SYNC_INDICATOR,
|
||||||
REMOVE_SHOW_SYNC_INDICATOR
|
REMOVE_SHOW_SYNC_INDICATOR,
|
||||||
|
ALLOW_QAPP_AUTO_BALANCE,
|
||||||
|
REMOVE_QAPP_AUTO_BALANCE
|
||||||
} from './app-action-types'
|
} from './app-action-types'
|
||||||
import { initWorkersReducer } from './reducers/init-workers'
|
import { initWorkersReducer } from './reducers/init-workers'
|
||||||
import { loginReducer } from './reducers/login-reducer'
|
import { loginReducer } from './reducers/login-reducer'
|
||||||
@ -89,6 +91,7 @@ const INITIAL_STATE = {
|
|||||||
qAPPAutoLists: loadStateFromLocalStorage('qAPPAutoLists') || false,
|
qAPPAutoLists: loadStateFromLocalStorage('qAPPAutoLists') || false,
|
||||||
qAPPFriendsList: loadStateFromLocalStorage('qAPPFriendsList') || false,
|
qAPPFriendsList: loadStateFromLocalStorage('qAPPFriendsList') || false,
|
||||||
showSyncIndicator: loadStateFromLocalStorage('showSyncIndicator') || false,
|
showSyncIndicator: loadStateFromLocalStorage('showSyncIndicator') || false,
|
||||||
|
qAPPAutoBalance: loadStateFromLocalStorage('qAPPAutoBalance') || false,
|
||||||
chatLastSeen: [],
|
chatLastSeen: [],
|
||||||
newTab: null,
|
newTab: null,
|
||||||
tabInfo: {},
|
tabInfo: {},
|
||||||
@ -251,6 +254,22 @@ export default (state = INITIAL_STATE, action) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ALLOW_QAPP_AUTO_BALANCE: {
|
||||||
|
saveStateToLocalStorage("qAPPAutoBalance", true)
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
qAPPAutoBalance: action.payload
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case REMOVE_QAPP_AUTO_BALANCE: {
|
||||||
|
saveStateToLocalStorage("qAPPAutoBalance", false)
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
qAPPAutoBalance: action.payload
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case ALLOW_QAPP_AUTO_LISTS: {
|
case ALLOW_QAPP_AUTO_LISTS: {
|
||||||
saveStateToLocalStorage("qAPPAutoLists", true)
|
saveStateToLocalStorage("qAPPAutoLists", true)
|
||||||
return {
|
return {
|
||||||
|
@ -6,6 +6,7 @@ const createTransaction = api.createTransaction
|
|||||||
const processTransaction = api.processTransaction
|
const processTransaction = api.processTransaction
|
||||||
const tradeBotCreateRequest = api.tradeBotCreateRequest
|
const tradeBotCreateRequest = api.tradeBotCreateRequest
|
||||||
const tradeBotRespondRequest = api.tradeBotRespondRequest
|
const tradeBotRespondRequest = api.tradeBotRespondRequest
|
||||||
|
const tradeBotRespondMultipleRequest = api.tradeBotRespondMultipleRequest
|
||||||
const signTradeBotTxn = api.signTradeBotTxn
|
const signTradeBotTxn = api.signTradeBotTxn
|
||||||
const deleteTradeOffer = api.deleteTradeOffer
|
const deleteTradeOffer = api.deleteTradeOffer
|
||||||
const cancelAllOffers = api.cancelAllOffers
|
const cancelAllOffers = api.cancelAllOffers
|
||||||
@ -163,6 +164,21 @@ export const routes = {
|
|||||||
return response
|
return response
|
||||||
},
|
},
|
||||||
|
|
||||||
|
tradeBotRespondMultipleRequest: async (req) => {
|
||||||
|
let response
|
||||||
|
|
||||||
|
try {
|
||||||
|
response = await tradeBotRespondMultipleRequest(req.data)
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
console.error(e.message)
|
||||||
|
|
||||||
|
response = e.message
|
||||||
|
}
|
||||||
|
|
||||||
|
return response
|
||||||
|
},
|
||||||
|
|
||||||
deleteTradeOffer: async (req) => {
|
deleteTradeOffer: async (req) => {
|
||||||
let response
|
let response
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { Sha256 } from 'asmcrypto.js'
|
import { Sha256 } from 'asmcrypto.js'
|
||||||
import Base58 from './api/deps/Base58'
|
import Base58 from './api/deps/Base58'
|
||||||
import Base64 from './api/deps/Base64'
|
import Base64 from './api/deps/Base64'
|
||||||
|
import Base64Message from './api/deps/Base64Message'
|
||||||
import { base58PublicKeyToAddress } from './api/wallet/base58PublicKeyToAddress'
|
import { base58PublicKeyToAddress } from './api/wallet/base58PublicKeyToAddress'
|
||||||
import { validateAddress } from './api/wallet/validateAddress'
|
import { validateAddress } from './api/wallet/validateAddress'
|
||||||
import { decryptChatMessage, decryptChatMessageBase64 } from './api/transactions/chat/decryptChatMessage'
|
import { decryptChatMessage, decryptChatMessageBase64 } from './api/transactions/chat/decryptChatMessage'
|
||||||
@ -9,6 +10,7 @@ import _ from 'lodash'
|
|||||||
window.Sha256 = Sha256
|
window.Sha256 = Sha256
|
||||||
window.Base58 = Base58
|
window.Base58 = Base58
|
||||||
window.Base64 = Base64
|
window.Base64 = Base64
|
||||||
|
window.Base64Message = Base64Message
|
||||||
window._ = _
|
window._ = _
|
||||||
window.base58PublicKeyToAddress = base58PublicKeyToAddress
|
window.base58PublicKeyToAddress = base58PublicKeyToAddress
|
||||||
window.validateAddress = validateAddress
|
window.validateAddress = validateAddress
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
export { request } from './fetch-request'
|
export { request } from './fetch-request'
|
||||||
export { transactionTypes as transactions } from './transactions/transactions'
|
export { transactionTypes as transactions } from './transactions/transactions'
|
||||||
export { processTransaction, processTransactionVersion2, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction, signArbitraryWithFeeTransaction } from './createTransaction'
|
export { processTransaction, processTransactionVersion2, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction, signArbitraryWithFeeTransaction } from './createTransaction'
|
||||||
export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest'
|
export { tradeBotCreateRequest, tradeBotRespondRequest, tradeBotRespondMultipleRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest'
|
||||||
export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers'
|
export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers'
|
||||||
|
92
crypto/api/deps/Base64Message.js
Normal file
92
crypto/api/deps/Base64Message.js
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import {
|
||||||
|
uint8ArrayToBase64,
|
||||||
|
base64ToUint8Array,
|
||||||
|
uint8ArrayToObject,
|
||||||
|
decryptSingle
|
||||||
|
} from '../../../plugins/plugins/core/components/GroupEncryption.js'
|
||||||
|
import {
|
||||||
|
extensionToPointer,
|
||||||
|
encodedToChar,
|
||||||
|
embedToString,
|
||||||
|
parseQortalLink
|
||||||
|
} from '../../../plugins/plugins/core/components/qdn-action-constants.js'
|
||||||
|
|
||||||
|
const Base64Message = {}
|
||||||
|
|
||||||
|
Base64Message.decode = function (string, keys, ref) {
|
||||||
|
let repliedToStr = ''
|
||||||
|
let hubSpecialId = ''
|
||||||
|
let hubMessageStr = ''
|
||||||
|
let newMessageObject = ''
|
||||||
|
let reactionStr = ''
|
||||||
|
let messageUseEmbed = {}
|
||||||
|
let editStr = false
|
||||||
|
let embedFileStr = '"images":[""]'
|
||||||
|
|
||||||
|
const binaryString = atob(string)
|
||||||
|
const binaryLength = binaryString.length
|
||||||
|
const bytes = new Uint8Array(binaryLength)
|
||||||
|
|
||||||
|
for (let i = 0; i < binaryLength; i++) {
|
||||||
|
bytes[i] = binaryString.charCodeAt(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
const decoder = new TextDecoder()
|
||||||
|
const decodedString = decoder.decode(bytes)
|
||||||
|
|
||||||
|
if (decodedString.includes("messageText") || decodedString === "4001") {
|
||||||
|
if (decodedString === "4001") {
|
||||||
|
const firstString = 'First group key created.'
|
||||||
|
const hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + firstString + '"}]}]},"images":[""],"repliedTo":"","version":3}'
|
||||||
|
return hubString
|
||||||
|
} else {
|
||||||
|
return decodedString
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const res = decryptSingle(string, keys, false)
|
||||||
|
|
||||||
|
if (res === 'noKey' || res === 'decryptionFailed') {
|
||||||
|
return '{"specialId":"","message":"<p>This message could not be decrypted</p>","repliedTo":"","isEdited":false,"isFromHub":true,"version": 3}'
|
||||||
|
}
|
||||||
|
|
||||||
|
const decryptToUnit8Array = base64ToUint8Array(res)
|
||||||
|
const responseData = uint8ArrayToObject(decryptToUnit8Array)
|
||||||
|
|
||||||
|
if (responseData.type === "edit") {
|
||||||
|
editStr = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseData.repliedTo) {
|
||||||
|
repliedToStr = responseData.repliedTo
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseData.specialId) {
|
||||||
|
hubSpecialId = responseData.specialId
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseData.type === "notification") {
|
||||||
|
hubMessageStr = responseData.data.message
|
||||||
|
} else if (ref !== "noref" && responseData.type === "reaction") {
|
||||||
|
reactionStr = '"isReaction":true,'
|
||||||
|
repliedToStr = ref
|
||||||
|
hubMessageStr = responseData.content
|
||||||
|
} else if (responseData.message.includes('qortal://use-embed/')) {
|
||||||
|
const useEmbed1 = extensionToPointer(responseData.message)
|
||||||
|
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
|
||||||
|
const useEmbed3 = encodedToChar(useEmbed2[1])
|
||||||
|
messageUseEmbed = parseQortalLink(useEmbed3)
|
||||||
|
embedFileStr = embedToString(messageUseEmbed)
|
||||||
|
hubMessageStr = responseData.message.split(useEmbed2[1]).join('')
|
||||||
|
} else {
|
||||||
|
hubMessageStr = responseData.message
|
||||||
|
}
|
||||||
|
|
||||||
|
const hubMessageFinal = hubMessageStr.split('"').join('"')
|
||||||
|
|
||||||
|
newMessageObject = '{"specialId":"' + hubSpecialId + '","message":"' + hubMessageFinal + '",' + embedFileStr + ',"repliedTo":"' + repliedToStr + '","isEdited":' + editStr + ',"isFromHub":true,' + reactionStr + '"version": 3}'
|
||||||
|
|
||||||
|
return newMessageObject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Base64Message
|
@ -4,6 +4,7 @@ import TradeBotRespondRequest from './transactions/trade-portal/tradebot/TradeBo
|
|||||||
import signTradeBotTransaction from './transactions/trade-portal/tradebot/signTradeBotTransaction'
|
import signTradeBotTransaction from './transactions/trade-portal/tradebot/signTradeBotTransaction'
|
||||||
import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer'
|
import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer'
|
||||||
import { request } from './fetch-request'
|
import { request } from './fetch-request'
|
||||||
|
import TradeBotRespondMultipleRequest from "./transactions/trade-portal/tradebot/TradeBotRespondMultipleRequest";
|
||||||
|
|
||||||
// TradeBotCreateRequest
|
// TradeBotCreateRequest
|
||||||
export const tradeBotCreateRequest = (requestObject) => {
|
export const tradeBotCreateRequest = (requestObject) => {
|
||||||
@ -35,6 +36,21 @@ export const tradeBotRespondRequest = (requestObject) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TradeBotRespondRequest
|
||||||
|
export const tradeBotRespondMultipleRequest = (requestObject) => {
|
||||||
|
const txn = new TradeBotRespondMultipleRequest().createTransaction(requestObject)
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
|
||||||
|
return request(`/crosschain/tradebot/respondmultiple?apiKey=${myNode.apiKey}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(txn)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Sign Trade Transactions
|
// Sign Trade Transactions
|
||||||
export const signTradeBotTxn = (unsignedTxn, keyPair) => {
|
export const signTradeBotTxn = (unsignedTxn, keyPair) => {
|
||||||
return signTradeBotTransaction(unsignedTxn, keyPair)
|
return signTradeBotTransaction(unsignedTxn, keyPair)
|
||||||
|
@ -50,5 +50,13 @@ export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipient
|
|||||||
return _decryptedMessage
|
return _decryptedMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let decrypted1 = new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||||
|
|
||||||
|
if (decrypted1.includes('messageText')) {
|
||||||
|
let decrypted2 = JSON.parse(decrypted1)
|
||||||
|
let decrypted3 = Object.assign(decrypted2, {isPrivate: true})
|
||||||
|
return JSON.stringify(decrypted3)
|
||||||
|
}
|
||||||
|
|
||||||
return new TextDecoder('utf-8').decode(_decryptedMessage)
|
return new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
/**
|
||||||
|
* CrossChain - TradeBot Respond Multiple Request (Buy Action)
|
||||||
|
*
|
||||||
|
* These are special types of transactions (JSON ENCODED)
|
||||||
|
*/
|
||||||
|
|
||||||
|
export default class TradeBotRespondMultipleRequest {
|
||||||
|
constructor() {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
createTransaction(txnReq) {
|
||||||
|
this.addresses(txnReq.addresses)
|
||||||
|
this.foreignKey(txnReq.foreignKey)
|
||||||
|
this.receivingAddress(txnReq.receivingAddress)
|
||||||
|
|
||||||
|
return this.txnRequest()
|
||||||
|
}
|
||||||
|
|
||||||
|
addresses(addresses) {
|
||||||
|
this._addresses = addresses
|
||||||
|
}
|
||||||
|
|
||||||
|
foreignKey(foreignKey) {
|
||||||
|
this._foreignKey = foreignKey
|
||||||
|
}
|
||||||
|
|
||||||
|
receivingAddress(receivingAddress) {
|
||||||
|
this._receivingAddress = receivingAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
txnRequest() {
|
||||||
|
return {
|
||||||
|
addresses: this._addresses,
|
||||||
|
foreignKey: this._foreignKey,
|
||||||
|
receivingAddress: this._receivingAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
electron.js
10
electron.js
@ -38,16 +38,16 @@ crashReporter.start({
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (myMemory > 16000000000) {
|
if (myMemory > 16000000000) {
|
||||||
app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=8192', '--max-semi-space-size=2')
|
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=8192')
|
||||||
log.info("Memory Size Is 16GB Using JS Memory Heap Size 8GB")
|
log.info("Memory Size Is 16GB Using JS Memory Heap Size 8GB")
|
||||||
} else if (myMemory > 12000000000) {
|
} else if (myMemory > 12000000000) {
|
||||||
app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=6144', '--max-semi-space-size=2')
|
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=6144')
|
||||||
log.info("Memory Size Is 12GB Using JS Memory Heap Size 6GB")
|
log.info("Memory Size Is 12GB Using JS Memory Heap Size 6GB")
|
||||||
} else if (myMemory > 7000000000) {
|
} else if (myMemory > 7000000000) {
|
||||||
app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=4096', '--max-semi-space-size=2')
|
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=4096')
|
||||||
log.info("Memory Size Is 8GB Using JS Memory Heap Size 4GB")
|
log.info("Memory Size Is 8GB Using JS Memory Heap Size 4GB")
|
||||||
} else {
|
} else {
|
||||||
app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=2048', '--max-semi-space-size=2')
|
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=2048')
|
||||||
log.info("Memory Size Is 4GB Using JS Memory Heap Size 2GB")
|
log.info("Memory Size Is 4GB Using JS Memory Heap Size 2GB")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,8 +69,6 @@ if (process.arch === 'arm') {
|
|||||||
} else {
|
} else {
|
||||||
app.commandLine.appendSwitch('enable-experimental-web-platform-features')
|
app.commandLine.appendSwitch('enable-experimental-web-platform-features')
|
||||||
app.commandLine.appendSwitch('disable-renderer-backgrounding')
|
app.commandLine.appendSwitch('disable-renderer-backgrounding')
|
||||||
app.commandLine.appendSwitch('disable-http-cache')
|
|
||||||
app.commandLine.appendSwitch('disable-software-rasterizer')
|
|
||||||
app.commandLine.appendSwitch('in-process-gpu')
|
app.commandLine.appendSwitch('in-process-gpu')
|
||||||
log.info('We are on 64bit. Hardware Acceleration is enabled !')
|
log.info('We are on 64bit. Hardware Acceleration is enabled !')
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
BIN
img/minter.png
Normal file
BIN
img/minter.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
3940
package-lock.json
generated
3940
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
47
package.json
47
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "qortal-ui",
|
"name": "qortal-ui",
|
||||||
"version": "4.5.5",
|
"version": "4.6.1",
|
||||||
"description": "Qortal Project - decentralize the world - Data storage, communications, web hosting, decentralized trading, complete infrastructure for the future blockchain-based Internet",
|
"description": "Qortal Project - decentralize the world - Data storage, communications, web hosting, decentralized trading, complete infrastructure for the future blockchain-based Internet",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"QORT",
|
"QORT",
|
||||||
@ -30,13 +30,14 @@
|
|||||||
"publish": "electron-builder -p always"
|
"publish": "electron-builder -p always"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hapi/hapi": "21.3.10",
|
"@hapi/hapi": "21.3.12",
|
||||||
"@hapi/inert": "7.1.0",
|
"@hapi/inert": "7.1.0",
|
||||||
"@lit-labs/motion": "1.0.6",
|
"@lit-labs/motion": "1.0.6",
|
||||||
"@popperjs/core": "2.11.8",
|
"@popperjs/core": "2.11.8",
|
||||||
"@tiptap/core": "2.0.4",
|
"@tiptap/core": "2.0.4",
|
||||||
"@tiptap/extension-highlight": "2.0.4",
|
"@tiptap/extension-highlight": "2.0.4",
|
||||||
"@tiptap/extension-image": "2.0.4",
|
"@tiptap/extension-image": "2.0.4",
|
||||||
|
"@tiptap/extension-mention": "2.0.0",
|
||||||
"@tiptap/extension-placeholder": "2.0.4",
|
"@tiptap/extension-placeholder": "2.0.4",
|
||||||
"@tiptap/extension-underline": "2.0.4",
|
"@tiptap/extension-underline": "2.0.4",
|
||||||
"@tiptap/html": "2.0.4",
|
"@tiptap/html": "2.0.4",
|
||||||
@ -47,34 +48,34 @@
|
|||||||
"buffer": "6.0.3",
|
"buffer": "6.0.3",
|
||||||
"compressorjs": "1.2.1",
|
"compressorjs": "1.2.1",
|
||||||
"crypto-js": "4.2.0",
|
"crypto-js": "4.2.0",
|
||||||
"driver.js": "1.3.1",
|
"driver.js": "1.3.5",
|
||||||
"electron-dl": "3.5.2",
|
"electron-dl": "3.5.2",
|
||||||
"electron-log": "5.1.5",
|
"electron-log": "5.3.0",
|
||||||
"electron-store": "8.2.0",
|
"electron-store": "8.2.0",
|
||||||
"electron-updater": "6.2.1",
|
"electron-updater": "6.3.9",
|
||||||
"emoji-picker-js": "https://github.com/Qortal/emoji-picker-js",
|
"emoji-picker-js": "https://github.com/Qortal/emoji-picker-js",
|
||||||
"extract-zip": "2.0.1",
|
"extract-zip": "2.0.1",
|
||||||
"jssha": "3.3.1",
|
"jssha": "3.3.1",
|
||||||
"localforage": "1.10.0",
|
"localforage": "1.10.0",
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.21",
|
||||||
"os-locale": "5.0.0",
|
"os-locale": "5.0.0",
|
||||||
"prosemirror-commands": "1.5.2",
|
"prosemirror-commands": "1.7.0",
|
||||||
"prosemirror-dropcursor": "1.8.1",
|
"prosemirror-dropcursor": "1.8.1",
|
||||||
"prosemirror-gapcursor": "1.3.2",
|
"prosemirror-gapcursor": "1.3.2",
|
||||||
"prosemirror-history": "1.4.0",
|
"prosemirror-history": "1.4.1",
|
||||||
"prosemirror-keymap": "1.2.2",
|
"prosemirror-keymap": "1.2.2",
|
||||||
"prosemirror-model": "1.21.3",
|
"prosemirror-model": "1.24.1",
|
||||||
"prosemirror-schema-list": "1.4.0",
|
"prosemirror-schema-list": "1.5.0",
|
||||||
"prosemirror-state": "1.4.3",
|
"prosemirror-state": "1.4.3",
|
||||||
"prosemirror-transform": "1.9.0",
|
"prosemirror-transform": "1.10.2",
|
||||||
"prosemirror-view": "1.33.8",
|
"prosemirror-view": "1.38.0",
|
||||||
"sass": "1.77.6",
|
"sass": "1.77.6",
|
||||||
"short-unique-id": "5.2.0",
|
"short-unique-id": "5.2.0",
|
||||||
"xhr2": "0.2.1"
|
"xhr2": "0.2.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.24.7",
|
"@babel/core": "7.26.9",
|
||||||
"@electron/packager": "18.3.3",
|
"@electron/packager": "18.3.6",
|
||||||
"@material/mwc-button": "0.27.0",
|
"@material/mwc-button": "0.27.0",
|
||||||
"@material/mwc-checkbox": "0.27.0",
|
"@material/mwc-checkbox": "0.27.0",
|
||||||
"@material/mwc-dialog": "0.27.0",
|
"@material/mwc-dialog": "0.27.0",
|
||||||
@ -111,11 +112,11 @@
|
|||||||
"@polymer/paper-toast": "3.0.1",
|
"@polymer/paper-toast": "3.0.1",
|
||||||
"@polymer/paper-tooltip": "3.0.1",
|
"@polymer/paper-tooltip": "3.0.1",
|
||||||
"@qortal/rollup-plugin-web-worker-loader": "1.6.5",
|
"@qortal/rollup-plugin-web-worker-loader": "1.6.5",
|
||||||
"@rollup/plugin-alias": "5.1.0",
|
"@rollup/plugin-alias": "5.1.1",
|
||||||
"@rollup/plugin-babel": "6.0.4",
|
"@rollup/plugin-babel": "6.0.4",
|
||||||
"@rollup/plugin-commonjs": "26.0.1",
|
"@rollup/plugin-commonjs": "28.0.2",
|
||||||
"@rollup/plugin-node-resolve": "15.2.3",
|
"@rollup/plugin-node-resolve": "16.0.0",
|
||||||
"@rollup/plugin-replace": "5.0.7",
|
"@rollup/plugin-replace": "6.0.2",
|
||||||
"@rollup/plugin-terser": "0.4.4",
|
"@rollup/plugin-terser": "0.4.4",
|
||||||
"@vaadin/avatar": "24.2.9",
|
"@vaadin/avatar": "24.2.9",
|
||||||
"@vaadin/button": "24.2.9",
|
"@vaadin/button": "24.2.9",
|
||||||
@ -125,10 +126,10 @@
|
|||||||
"@vaadin/tabs": "24.2.9",
|
"@vaadin/tabs": "24.2.9",
|
||||||
"@vaadin/tabsheet": "24.2.9",
|
"@vaadin/tabsheet": "24.2.9",
|
||||||
"@vaadin/tooltip": "24.2.9",
|
"@vaadin/tooltip": "24.2.9",
|
||||||
"@zip.js/zip.js": "2.7.45",
|
"@zip.js/zip.js": "2.7.57",
|
||||||
"axios": "1.7.2",
|
"axios": "1.7.9",
|
||||||
"electron": "31.1.0",
|
"electron": "32.3.1",
|
||||||
"electron-builder": "24.13.3",
|
"electron-builder": "25.1.8",
|
||||||
"epml": "0.3.3",
|
"epml": "0.3.3",
|
||||||
"file-saver": "2.0.5",
|
"file-saver": "2.0.5",
|
||||||
"highcharts": "11.1.0",
|
"highcharts": "11.1.0",
|
||||||
@ -139,13 +140,13 @@
|
|||||||
"pwa-helpers": "0.9.1",
|
"pwa-helpers": "0.9.1",
|
||||||
"redux": "5.0.1",
|
"redux": "5.0.1",
|
||||||
"redux-thunk": "3.1.0",
|
"redux-thunk": "3.1.0",
|
||||||
"rollup": "4.18.0",
|
"rollup": "4.34.8",
|
||||||
"rollup-plugin-node-globals": "1.4.0",
|
"rollup-plugin-node-globals": "1.4.0",
|
||||||
"rollup-plugin-progress": "1.1.2",
|
"rollup-plugin-progress": "1.1.2",
|
||||||
"rollup-plugin-scss": "3.0.0",
|
"rollup-plugin-scss": "3.0.0",
|
||||||
"shelljs": "0.8.5"
|
"shelljs": "0.8.5"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.20.3"
|
"node": ">=20.16.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import localForage from 'localforage'
|
|||||||
import '@material/mwc-icon'
|
import '@material/mwc-icon'
|
||||||
|
|
||||||
// Multi language support
|
// Multi language support
|
||||||
import { translate } from '../../../../core/translate'
|
import { get, translate } from '../../../../core/translate'
|
||||||
|
|
||||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
||||||
|
|
||||||
@ -66,6 +66,9 @@ class ChatHead extends LitElement {
|
|||||||
} else if (groupString === 'Group_1') {
|
} else if (groupString === 'Group_1') {
|
||||||
const avatarUrl = `/img/qdcgroup.png`
|
const avatarUrl = `/img/qdcgroup.png`
|
||||||
this.avatarImg = this.createImage(avatarUrl)
|
this.avatarImg = this.createImage(avatarUrl)
|
||||||
|
} else if (groupString === 'Group_694') {
|
||||||
|
const avatarUrl = `/img/minter.png`
|
||||||
|
this.avatarImg = this.createImage(avatarUrl)
|
||||||
} else if (this.chatInfo.name) {
|
} else if (this.chatInfo.name) {
|
||||||
const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.name}/qortal_avatar?async=true`
|
const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.name}/qortal_avatar?async=true`
|
||||||
this.avatarImg = this.createImage(avatarUrl)
|
this.avatarImg = this.createImage(avatarUrl)
|
||||||
@ -129,12 +132,24 @@ class ChatHead extends LitElement {
|
|||||||
>
|
>
|
||||||
${this.chatInfo.groupName ? this.chatInfo.groupName : this.chatInfo.name !== undefined ? this.chatInfo.name : this.chatInfo.address.substr(0, 15)}
|
${this.chatInfo.groupName ? this.chatInfo.groupName : this.chatInfo.name !== undefined ? this.chatInfo.name : this.chatInfo.address.substr(0, 15)}
|
||||||
</span>
|
</span>
|
||||||
<mwc-icon style="font-size:18px; color: var(--chat-group);">${this.chatInfo.groupId !== undefined ? 'lock_open' : 'lock'}</mwc-icon>
|
<mwc-icon
|
||||||
|
style="font-size:18px; color:${
|
||||||
|
this.chatInfo.groupId === undefined ? '#f0ad4e' :
|
||||||
|
this.chatInfo.isOpen === false ? '#C6011F' :
|
||||||
|
this.chatInfo.isOpen === true ? '#198754' : '#198754'}"
|
||||||
|
>
|
||||||
|
${
|
||||||
|
this.chatInfo.groupId === undefined ? 'private_connectivity' :
|
||||||
|
this.chatInfo.isOpen === false ? 'lock_outline' :
|
||||||
|
this.chatInfo.isOpen === true ? 'lock_open' :
|
||||||
|
'lock_open'
|
||||||
|
}
|
||||||
|
</mwc-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="about" style="margin-top:7px">
|
<div class="about" style="margin-top:7px">
|
||||||
<div class="name">
|
<div class="name">
|
||||||
<span style="float:left; padding-left: 8px; color: var(--chat-group);font-size:12px">${this.chatInfo.groupId !== undefined ? 'id: ' + this.chatInfo.groupId : ''}</span>
|
<span style="float:left; padding-left: 8px; color: var(--chat-group);font-size:12px">${this.chatInfo.groupId !== undefined ? 'id: ' + this.chatInfo.groupId : 'Private Chat'}</span>
|
||||||
<div style="color: var(--black); display: flex;font-size: 12px; align-items:center">
|
<div style="color: var(--black); display: flex;font-size: 12px; align-items:center">
|
||||||
<div style="width: 8px; height: 8px;border-radius: 50%;background: ${isUnread ? 'var(--error)' : 'none'} ; margin-right:5px;"></div>
|
<div style="width: 8px; height: 8px;border-radius: 50%;background: ${isUnread ? 'var(--error)' : 'none'} ; margin-right:5px;"></div>
|
||||||
<message-time style="display: ${(this.chatInfo.timestamp && this.chatInfo.timestamp > 100000) ? 'block' : 'none'}" timestamp=${this.chatInfo.timestamp}></message-time>
|
<message-time style="display: ${(this.chatInfo.timestamp && this.chatInfo.timestamp > 100000) ? 'block' : 'none'}" timestamp=${this.chatInfo.timestamp}></message-time>
|
||||||
|
@ -20,7 +20,7 @@ class ChatModals extends LitElement {
|
|||||||
hidePrivateMessageModal: { type: Function },
|
hidePrivateMessageModal: { type: Function },
|
||||||
hideBlockUserModal: { type: Function },
|
hideBlockUserModal: { type: Function },
|
||||||
toblockaddress: { type: String, attribute: true },
|
toblockaddress: { type: String, attribute: true },
|
||||||
chatBlockedAdresses: { type: Array }
|
chatBlockedAddresses: { type: Array }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ class ChatModals extends LitElement {
|
|||||||
this.isLoading = false
|
this.isLoading = false
|
||||||
this.hidePrivateMessageModal = () => { }
|
this.hidePrivateMessageModal = () => { }
|
||||||
this.hideBlockUserModal = () => { }
|
this.hideBlockUserModal = () => { }
|
||||||
this.chatBlockedAdresses = []
|
this.chatBlockedAddresses = []
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -313,11 +313,11 @@ class ChatModals extends LitElement {
|
|||||||
}, 500)
|
}, 500)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getChatBlockedAdresses() {
|
async getchatBlockedAddresses() {
|
||||||
const chatBlockedAdresses = await parentEpml.request('apiCall', {
|
const chatBlockedAddresses = await parentEpml.request('apiCall', {
|
||||||
url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}`
|
url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}`
|
||||||
})
|
})
|
||||||
this.chatBlockedAdresses = chatBlockedAdresses
|
this.chatBlockedAddresses = chatBlockedAddresses
|
||||||
}
|
}
|
||||||
|
|
||||||
async chatBlockAddress() {
|
async chatBlockAddress() {
|
||||||
@ -339,8 +339,8 @@ class ChatModals extends LitElement {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (ret === true) {
|
if (ret === true) {
|
||||||
this.chatBlockedAdresses = this.chatBlockedAdresses.filter(item => item != address)
|
this.chatBlockedAddresses = this.chatBlockedAddresses.filter(item => item != address)
|
||||||
this.chatBlockedAdresses.push(address)
|
this.chatBlockedAddresses.push(address)
|
||||||
this.getChatBlockedList()
|
this.getChatBlockedList()
|
||||||
this.hideBlockUserModal()
|
this.hideBlockUserModal()
|
||||||
let err1string = get("blockpage.bcchange2")
|
let err1string = get("blockpage.bcchange2")
|
||||||
|
@ -3,7 +3,7 @@ import { ifDefined } from 'lit/directives/if-defined.js'
|
|||||||
import { unsafeHTML } from 'lit/directives/unsafe-html.js'
|
import { unsafeHTML } from 'lit/directives/unsafe-html.js'
|
||||||
import { animate } from '@lit-labs/motion'
|
import { animate } from '@lit-labs/motion'
|
||||||
import { Epml } from '../../../epml'
|
import { Epml } from '../../../epml'
|
||||||
import { Editor, Extension, generateHTML } from '@tiptap/core'
|
import { Editor, Extension, generateHTML, generateJSON } from '@tiptap/core'
|
||||||
import { escape } from 'html-escaper'
|
import { escape } from 'html-escaper'
|
||||||
import { inputKeyCodes, replaceMessagesEdited, generateIdFromAddresses } from '../../utils/functions'
|
import { inputKeyCodes, replaceMessagesEdited, generateIdFromAddresses } from '../../utils/functions'
|
||||||
import { publishData, modalHelper, RequestQueue } from '../../utils/classes'
|
import { publishData, modalHelper, RequestQueue } from '../../utils/classes'
|
||||||
@ -15,6 +15,7 @@ import StarterKit from '@tiptap/starter-kit'
|
|||||||
import Underline from '@tiptap/extension-underline'
|
import Underline from '@tiptap/extension-underline'
|
||||||
import Placeholder from '@tiptap/extension-placeholder'
|
import Placeholder from '@tiptap/extension-placeholder'
|
||||||
import Highlight from '@tiptap/extension-highlight'
|
import Highlight from '@tiptap/extension-highlight'
|
||||||
|
import Mention from '@tiptap/extension-mention'
|
||||||
import WebWorker from 'web-worker:./computePowWorker.js'
|
import WebWorker from 'web-worker:./computePowWorker.js'
|
||||||
import WebWorkerFile from 'web-worker:./computePowWorkerFile.js'
|
import WebWorkerFile from 'web-worker:./computePowWorkerFile.js'
|
||||||
import WebWorkerSortMessages from 'web-worker:./webworkerSortMessages.js'
|
import WebWorkerSortMessages from 'web-worker:./webworkerSortMessages.js'
|
||||||
@ -134,7 +135,8 @@ class ChatPage extends LitElement {
|
|||||||
messageQueue: { type: Array },
|
messageQueue: { type: Array },
|
||||||
isInProcessQueue: { type: Boolean },
|
isInProcessQueue: { type: Boolean },
|
||||||
loggedInUserName: { type: String },
|
loggedInUserName: { type: String },
|
||||||
loggedInUserAddress: { type: String }
|
loggedInUserAddress: { type: String },
|
||||||
|
secretKeysWorker: { type: Object }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,6 +243,7 @@ class ChatPage extends LitElement {
|
|||||||
this.isInProcessQueue = false
|
this.isInProcessQueue = false
|
||||||
this.nodeUrl = this.getNodeUrl()
|
this.nodeUrl = this.getNodeUrl()
|
||||||
this.myNode = this.getMyNode()
|
this.myNode = this.getMyNode()
|
||||||
|
this.secretKeysWorker = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -342,7 +345,12 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
${+this.repliedToMessageObj.version > 1 ?
|
${+this.repliedToMessageObj.version > 1 ?
|
||||||
html`
|
html`
|
||||||
<span style="color: var(--black);">${unsafeHTML(generateHTML(this.repliedToMessageObj.message, [StarterKit, Underline, Highlight]))}</span>
|
<span style="color: var(--black);">
|
||||||
|
${this.repliedToMessageObj.decodedMessage.includes('specialId') ?
|
||||||
|
this.convertHubMessageToJson(this.repliedToMessageObj.message) :
|
||||||
|
unsafeHTML(generateHTML(this.repliedToMessageObj.message, [StarterKit, Underline, Highlight, Mention]))
|
||||||
|
}
|
||||||
|
</span>
|
||||||
`
|
`
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
@ -359,7 +367,12 @@ class ChatPage extends LitElement {
|
|||||||
<vaadin-icon class="reply-icon" icon="vaadin:pencil" slot="icon"></vaadin-icon>
|
<vaadin-icon class="reply-icon" icon="vaadin:pencil" slot="icon"></vaadin-icon>
|
||||||
<div class="repliedTo-message">
|
<div class="repliedTo-message">
|
||||||
<p class="senderName">${translate("chatpage.cchange25")}</p>
|
<p class="senderName">${translate("chatpage.cchange25")}</p>
|
||||||
<span style="color: var(--black);">${unsafeHTML(generateHTML(this.editedMessageObj.message, [StarterKit, Underline, Highlight]))}</span>
|
<span style="color: var(--black);">
|
||||||
|
${this.editedMessageObj.decodedMessage.includes('specialId') && !this.editedMessageObj.decodedMessage.includes('messageText') ?
|
||||||
|
this.convertHubMessageToJson(this.editedMessageObj.message) :
|
||||||
|
unsafeHTML(generateHTML(this.editedMessageObj.message, [StarterKit, Underline, Highlight, Mention]))
|
||||||
|
}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<vaadin-icon class="close-icon" icon="vaadin:close-big" slot="icon" @click=${() => this.closeEditMessageContainer()}></vaadin-icon>
|
<vaadin-icon class="close-icon" icon="vaadin:close-big" slot="icon" @click=${() => this.closeEditMessageContainer()}></vaadin-icon>
|
||||||
</div>
|
</div>
|
||||||
@ -815,16 +828,21 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('storage', () => {
|
window.addEventListener('storage', () => {
|
||||||
|
this.secretKeysWorker = {}
|
||||||
|
|
||||||
const checkLanguage = localStorage.getItem('qortalLanguage')
|
const checkLanguage = localStorage.getItem('qortalLanguage')
|
||||||
const checkTheme = localStorage.getItem('qortalTheme')
|
const checkTheme = localStorage.getItem('qortalTheme')
|
||||||
|
const arraySecretKeysWorkerNew = JSON.parse(localStorage.getItem("symKeysCurrent") || "[]")
|
||||||
|
|
||||||
this.userLanguage = checkLanguage
|
this.userLanguage = checkLanguage
|
||||||
|
this.secretKeysWorker = arraySecretKeysWorkerNew[0]
|
||||||
|
|
||||||
if (checkTheme === 'dark') {
|
if (checkTheme === 'dark') {
|
||||||
this.theme = 'dark'
|
this.theme = 'dark'
|
||||||
} else {
|
} else {
|
||||||
this.theme = 'light'
|
this.theme = 'light'
|
||||||
}
|
}
|
||||||
|
|
||||||
document.querySelector('html').setAttribute('theme', this.theme)
|
document.querySelector('html').setAttribute('theme', this.theme)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -837,7 +855,12 @@ class ChatPage extends LitElement {
|
|||||||
if (isEnabledChatEnter) {
|
if (isEnabledChatEnter) {
|
||||||
this.isEnabledChatEnter = isEnabledChatEnter === 'false' ? false : true
|
this.isEnabledChatEnter = isEnabledChatEnter === 'false' ? false : true
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
convertHubMessageToJson(message) {
|
||||||
|
let newJson = generateJSON(`${message}`, [StarterKit, Underline, Highlight, Mention])
|
||||||
|
|
||||||
|
return unsafeHTML(generateHTML(newJson, [StarterKit, Underline, Highlight, Mention]))
|
||||||
}
|
}
|
||||||
|
|
||||||
getNodeUrl() {
|
getNodeUrl() {
|
||||||
@ -906,7 +929,6 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
addToQueue(outSideMsg, messageQueue) {
|
addToQueue(outSideMsg, messageQueue) {
|
||||||
// Push the new message object to the queue
|
// Push the new message object to the queue
|
||||||
|
|
||||||
this.messageQueue = [...messageQueue, { ...outSideMsg, timestamp: Date.now() }]
|
this.messageQueue = [...messageQueue, { ...outSideMsg, timestamp: Date.now() }]
|
||||||
|
|
||||||
// Start processing the queue only if the message we just added is the only one in the queue
|
// Start processing the queue only if the message we just added is the only one in the queue
|
||||||
@ -921,7 +943,9 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
async processQueue() {
|
async processQueue() {
|
||||||
if (this.messageQueue.length === 0) return
|
if (this.messageQueue.length === 0) return
|
||||||
|
|
||||||
const currentMessage = this.messageQueue[0]
|
const currentMessage = this.messageQueue[0]
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await this.sendMessage(currentMessage)
|
const res = await this.sendMessage(currentMessage)
|
||||||
|
|
||||||
@ -932,8 +956,7 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.messageQueue.length > 0) {
|
if (this.messageQueue.length > 0) {
|
||||||
setTimeout(() => this.processQueue(), 2000) // Wait for 10 seconds before retrying
|
setTimeout(() => this.processQueue(), 2000) // Wait for 2 seconds before retrying
|
||||||
// setTimeout(() => this.processQueue(), 0) // Process the next message immediately
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to send message:", error)
|
console.error("Failed to send message:", error)
|
||||||
@ -944,6 +967,7 @@ class ChatPage extends LitElement {
|
|||||||
async getLastestMessages() {
|
async getLastestMessages() {
|
||||||
try {
|
try {
|
||||||
let getInitialMessages = []
|
let getInitialMessages = []
|
||||||
|
|
||||||
if (this.isReceipient) {
|
if (this.isReceipient) {
|
||||||
getInitialMessages = await parentEpml.request('apiCall', {
|
getInitialMessages = await parentEpml.request('apiCall', {
|
||||||
type: 'api',
|
type: 'api',
|
||||||
@ -955,6 +979,7 @@ class ChatPage extends LitElement {
|
|||||||
url: `/chat/messages?txGroupId=${Number(this._chatId)}&limit=${chatLimit}&reverse=true&haschatreference=false&encoding=BASE64`
|
url: `/chat/messages?txGroupId=${Number(this._chatId)}&limit=${chatLimit}&reverse=true&haschatreference=false&encoding=BASE64`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
this.processMessages(getInitialMessages, true, false)
|
this.processMessages(getInitialMessages, true, false)
|
||||||
} catch (error) { /* empty */ }
|
} catch (error) { /* empty */ }
|
||||||
}
|
}
|
||||||
@ -991,6 +1016,7 @@ class ChatPage extends LitElement {
|
|||||||
return memberItem
|
return memberItem
|
||||||
})
|
})
|
||||||
const membersWithName = await Promise.all(getMembersWithName)
|
const membersWithName = await Promise.all(getMembersWithName)
|
||||||
|
|
||||||
this.groupMembers = [...this.groupMembers, ...membersWithName]
|
this.groupMembers = [...this.groupMembers, ...membersWithName]
|
||||||
this.pageNumber = this.pageNumber + 1
|
this.pageNumber = this.pageNumber + 1
|
||||||
} catch (error) { /* empty */ }
|
} catch (error) { /* empty */ }
|
||||||
@ -998,6 +1024,7 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
async connectedCallback() {
|
async connectedCallback() {
|
||||||
super.connectedCallback()
|
super.connectedCallback()
|
||||||
|
|
||||||
await this.initUpdate()
|
await this.initUpdate()
|
||||||
|
|
||||||
if (!this.webWorker) {
|
if (!this.webWorker) {
|
||||||
@ -1023,9 +1050,7 @@ class ChatPage extends LitElement {
|
|||||||
const elementChatGifId = this.shadowRoot.getElementById('chatGifId').shadowRoot.getElementById('newGifChat')
|
const elementChatGifId = this.shadowRoot.getElementById('chatGifId').shadowRoot.getElementById('newGifChat')
|
||||||
const elementChatAttachmentId = this.shadowRoot.getElementById('chatAttachmentId').shadowRoot.getElementById('newAttachmentChat')
|
const elementChatAttachmentId = this.shadowRoot.getElementById('chatAttachmentId').shadowRoot.getElementById('newAttachmentChat')
|
||||||
const elementChatFileId = this.shadowRoot.getElementById('chatFileId').shadowRoot.getElementById('newFileChat')
|
const elementChatFileId = this.shadowRoot.getElementById('chatFileId').shadowRoot.getElementById('newFileChat')
|
||||||
|
|
||||||
const placeholderString = get('chatpage.cchange114')
|
const placeholderString = get('chatpage.cchange114')
|
||||||
|
|
||||||
const clipboardTextParser = (text, context, plain) => {
|
const clipboardTextParser = (text, context, plain) => {
|
||||||
const splitLines = text.replace().split(/(?:\r\n?|\n)/)
|
const splitLines = text.replace().split(/(?:\r\n?|\n)/)
|
||||||
const nodesLines = []
|
const nodesLines = []
|
||||||
@ -1061,6 +1086,7 @@ class ChatPage extends LitElement {
|
|||||||
StarterKit,
|
StarterKit,
|
||||||
Underline,
|
Underline,
|
||||||
Highlight,
|
Highlight,
|
||||||
|
Mention,
|
||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: `${placeholderString}`
|
placeholder: `${placeholderString}`
|
||||||
}),
|
}),
|
||||||
@ -1099,6 +1125,7 @@ class ChatPage extends LitElement {
|
|||||||
StarterKit,
|
StarterKit,
|
||||||
Underline,
|
Underline,
|
||||||
Highlight,
|
Highlight,
|
||||||
|
Mention,
|
||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: `${placeholderString}`
|
placeholder: `${placeholderString}`
|
||||||
}),
|
}),
|
||||||
@ -1134,6 +1161,7 @@ class ChatPage extends LitElement {
|
|||||||
StarterKit,
|
StarterKit,
|
||||||
Underline,
|
Underline,
|
||||||
Highlight,
|
Highlight,
|
||||||
|
Mention,
|
||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: `${placeholderString}`
|
placeholder: `${placeholderString}`
|
||||||
}),
|
}),
|
||||||
@ -1169,6 +1197,7 @@ class ChatPage extends LitElement {
|
|||||||
StarterKit,
|
StarterKit,
|
||||||
Underline,
|
Underline,
|
||||||
Highlight,
|
Highlight,
|
||||||
|
Mention,
|
||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: `${placeholderString}`
|
placeholder: `${placeholderString}`
|
||||||
}),
|
}),
|
||||||
@ -1204,6 +1233,7 @@ class ChatPage extends LitElement {
|
|||||||
StarterKit,
|
StarterKit,
|
||||||
Underline,
|
Underline,
|
||||||
Highlight,
|
Highlight,
|
||||||
|
Mention,
|
||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: `${placeholderString}`
|
placeholder: `${placeholderString}`
|
||||||
}),
|
}),
|
||||||
@ -1379,23 +1409,30 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
if (findMessage) {
|
if (findMessage) {
|
||||||
findMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' })
|
findMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' })
|
||||||
|
|
||||||
const findElement = findMessage.shadowRoot.querySelector('.message-parent')
|
const findElement = findMessage.shadowRoot.querySelector('.message-parent')
|
||||||
|
|
||||||
if (findElement) {
|
if (findElement) {
|
||||||
findElement.classList.add('blink-bg')
|
findElement.classList.add('blink-bg')
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
findElement.classList.remove('blink-bg')
|
findElement.classList.remove('blink-bg')
|
||||||
}, 2000)
|
}, 2000)
|
||||||
}
|
}
|
||||||
|
|
||||||
const chatScrollerElement = this.shadowRoot.querySelector('chat-scroller')
|
const chatScrollerElement = this.shadowRoot.querySelector('chat-scroller')
|
||||||
|
|
||||||
if (chatScrollerElement && chatScrollerElement.disableFetching) {
|
if (chatScrollerElement && chatScrollerElement.disableFetching) {
|
||||||
chatScrollerElement.disableFetching = false
|
chatScrollerElement.disableFetching = false
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const findOriginalMessage = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById(clickedOnMessage.signature)
|
const findOriginalMessage = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById(clickedOnMessage.signature)
|
||||||
|
|
||||||
if (findOriginalMessage) {
|
if (findOriginalMessage) {
|
||||||
const messageClientRect = findOriginalMessage.getBoundingClientRect()
|
const messageClientRect = findOriginalMessage.getBoundingClientRect()
|
||||||
|
|
||||||
this.isLoadingGoToRepliedMessage = {
|
this.isLoadingGoToRepliedMessage = {
|
||||||
...this.isLoadingGoToRepliedMessage,
|
...this.isLoadingGoToRepliedMessage,
|
||||||
loading: true,
|
loading: true,
|
||||||
@ -1414,15 +1451,19 @@ class ChatPage extends LitElement {
|
|||||||
)
|
)
|
||||||
|| marginElements.find((item) => item.messageObj.signature === message.originalSignature)
|
|| marginElements.find((item) => item.messageObj.signature === message.originalSignature)
|
||||||
|| marginElements.find((item) => item.messageObj.originalSignature === message.originalSignature)
|
|| marginElements.find((item) => item.messageObj.originalSignature === message.originalSignature)
|
||||||
|
|
||||||
if (findMessage2) {
|
if (findMessage2) {
|
||||||
findMessage2.scrollIntoView({ block: 'center' })
|
findMessage2.scrollIntoView({ block: 'center' })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (findMessage2) {
|
if (findMessage2) {
|
||||||
this.isLoadingGoToRepliedMessage = {
|
this.isLoadingGoToRepliedMessage = {
|
||||||
...this.isLoadingGoToRepliedMessage,
|
...this.isLoadingGoToRepliedMessage,
|
||||||
loading: false
|
loading: false
|
||||||
}
|
}
|
||||||
|
|
||||||
const findElement = findMessage2.shadowRoot.querySelector('.message-parent')
|
const findElement = findMessage2.shadowRoot.querySelector('.message-parent')
|
||||||
|
|
||||||
if (findElement) {
|
if (findElement) {
|
||||||
findElement.classList.add('blink-bg')
|
findElement.classList.add('blink-bg')
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@ -1438,11 +1479,14 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this.isLoadingGoToRepliedMessage = {
|
this.isLoadingGoToRepliedMessage = {
|
||||||
...this.isLoadingGoToRepliedMessage,
|
...this.isLoadingGoToRepliedMessage,
|
||||||
loading: false
|
loading: false
|
||||||
}
|
}
|
||||||
|
|
||||||
let errorMsg = get("chatpage.cchange66")
|
let errorMsg = get("chatpage.cchange66")
|
||||||
|
|
||||||
parentEpml.request('showSnackBar', `${errorMsg}`)
|
parentEpml.request('showSnackBar', `${errorMsg}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1581,6 +1625,10 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async initUpdate() {
|
async initUpdate() {
|
||||||
|
this.secretKeysWorker = {}
|
||||||
|
let arraySecretKeysWorkerInit = JSON.parse(localStorage.getItem("symKeysCurrent") || "[]")
|
||||||
|
this.secretKeysWorker = arraySecretKeysWorkerInit[0]
|
||||||
|
|
||||||
if (this.webSocket) {
|
if (this.webSocket) {
|
||||||
this.webSocket.close(1000, 'switch chat')
|
this.webSocket.close(1000, 'switch chat')
|
||||||
this.webSocket = ''
|
this.webSocket = ''
|
||||||
@ -1633,7 +1681,7 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
const getMembersAdmins = await parentEpml.request("apiCall", {
|
const getMembersAdmins = await parentEpml.request("apiCall", {
|
||||||
type: "api",
|
type: "api",
|
||||||
url: `/groups/members/${groupId}?onlyAdmins=true&limit=20`
|
url: `/groups/members/${groupId}?onlyAdmins=true&limit=0`
|
||||||
})
|
})
|
||||||
|
|
||||||
const getGroupInfo = await parentEpml.request("apiCall", {
|
const getGroupInfo = await parentEpml.request("apiCall", {
|
||||||
@ -1784,7 +1832,7 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let userName = ''
|
let userName = 'this.chatId'
|
||||||
|
|
||||||
if (this.isReceipient) {
|
if (this.isReceipient) {
|
||||||
userName = await getName(this._chatId)
|
userName = await getName(this._chatId)
|
||||||
@ -1873,7 +1921,9 @@ class ChatPage extends LitElement {
|
|||||||
type: "api",
|
type: "api",
|
||||||
url: `/chat/message/${messageToGoTo.originalSignature || messageToGoTo.signature}?encoding=BASE64`,
|
url: `/chat/message/${messageToGoTo.originalSignature || messageToGoTo.signature}?encoding=BASE64`,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!findMsg) return null
|
if (!findMsg) return null
|
||||||
|
|
||||||
if (this.isReceipient) {
|
if (this.isReceipient) {
|
||||||
const getInitialMessagesBefore = await parentEpml.request('apiCall', {
|
const getInitialMessagesBefore = await parentEpml.request('apiCall', {
|
||||||
type: 'api',
|
type: 'api',
|
||||||
@ -1886,7 +1936,7 @@ class ChatPage extends LitElement {
|
|||||||
const getInitialMessages = [...getInitialMessagesBefore, ...getInitialMessagesAfter]
|
const getInitialMessages = [...getInitialMessagesBefore, ...getInitialMessagesAfter]
|
||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey })
|
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, secretKeys: this.secretKeysWorker })
|
||||||
|
|
||||||
this.webWorkerDecodeMessages.onmessage = e => {
|
this.webWorkerDecodeMessages.onmessage = e => {
|
||||||
decodeMsgs = e.data
|
decodeMsgs = e.data
|
||||||
@ -1904,6 +1954,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: this.isReceipient,
|
isReceipient: this.isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@ -1949,7 +2000,7 @@ class ChatPage extends LitElement {
|
|||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
|
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey })
|
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, secretKeys: this.secretKeysWorker })
|
||||||
|
|
||||||
this.webWorkerDecodeMessages.onmessage = e => {
|
this.webWorkerDecodeMessages.onmessage = e => {
|
||||||
decodeMsgs = e.data
|
decodeMsgs = e.data
|
||||||
@ -1967,6 +2018,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: this.isReceipient,
|
isReceipient: this.isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@ -1988,6 +2040,7 @@ class ChatPage extends LitElement {
|
|||||||
type: 'api',
|
type: 'api',
|
||||||
url: `/chat/messages/count?after=${lastMsg.timestamp}&txGroupId=${Number(this._chatId)}&limit=20&reverse=false`
|
url: `/chat/messages/count?after=${lastMsg.timestamp}&txGroupId=${Number(this._chatId)}&limit=20&reverse=false`
|
||||||
})
|
})
|
||||||
|
|
||||||
this.messagesRendered = {
|
this.messagesRendered = {
|
||||||
messages: list,
|
messages: list,
|
||||||
type: 'inBetween',
|
type: 'inBetween',
|
||||||
@ -2008,6 +2061,7 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.isReceipient) {
|
if (this.isReceipient) {
|
||||||
const getInitialMessages = await parentEpml.request('apiCall', {
|
const getInitialMessages = await parentEpml.request('apiCall', {
|
||||||
type: 'api',
|
type: 'api',
|
||||||
@ -2015,7 +2069,7 @@ class ChatPage extends LitElement {
|
|||||||
})
|
})
|
||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey })
|
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, secretKeys: this.secretKeysWorker })
|
||||||
|
|
||||||
this.webWorkerDecodeMessages.onmessage = e => {
|
this.webWorkerDecodeMessages.onmessage = e => {
|
||||||
decodeMsgs = e.data
|
decodeMsgs = e.data
|
||||||
@ -2033,6 +2087,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: this.isReceipient,
|
isReceipient: this.isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@ -2062,7 +2117,7 @@ class ChatPage extends LitElement {
|
|||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
|
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey })
|
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, secretKeys: this.secretKeysWorker })
|
||||||
|
|
||||||
this.webWorkerDecodeMessages.onmessage = e => {
|
this.webWorkerDecodeMessages.onmessage = e => {
|
||||||
decodeMsgs = e.data
|
decodeMsgs = e.data
|
||||||
@ -2080,6 +2135,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: this.isReceipient,
|
isReceipient: this.isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@ -2109,6 +2165,7 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const timestamp = scrollElement.messageObj.timestamp
|
const timestamp = scrollElement.messageObj.timestamp
|
||||||
|
|
||||||
if (this.isReceipient) {
|
if (this.isReceipient) {
|
||||||
@ -2119,7 +2176,7 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey })
|
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, secretKeys: this.secretKeysWorker })
|
||||||
|
|
||||||
this.webWorkerDecodeMessages.onmessage = e => {
|
this.webWorkerDecodeMessages.onmessage = e => {
|
||||||
decodeMsgs = e.data
|
decodeMsgs = e.data
|
||||||
@ -2137,6 +2194,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: this.isReceipient,
|
isReceipient: this.isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@ -2172,7 +2230,7 @@ class ChatPage extends LitElement {
|
|||||||
})
|
})
|
||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey })
|
this.webWorkerDecodeMessages.postMessage({ messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, secretKeys: this.secretKeysWorker })
|
||||||
|
|
||||||
this.webWorkerDecodeMessages.onmessage = e => {
|
this.webWorkerDecodeMessages.onmessage = e => {
|
||||||
decodeMsgs = e.data
|
decodeMsgs = e.data
|
||||||
@ -2190,6 +2248,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: this.isReceipient,
|
isReceipient: this.isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@ -2219,9 +2278,10 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async addToUpdateMessageHashmap(array) {
|
async addToUpdateMessageHashmap(array) {
|
||||||
|
const withoutHubReactions = array.filter(({decodedMessage}) => !decodedMessage.includes('isReaction'))
|
||||||
const newObj = {}
|
const newObj = {}
|
||||||
|
|
||||||
array.forEach((item) => {
|
withoutHubReactions.forEach((item) => {
|
||||||
const signature = item.originalSignature || item.signature
|
const signature = item.originalSignature || item.signature
|
||||||
newObj[signature] = item
|
newObj[signature] = item
|
||||||
})
|
})
|
||||||
@ -2262,6 +2322,7 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
async processMessages(messages, isInitial, isUnread, count) {
|
async processMessages(messages, isInitial, isUnread, count) {
|
||||||
const isReceipient = this.chatId.includes('direct')
|
const isReceipient = this.chatId.includes('direct')
|
||||||
|
|
||||||
let decodedMessages = []
|
let decodedMessages = []
|
||||||
|
|
||||||
if (!this.webWorkerDecodeMessages) {
|
if (!this.webWorkerDecodeMessages) {
|
||||||
@ -2273,7 +2334,7 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({ messages: messages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey })
|
this.webWorkerDecodeMessages.postMessage({ messages: messages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, secretKeys: this.secretKeysWorker })
|
||||||
|
|
||||||
this.webWorkerDecodeMessages.onmessage = e => {
|
this.webWorkerDecodeMessages.onmessage = e => {
|
||||||
decodedMessages = e.data
|
decodedMessages = e.data
|
||||||
@ -2295,6 +2356,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: isReceipient,
|
isReceipient: isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -2346,6 +2408,7 @@ class ChatPage extends LitElement {
|
|||||||
isReceipient: isReceipient,
|
isReceipient: isReceipient,
|
||||||
decodeMessageFunc: this.decodeMessage,
|
decodeMessageFunc: this.decodeMessage,
|
||||||
_publicKey: this._publicKey,
|
_publicKey: this._publicKey,
|
||||||
|
symKeys: this.secretKeysWorker,
|
||||||
isNotInitial: true,
|
isNotInitial: true,
|
||||||
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
addToUpdateMessageHashmap: this.addToUpdateMessageHashmap
|
||||||
}))
|
}))
|
||||||
@ -2374,6 +2437,11 @@ class ChatPage extends LitElement {
|
|||||||
this.requestUpdate()
|
this.requestUpdate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
closeRepliedToContainer() {
|
||||||
|
this.repliedToMessageObj = null
|
||||||
|
this.requestUpdate()
|
||||||
|
}
|
||||||
|
|
||||||
// set edited message in chat editor
|
// set edited message in chat editor
|
||||||
setEditedMessageObj(messageObj) {
|
setEditedMessageObj(messageObj) {
|
||||||
this.editor.commands.focus('end')
|
this.editor.commands.focus('end')
|
||||||
@ -2388,11 +2456,6 @@ class ChatPage extends LitElement {
|
|||||||
this.editor.commands.setContent('')
|
this.editor.commands.setContent('')
|
||||||
}
|
}
|
||||||
|
|
||||||
closeRepliedToContainer() {
|
|
||||||
this.repliedToMessageObj = null
|
|
||||||
this.requestUpdate()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* New Message Template implementation, takes in a message object.
|
* New Message Template implementation, takes in a message object.
|
||||||
* @param { Object } messageObj
|
* @param { Object } messageObj
|
||||||
@ -2456,7 +2519,7 @@ class ChatPage extends LitElement {
|
|||||||
* @param {Object} encodedMessageObj
|
* @param {Object} encodedMessageObj
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
decodeMessage(encodedMessageObj, isReceipient, _publicKey) {
|
decodeMessage(encodedMessageObj, isReceipient, _publicKey, symKeys) {
|
||||||
let isReceipientVar
|
let isReceipientVar
|
||||||
let _publicKeyVar
|
let _publicKeyVar
|
||||||
|
|
||||||
@ -2476,14 +2539,23 @@ class ChatPage extends LitElement {
|
|||||||
let decodedMessage = window.parent.decryptChatMessageBase64(encodedMessageObj.data, window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, _publicKeyVar.key, encodedMessageObj.reference)
|
let decodedMessage = window.parent.decryptChatMessageBase64(encodedMessageObj.data, window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, _publicKeyVar.key, encodedMessageObj.reference)
|
||||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||||
} else if (encodedMessageObj.isEncrypted === false && encodedMessageObj.data) {
|
} else if (encodedMessageObj.isEncrypted === false && encodedMessageObj.data) {
|
||||||
let decodedMessage = window.parent.Base64.decode(encodedMessageObj.data)
|
let decodedMessage = window.parent.Base64Message.decode(encodedMessageObj.data, symKeys)
|
||||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||||
} else {
|
} else {
|
||||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage: "Cannot Decrypt Message!" }
|
decodedMessageObj = { ...encodedMessageObj, decodedMessage: "Cannot Decrypt Message!" }
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// group chat
|
// group chat
|
||||||
let decodedMessage = window.parent.Base64.decode(encodedMessageObj.data)
|
let decodedMessage
|
||||||
|
|
||||||
|
const noRef = "noref"
|
||||||
|
|
||||||
|
if (encodedMessageObj.chatReference) {
|
||||||
|
decodedMessage = window.parent.Base64Message.decode(encodedMessageObj.data, symKeys, encodedMessageObj.chatReference)
|
||||||
|
} else {
|
||||||
|
decodedMessage = window.parent.Base64Message.decode(encodedMessageObj.data, symKeys, noRef)
|
||||||
|
}
|
||||||
|
|
||||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2494,15 +2566,13 @@ class ChatPage extends LitElement {
|
|||||||
const initDirect = async (cid, noInitial) => {
|
const initDirect = async (cid, noInitial) => {
|
||||||
let timeoutId
|
let timeoutId
|
||||||
let initial = 0
|
let initial = 0
|
||||||
|
|
||||||
let directSocketTimeout
|
let directSocketTimeout
|
||||||
|
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
let directSocketLink
|
let directSocketLink
|
||||||
|
|
||||||
if (window.parent.location.protocol === "https:") {
|
if (nodeProtocol === "https") {
|
||||||
directSocketLink = `wss://${nodeUrl}/websockets/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${cid}&encoding=BASE64&limit=1`
|
directSocketLink = `wss://${nodeUrl}/websockets/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${cid}&encoding=BASE64&limit=1`
|
||||||
} else {
|
} else {
|
||||||
// Fallback to http
|
// Fallback to http
|
||||||
@ -2530,12 +2600,17 @@ class ChatPage extends LitElement {
|
|||||||
let getInitialMessages = []
|
let getInitialMessages = []
|
||||||
let count = 0
|
let count = 0
|
||||||
let isUnread = false
|
let isUnread = false
|
||||||
|
let chatInfoTimestamp
|
||||||
|
|
||||||
const chatId = this.chatId
|
const chatId = this.chatId
|
||||||
const findContent = this.chatHeads.find((item) => item.url === chatId)
|
const findContent = this.chatHeads.find((item) => item.url === chatId)
|
||||||
const chatInfoTimestamp = findContent.timestamp || 0
|
|
||||||
const lastReadMessageTimestamp = this.lastReadMessageTimestamp
|
const lastReadMessageTimestamp = this.lastReadMessageTimestamp
|
||||||
|
|
||||||
|
if (findContent === undefined) {
|
||||||
|
chatInfoTimestamp = 0
|
||||||
|
} else {
|
||||||
|
chatInfoTimestamp = findContent.timestamp || 0
|
||||||
|
}
|
||||||
|
|
||||||
if (lastReadMessageTimestamp && chatInfoTimestamp) {
|
if (lastReadMessageTimestamp && chatInfoTimestamp) {
|
||||||
if (lastReadMessageTimestamp < chatInfoTimestamp) {
|
if (lastReadMessageTimestamp < chatInfoTimestamp) {
|
||||||
@ -2618,17 +2693,15 @@ class ChatPage extends LitElement {
|
|||||||
const initGroup = (gId, noInitial) => {
|
const initGroup = (gId, noInitial) => {
|
||||||
let timeoutId
|
let timeoutId
|
||||||
let groupId = Number(gId)
|
let groupId = Number(gId)
|
||||||
|
|
||||||
let initial = 0
|
let initial = 0
|
||||||
let count = 0
|
let count = 0
|
||||||
let groupSocketTimeout
|
let groupSocketTimeout
|
||||||
|
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
let groupSocketLink
|
let groupSocketLink
|
||||||
|
|
||||||
if (window.parent.location.protocol === "https:") {
|
if (nodeProtocol === "https") {
|
||||||
groupSocketLink = `wss://${nodeUrl}/websockets/chat/messages?txGroupId=${groupId}&encoding=BASE64&limit=1`
|
groupSocketLink = `wss://${nodeUrl}/websockets/chat/messages?txGroupId=${groupId}&encoding=BASE64&limit=1`
|
||||||
} else {
|
} else {
|
||||||
// Fallback to http
|
// Fallback to http
|
||||||
@ -2653,13 +2726,18 @@ class ChatPage extends LitElement {
|
|||||||
this.lastReadMessageTimestamp = await chatLastSeen.getItem(this.chatId) || 0
|
this.lastReadMessageTimestamp = await chatLastSeen.getItem(this.chatId) || 0
|
||||||
if (noInitial) return
|
if (noInitial) return
|
||||||
let getInitialMessages = []
|
let getInitialMessages = []
|
||||||
const lastReadMessageTimestamp = this.lastReadMessageTimestamp
|
|
||||||
|
|
||||||
let isUnread = false
|
let isUnread = false
|
||||||
|
let chatInfoTimestamp
|
||||||
|
|
||||||
const chatId = this.chatId
|
const chatId = this.chatId
|
||||||
const findContent = this.chatHeads.find((item) => item.url === chatId)
|
const findContent = this.chatHeads.find((item) => item.url === chatId)
|
||||||
const chatInfoTimestamp = findContent.timestamp || 0
|
const lastReadMessageTimestamp = this.lastReadMessageTimestamp
|
||||||
|
|
||||||
|
if (findContent === undefined) {
|
||||||
|
chatInfoTimestamp = 0
|
||||||
|
} else {
|
||||||
|
chatInfoTimestamp = findContent.timestamp || 0
|
||||||
|
}
|
||||||
|
|
||||||
if (lastReadMessageTimestamp && chatInfoTimestamp) {
|
if (lastReadMessageTimestamp && chatInfoTimestamp) {
|
||||||
if (lastReadMessageTimestamp < chatInfoTimestamp) {
|
if (lastReadMessageTimestamp < chatInfoTimestamp) {
|
||||||
|
@ -3,12 +3,13 @@ import { repeat } from 'lit/directives/repeat.js'
|
|||||||
import { unsafeHTML } from 'lit/directives/unsafe-html.js'
|
import { unsafeHTML } from 'lit/directives/unsafe-html.js'
|
||||||
import { Epml } from '../../../epml'
|
import { Epml } from '../../../epml'
|
||||||
import { cropAddress, roundToNearestDecimal } from '../../utils/functions'
|
import { cropAddress, roundToNearestDecimal } from '../../utils/functions'
|
||||||
import { generateHTML } from '@tiptap/core'
|
import { generateHTML, generateJSON } from '@tiptap/core'
|
||||||
import { chatLimit, totalMsgCount } from './ChatPage'
|
import { chatLimit, totalMsgCount } from './ChatPage'
|
||||||
import { chatStyles } from './plugins-css'
|
import { chatStyles } from './plugins-css'
|
||||||
import isElectron from 'is-electron'
|
import isElectron from 'is-electron'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import Highlight from '@tiptap/extension-highlight'
|
import Highlight from '@tiptap/extension-highlight'
|
||||||
|
import Mention from '@tiptap/extension-mention'
|
||||||
import ShortUniqueId from 'short-unique-id'
|
import ShortUniqueId from 'short-unique-id'
|
||||||
import StarterKit from '@tiptap/starter-kit'
|
import StarterKit from '@tiptap/starter-kit'
|
||||||
import Underline from '@tiptap/extension-underline'
|
import Underline from '@tiptap/extension-underline'
|
||||||
@ -176,7 +177,7 @@ function processText(input) {
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log({ error })
|
console.error({ error })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -279,6 +280,7 @@ class ChatScroller extends LitElement {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
let formattedMessages = this.messagesToRender
|
let formattedMessages = this.messagesToRender
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
${this.isLoadingBefore
|
${this.isLoadingBefore
|
||||||
? html`
|
? html`
|
||||||
@ -1080,17 +1082,22 @@ class MessageTemplate extends LitElement {
|
|||||||
let version = 0
|
let version = 0
|
||||||
let isForwarded = false
|
let isForwarded = false
|
||||||
let isEdited = false
|
let isEdited = false
|
||||||
|
let isEncrypted = false
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage)
|
const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage)
|
||||||
|
|
||||||
if (+parsedMessageObj.version > 1 && parsedMessageObj.messageText) {
|
if (parsedMessageObj.version > 1 && parsedMessageObj.messageText) {
|
||||||
messageVersion2 = generateHTML(parsedMessageObj.messageText, [StarterKit, Underline, Highlight])
|
messageVersion2 = generateHTML(parsedMessageObj.messageText, [StarterKit, Underline, Highlight, Mention])
|
||||||
messageVersion2WithLink = processText(messageVersion2)
|
messageVersion2WithLink = processText(messageVersion2)
|
||||||
}
|
}
|
||||||
|
|
||||||
message = parsedMessageObj.messageText
|
if (parsedMessageObj.version > 1 && parsedMessageObj.message && !parsedMessageObj.messageText) {
|
||||||
|
messageVersion2 = parsedMessageObj.message
|
||||||
|
messageVersion2WithLink = processText(messageVersion2)
|
||||||
|
}
|
||||||
|
|
||||||
|
message = parsedMessageObj.messageText ? parsedMessageObj.messageText : parsedMessageObj.message
|
||||||
repliedToData = this.messageObj.repliedToData
|
repliedToData = this.messageObj.repliedToData
|
||||||
isImageDeleted = parsedMessageObj.isImageDeleted
|
isImageDeleted = parsedMessageObj.isImageDeleted
|
||||||
isGifDeleted = parsedMessageObj.isGifDeleted
|
isGifDeleted = parsedMessageObj.isGifDeleted
|
||||||
@ -1100,6 +1107,7 @@ class MessageTemplate extends LitElement {
|
|||||||
version = parsedMessageObj.version
|
version = parsedMessageObj.version
|
||||||
isForwarded = parsedMessageObj.type === 'forward'
|
isForwarded = parsedMessageObj.type === 'forward'
|
||||||
isEdited = parsedMessageObj.isEdited && true
|
isEdited = parsedMessageObj.isEdited && true
|
||||||
|
isEncrypted = parsedMessageObj.isFromHub || parsedMessageObj.isPrivate || parsedMessageObj.message ? true : false
|
||||||
|
|
||||||
if (parsedMessageObj.images && Array.isArray(parsedMessageObj.images) && parsedMessageObj.images.length > 0) {
|
if (parsedMessageObj.images && Array.isArray(parsedMessageObj.images) && parsedMessageObj.images.length > 0) {
|
||||||
image = parsedMessageObj.images[0]
|
image = parsedMessageObj.images[0]
|
||||||
@ -1131,6 +1139,8 @@ class MessageTemplate extends LitElement {
|
|||||||
let hideit = hidemsg.includes(this.messageObj.sender)
|
let hideit = hidemsg.includes(this.messageObj.sender)
|
||||||
let forwarded = ''
|
let forwarded = ''
|
||||||
let edited = ''
|
let edited = ''
|
||||||
|
let encrypted = ''
|
||||||
|
let decrypted = ''
|
||||||
|
|
||||||
levelFounder = html`<level-founder checkleveladdress="${this.messageObj.sender}"></level-founder>`
|
levelFounder = html`<level-founder checkleveladdress="${this.messageObj.sender}"></level-founder>`
|
||||||
|
|
||||||
@ -1246,6 +1256,10 @@ class MessageTemplate extends LitElement {
|
|||||||
</span>
|
</span>
|
||||||
`
|
`
|
||||||
|
|
||||||
|
encrypted = html` <mwc-icon style="font-size:16px; color: var(--chat-group);">key</mwc-icon> `
|
||||||
|
|
||||||
|
decrypted = html` <mwc-icon style="font-size:16px; color: var(--chat-group);">key_off</mwc-icon> `
|
||||||
|
|
||||||
if (repliedToData) {
|
if (repliedToData) {
|
||||||
try {
|
try {
|
||||||
repliedToData.decodedMessage = JSON.parse(repliedToData.decodedMessage)
|
repliedToData.decodedMessage = JSON.parse(repliedToData.decodedMessage)
|
||||||
@ -1256,7 +1270,11 @@ class MessageTemplate extends LitElement {
|
|||||||
|
|
||||||
if (repliedToData && repliedToData.decodedMessage && repliedToData.decodedMessage.messageText) {
|
if (repliedToData && repliedToData.decodedMessage && repliedToData.decodedMessage.messageText) {
|
||||||
try {
|
try {
|
||||||
repliedToMessageText = generateHTML(repliedToData.decodedMessage.messageText, [StarterKit, Underline, Highlight])
|
repliedToMessageText = generateHTML(repliedToData.decodedMessage.messageText, [StarterKit, Underline, Highlight, Mention])
|
||||||
|
} catch (error) { /* empty */ }
|
||||||
|
} else if (repliedToData && repliedToData.decodedMessage && repliedToData.decodedMessage.message) {
|
||||||
|
try {
|
||||||
|
repliedToMessageText = this.convertHubMessageToJson(repliedToData.decodedMessage.message)
|
||||||
} catch (error) { /* empty */ }
|
} catch (error) { /* empty */ }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1535,9 +1553,10 @@ class MessageTemplate extends LitElement {
|
|||||||
<p class="attachment-name">
|
<p class="attachment-name">
|
||||||
${attachment && attachment.attachmentName}
|
${attachment && attachment.attachmentName}
|
||||||
</p>
|
</p>
|
||||||
<p class="attachment-size">
|
${attachment.attachmentSize > 0 ?
|
||||||
|
`<p class="attachment-size">
|
||||||
${roundToNearestDecimal(attachment.attachmentSize)} mb
|
${roundToNearestDecimal(attachment.attachmentSize)} mb
|
||||||
</p>
|
</p>` : ''}
|
||||||
</div>
|
</div>
|
||||||
<vaadin-icon
|
<vaadin-icon
|
||||||
@click=${async () => await this.downloadAttachment(attachment)}
|
@click=${async () => await this.downloadAttachment(attachment)}
|
||||||
@ -1661,23 +1680,38 @@ class MessageTemplate extends LitElement {
|
|||||||
${this.isInProgress ? html`
|
${this.isInProgress ? html`
|
||||||
<p>${translate('chatpage.cchange91')}</p>
|
<p>${translate('chatpage.cchange91')}</p>
|
||||||
` : this.isAgo ? html`
|
` : this.isAgo ? html`
|
||||||
<div id="timeformat">
|
<div style="display: flex; align-items: center;">
|
||||||
<span>
|
<div style="margin-top: 4px;">
|
||||||
<message-time timestamp=${this.messageObj.timestamp}></message-time>
|
${isEncrypted ? html`${encrypted}` : html`${decrypted}`}
|
||||||
</span>
|
</div>
|
||||||
|
<div id="timeformat">
|
||||||
|
<span>
|
||||||
|
<message-time timestamp=${this.messageObj.timestamp}></message-time>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
` : this.isIso ? html`
|
` : this.isIso ? html`
|
||||||
<div id="timeformat">
|
<div style="display: flex; align-items: center;">
|
||||||
<span>
|
<div style="margin-top: 4px;">
|
||||||
${new Date(this.messageObj.timestamp).toLocaleString()}
|
${isEncrypted ? html`${encrypted}` : html`${decrypted}`}
|
||||||
</span>
|
</div>
|
||||||
|
<div id="timeformat">
|
||||||
|
<span>
|
||||||
|
${new Date(this.messageObj.timestamp).toLocaleString()}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
` : this.isBoth ? html`
|
` : this.isBoth ? html`
|
||||||
<div id="timeformat">
|
<div style="display: flex; align-items: center;">
|
||||||
<span>
|
<div style="margin-top: 4px;">
|
||||||
${new Date(this.messageObj.timestamp).toLocaleString()}
|
${isEncrypted ? html`${encrypted}` : html`${decrypted}`}
|
||||||
( <message-time timestamp=${this.messageObj.timestamp}></message-time> )
|
</div>
|
||||||
</span>
|
<div id="timeformat">
|
||||||
|
<span>
|
||||||
|
${new Date(this.messageObj.timestamp).toLocaleString()}
|
||||||
|
( <message-time timestamp=${this.messageObj.timestamp}></message-time> )
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
` : ''
|
` : ''
|
||||||
}
|
}
|
||||||
@ -2043,6 +2077,11 @@ class MessageTemplate extends LitElement {
|
|||||||
}, 60000)
|
}, 60000)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
convertHubMessageToJson(message) {
|
||||||
|
let newJson = generateJSON(`${message}`, [StarterKit, Underline, Highlight, Mention])
|
||||||
|
return generateHTML(newJson, [StarterKit, Underline, Highlight, Mention])
|
||||||
|
}
|
||||||
|
|
||||||
async closeDownloadProgressDialog() {
|
async closeDownloadProgressDialog() {
|
||||||
const closeDelay = ms => new Promise(res => setTimeout(res, ms))
|
const closeDelay = ms => new Promise(res => setTimeout(res, ms))
|
||||||
this.shadowRoot.getElementById('downloadProgressDialog').close()
|
this.shadowRoot.getElementById('downloadProgressDialog').close()
|
||||||
@ -2175,7 +2214,7 @@ class MessageTemplate extends LitElement {
|
|||||||
|
|
||||||
await writeFile(fileHandle, blob).then(() => console.log('FILE SAVED'))
|
await writeFile(fileHandle, blob).then(() => console.log('FILE SAVED'))
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.error(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2326,7 +2365,13 @@ class ChatMenu extends LitElement {
|
|||||||
<div
|
<div
|
||||||
class=${`menu-icon ${!this.firstMessageInChat ? 'tooltip' : ''}`}
|
class=${`menu-icon ${!this.firstMessageInChat ? 'tooltip' : ''}`}
|
||||||
data-text="${translate('blockpage.bcchange12')}"
|
data-text="${translate('blockpage.bcchange12')}"
|
||||||
@click=${() => {if (this.version === '0') {this.versionErrorSnack(); return;} this.setEditedMessageObj(this.originalMessage);}}
|
@click=${() => {
|
||||||
|
if (this.version === '0') {
|
||||||
|
this.versionErrorSnack();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.setEditedMessageObj(this.originalMessage);
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<vaadin-icon icon="vaadin:pencil" slot="icon"></vaadin-icon>
|
<vaadin-icon icon="vaadin:pencil" slot="icon"></vaadin-icon>
|
||||||
</div>
|
</div>
|
||||||
|
644
plugins/plugins/core/components/GroupEncryption.js
Normal file
644
plugins/plugins/core/components/GroupEncryption.js
Normal file
@ -0,0 +1,644 @@
|
|||||||
|
import Base58 from '../../../../crypto/api/deps/Base58'
|
||||||
|
import ed2curve from '../../../../crypto/api/deps/ed2curve'
|
||||||
|
import nacl from '../../../../crypto/api/deps/nacl-fast'
|
||||||
|
|
||||||
|
export function base64ToUint8Array(base64) {
|
||||||
|
const binaryString = atob(base64)
|
||||||
|
const len = binaryString.length
|
||||||
|
const bytes = new Uint8Array(len)
|
||||||
|
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
bytes[i] = binaryString.charCodeAt(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
export function uint8ArrayToBase64(uint8Array) {
|
||||||
|
const length = uint8Array.length
|
||||||
|
let binaryString = ''
|
||||||
|
// Process 1MB at a time
|
||||||
|
const chunkSize = 1024 * 1024
|
||||||
|
|
||||||
|
for (let i = 0; i < length; i += chunkSize) {
|
||||||
|
const chunkEnd = Math.min(i + chunkSize, length)
|
||||||
|
const chunk = uint8Array.subarray(i, chunkEnd)
|
||||||
|
binaryString += Array.from(chunk, byte => String.fromCharCode(byte)).join('')
|
||||||
|
}
|
||||||
|
|
||||||
|
return btoa(binaryString)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function objectToBase64(obj) {
|
||||||
|
// Step 1: Convert the object to a JSON string
|
||||||
|
const jsonString = JSON.stringify(obj)
|
||||||
|
|
||||||
|
// Step 2: Create a Blob from the JSON string
|
||||||
|
const blob = new Blob([jsonString], { type: 'application/json' })
|
||||||
|
|
||||||
|
// Step 3: Create a FileReader to read the Blob as a base64-encoded string
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const reader = new FileReader()
|
||||||
|
reader.onloadend = () => {
|
||||||
|
if (typeof reader.result === 'string') {
|
||||||
|
// Remove 'data:application/json;base64,' prefix
|
||||||
|
const base64 = reader.result.replace(
|
||||||
|
'data:application/json;base64,',
|
||||||
|
''
|
||||||
|
)
|
||||||
|
resolve(base64)
|
||||||
|
} else {
|
||||||
|
reject(new Error('Failed to read the Blob as a base64-encoded string'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.onerror = () => {
|
||||||
|
reject(reader.error)
|
||||||
|
}
|
||||||
|
reader.readAsDataURL(blob)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function uint8ArrayToObject(uint8Array) {
|
||||||
|
// Decode the byte array using TextDecoder
|
||||||
|
const decoder = new TextDecoder()
|
||||||
|
const jsonString = decoder.decode(uint8Array)
|
||||||
|
|
||||||
|
// Convert the JSON string back into an object
|
||||||
|
return JSON.parse(jsonString)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function validateSecretKey(obj) {
|
||||||
|
// Check if the input is an object
|
||||||
|
if (typeof obj !== "object" || obj === null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate over each key in the object
|
||||||
|
for (let key in obj) {
|
||||||
|
// Ensure the key is a string representation of a positive integer
|
||||||
|
if (!/^\d+$/.test(key)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the corresponding value for the key
|
||||||
|
const value = obj[key]
|
||||||
|
|
||||||
|
// Check that value is an object and not null
|
||||||
|
if (typeof value !== "object" || value === null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for messageKey
|
||||||
|
if (!value.hasOwnProperty("messageKey")) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure messageKey and nonce are non-empty strings
|
||||||
|
if (typeof value.messageKey !== "string" || value.messageKey.trim() === "") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If all checks passed, return true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to create a symmetric key and nonce
|
||||||
|
export const createSymmetricKeyAndNonce = () => {
|
||||||
|
// 32 bytes for the symmetric key
|
||||||
|
const messageKey = new Uint8Array(32)
|
||||||
|
crypto.getRandomValues(messageKey)
|
||||||
|
|
||||||
|
return { messageKey: uint8ArrayToBase64(messageKey)}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encryptDataGroup = (data64, publicKeys, privateKey, userPublicKey, customSymmetricKey) => {
|
||||||
|
let combinedPublicKeys = [...publicKeys, userPublicKey]
|
||||||
|
|
||||||
|
const decodedPrivateKey = Base58.decode(privateKey)
|
||||||
|
const publicKeysDuplicateFree = [...new Set(combinedPublicKeys)]
|
||||||
|
const Uint8ArrayData = base64ToUint8Array(data64)
|
||||||
|
|
||||||
|
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||||
|
throw new Error("The Uint8ArrayData you've submitted is invalid")
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Generate a random symmetric key for the message.
|
||||||
|
let messageKey
|
||||||
|
|
||||||
|
if(customSymmetricKey){
|
||||||
|
messageKey = base64ToUint8Array(customSymmetricKey)
|
||||||
|
} else {
|
||||||
|
messageKey = new Uint8Array(32)
|
||||||
|
crypto.getRandomValues(messageKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!messageKey) throw new Error('Cannot create symmetric key')
|
||||||
|
|
||||||
|
const nonce = new Uint8Array(24)
|
||||||
|
|
||||||
|
crypto.getRandomValues(nonce)
|
||||||
|
|
||||||
|
// Encrypt the data with the symmetric key.
|
||||||
|
const encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||||
|
|
||||||
|
// Generate a keyNonce outside of the loop.
|
||||||
|
const keyNonce = new Uint8Array(24)
|
||||||
|
crypto.getRandomValues(keyNonce)
|
||||||
|
|
||||||
|
// Encrypt the symmetric key for each recipient.
|
||||||
|
let encryptedKeys = []
|
||||||
|
|
||||||
|
publicKeysDuplicateFree.forEach((recipientPublicKey) => {
|
||||||
|
const publicKeyUnit8Array = Base58.decode(recipientPublicKey)
|
||||||
|
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||||
|
const convertedPublicKey = ed2curve.convertPublicKey(publicKeyUnit8Array)
|
||||||
|
const sharedSecret = new Uint8Array(32)
|
||||||
|
|
||||||
|
// the length of the sharedSecret will be 32 + 16
|
||||||
|
// When you're encrypting data using nacl.secretbox, it's adding an authentication tag to the result, which is 16 bytes long. This tag is used for verifying the integrity and authenticity of the data when it is decrypted
|
||||||
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
|
||||||
|
|
||||||
|
// Encrypt the symmetric key with the shared secret.
|
||||||
|
const encryptedKey = nacl.secretbox(messageKey, keyNonce, sharedSecret)
|
||||||
|
|
||||||
|
encryptedKeys.push(encryptedKey)
|
||||||
|
})
|
||||||
|
|
||||||
|
const str = "qortalGroupEncryptedData"
|
||||||
|
const strEncoder = new TextEncoder()
|
||||||
|
const strUint8Array = strEncoder.encode(str)
|
||||||
|
|
||||||
|
// Convert sender's public key to Uint8Array and add to the message
|
||||||
|
const senderPublicKeyUint8Array = Base58.decode(userPublicKey)
|
||||||
|
|
||||||
|
// Combine all data into a single Uint8Array.
|
||||||
|
// Calculate size of combinedData
|
||||||
|
let combinedDataSize = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length + 4
|
||||||
|
let encryptedKeysSize = 0
|
||||||
|
|
||||||
|
encryptedKeys.forEach((key) => {
|
||||||
|
encryptedKeysSize += key.length
|
||||||
|
})
|
||||||
|
|
||||||
|
combinedDataSize += encryptedKeysSize
|
||||||
|
let combinedData = new Uint8Array(combinedDataSize)
|
||||||
|
combinedData.set(strUint8Array)
|
||||||
|
combinedData.set(nonce, strUint8Array.length)
|
||||||
|
combinedData.set(keyNonce, strUint8Array.length + nonce.length)
|
||||||
|
combinedData.set(senderPublicKeyUint8Array, strUint8Array.length + nonce.length + keyNonce.length)
|
||||||
|
combinedData.set(encryptedData, strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length)
|
||||||
|
|
||||||
|
// Initialize offset for encryptedKeys
|
||||||
|
let encryptedKeysOffset = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length
|
||||||
|
|
||||||
|
encryptedKeys.forEach((key) => {
|
||||||
|
combinedData.set(key, encryptedKeysOffset)
|
||||||
|
encryptedKeysOffset += key.length
|
||||||
|
})
|
||||||
|
|
||||||
|
const countArray = new Uint8Array(new Uint32Array([publicKeysDuplicateFree.length]).buffer)
|
||||||
|
combinedData.set(countArray, combinedData.length - 4)
|
||||||
|
|
||||||
|
return uint8ArrayToBase64(combinedData)
|
||||||
|
} catch (error) {
|
||||||
|
console.log('error', error)
|
||||||
|
throw new Error("Error in encrypting data")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encryptSingle = async (data64, secretKeyObject, typeNumber = 2) => {
|
||||||
|
// Find the highest key in the secretKeyObject
|
||||||
|
const highestKey = Math.max(...Object.keys(secretKeyObject).filter(item => !isNaN(+item)).map(Number))
|
||||||
|
const highestKeyObject = secretKeyObject[highestKey]
|
||||||
|
|
||||||
|
// Convert data and keys from base64
|
||||||
|
const Uint8ArrayData = base64ToUint8Array(data64)
|
||||||
|
const messageKey = base64ToUint8Array(highestKeyObject.messageKey)
|
||||||
|
|
||||||
|
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||||
|
throw new Error("The Uint8ArrayData you've submitted is invalid")
|
||||||
|
}
|
||||||
|
|
||||||
|
let nonce, encryptedData, encryptedDataBase64, finalEncryptedData
|
||||||
|
|
||||||
|
// Convert type number to a fixed length of 3 digits
|
||||||
|
const typeNumberStr = typeNumber.toString().padStart(3, '0')
|
||||||
|
|
||||||
|
if (highestKeyObject.nonce) {
|
||||||
|
// Old format: Use the nonce from secretKeyObject
|
||||||
|
nonce = base64ToUint8Array(highestKeyObject.nonce)
|
||||||
|
|
||||||
|
// Encrypt the data with the existing nonce and message key
|
||||||
|
encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||||
|
encryptedDataBase64 = uint8ArrayToBase64(encryptedData)
|
||||||
|
|
||||||
|
// Concatenate the highest key, type number, and encrypted data (old format)
|
||||||
|
// Fixed length of 10 digits
|
||||||
|
const highestKeyStr = highestKey.toString().padStart(10, '0')
|
||||||
|
finalEncryptedData = btoa(highestKeyStr + encryptedDataBase64)
|
||||||
|
} else {
|
||||||
|
// New format: Generate a random nonce and embed it in the message
|
||||||
|
// 24 bytes for the nonce
|
||||||
|
nonce = new Uint8Array(24)
|
||||||
|
crypto.getRandomValues(nonce)
|
||||||
|
|
||||||
|
// Encrypt the data with the new nonce and message key
|
||||||
|
encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||||
|
encryptedDataBase64 = uint8ArrayToBase64(encryptedData)
|
||||||
|
|
||||||
|
// Convert the nonce to base64
|
||||||
|
const nonceBase64 = uint8ArrayToBase64(nonce)
|
||||||
|
|
||||||
|
// Concatenate the highest key, type number, nonce, and encrypted data (new format)
|
||||||
|
// Fixed length of 10 digits
|
||||||
|
const highestKeyStr = highestKey.toString().padStart(10, '0')
|
||||||
|
const highestKeyBytes = new TextEncoder().encode(highestKeyStr.padStart(10, '0'))
|
||||||
|
const typeNumberBytes = new TextEncoder().encode(typeNumberStr.padStart(3, '0'))
|
||||||
|
|
||||||
|
// Step 3: Concatenate all binary
|
||||||
|
const combinedBinary = new Uint8Array(
|
||||||
|
highestKeyBytes.length + typeNumberBytes.length + nonce.length + encryptedData.length
|
||||||
|
)
|
||||||
|
|
||||||
|
// finalEncryptedData = btoa(highestKeyStr) + btoa(typeNumberStr) + nonceBase64 + encryptedDataBase64
|
||||||
|
combinedBinary.set(highestKeyBytes, 0)
|
||||||
|
combinedBinary.set(typeNumberBytes, highestKeyBytes.length)
|
||||||
|
combinedBinary.set(nonce, highestKeyBytes.length + typeNumberBytes.length)
|
||||||
|
combinedBinary.set(encryptedData, highestKeyBytes.length + typeNumberBytes.length + nonce.length)
|
||||||
|
|
||||||
|
// Step 4: Base64 encode once
|
||||||
|
finalEncryptedData = uint8ArrayToBase64(combinedBinary)
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalEncryptedData
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const decodeBase64ForUIChatMessages = (messages) => {
|
||||||
|
let msgs = []
|
||||||
|
for(const msg of messages) {
|
||||||
|
try {
|
||||||
|
const decoded = atob(msg.data)
|
||||||
|
const parseDecoded =JSON.parse(decodeURIComponent(escape(decoded)))
|
||||||
|
|
||||||
|
msgs.push({
|
||||||
|
...msg,
|
||||||
|
...parseDecoded
|
||||||
|
})
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return msgs
|
||||||
|
}
|
||||||
|
|
||||||
|
export function decryptSingle(data64, secretKeyObject, skipDecodeBase64) {
|
||||||
|
// First, decode the base64-encoded input (if skipDecodeBase64 is not set)
|
||||||
|
const decodedData = skipDecodeBase64 ? data64 : atob(data64)
|
||||||
|
|
||||||
|
// Then, decode it again for the specific format (if double encoding is used)
|
||||||
|
const decodeForNumber = atob(decodedData)
|
||||||
|
|
||||||
|
// Extract the key (assuming it's always the first 10 characters)
|
||||||
|
const keyStr = decodeForNumber.slice(0, 10)
|
||||||
|
|
||||||
|
// Convert the key string back to a number
|
||||||
|
const highestKey = parseInt(keyStr, 10)
|
||||||
|
|
||||||
|
// Check if we have a valid secret key for the extracted highestKey
|
||||||
|
if (!secretKeyObject[highestKey]) {
|
||||||
|
return 'noKey'
|
||||||
|
}
|
||||||
|
|
||||||
|
const secretKeyEntry = secretKeyObject[highestKey]
|
||||||
|
|
||||||
|
let typeNumberStr, nonceBase64, encryptedDataBase64
|
||||||
|
|
||||||
|
// Determine if typeNumber exists by checking if the next 3 characters after keyStr are digits
|
||||||
|
const possibleTypeNumberStr = decodeForNumber.slice(10, 13)
|
||||||
|
|
||||||
|
// Check if next 3 characters are digits
|
||||||
|
const hasTypeNumber = /^\d{3}$/.test(possibleTypeNumberStr)
|
||||||
|
|
||||||
|
if (secretKeyEntry.nonce) {
|
||||||
|
// Old format: nonce is present in the secretKeyObject, so no type number exists
|
||||||
|
nonceBase64 = secretKeyEntry.nonce
|
||||||
|
|
||||||
|
// The remaining part is the encrypted data
|
||||||
|
encryptedDataBase64 = decodeForNumber.slice(10)
|
||||||
|
} else {
|
||||||
|
if (hasTypeNumber) {
|
||||||
|
if(decodeForNumber.slice(10, 13) !== '001'){
|
||||||
|
const decodedBinary = base64ToUint8Array(decodedData)
|
||||||
|
|
||||||
|
// if ASCII digits only
|
||||||
|
const highestKeyBytes = decodedBinary.slice(0, 10)
|
||||||
|
|
||||||
|
const highestKeyStr = new TextDecoder().decode(highestKeyBytes)
|
||||||
|
const nonce = decodedBinary.slice(13, 13 + 24)
|
||||||
|
const encryptedData = decodedBinary.slice(13 + 24)
|
||||||
|
const highestKey = parseInt(highestKeyStr, 10)
|
||||||
|
const messageKey = base64ToUint8Array(secretKeyObject[+highestKey].messageKey)
|
||||||
|
const decryptedBytes = nacl.secretbox.open(encryptedData, nonce, messageKey)
|
||||||
|
|
||||||
|
// Check if decryption was successful
|
||||||
|
if (!decryptedBytes) {
|
||||||
|
return 'decryptionFailed'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the decrypted Uint8Array back to a Base64 string
|
||||||
|
return uint8ArrayToBase64(decryptedBytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// New format: Extract type number and nonce
|
||||||
|
// Extract type number
|
||||||
|
typeNumberStr = possibleTypeNumberStr
|
||||||
|
|
||||||
|
// Extract nonce (next 32 characters after type number)
|
||||||
|
nonceBase64 = decodeForNumber.slice(13, 45)
|
||||||
|
|
||||||
|
// The remaining part is the encrypted data
|
||||||
|
encryptedDataBase64 = decodeForNumber.slice(45)
|
||||||
|
} else {
|
||||||
|
// Old format without type number (nonce is embedded in the message, first 32 characters after keyStr)
|
||||||
|
// First 32 characters for the nonce
|
||||||
|
nonceBase64 = decodeForNumber.slice(10, 42)
|
||||||
|
|
||||||
|
// The remaining part is the encrypted data
|
||||||
|
encryptedDataBase64 = decodeForNumber.slice(42)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert Base64 strings to Uint8Array
|
||||||
|
const Uint8ArrayData = base64ToUint8Array(encryptedDataBase64)
|
||||||
|
const nonce = base64ToUint8Array(nonceBase64)
|
||||||
|
const messageKey = base64ToUint8Array(secretKeyEntry.messageKey)
|
||||||
|
|
||||||
|
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||||
|
return 'decryptionFailed'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decrypt the data using the nonce and messageKey
|
||||||
|
const decryptedData = nacl.secretbox.open(Uint8ArrayData, nonce, messageKey)
|
||||||
|
|
||||||
|
// Check if decryption was successful
|
||||||
|
if (!decryptedData) {
|
||||||
|
return 'decryptionFailed'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the decrypted Uint8Array back to a Base64 string
|
||||||
|
return uint8ArrayToBase64(decryptedData)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decryptGroupEncryptionWithSharingKey = async (data64EncryptedData, key) => {
|
||||||
|
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||||
|
const str = "qortalGroupEncryptedData"
|
||||||
|
const strEncoder = new TextEncoder()
|
||||||
|
const strUint8Array = strEncoder.encode(str)
|
||||||
|
|
||||||
|
// Extract the nonce
|
||||||
|
const nonceStartPosition = strUint8Array.length
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const nonceEndPosition = nonceStartPosition + 24
|
||||||
|
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the shared keyNonce
|
||||||
|
const keyNonceStartPosition = nonceEndPosition
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||||
|
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the sender's public key
|
||||||
|
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||||
|
|
||||||
|
// Public keys are 32 bytes
|
||||||
|
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||||
|
|
||||||
|
// Calculate count first
|
||||||
|
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||||
|
const countStartPosition = allCombined.length - 4
|
||||||
|
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||||
|
const count = new Uint32Array(countArray.buffer)[0]
|
||||||
|
|
||||||
|
// Then use count to calculate encryptedData
|
||||||
|
// start position of encryptedData
|
||||||
|
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||||
|
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||||
|
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||||
|
const symmetricKey = base64ToUint8Array(key)
|
||||||
|
|
||||||
|
// Decrypt the data using the nonce and messageKey
|
||||||
|
const decryptedData = nacl.secretbox.open(encryptedData, nonce, symmetricKey)
|
||||||
|
|
||||||
|
// Check if decryption was successful
|
||||||
|
if (!decryptedData) {
|
||||||
|
throw new Error("Decryption failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the decrypted Uint8Array back to a Base64 string
|
||||||
|
return uint8ArrayToBase64(decryptedData)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function decryptGroupDataQortalRequest(data64EncryptedData, privateKey) {
|
||||||
|
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||||
|
const str = "qortalGroupEncryptedData"
|
||||||
|
const strEncoder = new TextEncoder()
|
||||||
|
const strUint8Array = strEncoder.encode(str)
|
||||||
|
|
||||||
|
// Extract the nonce
|
||||||
|
const nonceStartPosition = strUint8Array.length
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const nonceEndPosition = nonceStartPosition + 24
|
||||||
|
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the shared keyNonce
|
||||||
|
const keyNonceStartPosition = nonceEndPosition
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||||
|
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the sender's public key
|
||||||
|
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||||
|
|
||||||
|
// Public keys are 32 bytes
|
||||||
|
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||||
|
const senderPublicKey = allCombined.slice(senderPublicKeyStartPosition, senderPublicKeyEndPosition)
|
||||||
|
|
||||||
|
// Calculate count first
|
||||||
|
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||||
|
const countStartPosition = allCombined.length - 4
|
||||||
|
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||||
|
const count = new Uint32Array(countArray.buffer)[0]
|
||||||
|
|
||||||
|
// Then use count to calculate encryptedData
|
||||||
|
// start position of encryptedData
|
||||||
|
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||||
|
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||||
|
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||||
|
|
||||||
|
// Extract the encrypted keys
|
||||||
|
// 32+16 = 48
|
||||||
|
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48))
|
||||||
|
|
||||||
|
if (!privateKey) {
|
||||||
|
throw new Error("Unable to retrieve keys")
|
||||||
|
}
|
||||||
|
|
||||||
|
const decodedPrivateKey = Base58.decode(privateKey)
|
||||||
|
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||||
|
const convertedSenderPublicKey = ed2curve.convertPublicKey(senderPublicKey)
|
||||||
|
const sharedSecret = new Uint8Array(32)
|
||||||
|
|
||||||
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedSenderPublicKey)
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48)
|
||||||
|
|
||||||
|
// Decrypt the symmetric key.
|
||||||
|
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret)
|
||||||
|
|
||||||
|
// If decryption was successful, decryptedKey will not be null.
|
||||||
|
if (decryptedKey) {
|
||||||
|
// Decrypt the data using the symmetric key.
|
||||||
|
const decryptedData = nacl.secretbox.open(encryptedData, nonce, decryptedKey)
|
||||||
|
|
||||||
|
// If decryption was successful, decryptedData will not be null.
|
||||||
|
if (decryptedData) {
|
||||||
|
return decryptedData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error("Unable to decrypt data")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function decryptGroupData(data64EncryptedData, privateKey) {
|
||||||
|
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||||
|
const str = "qortalGroupEncryptedData"
|
||||||
|
const strEncoder = new TextEncoder()
|
||||||
|
const strUint8Array = strEncoder.encode(str)
|
||||||
|
|
||||||
|
// Extract the nonce
|
||||||
|
const nonceStartPosition = strUint8Array.length
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const nonceEndPosition = nonceStartPosition + 24
|
||||||
|
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the shared keyNonce
|
||||||
|
const keyNonceStartPosition = nonceEndPosition
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||||
|
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the sender's public key
|
||||||
|
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||||
|
|
||||||
|
// Public keys are 32 bytes
|
||||||
|
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||||
|
const senderPublicKey = allCombined.slice(senderPublicKeyStartPosition, senderPublicKeyEndPosition)
|
||||||
|
|
||||||
|
// Calculate count first
|
||||||
|
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||||
|
const countStartPosition = allCombined.length - 4
|
||||||
|
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||||
|
const count = new Uint32Array(countArray.buffer)[0]
|
||||||
|
|
||||||
|
// Then use count to calculate encryptedData
|
||||||
|
// start position of encryptedData
|
||||||
|
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||||
|
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||||
|
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||||
|
|
||||||
|
// Extract the encrypted keys
|
||||||
|
// 32+16 = 48
|
||||||
|
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48))
|
||||||
|
|
||||||
|
if (!privateKey) {
|
||||||
|
throw new Error("Unable to retrieve keys")
|
||||||
|
}
|
||||||
|
|
||||||
|
const decodedPrivateKey = Base58.decode(privateKey)
|
||||||
|
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||||
|
const convertedSenderPublicKey = ed2curve.convertPublicKey(senderPublicKey)
|
||||||
|
const sharedSecret = new Uint8Array(32)
|
||||||
|
|
||||||
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedSenderPublicKey)
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48)
|
||||||
|
|
||||||
|
// Decrypt the symmetric key.
|
||||||
|
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret)
|
||||||
|
|
||||||
|
// If decryption was successful, decryptedKey will not be null.
|
||||||
|
if (decryptedKey) {
|
||||||
|
// Decrypt the data using the symmetric key.
|
||||||
|
const decryptedData = nacl.secretbox.open(encryptedData, nonce, decryptedKey)
|
||||||
|
|
||||||
|
// If decryption was successful, decryptedData will not be null.
|
||||||
|
if (decryptedData) {
|
||||||
|
return {decryptedData, count}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error("Unable to decrypt data")
|
||||||
|
}
|
||||||
|
|
||||||
|
export function uint8ArrayStartsWith(uint8Array, string) {
|
||||||
|
const stringEncoder = new TextEncoder()
|
||||||
|
const stringUint8Array = stringEncoder.encode(string)
|
||||||
|
|
||||||
|
if (uint8Array.length < stringUint8Array.length) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < stringUint8Array.length; i++) {
|
||||||
|
if (uint8Array[i] !== stringUint8Array[i]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
export function decryptDeprecatedSingle(uint8Array, publicKey, privateKey) {
|
||||||
|
const combinedData = uint8Array
|
||||||
|
const str = "qortalEncryptedData"
|
||||||
|
const strEncoder = new TextEncoder()
|
||||||
|
const strUint8Array = strEncoder.encode(str)
|
||||||
|
const strData = combinedData.slice(0, strUint8Array.length)
|
||||||
|
const nonce = combinedData.slice(strUint8Array.length, strUint8Array.length + 24)
|
||||||
|
const _encryptedData = combinedData.slice(strUint8Array.length + 24)
|
||||||
|
const _publicKey = window.parent.Base58.decode(publicKey)
|
||||||
|
|
||||||
|
if (!privateKey || !_publicKey) {
|
||||||
|
throw new Error("Unable to retrieve keys")
|
||||||
|
}
|
||||||
|
|
||||||
|
const convertedPrivateKey = ed2curve.convertSecretKey(privateKey)
|
||||||
|
const convertedPublicKey = ed2curve.convertPublicKey(_publicKey)
|
||||||
|
const sharedSecret = new Uint8Array(32)
|
||||||
|
|
||||||
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
|
||||||
|
|
||||||
|
const _chatEncryptionSeed = new window.parent.Sha256().process(sharedSecret).finish().result
|
||||||
|
const _decryptedData = nacl.secretbox.open(_encryptedData, nonce, _chatEncryptionSeed)
|
||||||
|
|
||||||
|
if (!_decryptedData) {
|
||||||
|
throw new Error("Unable to decrypt")
|
||||||
|
}
|
||||||
|
|
||||||
|
return uint8ArrayToBase64(_decryptedData)
|
||||||
|
}
|
@ -54,9 +54,9 @@ class LevelFounder extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderFounder() {
|
renderFounder() {
|
||||||
let adressfounder = this.memberInfo.flags
|
let addressfounder = this.memberInfo.flags
|
||||||
|
|
||||||
if (adressfounder === 1) {
|
if (addressfounder === 1) {
|
||||||
return html`
|
return html`
|
||||||
<span id="founderTooltip" class="badge">F</span>
|
<span id="founderTooltip" class="badge">F</span>
|
||||||
<paper-tooltip class="custom" for="founderTooltip" position="top">FOUNDER</paper-tooltip>
|
<paper-tooltip class="custom" for="founderTooltip" position="top">FOUNDER</paper-tooltip>
|
||||||
@ -67,13 +67,13 @@ class LevelFounder extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderLevel() {
|
renderLevel() {
|
||||||
let adresslevel = this.memberInfo.level
|
let addresslevel = this.memberInfo.level
|
||||||
|
|
||||||
return adresslevel ?
|
return addresslevel ?
|
||||||
html`
|
html`
|
||||||
<img id="level-img" src=${`/img/badges/level-${adresslevel}.png`} alt=${`badge-${adresslevel}`} class="message-data-level" />
|
<img id="level-img" src=${`/img/badges/level-${addresslevel}.png`} alt=${`badge-${addresslevel}`} class="message-data-level" />
|
||||||
<paper-tooltip class="level-img-tooltip" for="level-img" position="top">
|
<paper-tooltip class="level-img-tooltip" for="level-img" position="top">
|
||||||
${translate("mintingpage.mchange27")} ${adresslevel}
|
${translate("mintingpage.mchange27")} ${addresslevel}
|
||||||
</paper-tooltip>
|
</paper-tooltip>
|
||||||
`
|
`
|
||||||
: ''
|
: ''
|
||||||
|
@ -19,7 +19,7 @@ class NameMenu extends LitElement {
|
|||||||
return {
|
return {
|
||||||
toblockaddress: { type: String, attribute: true },
|
toblockaddress: { type: String, attribute: true },
|
||||||
nametodialog: { type: String, attribute: true },
|
nametodialog: { type: String, attribute: true },
|
||||||
chatBlockedAdresses: { type: Array },
|
chatBlockedAddresses: { type: Array },
|
||||||
selectedAddress: { type: Object },
|
selectedAddress: { type: Object },
|
||||||
config: { type: Object },
|
config: { type: Object },
|
||||||
myAddress: { type: Object, reflect: true },
|
myAddress: { type: Object, reflect: true },
|
||||||
@ -36,7 +36,7 @@ class NameMenu extends LitElement {
|
|||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super()
|
super()
|
||||||
this.chatBlockedAdresses = []
|
this.chatBlockedAddresses = []
|
||||||
this.selectedAddress = window.parent.reduxStore.getState().app.selectedAddress.address
|
this.selectedAddress = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||||
this.myAddress = {}
|
this.myAddress = {}
|
||||||
this.balance = 1
|
this.balance = 1
|
||||||
@ -94,10 +94,10 @@ class NameMenu extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
firstUpdated() {
|
firstUpdated() {
|
||||||
this.getChatBlockedAdresses()
|
this.getchatBlockedAddresses()
|
||||||
|
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
this.getChatBlockedAdresses()
|
this.getchatBlockedAddresses()
|
||||||
}, 60000)
|
}, 60000)
|
||||||
|
|
||||||
window.onclick = function (event) {
|
window.onclick = function (event) {
|
||||||
@ -185,8 +185,8 @@ class NameMenu extends LitElement {
|
|||||||
}, 500)
|
}, 500)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getChatBlockedAdresses() {
|
async getchatBlockedAddresses() {
|
||||||
this.chatBlockedAdresses = await parentEpml.request('apiCall', {
|
this.chatBlockedAddresses = await parentEpml.request('apiCall', {
|
||||||
url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}`
|
url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -210,8 +210,8 @@ class NameMenu extends LitElement {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (ret === true) {
|
if (ret === true) {
|
||||||
this.chatBlockedAdresses = this.chatBlockedAdresses.filter(item => item != address)
|
this.chatBlockedAddresses = this.chatBlockedAddresses.filter(item => item != address)
|
||||||
this.chatBlockedAdresses.push(address)
|
this.chatBlockedAddresses.push(address)
|
||||||
this.getChatBlockedList()
|
this.getChatBlockedList()
|
||||||
this.closeMenu()
|
this.closeMenu()
|
||||||
this.shadowRoot.querySelector('#blockNameDialog').close()
|
this.shadowRoot.querySelector('#blockNameDialog').close()
|
||||||
|
@ -1649,7 +1649,7 @@ export const chatStyles = css`
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
height: 75%;
|
height: 85%;
|
||||||
width: 2.6px;
|
width: 2.6px;
|
||||||
background-color: var(--mdc-theme-primary);
|
background-color: var(--mdc-theme-primary);
|
||||||
}
|
}
|
||||||
@ -1669,7 +1669,7 @@ export const chatStyles = css`
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
max-width: 500px;
|
max-width: 500px;
|
||||||
max-height: 40px;
|
max-height: 80px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
@ -2014,8 +2014,13 @@ export const chatStyles = css`
|
|||||||
}
|
}
|
||||||
|
|
||||||
#messageContent code {
|
#messageContent code {
|
||||||
background-color: rgba(#616161, 0.1);
|
background: #0D0D0D;
|
||||||
color: #616161;
|
color: #FFF;
|
||||||
|
font-family: 'JetBrainsMono', monospace;
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#messageContent pre {
|
#messageContent pre {
|
||||||
@ -2034,12 +2039,10 @@ export const chatStyles = css`
|
|||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#messageContent img {
|
#messageContent img {
|
||||||
width: 1.7em;
|
width: 1.7em;
|
||||||
height: 1.5em;
|
height: 1.5em;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#messageContent blockquote {
|
#messageContent blockquote {
|
||||||
@ -2078,8 +2081,13 @@ export const chatStyles = css`
|
|||||||
}
|
}
|
||||||
|
|
||||||
.replied-message code {
|
.replied-message code {
|
||||||
background-color: rgba(#616161, 0.1);
|
background: #0D0D0D;
|
||||||
color: #616161;
|
color: #FFF;
|
||||||
|
font-family: 'JetBrainsMono', monospace;
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
margin: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.replied-message pre {
|
.replied-message pre {
|
||||||
@ -7138,18 +7146,28 @@ export const qchatStyles = css`
|
|||||||
* {
|
* {
|
||||||
--mdc-theme-primary: rgb(3, 169, 244);
|
--mdc-theme-primary: rgb(3, 169, 244);
|
||||||
--mdc-theme-secondary: var(--mdc-theme-primary);
|
--mdc-theme-secondary: var(--mdc-theme-primary);
|
||||||
--paper-input-container-focus-color: var(--mdc-theme-primary);
|
|
||||||
--mdc-theme-surface: var(--white);
|
--mdc-theme-surface: var(--white);
|
||||||
--mdc-dialog-content-ink-color: var(--black);
|
--mdc-dialog-content-ink-color: var(--black);
|
||||||
|
--mdc-dialog-min-width: 750px;
|
||||||
--lumo-primary-text-color: rgb(0, 167, 245);
|
--lumo-primary-text-color: rgb(0, 167, 245);
|
||||||
--lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
|
--lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
|
||||||
--lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
|
--lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
|
||||||
--lumo-primary-color: hsl(199, 100%, 48%);
|
--lumo-primary-color: hsl(199, 100%, 48%);
|
||||||
|
--lumo-secondary-text-color: var(--sectxt);
|
||||||
|
--lumo-contrast-60pct: var(--vdicon);
|
||||||
|
--item-selected-color: var(--nav-selected-color);
|
||||||
--lumo-base-color: var(--white);
|
--lumo-base-color: var(--white);
|
||||||
--lumo-body-text-color: var(--black);
|
--lumo-body-text-color: var(--black);
|
||||||
--_lumo-grid-border-color: var(--border);
|
--_lumo-grid-border-color: var(--border);
|
||||||
--_lumo-grid-secondary-border-color: var(--border2);
|
--_lumo-grid-secondary-border-color: var(--border2);
|
||||||
--mdc-dialog-min-width: 750px;
|
--item-selected-color-text: var(--nav-selected-color-text);
|
||||||
|
--item-color-active: var(--nav-color-active);
|
||||||
|
--item-color-hover: var(--nav-color-hover);
|
||||||
|
--item-text-color: var(--nav-text-color);
|
||||||
|
--item-icon-color: var(--nav-icon-color);
|
||||||
|
--item-border-color: var(--nav-border-color);
|
||||||
|
--item-border-selected-color: var(--nav-border-selected-color);
|
||||||
|
--paper-input-container-focus-color: var(--mdc-theme-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
paper-spinner-lite {
|
paper-spinner-lite {
|
||||||
@ -7440,6 +7458,10 @@ export const qchatStyles = css`
|
|||||||
--mdc-theme-primary: red;
|
--mdc-theme-primary: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.green {
|
||||||
|
--mdc-theme-primary: #198754;
|
||||||
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
@ -7598,6 +7620,154 @@ export const qchatStyles = css`
|
|||||||
color: #04aa2e;
|
color: #04aa2e;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.close-check {
|
||||||
|
color: var(--black);
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
position: absolute;
|
||||||
|
top: -15px;
|
||||||
|
right: -15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-check:hover {
|
||||||
|
color: #df3636;
|
||||||
|
}
|
||||||
|
|
||||||
|
paper-dialog.check {
|
||||||
|
width: auto;
|
||||||
|
max-width: 50vw;
|
||||||
|
height: auto;
|
||||||
|
max-height: 30vh;
|
||||||
|
background-color: var(--white);
|
||||||
|
color: var(--black);
|
||||||
|
border: 1px solid var(--black);
|
||||||
|
border-radius: 15px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 15px;
|
||||||
|
line-height: 1.6;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
paper-dialog.close-check {
|
||||||
|
min-width: 550px;
|
||||||
|
max-width: 550px;
|
||||||
|
height: auto;
|
||||||
|
background-color: var(--white);
|
||||||
|
color: var(--black);
|
||||||
|
border: 1px solid var(--black);
|
||||||
|
border-radius: 15px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 15px;
|
||||||
|
font-size: 17px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 20px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid {
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div {
|
||||||
|
position: absolute;
|
||||||
|
width: 34px;
|
||||||
|
height: 34px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #03a9f4;
|
||||||
|
animation: view-grid 1.2s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(1) {
|
||||||
|
top: 4px;
|
||||||
|
left: 4px;
|
||||||
|
animation-delay: 0s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(2) {
|
||||||
|
top: 4px;
|
||||||
|
left: 48px;
|
||||||
|
animation-delay: -0.4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(3) {
|
||||||
|
top: 4px;
|
||||||
|
left: 90px;
|
||||||
|
animation-delay: -0.8s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(4) {
|
||||||
|
top: 50px;
|
||||||
|
left: 4px;
|
||||||
|
animation-delay: -0.4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(5) {
|
||||||
|
top: 50px;
|
||||||
|
left: 48px;
|
||||||
|
animation-delay: -0.8s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(6) {
|
||||||
|
top: 50px;
|
||||||
|
left: 90px;
|
||||||
|
animation-delay: -1.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(7) {
|
||||||
|
top: 95px;
|
||||||
|
left: 4px;
|
||||||
|
animation-delay: -0.8s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(8) {
|
||||||
|
top: 95px;
|
||||||
|
left: 48px;
|
||||||
|
animation-delay: -1.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-grid div:nth-child(9) {
|
||||||
|
top: 95px;
|
||||||
|
left: 90px;
|
||||||
|
animation-delay: -1.6s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes view-grid {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
paper-dialog.viewSettings {
|
||||||
|
min-width: 525px;
|
||||||
|
max-width: 525px;
|
||||||
|
min-height: auto;
|
||||||
|
max-height: 150px;
|
||||||
|
background-color: var(--white);
|
||||||
|
color: var(--black);
|
||||||
|
line-height: 1.6;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid var(--black);
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 15px;
|
||||||
|
box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.view {
|
||||||
|
display: inline;
|
||||||
|
width: 50%;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
export const becomeMinterStyles = css`
|
export const becomeMinterStyles = css`
|
||||||
@ -8363,7 +8533,7 @@ export const groupManagementStyles = css`
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
height: 75%;
|
height: 85%;
|
||||||
width: 2.6px;
|
width: 2.6px;
|
||||||
background-color: var(--mdc-theme-primary);
|
background-color: var(--mdc-theme-primary);
|
||||||
}
|
}
|
||||||
@ -8387,7 +8557,7 @@ export const groupManagementStyles = css`
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
max-width: 500px;
|
max-width: 500px;
|
||||||
max-height: 40px;
|
max-height: 80px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
@ -12230,6 +12400,10 @@ export const webBrowserModalStyles = css`
|
|||||||
z-index: 1000001;
|
z-index: 1000001;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.modal-body {
|
||||||
|
padding: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes modal_transition {
|
@keyframes modal_transition {
|
||||||
0% {
|
0% {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
@ -12253,8 +12427,30 @@ export const webBrowserModalStyles = css`
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-body {
|
.modal-content-error {
|
||||||
padding: 25px;
|
background-color: #ffdddd;
|
||||||
|
border-radius: 15px;
|
||||||
|
border: 1px solid var(--black);
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
|
||||||
|
max-width: 80%;
|
||||||
|
min-width: 300px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content-success {
|
||||||
|
background-color: #ddffdd;
|
||||||
|
border-radius: 15px;
|
||||||
|
border: 1px solid var(--black);
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
|
||||||
|
max-width: 80%;
|
||||||
|
min-width: 300px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-subcontainer {
|
.modal-subcontainer {
|
||||||
@ -12266,22 +12462,23 @@ export const webBrowserModalStyles = css`
|
|||||||
}
|
}
|
||||||
|
|
||||||
.modal-subcontainer-error {
|
.modal-subcontainer-error {
|
||||||
color: var(--black);
|
color: 000;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 15px;
|
gap: 1ßpx;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
max-height: calc(95vh - 250px);
|
max-height: calc(95vh - 250px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-paragraph-error {
|
.modal-subcontainer-success {
|
||||||
font-family: Roboto, sans-serif;
|
color: 000;
|
||||||
font-size: 20px;
|
display: flex;
|
||||||
letter-spacing: 0.3px;
|
flex-direction: column;
|
||||||
font-weight: 700;
|
align-items: center;
|
||||||
color: var(--black);
|
gap: 10px;
|
||||||
margin: 0;
|
overflow: auto;
|
||||||
|
max-height: calc(95vh - 250px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-paragraph {
|
.modal-paragraph {
|
||||||
@ -12295,6 +12492,50 @@ export const webBrowserModalStyles = css`
|
|||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.modal-paragraph-error {
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
letter-spacing: 0.3px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: 000;
|
||||||
|
margin: 0;
|
||||||
|
word-wrap: break-word;
|
||||||
|
overflow-wrap: break-wor
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-paragraph-success {
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
letter-spacing: 0.3px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: 000;
|
||||||
|
margin: 0;
|
||||||
|
word-wrap: break-word;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-paragraph-error-header {
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
letter-spacing: 0.3px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: 000;
|
||||||
|
margin: 0;
|
||||||
|
word-wrap: break-word;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-paragraph-success-header {
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
letter-spacing: 0.3px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: 000;
|
||||||
|
margin: 0;
|
||||||
|
word-wrap: break-word;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
.capitalize-first {
|
.capitalize-first {
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
|
@ -54,3 +54,187 @@ export const mimeToExtensionMap = {
|
|||||||
"application/x-gzip": ".gz",
|
"application/x-gzip": ".gz",
|
||||||
"application/x-bzip2": ".bz2",
|
"application/x-bzip2": ".bz2",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const parseQortalLink = (link) => {
|
||||||
|
const prefix = "qortal://use-embed/"
|
||||||
|
|
||||||
|
let params = {}
|
||||||
|
|
||||||
|
if (!link.startsWith(prefix)) {
|
||||||
|
throw new Error("Invalid link format")
|
||||||
|
}
|
||||||
|
|
||||||
|
const [typePart, queryPart] = link.slice(prefix.length).split("?")
|
||||||
|
const type = typePart.split("/")[0].toUpperCase()
|
||||||
|
|
||||||
|
if (queryPart) {
|
||||||
|
const queryPairs = queryPart.split("&")
|
||||||
|
queryPairs.forEach((pair) => {
|
||||||
|
const [key, value] = pair.split("=")
|
||||||
|
if (key && value) {
|
||||||
|
const decodedKey = decodeURIComponent(key.trim())
|
||||||
|
const decodedValue = value.trim().replace(/<\/?[^>]+(>|$)/g,"")
|
||||||
|
params[decodedKey] = decodedValue
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return { type, ...params }
|
||||||
|
}
|
||||||
|
|
||||||
|
export const extensionToPointer = (repString) => {
|
||||||
|
const replace00 = repString.split('qortal://use-embed/').join('<newpointer>qortal://use-embed/')
|
||||||
|
const replace01 = replace00.split('.pdf').join('.pdf</newpointer>')
|
||||||
|
const replace02 = replace01.split('.doc').join('.doc</newpointer>')
|
||||||
|
const replace03 = replace02.split('.xls').join('.xls</newpointer>')
|
||||||
|
const replace04 = replace03.split('.ppt').join('.ppt</newpointer>')
|
||||||
|
const replace05 = replace04.split('.odt').join('.odt</newpointer>')
|
||||||
|
const replace06 = replace05.split('.ods').join('.ods</newpointer>')
|
||||||
|
const replace07 = replace06.split('.odp').join('.odp</newpointer>')
|
||||||
|
const replace08 = replace07.split('.txt').join('.txt</newpointer>')
|
||||||
|
const replace09 = replace08.split('.csv').join('.csv</newpointer>')
|
||||||
|
const replace10 = replace09.split('.html').join('.html</newpointer>')
|
||||||
|
const replace11 = replace10.split('.xml').join('.xml</newpointer>')
|
||||||
|
const replace12 = replace11.split('.json').join('.json</newpointer>')
|
||||||
|
const replace13 = replace12.split('.jpg').join('.jpg</newpointer>')
|
||||||
|
const replace14 = replace13.split('.png').join('.png</newpointer>')
|
||||||
|
const replace15 = replace14.split('.gif').join('.gif</newpointer>')
|
||||||
|
const replace16 = replace15.split('.webp').join('.webp</newpointer>')
|
||||||
|
const replace17 = replace16.split('.svg').join('.svg</newpointer>')
|
||||||
|
const replace18 = replace17.split('.tif').join('.tif</newpointer>')
|
||||||
|
const replace19 = replace18.split('.bmp').join('.bmp</newpointer>')
|
||||||
|
const replace20 = replace19.split('.mp3').join('.mp3</newpointer>')
|
||||||
|
const replace21 = replace20.split('.ogg').join('.ogg</newpointer>')
|
||||||
|
const replace22 = replace21.split('.wav').join('.wav</newpointer>')
|
||||||
|
const replace23 = replace22.split('.webm').join('.webm</newpointer>')
|
||||||
|
const replace24 = replace23.split('.ogv').join('.ogv</newpointer>')
|
||||||
|
const replace25 = replace24.split('.avi').join('.avi</newpointer>')
|
||||||
|
const replace26 = replace25.split('.mov').join('.mov</newpointer>')
|
||||||
|
const replace27 = replace26.split('.wmv').join('.wmv</newpointer>')
|
||||||
|
const replace28 = replace27.split('.mpeg').join('.mpeg</newpointer>')
|
||||||
|
const replace29 = replace28.split('.3gp').join('.3gp</newpointer>')
|
||||||
|
const replace30 = replace29.split('.3g2').join('.3g2</newpointer>')
|
||||||
|
const replace31 = replace30.split('.mkv').join('.mkv</newpointer>')
|
||||||
|
const replace32 = replace31.split('.flv').join('.flv</newpointer>')
|
||||||
|
const replace33 = replace32.split('.zip').join('.zip</newpointer>')
|
||||||
|
const replace34 = replace33.split('.rar').join('.rar</newpointer>')
|
||||||
|
const replace35 = replace34.split('.tar').join('.tar</newpointer>')
|
||||||
|
const replace36 = replace35.split('.7z').join('.7z</newpointer>')
|
||||||
|
const replace37 = replace36.split('.gz').join('.gz</newpointer>')
|
||||||
|
const replace38 = replace37.split('.bz2').join('.bz2</newpointer>')
|
||||||
|
|
||||||
|
return replace38
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encodedToChar = (encodedString) => {
|
||||||
|
const encode01 = encodedString.split('&').join('&')
|
||||||
|
const encode02 = encode01.split(' ').join(' ')
|
||||||
|
const encode03 = encode02.split('<').join('<')
|
||||||
|
const encode04 = encode03.split('>').join('>')
|
||||||
|
const encode05 = encode04.split('"').join('"')
|
||||||
|
const encode06 = encode05.split('%20').join(' ')
|
||||||
|
const encode07 = encode06.split('%23').join('#')
|
||||||
|
const encode08 = encode07.split('%24').join('$')
|
||||||
|
const encode09 = encode08.split('%26').join('&')
|
||||||
|
const encode10 = encode09.split('%2B').join('+')
|
||||||
|
const encode11 = encode10.split('%2C').join(',')
|
||||||
|
const encode12 = encode11.split('%2F').join('/')
|
||||||
|
const encode13 = encode12.split('%3A').join(':')
|
||||||
|
const encode14 = encode13.split('%3B').join(';')
|
||||||
|
const encode15 = encode14.split('%3D').join('=')
|
||||||
|
const encode16 = encode15.split('%3F').join('?')
|
||||||
|
const encode17 = encode16.split('%40').join('@')
|
||||||
|
|
||||||
|
return encode17
|
||||||
|
}
|
||||||
|
|
||||||
|
export const embedToString = (embed) => {
|
||||||
|
let embedString = ''
|
||||||
|
let embedService = ''
|
||||||
|
let embedName = ''
|
||||||
|
let embedIdentifier = ''
|
||||||
|
let embedAttachmentName = ''
|
||||||
|
|
||||||
|
if (embed.type === "IMAGE") {
|
||||||
|
embedService = embed.service
|
||||||
|
embedName = embed.name
|
||||||
|
embedIdentifier = embed.identifier
|
||||||
|
embedString = '"images":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '"}],"isImageDeleted":false'
|
||||||
|
} else if (embed.type === "ATTACHMENT") {
|
||||||
|
embedService = embed.service
|
||||||
|
embedName = embed.name
|
||||||
|
embedIdentifier = embed.identifier
|
||||||
|
embedAttachmentName = embed.fileName
|
||||||
|
embedString = '"attachments":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '","attachmentName":"' + embedAttachmentName + '","attachmentSize":0}],"isAttachmentDeleted":false'
|
||||||
|
} else {
|
||||||
|
embedString = '"images":[""]'
|
||||||
|
}
|
||||||
|
|
||||||
|
return embedString
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const listOfAllQortalRequests = [
|
||||||
|
'IS_USING_GATEWAY',
|
||||||
|
'ADMIN_ACTION',
|
||||||
|
'SHOW_ACTIONS',
|
||||||
|
'CREATE_AND_COPY_EMBED_LINK',
|
||||||
|
'GET_USER_ACCOUNT',
|
||||||
|
'REGISTER_NAME',
|
||||||
|
'UPDATE_NAME',
|
||||||
|
'ENCRYPT_DATA',
|
||||||
|
'DECRYPT_DATA',
|
||||||
|
'ENCRYPT_QORTAL_GROUP_DATA',
|
||||||
|
'DECRYPT_QORTAL_GROUP_DATA',
|
||||||
|
'ENCRYPT_DATA_WITH_SHARING_KEY',
|
||||||
|
'DECRYPT_DATA_WITH_SHARING_KEY',
|
||||||
|
'DECRYPT_AESGCM',
|
||||||
|
'CREATE_TRADE_BUY_ORDER',
|
||||||
|
'CREATE_TRADE_SELL_ORDER',
|
||||||
|
'CANCEL_TRADE_SELL_ORDER',
|
||||||
|
'GET_LIST_ITEMS',
|
||||||
|
'ADD_LIST_ITEMS',
|
||||||
|
'DELETE_LIST_ITEM',
|
||||||
|
'GET_FRIENDS_LIST',
|
||||||
|
'LINK_TO_QDN_RESOURCE',
|
||||||
|
'QDN_RESOURCE_DISPLAYED',
|
||||||
|
'SET_TAB_NOTIFICATIONS',
|
||||||
|
'PUBLISH_QDN_RESOURCE',
|
||||||
|
'PUBLISH_MULTIPLE_QDN_RESOURCES',
|
||||||
|
'VOTE_ON_POLL',
|
||||||
|
'CREATE_POLL',
|
||||||
|
'OPEN_NEW_TAB',
|
||||||
|
'NOTIFICATIONS_PERMISSION',
|
||||||
|
'SEND_LOCAL_NOTIFICATION',
|
||||||
|
'SEND_CHAT_MESSAGE',
|
||||||
|
'JOIN_GROUP',
|
||||||
|
'LEAVE_GROUP',
|
||||||
|
'INVITE_TO_GROUP',
|
||||||
|
'CANCEL_GROUP_INVITE',
|
||||||
|
'KICK_FROM_GROUP',
|
||||||
|
'BAN_FROM_GROUP',
|
||||||
|
'CANCEL_GROUP_BAN',
|
||||||
|
'ADD_GROUP_ADMIN',
|
||||||
|
'REMOVE_GROUP_ADMIN',
|
||||||
|
'SAVE_FILE',
|
||||||
|
'GET_HOSTED_DATA',
|
||||||
|
'DELETE_HOSTED_DATA',
|
||||||
|
'DEPLOY_AT',
|
||||||
|
'GET_PROFILE_DATA',
|
||||||
|
'SET_PROFILE_DATA',
|
||||||
|
'OPEN_PROFILE',
|
||||||
|
'GET_USER_WALLET',
|
||||||
|
'GET_WALLET_BALANCE',
|
||||||
|
'GET_USER_WALLET_INFO',
|
||||||
|
'GET_CROSSCHAIN_SERVER_INFO',
|
||||||
|
'GET_TX_ACTIVITY_SUMMARY',
|
||||||
|
'GET_FOREIGN_FEE',
|
||||||
|
'UPDATE_FOREIGN_FEE',
|
||||||
|
'GET_SERVER_CONNECTION_HISTORY',
|
||||||
|
'SET_CURRENT_FOREIGN_SERVER',
|
||||||
|
'ADD_FOREIGN_SERVER',
|
||||||
|
'REMOVE_FOREIGN_SERVER',
|
||||||
|
'GET_DAY_SUMMARY',
|
||||||
|
'SIGN_TRANSACTION',
|
||||||
|
'SEND_COIN'
|
||||||
|
]
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import Base58 from '../../../../crypto/api/deps/Base58'
|
||||||
import nacl from '../../../../crypto/api/deps/nacl-fast.js'
|
import nacl from '../../../../crypto/api/deps/nacl-fast.js'
|
||||||
import ed2curve from '../../../../crypto/api/deps/ed2curve.js'
|
import ed2curve from '../../../../crypto/api/deps/ed2curve.js'
|
||||||
|
|
||||||
@ -33,10 +34,14 @@ export const fileToBase64 = (file) => new Promise(async (resolve, reject) => {
|
|||||||
if (!reader) {
|
if (!reader) {
|
||||||
reader = new FileReader()
|
reader = new FileReader()
|
||||||
}
|
}
|
||||||
|
|
||||||
await semaphore.acquire()
|
await semaphore.acquire()
|
||||||
|
|
||||||
reader.readAsDataURL(file)
|
reader.readAsDataURL(file)
|
||||||
|
|
||||||
reader.onload = () => {
|
reader.onload = () => {
|
||||||
const dataUrl = reader.result
|
const dataUrl = reader.result
|
||||||
|
|
||||||
if (typeof dataUrl === "string") {
|
if (typeof dataUrl === "string") {
|
||||||
const base64String = dataUrl.split(',')[1]
|
const base64String = dataUrl.split(',')[1]
|
||||||
reader.onload = null
|
reader.onload = null
|
||||||
@ -49,6 +54,7 @@ export const fileToBase64 = (file) => new Promise(async (resolve, reject) => {
|
|||||||
}
|
}
|
||||||
semaphore.release()
|
semaphore.release()
|
||||||
}
|
}
|
||||||
|
|
||||||
reader.onerror = (error) => {
|
reader.onerror = (error) => {
|
||||||
reader.onload = null
|
reader.onload = null
|
||||||
reader.onerror = null
|
reader.onerror = null
|
||||||
@ -73,9 +79,11 @@ export function base64ToUint8Array(base64) {
|
|||||||
const binaryString = atob(base64)
|
const binaryString = atob(base64)
|
||||||
const len = binaryString.length
|
const len = binaryString.length
|
||||||
const bytes = new Uint8Array(len)
|
const bytes = new Uint8Array(len)
|
||||||
|
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
bytes[i] = binaryString.charCodeAt(i)
|
bytes[i] = binaryString.charCodeAt(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes
|
return bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,6 +234,102 @@ export const encryptDataGroup = ({ data64, publicKeys }) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const encryptDataGroupNew = (data64, publicKeys, privateKey, userPublicKey, customSymmetricKey) => {
|
||||||
|
let combinedPublicKeys = [...publicKeys, userPublicKey]
|
||||||
|
|
||||||
|
const decodedPrivateKey = Base58.decode(privateKey)
|
||||||
|
const publicKeysDuplicateFree = [...new Set(combinedPublicKeys)]
|
||||||
|
const Uint8ArrayData = base64ToUint8Array(data64)
|
||||||
|
|
||||||
|
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||||
|
throw new Error("The Uint8ArrayData you've submitted is invalid")
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Generate a random symmetric key for the message.
|
||||||
|
let messageKey
|
||||||
|
|
||||||
|
if(customSymmetricKey){
|
||||||
|
messageKey = base64ToUint8Array(customSymmetricKey)
|
||||||
|
} else {
|
||||||
|
messageKey = new Uint8Array(32)
|
||||||
|
crypto.getRandomValues(messageKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!messageKey) throw new Error('Cannot create symmetric key')
|
||||||
|
|
||||||
|
const nonce = new Uint8Array(24)
|
||||||
|
|
||||||
|
crypto.getRandomValues(nonce)
|
||||||
|
|
||||||
|
// Encrypt the data with the symmetric key.
|
||||||
|
const encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||||
|
|
||||||
|
// Generate a keyNonce outside of the loop.
|
||||||
|
const keyNonce = new Uint8Array(24)
|
||||||
|
crypto.getRandomValues(keyNonce)
|
||||||
|
|
||||||
|
// Encrypt the symmetric key for each recipient.
|
||||||
|
let encryptedKeys = []
|
||||||
|
|
||||||
|
publicKeysDuplicateFree.forEach((recipientPublicKey) => {
|
||||||
|
const publicKeyUnit8Array = Base58.decode(recipientPublicKey)
|
||||||
|
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||||
|
const convertedPublicKey = ed2curve.convertPublicKey(publicKeyUnit8Array)
|
||||||
|
const sharedSecret = new Uint8Array(32)
|
||||||
|
|
||||||
|
// the length of the sharedSecret will be 32 + 16
|
||||||
|
// When you're encrypting data using nacl.secretbox, it's adding an authentication tag to the result, which is 16 bytes long. This tag is used for verifying the integrity and authenticity of the data when it is decrypted
|
||||||
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
|
||||||
|
|
||||||
|
// Encrypt the symmetric key with the shared secret.
|
||||||
|
const encryptedKey = nacl.secretbox(messageKey, keyNonce, sharedSecret)
|
||||||
|
|
||||||
|
encryptedKeys.push(encryptedKey)
|
||||||
|
})
|
||||||
|
|
||||||
|
const str = "qortalGroupEncryptedData"
|
||||||
|
const strEncoder = new TextEncoder()
|
||||||
|
const strUint8Array = strEncoder.encode(str)
|
||||||
|
|
||||||
|
// Convert sender's public key to Uint8Array and add to the message
|
||||||
|
const senderPublicKeyUint8Array = Base58.decode(userPublicKey)
|
||||||
|
|
||||||
|
// Combine all data into a single Uint8Array.
|
||||||
|
// Calculate size of combinedData
|
||||||
|
let combinedDataSize = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length + 4
|
||||||
|
let encryptedKeysSize = 0
|
||||||
|
|
||||||
|
encryptedKeys.forEach((key) => {
|
||||||
|
encryptedKeysSize += key.length
|
||||||
|
})
|
||||||
|
|
||||||
|
combinedDataSize += encryptedKeysSize
|
||||||
|
let combinedData = new Uint8Array(combinedDataSize)
|
||||||
|
combinedData.set(strUint8Array)
|
||||||
|
combinedData.set(nonce, strUint8Array.length)
|
||||||
|
combinedData.set(keyNonce, strUint8Array.length + nonce.length)
|
||||||
|
combinedData.set(senderPublicKeyUint8Array, strUint8Array.length + nonce.length + keyNonce.length)
|
||||||
|
combinedData.set(encryptedData, strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length)
|
||||||
|
|
||||||
|
// Initialize offset for encryptedKeys
|
||||||
|
let encryptedKeysOffset = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length
|
||||||
|
|
||||||
|
encryptedKeys.forEach((key) => {
|
||||||
|
combinedData.set(key, encryptedKeysOffset)
|
||||||
|
encryptedKeysOffset += key.length
|
||||||
|
})
|
||||||
|
|
||||||
|
const countArray = new Uint8Array(new Uint32Array([publicKeysDuplicateFree.length]).buffer)
|
||||||
|
combinedData.set(countArray, combinedData.length - 4)
|
||||||
|
|
||||||
|
return uint8ArrayToBase64(combinedData)
|
||||||
|
} catch (error) {
|
||||||
|
console.log('error', error)
|
||||||
|
throw new Error("Error in encrypting data")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function uint8ArrayStartsWith(uint8Array, string) {
|
export function uint8ArrayStartsWith(uint8Array, string) {
|
||||||
const stringEncoder = new TextEncoder()
|
const stringEncoder = new TextEncoder()
|
||||||
const stringUint8Array = stringEncoder.encode(string)
|
const stringUint8Array = stringEncoder.encode(string)
|
||||||
@ -317,3 +421,100 @@ export function decryptGroupData(data64EncryptedData) {
|
|||||||
}
|
}
|
||||||
throw new Error("Unable to decrypt data")
|
throw new Error("Unable to decrypt data")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function decryptGroupDataNew(data64EncryptedData, privateKey) {
|
||||||
|
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||||
|
const str = "qortalGroupEncryptedData"
|
||||||
|
const strEncoder = new TextEncoder()
|
||||||
|
const strUint8Array = strEncoder.encode(str)
|
||||||
|
|
||||||
|
// Extract the nonce
|
||||||
|
const nonceStartPosition = strUint8Array.length
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const nonceEndPosition = nonceStartPosition + 24
|
||||||
|
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the shared keyNonce
|
||||||
|
const keyNonceStartPosition = nonceEndPosition
|
||||||
|
|
||||||
|
// Nonce is 24 bytes
|
||||||
|
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||||
|
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||||
|
|
||||||
|
// Extract the sender's public key
|
||||||
|
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||||
|
|
||||||
|
// Public keys are 32 bytes
|
||||||
|
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||||
|
const senderPublicKey = allCombined.slice(senderPublicKeyStartPosition, senderPublicKeyEndPosition)
|
||||||
|
|
||||||
|
// Calculate count first
|
||||||
|
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||||
|
const countStartPosition = allCombined.length - 4
|
||||||
|
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||||
|
const count = new Uint32Array(countArray.buffer)[0]
|
||||||
|
|
||||||
|
// Then use count to calculate encryptedData
|
||||||
|
// start position of encryptedData
|
||||||
|
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||||
|
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||||
|
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||||
|
|
||||||
|
// Extract the encrypted keys
|
||||||
|
// 32+16 = 48
|
||||||
|
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48))
|
||||||
|
|
||||||
|
if (!privateKey) {
|
||||||
|
throw new Error("Unable to retrieve keys")
|
||||||
|
}
|
||||||
|
|
||||||
|
const decodedPrivateKey = Base58.decode(privateKey)
|
||||||
|
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||||
|
const convertedSenderPublicKey = ed2curve.convertPublicKey(senderPublicKey)
|
||||||
|
const sharedSecret = new Uint8Array(32)
|
||||||
|
|
||||||
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedSenderPublicKey)
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48)
|
||||||
|
console.log("Encrypted KEY", encryptedKey)
|
||||||
|
console.log("KEY NONCE", keyNonce)
|
||||||
|
console.log("SHARED SECRET", sharedSecret)
|
||||||
|
// Decrypt the symmetric key.
|
||||||
|
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret)
|
||||||
|
|
||||||
|
// If decryption was successful, decryptedKey will not be null.
|
||||||
|
if (decryptedKey) {
|
||||||
|
// Decrypt the data using the symmetric key.
|
||||||
|
const decryptedData = nacl.secretbox.open(encryptedData, nonce, decryptedKey)
|
||||||
|
|
||||||
|
// If decryption was successful, decryptedData will not be null.
|
||||||
|
if (decryptedData) {
|
||||||
|
return {decryptedData, count}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error("Unable to decrypt data")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const base64ToBlobUrl = (base64, mimeType = "image/png") => {
|
||||||
|
const binary = atob(base64)
|
||||||
|
const array = []
|
||||||
|
|
||||||
|
for (let i = 0; i < binary.length; i++) {
|
||||||
|
array.push(binary.charCodeAt(i))
|
||||||
|
}
|
||||||
|
|
||||||
|
const blob = new Blob([new Uint8Array(array)], { type: mimeType })
|
||||||
|
|
||||||
|
return URL.createObjectURL(blob)
|
||||||
|
}
|
||||||
|
|
||||||
|
export let groupSecretkeys = {}
|
||||||
|
|
||||||
|
export function roundUpToDecimals(number, decimals = 8) {
|
||||||
|
const factor = Math.pow(10, decimals)
|
||||||
|
return Math.ceil(+number * factor) / factor
|
||||||
|
}
|
||||||
|
@ -1,62 +1,49 @@
|
|||||||
|
// IS_USING_PUBLIC_NODE
|
||||||
|
export const IS_USING_PUBLIC_NODE = 'IS_USING_PUBLIC_NODE'
|
||||||
|
|
||||||
|
// ADMIN_ACTION
|
||||||
|
export const ADMIN_ACTION = 'ADMIN_ACTION'
|
||||||
|
|
||||||
|
// SHOW_ACTIONS
|
||||||
|
export const SHOW_ACTIONS = 'SHOW_ACTIONS'
|
||||||
|
|
||||||
|
// CREATE_AND_COPY_EMBED_LINK
|
||||||
|
|
||||||
// GET_USER_ACCOUNT
|
// GET_USER_ACCOUNT
|
||||||
export const GET_USER_ACCOUNT = 'GET_USER_ACCOUNT'
|
export const GET_USER_ACCOUNT = 'GET_USER_ACCOUNT'
|
||||||
|
|
||||||
// LINK_TO_QDN_RESOURCE
|
// REGISTER_NAME
|
||||||
export const LINK_TO_QDN_RESOURCE = 'LINK_TO_QDN_RESOURCE'
|
// UPDATE_NAME
|
||||||
|
|
||||||
// QDN_RESOURCE_DISPLAYED
|
// ENCRYPT_DATA
|
||||||
export const QDN_RESOURCE_DISPLAYED = 'QDN_RESOURCE_DISPLAYED'
|
export const ENCRYPT_DATA = 'ENCRYPT_DATA'
|
||||||
|
|
||||||
// PUBLISH_QDN_RESOURCE
|
// DECRYPT_DATA
|
||||||
export const PUBLISH_QDN_RESOURCE = 'PUBLISH_QDN_RESOURCE'
|
export const DECRYPT_DATA = 'DECRYPT_DATA'
|
||||||
|
|
||||||
// SEND_CHAT_MESSAGE
|
// ENCRYPT_QORTAL_GROUP_DATA
|
||||||
export const SEND_CHAT_MESSAGE = 'SEND_CHAT_MESSAGE'
|
export const ENCRYPT_QORTAL_GROUP_DATA = 'ENCRYPT_QORTAL_GROUP_DATA'
|
||||||
|
|
||||||
// JOIN_GROUP
|
// DECRYPT_QORTAL_GROUP_DATA
|
||||||
export const JOIN_GROUP = 'JOIN_GROUP'
|
export const DECRYPT_QORTAL_GROUP_DATA = 'DECRYPT_QORTAL_GROUP_DATA'
|
||||||
|
|
||||||
// DEPLOY_AT
|
// ENCRYPT_DATA_WITH_SHARING_KEY
|
||||||
export const DEPLOY_AT = 'DEPLOY_AT'
|
export const ENCRYPT_DATA_WITH_SHARING_KEY = 'ENCRYPT_DATA_WITH_SHARING_KEY'
|
||||||
|
|
||||||
// GET_USER_WALLET
|
// DECRYPT_DATA_WITH_SHARING_KEY
|
||||||
export const GET_USER_WALLET = 'GET_USER_WALLET'
|
export const DECRYPT_DATA_WITH_SHARING_KEY = 'DECRYPT_DATA_WITH_SHARING_KEY'
|
||||||
|
|
||||||
// GET_USER_WALLET_INFO
|
// DECRYPT_AESGCM
|
||||||
export const GET_USER_WALLET_INFO = 'GET_USER_WALLET_INFO'
|
export const DECRYPT_AESGCM = 'DECRYPT_AESGCM'
|
||||||
|
|
||||||
// GET_CROSSCHAIN_SERVER_INFO
|
// CREATE_TRADE_BUY_ORDER
|
||||||
export const GET_CROSSCHAIN_SERVER_INFO = 'GET_CROSSCHAIN_SERVER_INFO'
|
export const CREATE_TRADE_BUY_ORDER = 'CREATE_TRADE_BUY_ORDER'
|
||||||
|
|
||||||
// GET_TX_ACTIVITY_SUMMARY
|
// CREATE_TRADE_SELL_ORDER
|
||||||
export const GET_TX_ACTIVITY_SUMMARY = 'GET_TX_ACTIVITY_SUMMARY'
|
export const CREATE_TRADE_SELL_ORDER = 'CREATE_TRADE_SELL_ORDER'
|
||||||
|
|
||||||
// GET_FOREIGN_FEE action
|
// CANCEL_TRADE_SELL_ORDER
|
||||||
export const GET_FOREIGN_FEE = 'GET_FOREIGN_FEE';
|
export const CANCEL_TRADE_SELL_ORDER = 'CANCEL_TRADE_SELL_ORDER'
|
||||||
|
|
||||||
// UPDATE_FOREIGN_FEE action
|
|
||||||
export const UPDATE_FOREIGN_FEE = 'UPDATE_FOREIGN_FEE';
|
|
||||||
|
|
||||||
// GET_SERVER_CONNECTION_HISTORY
|
|
||||||
export let GET_SERVER_CONNECTION_HISTORY = "GET_SERVER_CONNECTION_HISTORY";
|
|
||||||
|
|
||||||
// SET_CURRENT_FOREIGN_SERVER
|
|
||||||
export let SET_CURRENT_FOREIGN_SERVER = "SET_CURRENT_FOREIGN_SERVER";
|
|
||||||
|
|
||||||
// ADD_FOREIGN_SERVER
|
|
||||||
export let ADD_FOREIGN_SERVER = "ADD_FOREIGN_SERVER";
|
|
||||||
|
|
||||||
// REMOVE_FOREIGN_SERVER
|
|
||||||
export let REMOVE_FOREIGN_SERVER = "REMOVE_FOREIGN_SERVER";
|
|
||||||
|
|
||||||
// GET_WALLET_BALANCE action
|
|
||||||
export const GET_WALLET_BALANCE = 'GET_WALLET_BALANCE'
|
|
||||||
|
|
||||||
// SEND_COIN
|
|
||||||
export const SEND_COIN = 'SEND_COIN'
|
|
||||||
|
|
||||||
// PUBLISH_MULTIPLE_QDN_RESOURCES
|
|
||||||
export const PUBLISH_MULTIPLE_QDN_RESOURCES = 'PUBLISH_MULTIPLE_QDN_RESOURCES'
|
|
||||||
|
|
||||||
// GET_LIST_ITEMS
|
// GET_LIST_ITEMS
|
||||||
export const GET_LIST_ITEMS = 'GET_LIST_ITEMS'
|
export const GET_LIST_ITEMS = 'GET_LIST_ITEMS'
|
||||||
@ -67,21 +54,30 @@ export const ADD_LIST_ITEMS = 'ADD_LIST_ITEMS'
|
|||||||
// DELETE_LIST_ITEM
|
// DELETE_LIST_ITEM
|
||||||
export const DELETE_LIST_ITEM = 'DELETE_LIST_ITEM'
|
export const DELETE_LIST_ITEM = 'DELETE_LIST_ITEM'
|
||||||
|
|
||||||
// ENCRYPT_DATA
|
// GET_FRIENDS_LIST
|
||||||
export const ENCRYPT_DATA = 'ENCRYPT_DATA'
|
export const GET_FRIENDS_LIST = 'GET_FRIENDS_LIST'
|
||||||
|
|
||||||
// DECRYPT_DATA
|
// LINK_TO_QDN_RESOURCE
|
||||||
export const DECRYPT_DATA = 'DECRYPT_DATA'
|
export const LINK_TO_QDN_RESOURCE = 'LINK_TO_QDN_RESOURCE'
|
||||||
|
|
||||||
// DECRYPT_DATA_GROUP
|
// QDN_RESOURCE_DISPLAYED
|
||||||
export const DECRYPT_DATA_GROUP = 'DECRYPT_DATA_GROUP'
|
export const QDN_RESOURCE_DISPLAYED = 'QDN_RESOURCE_DISPLAYED'
|
||||||
|
|
||||||
// SAVE_FILE
|
|
||||||
export const SAVE_FILE = 'SAVE_FILE'
|
|
||||||
|
|
||||||
// SET_TAB_NOTIFICATIONS
|
// SET_TAB_NOTIFICATIONS
|
||||||
export const SET_TAB_NOTIFICATIONS = 'SET_TAB_NOTIFICATIONS'
|
export const SET_TAB_NOTIFICATIONS = 'SET_TAB_NOTIFICATIONS'
|
||||||
|
|
||||||
|
// PUBLISH_QDN_RESOURCE
|
||||||
|
export const PUBLISH_QDN_RESOURCE = 'PUBLISH_QDN_RESOURCE'
|
||||||
|
|
||||||
|
// PUBLISH_MULTIPLE_QDN_RESOURCES
|
||||||
|
export const PUBLISH_MULTIPLE_QDN_RESOURCES = 'PUBLISH_MULTIPLE_QDN_RESOURCES'
|
||||||
|
|
||||||
|
// VOTE_ON_POLL
|
||||||
|
export const VOTE_ON_POLL= 'VOTE_ON_POLL'
|
||||||
|
|
||||||
|
// CREATE_POLL
|
||||||
|
export const CREATE_POLL= 'CREATE_POLL'
|
||||||
|
|
||||||
// OPEN_NEW_TAB
|
// OPEN_NEW_TAB
|
||||||
export const OPEN_NEW_TAB = 'OPEN_NEW_TAB'
|
export const OPEN_NEW_TAB = 'OPEN_NEW_TAB'
|
||||||
|
|
||||||
@ -91,11 +87,29 @@ export const NOTIFICATIONS_PERMISSION = 'NOTIFICATIONS_PERMISSION'
|
|||||||
// SEND_LOCAL_NOTIFICATION
|
// SEND_LOCAL_NOTIFICATION
|
||||||
export const SEND_LOCAL_NOTIFICATION = 'SEND_LOCAL_NOTIFICATION'
|
export const SEND_LOCAL_NOTIFICATION = 'SEND_LOCAL_NOTIFICATION'
|
||||||
|
|
||||||
// VOTE_ON_POLL
|
// SEND_CHAT_MESSAGE
|
||||||
export const VOTE_ON_POLL= 'VOTE_ON_POLL'
|
export const SEND_CHAT_MESSAGE = 'SEND_CHAT_MESSAGE'
|
||||||
|
|
||||||
// CREATE_POLL
|
// JOIN_GROUP
|
||||||
export const CREATE_POLL= 'CREATE_POLL'
|
export const JOIN_GROUP = 'JOIN_GROUP'
|
||||||
|
|
||||||
|
// LEAVE_GROUP
|
||||||
|
// INVITE_TO_GROUP
|
||||||
|
// CANCEL_GROUP_INVITE
|
||||||
|
// KICK_FROM_GROUP
|
||||||
|
// BAN_FROM_GROUP
|
||||||
|
// CANCEL_GROUP_BAN
|
||||||
|
// ADD_GROUP_ADMIN
|
||||||
|
// REMOVE_GROUP_ADMIN
|
||||||
|
|
||||||
|
// SAVE_FILE
|
||||||
|
export const SAVE_FILE = 'SAVE_FILE'
|
||||||
|
|
||||||
|
// GET_HOSTED_DATA
|
||||||
|
// DELETE_HOSTED_DATA
|
||||||
|
|
||||||
|
// DEPLOY_AT
|
||||||
|
export const DEPLOY_AT = 'DEPLOY_AT'
|
||||||
|
|
||||||
// GET_PROFILE_DATA
|
// GET_PROFILE_DATA
|
||||||
export const GET_PROFILE_DATA = 'GET_PROFILE_DATA'
|
export const GET_PROFILE_DATA = 'GET_PROFILE_DATA'
|
||||||
@ -103,11 +117,47 @@ export const GET_PROFILE_DATA = 'GET_PROFILE_DATA'
|
|||||||
// SET_PROFILE_DATA
|
// SET_PROFILE_DATA
|
||||||
export const SET_PROFILE_DATA= 'SET_PROFILE_DATA'
|
export const SET_PROFILE_DATA= 'SET_PROFILE_DATA'
|
||||||
|
|
||||||
|
// OPEN_PROFILE
|
||||||
|
export const OPEN_PROFILE = 'OPEN_PROFILE'
|
||||||
|
|
||||||
|
// GET_USER_WALLET
|
||||||
|
export const GET_USER_WALLET = 'GET_USER_WALLET'
|
||||||
|
|
||||||
|
// GET_WALLET_BALANCE
|
||||||
|
export const GET_WALLET_BALANCE = 'GET_WALLET_BALANCE'
|
||||||
|
|
||||||
|
// GET_USER_WALLET_INFO
|
||||||
|
export const GET_USER_WALLET_INFO = 'GET_USER_WALLET_INFO'
|
||||||
|
|
||||||
|
// GET_CROSSCHAIN_SERVER_INFO
|
||||||
|
export const GET_CROSSCHAIN_SERVER_INFO = 'GET_CROSSCHAIN_SERVER_INFO'
|
||||||
|
|
||||||
|
// GET_TX_ACTIVITY_SUMMARY
|
||||||
|
export const GET_TX_ACTIVITY_SUMMARY = 'GET_TX_ACTIVITY_SUMMARY'
|
||||||
|
|
||||||
|
// GET_FOREIGN_FEE
|
||||||
|
export const GET_FOREIGN_FEE = 'GET_FOREIGN_FEE'
|
||||||
|
|
||||||
|
// UPDATE_FOREIGN_FEE
|
||||||
|
export const UPDATE_FOREIGN_FEE = 'UPDATE_FOREIGN_FEE'
|
||||||
|
|
||||||
|
// GET_SERVER_CONNECTION_HISTORY
|
||||||
|
export let GET_SERVER_CONNECTION_HISTORY = 'GET_SERVER_CONNECTION_HISTORY'
|
||||||
|
|
||||||
|
// SET_CURRENT_FOREIGN_SERVER
|
||||||
|
export let SET_CURRENT_FOREIGN_SERVER = 'SET_CURRENT_FOREIGN_SERVER'
|
||||||
|
|
||||||
|
// ADD_FOREIGN_SERVER
|
||||||
|
export let ADD_FOREIGN_SERVER = 'ADD_FOREIGN_SERVER'
|
||||||
|
|
||||||
|
// REMOVE_FOREIGN_SERVER
|
||||||
|
export let REMOVE_FOREIGN_SERVER = 'REMOVE_FOREIGN_SERVER'
|
||||||
|
|
||||||
// GET_DAY_SUMMARY
|
// GET_DAY_SUMMARY
|
||||||
export const GET_DAY_SUMMARY = 'GET_DAY_SUMMARY'
|
export const GET_DAY_SUMMARY = 'GET_DAY_SUMMARY'
|
||||||
|
|
||||||
// GET_FRIENDS_LIST
|
// SIGN_TRANSACTION
|
||||||
export const GET_FRIENDS_LIST = 'GET_FRIENDS_LIST'
|
export const SIGN_TRANSACTION = 'SIGN_TRANSACTION'
|
||||||
|
|
||||||
// OPEN_PROFILE
|
// SEND_COIN
|
||||||
export const OPEN_PROFILE = 'OPEN_PROFILE'
|
export const SEND_COIN = 'SEND_COIN'
|
||||||
|
@ -1,4 +1,16 @@
|
|||||||
import { Sha256 } from 'asmcrypto.js'
|
import { Sha256 } from 'asmcrypto.js'
|
||||||
|
import {
|
||||||
|
uint8ArrayToBase64,
|
||||||
|
base64ToUint8Array,
|
||||||
|
uint8ArrayToObject,
|
||||||
|
decryptSingle
|
||||||
|
} from './GroupEncryption.js'
|
||||||
|
import {
|
||||||
|
extensionToPointer,
|
||||||
|
encodedToChar,
|
||||||
|
embedToString,
|
||||||
|
parseQortalLink
|
||||||
|
} from './qdn-action-constants.js'
|
||||||
|
|
||||||
const nacl = {}
|
const nacl = {}
|
||||||
|
|
||||||
@ -2731,7 +2743,6 @@ class Curve25519 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const base58Instant = new Base58()
|
const base58Instant = new Base58()
|
||||||
|
|
||||||
const curve25519Instance = new Curve25519()
|
const curve25519Instance = new Curve25519()
|
||||||
|
|
||||||
self.addEventListener('message', async (e) => {
|
self.addEventListener('message', async (e) => {
|
||||||
@ -2741,7 +2752,8 @@ self.addEventListener('message', async (e) => {
|
|||||||
eachMessage,
|
eachMessage,
|
||||||
e.data.isReceipient,
|
e.data.isReceipient,
|
||||||
e.data._publicKey,
|
e.data._publicKey,
|
||||||
e.data.privateKey
|
e.data.privateKey,
|
||||||
|
e.data.secretKeys
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
postMessage(decodeMsgs)
|
postMessage(decodeMsgs)
|
||||||
@ -2754,7 +2766,16 @@ self.addEventListener('message', async (e) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const decode = (string) => {
|
const decode = (string, keys, ref) => {
|
||||||
|
let repliedToStr = ''
|
||||||
|
let hubSpecialId = ''
|
||||||
|
let hubMessageStr = ''
|
||||||
|
let newMessageObject = ''
|
||||||
|
let reactionStr = ''
|
||||||
|
let messageUseEmbed = {}
|
||||||
|
let editStr = false
|
||||||
|
let embedFileStr = '"images":[""]'
|
||||||
|
|
||||||
const binaryString = atob(string)
|
const binaryString = atob(string)
|
||||||
const binaryLength = binaryString.length
|
const binaryLength = binaryString.length
|
||||||
const bytes = new Uint8Array(binaryLength)
|
const bytes = new Uint8Array(binaryLength)
|
||||||
@ -2765,7 +2786,60 @@ const decode = (string) => {
|
|||||||
|
|
||||||
const decoder = new TextDecoder()
|
const decoder = new TextDecoder()
|
||||||
const decodedString = decoder.decode(bytes)
|
const decodedString = decoder.decode(bytes)
|
||||||
return decodedString
|
|
||||||
|
if (decodedString.includes("messageText") || decodedString === "4001") {
|
||||||
|
if (decodedString === "4001") {
|
||||||
|
const firstString = 'First group key created.'
|
||||||
|
const hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + firstString + '"}]}]},"images":[""],"repliedTo":"","version":3}'
|
||||||
|
return hubString
|
||||||
|
} else {
|
||||||
|
return decodedString
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const res = decryptSingle(string, keys, false)
|
||||||
|
|
||||||
|
if (res === 'noKey' || res === 'decryptionFailed') {
|
||||||
|
return '{"specialId":"","message":"<p>This message could not be decrypted</p>","repliedTo":"","isEdited":false,"isFromHub":true,"version": 3}'
|
||||||
|
}
|
||||||
|
|
||||||
|
const decryptToUnit8Array = base64ToUint8Array(res)
|
||||||
|
const responseData = uint8ArrayToObject(decryptToUnit8Array)
|
||||||
|
|
||||||
|
if (responseData.type === "edit") {
|
||||||
|
editStr = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseData.repliedTo) {
|
||||||
|
repliedToStr = responseData.repliedTo
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseData.specialId) {
|
||||||
|
hubSpecialId = responseData.specialId
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseData.type === "notification") {
|
||||||
|
hubMessageStr = responseData.data.message
|
||||||
|
} else if (ref !== "noref" && responseData.type === "reaction") {
|
||||||
|
reactionStr = '"isReaction":true,'
|
||||||
|
repliedToStr = ref
|
||||||
|
hubMessageStr = responseData.content
|
||||||
|
} else if (responseData.message.includes('qortal://use-embed/')) {
|
||||||
|
const useEmbed1 = extensionToPointer(responseData.message)
|
||||||
|
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
|
||||||
|
const useEmbed3 = encodedToChar(useEmbed2[1])
|
||||||
|
messageUseEmbed = parseQortalLink(useEmbed3)
|
||||||
|
embedFileStr = embedToString(messageUseEmbed)
|
||||||
|
hubMessageStr = responseData.message.split(useEmbed2[1]).join('')
|
||||||
|
} else {
|
||||||
|
hubMessageStr = responseData.message
|
||||||
|
}
|
||||||
|
|
||||||
|
const hubMessageFinal = hubMessageStr.split('"').join('"')
|
||||||
|
|
||||||
|
newMessageObject = '{"specialId":"' + hubSpecialId + '","message":"' + hubMessageFinal + '",' + embedFileStr + ',"repliedTo":"' + repliedToStr + '","isEdited":' + editStr + ',"isFromHub":true,' + reactionStr + '"version": 3}'
|
||||||
|
|
||||||
|
return newMessageObject
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipientPublicKey, lastReference) => {
|
export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipientPublicKey, lastReference) => {
|
||||||
@ -2819,10 +2893,18 @@ export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipient
|
|||||||
return _decryptedMessage
|
return _decryptedMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let decrypted1 = new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||||
|
|
||||||
|
if (decrypted1.includes('messageText')) {
|
||||||
|
let decrypted2 = JSON.parse(decrypted1)
|
||||||
|
let decrypted3 = Object.assign(decrypted2, {isPrivate: true})
|
||||||
|
return JSON.stringify(decrypted3)
|
||||||
|
}
|
||||||
|
|
||||||
return new TextDecoder('utf-8').decode(_decryptedMessage)
|
return new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey) => {
|
const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey, secretKeys) => {
|
||||||
let isReceipientVar
|
let isReceipientVar
|
||||||
let _publicKeyVar
|
let _publicKeyVar
|
||||||
|
|
||||||
@ -2847,7 +2929,7 @@ const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey)
|
|||||||
)
|
)
|
||||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||||
} else if (encodedMessageObj.isEncrypted === false && encodedMessageObj.data) {
|
} else if (encodedMessageObj.isEncrypted === false && encodedMessageObj.data) {
|
||||||
let decodedMessage = decode(encodedMessageObj.data)
|
let decodedMessage = decode(encodedMessageObj.data, secretKeys)
|
||||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||||
} else {
|
} else {
|
||||||
decodedMessageObj = {
|
decodedMessageObj = {
|
||||||
@ -2857,7 +2939,16 @@ const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// group chat
|
// group chat
|
||||||
let decodedMessage = decode(encodedMessageObj.data)
|
let decodedMessage
|
||||||
|
|
||||||
|
const noRef = "noref"
|
||||||
|
|
||||||
|
if (encodedMessageObj.chatReference) {
|
||||||
|
decodedMessage = decode(encodedMessageObj.data, secretKeys, encodedMessageObj.chatReference)
|
||||||
|
} else {
|
||||||
|
decodedMessage = decode(encodedMessageObj.data, secretKeys, noRef)
|
||||||
|
}
|
||||||
|
|
||||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -12,6 +12,7 @@ import '@vaadin/grid'
|
|||||||
|
|
||||||
// Multi language support
|
// Multi language support
|
||||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||||
|
|
||||||
registerTranslateConfig({
|
registerTranslateConfig({
|
||||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||||
})
|
})
|
||||||
@ -427,7 +428,9 @@ class NodeManagement extends LitElement {
|
|||||||
|
|
||||||
async addPeer() {
|
async addPeer() {
|
||||||
this.addPeerLoading = true
|
this.addPeerLoading = true
|
||||||
|
|
||||||
const addPeerAddress = this.shadowRoot.getElementById('addPeerAddress').value
|
const addPeerAddress = this.shadowRoot.getElementById('addPeerAddress').value
|
||||||
|
|
||||||
await parentEpml.request('apiCall', {
|
await parentEpml.request('apiCall', {
|
||||||
url: `/peers?apiKey=${this.getApiKey()}`,
|
url: `/peers?apiKey=${this.getApiKey()}`,
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@ -456,7 +459,6 @@ class NodeManagement extends LitElement {
|
|||||||
addMintingAccount() {
|
addMintingAccount() {
|
||||||
this.addMintingAccountLoading = true
|
this.addMintingAccountLoading = true
|
||||||
this.addMintingAccountMessage = 'Loading...'
|
this.addMintingAccountMessage = 'Loading...'
|
||||||
|
|
||||||
this.addMintingAccountKey = this.shadowRoot.querySelector('#addMintingAccountKey').value
|
this.addMintingAccountKey = this.shadowRoot.querySelector('#addMintingAccountKey').value
|
||||||
|
|
||||||
parentEpml.request('apiCall', {
|
parentEpml.request('apiCall', {
|
||||||
@ -479,8 +481,10 @@ class NodeManagement extends LitElement {
|
|||||||
|
|
||||||
updateMintingAccounts() {
|
updateMintingAccounts() {
|
||||||
this.mintingAccounts = []
|
this.mintingAccounts = []
|
||||||
|
|
||||||
parentEpml.request('apiCall', {
|
parentEpml.request('apiCall', {
|
||||||
url: `/admin/mintingaccounts`
|
url: `/admin/mintingaccounts?apiKey=${this.getApiKey()}`,
|
||||||
|
method: 'GET'
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
this.mintingAccounts = res
|
this.mintingAccounts = res
|
||||||
})
|
})
|
||||||
@ -517,10 +521,6 @@ class NodeManagement extends LitElement {
|
|||||||
if (!arr) { return true }
|
if (!arr) { return true }
|
||||||
return arr.length === 0
|
return arr.length === 0
|
||||||
}
|
}
|
||||||
|
|
||||||
round(number) {
|
|
||||||
return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window.customElements.define('node-management', NodeManagement)
|
window.customElements.define('node-management', NodeManagement)
|
@ -10,6 +10,7 @@ import '@vaadin/button'
|
|||||||
|
|
||||||
// Multi language support
|
// Multi language support
|
||||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||||
|
|
||||||
registerTranslateConfig({
|
registerTranslateConfig({
|
||||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||||
})
|
})
|
||||||
@ -144,7 +145,6 @@ class OverviewPage extends LitElement {
|
|||||||
async firstUpdated() {
|
async firstUpdated() {
|
||||||
this.changeTheme()
|
this.changeTheme()
|
||||||
this.changeLanguage()
|
this.changeLanguage()
|
||||||
|
|
||||||
this.nodeConfig = window.parent.reduxStore.getState().app.nodeConfig
|
this.nodeConfig = window.parent.reduxStore.getState().app.nodeConfig
|
||||||
this.accountInfo = window.parent.reduxStore.getState().app.accountInfo
|
this.accountInfo = window.parent.reduxStore.getState().app.accountInfo
|
||||||
|
|
||||||
@ -199,11 +199,13 @@ class OverviewPage extends LitElement {
|
|||||||
|
|
||||||
changeTheme() {
|
changeTheme() {
|
||||||
const checkTheme = localStorage.getItem('qortalTheme')
|
const checkTheme = localStorage.getItem('qortalTheme')
|
||||||
|
|
||||||
if (checkTheme === 'dark') {
|
if (checkTheme === 'dark') {
|
||||||
this.theme = 'dark'
|
this.theme = 'dark'
|
||||||
} else {
|
} else {
|
||||||
this.theme = 'light'
|
this.theme = 'light'
|
||||||
}
|
}
|
||||||
|
|
||||||
document.querySelector('html').setAttribute('theme', this.theme)
|
document.querySelector('html').setAttribute('theme', this.theme)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,6 +227,7 @@ class OverviewPage extends LitElement {
|
|||||||
async refreshItems() {
|
async refreshItems() {
|
||||||
this.nodeConfig = window.parent.reduxStore.getState().app.nodeConfig
|
this.nodeConfig = window.parent.reduxStore.getState().app.nodeConfig
|
||||||
this.accountInfo = window.parent.reduxStore.getState().app.accountInfo
|
this.accountInfo = window.parent.reduxStore.getState().app.accountInfo
|
||||||
|
|
||||||
await this.getNodeInfo()
|
await this.getNodeInfo()
|
||||||
await this.getCoreInfo()
|
await this.getCoreInfo()
|
||||||
await this.getBalanceInfo()
|
await this.getBalanceInfo()
|
||||||
@ -234,12 +237,14 @@ class OverviewPage extends LitElement {
|
|||||||
async getMintingKeysList() {
|
async getMintingKeysList() {
|
||||||
this.check1 = false
|
this.check1 = false
|
||||||
this.check2 = false
|
this.check2 = false
|
||||||
|
|
||||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
const nodeStatus = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
const nodeStatus = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||||
const statusUrl = `${nodeStatus}/admin/mintingaccounts`
|
const statusUrl = `${nodeStatus}/admin/mintingaccounts?apiKey=${this.getApiKey()}`
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await fetch(statusUrl)
|
const res = await fetch(statusUrl)
|
||||||
|
|
||||||
this.listAccounts = await res.json()
|
this.listAccounts = await res.json()
|
||||||
|
|
||||||
const addressInfo = window.parent.reduxStore.getState().app.accountInfo.addressInfo
|
const addressInfo = window.parent.reduxStore.getState().app.accountInfo.addressInfo
|
||||||
@ -249,7 +254,6 @@ class OverviewPage extends LitElement {
|
|||||||
const findRemovedSponsorsKey = this.listAccounts.filter((my) => my.address)
|
const findRemovedSponsorsKey = this.listAccounts.filter((my) => my.address)
|
||||||
|
|
||||||
this.check1 = findMyMintingAccount !== undefined
|
this.check1 = findMyMintingAccount !== undefined
|
||||||
|
|
||||||
this.check2 = findMyMintingRecipient !== undefined
|
this.check2 = findMyMintingRecipient !== undefined
|
||||||
|
|
||||||
if (findRemovedSponsorsKey.length > 0) {
|
if (findRemovedSponsorsKey.length > 0) {
|
||||||
@ -285,8 +289,7 @@ class OverviewPage extends LitElement {
|
|||||||
this.cssStatus = ''
|
this.cssStatus = ''
|
||||||
return html`<span class="btn btn-sm btn-info float-right">${translate("walletprofile.wp1")}</span>`
|
return html`<span class="btn btn-sm btn-info float-right">${translate("walletprofile.wp1")}</span>`
|
||||||
} else if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === false && this.check1 === false && this.check2 === true && addressInfo.level == 0 && addressInfo.blocksMinted < 7200) {
|
} else if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === false && this.check1 === false && this.check2 === true && addressInfo.level == 0 && addressInfo.blocksMinted < 7200) {
|
||||||
this.cssStatus = ''
|
return html`<span class="float-right"><start-minting-now></start-minting-now></span>`
|
||||||
return html`<span class="btn btn-sm btn-info float-right">${translate("becomeMinterPage.bchange12")}</span>`
|
|
||||||
} else if (this.check1 === false && this.check2 === false && myMintingKey === true) {
|
} else if (this.check1 === false && this.check2 === false && myMintingKey === true) {
|
||||||
return html`<span class="float-right"><start-minting-now></start-minting-now></span>`
|
return html`<span class="float-right"><start-minting-now></start-minting-now></span>`
|
||||||
} else if (myMintingKey === false) {
|
} else if (myMintingKey === false) {
|
||||||
@ -319,6 +322,7 @@ class OverviewPage extends LitElement {
|
|||||||
const infoNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
const infoNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
const infoNodeUrl = infoNode.protocol + '://' + infoNode.domain + ':' + infoNode.port
|
const infoNodeUrl = infoNode.protocol + '://' + infoNode.domain + ':' + infoNode.port
|
||||||
const nodeUrl = `${infoNodeUrl}/admin/status`
|
const nodeUrl = `${infoNodeUrl}/admin/status`
|
||||||
|
|
||||||
await fetch(nodeUrl).then(response => {
|
await fetch(nodeUrl).then(response => {
|
||||||
return response.json()
|
return response.json()
|
||||||
}).then(data => {
|
}).then(data => {
|
||||||
@ -332,6 +336,7 @@ class OverviewPage extends LitElement {
|
|||||||
const infoCore = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
const infoCore = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
const infoCoreUrl = infoCore.protocol + '://' + infoCore.domain + ':' + infoCore.port
|
const infoCoreUrl = infoCore.protocol + '://' + infoCore.domain + ':' + infoCore.port
|
||||||
const coreUrl = `${infoCoreUrl}/admin/info`
|
const coreUrl = `${infoCoreUrl}/admin/info`
|
||||||
|
|
||||||
await fetch(coreUrl).then(response => {
|
await fetch(coreUrl).then(response => {
|
||||||
return response.json()
|
return response.json()
|
||||||
}).then(data => {
|
}).then(data => {
|
||||||
@ -344,6 +349,7 @@ class OverviewPage extends LitElement {
|
|||||||
const infoBalance = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
const infoBalance = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
const infoBalanceUrl = infoBalance.protocol + '://' + infoBalance.domain + ':' + infoBalance.port
|
const infoBalanceUrl = infoBalance.protocol + '://' + infoBalance.domain + ':' + infoBalance.port
|
||||||
const balanceUrl = `${infoBalanceUrl}/addresses/balance/${this.accountInfo.addressInfo.address}`
|
const balanceUrl = `${infoBalanceUrl}/addresses/balance/${this.accountInfo.addressInfo.address}`
|
||||||
|
|
||||||
await fetch(balanceUrl).then(response => {
|
await fetch(balanceUrl).then(response => {
|
||||||
return response.json()
|
return response.json()
|
||||||
}).then(data => {
|
}).then(data => {
|
||||||
@ -422,7 +428,7 @@ class StartMintingNow extends LitElement {
|
|||||||
async getMintingAcccounts() {
|
async getMintingAcccounts() {
|
||||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||||
const url = `${nodeUrl}/admin/mintingaccounts`
|
const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${this.getApiKey()}`
|
||||||
try {
|
try {
|
||||||
const res = await fetch(url)
|
const res = await fetch(url)
|
||||||
this.mintingAccountData = await res.json()
|
this.mintingAccountData = await res.json()
|
||||||
@ -484,7 +490,9 @@ class StartMintingNow extends LitElement {
|
|||||||
|
|
||||||
let interval = null
|
let interval = null
|
||||||
let stop = false
|
let stop = false
|
||||||
|
|
||||||
this.status = 2
|
this.status = 2
|
||||||
|
|
||||||
const getAnswer = async () => {
|
const getAnswer = async () => {
|
||||||
const rewardShares = async (minterAddr) => {
|
const rewardShares = async (minterAddr) => {
|
||||||
const url = `${nodeUrl}/addresses/rewardshares?minters=${minterAddr}&recipients=${minterAddr}`
|
const url = `${nodeUrl}/addresses/rewardshares?minters=${minterAddr}&recipients=${minterAddr}`
|
||||||
@ -508,6 +516,7 @@ class StartMintingNow extends LitElement {
|
|||||||
stop = false
|
stop = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interval = setInterval(getAnswer, 5000)
|
interval = setInterval(getAnswer, 5000)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,12 +5,21 @@ import { passiveSupport } from 'passive-events-support/src/utils'
|
|||||||
import { Editor, Extension } from '@tiptap/core'
|
import { Editor, Extension } from '@tiptap/core'
|
||||||
import { supportCountryFlagEmojis } from '../components/ChatEmojiFlags'
|
import { supportCountryFlagEmojis } from '../components/ChatEmojiFlags'
|
||||||
import { qchatStyles } from '../components/plugins-css'
|
import { qchatStyles } from '../components/plugins-css'
|
||||||
|
import {
|
||||||
|
decryptGroupData,
|
||||||
|
uint8ArrayToBase64,
|
||||||
|
base64ToUint8Array,
|
||||||
|
uint8ArrayToObject,
|
||||||
|
validateSecretKey
|
||||||
|
} from '../components/GroupEncryption'
|
||||||
|
import Base58 from '../../../../crypto/api/deps/Base58'
|
||||||
import isElectron from 'is-electron'
|
import isElectron from 'is-electron'
|
||||||
import WebWorker from 'web-worker:./computePowWorker'
|
import WebWorker from 'web-worker:./computePowWorker'
|
||||||
import StarterKit from '@tiptap/starter-kit'
|
import StarterKit from '@tiptap/starter-kit'
|
||||||
import Underline from '@tiptap/extension-underline'
|
import Underline from '@tiptap/extension-underline'
|
||||||
import Placeholder from '@tiptap/extension-placeholder'
|
import Placeholder from '@tiptap/extension-placeholder'
|
||||||
import Highlight from '@tiptap/extension-highlight'
|
import Highlight from '@tiptap/extension-highlight'
|
||||||
|
import Mention from '@tiptap/extension-mention'
|
||||||
import ShortUniqueId from 'short-unique-id'
|
import ShortUniqueId from 'short-unique-id'
|
||||||
import snackbar from '../components/snackbar'
|
import snackbar from '../components/snackbar'
|
||||||
import '../components/ChatWelcomePage'
|
import '../components/ChatWelcomePage'
|
||||||
@ -23,9 +32,14 @@ import '@material/mwc-button'
|
|||||||
import '@material/mwc-dialog'
|
import '@material/mwc-dialog'
|
||||||
import '@material/mwc-icon'
|
import '@material/mwc-icon'
|
||||||
import '@material/mwc-snackbar'
|
import '@material/mwc-snackbar'
|
||||||
|
import '@material/mwc-textfield'
|
||||||
|
import '@polymer/paper-dialog/paper-dialog.js'
|
||||||
|
import '@polymer/iron-icons/iron-icons.js'
|
||||||
|
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||||
import '@vaadin/grid'
|
import '@vaadin/grid'
|
||||||
import '@vaadin/tooltip'
|
import '@vaadin/tooltip'
|
||||||
|
import '@vaadin/text-field'
|
||||||
|
|
||||||
// Multi language support
|
// Multi language support
|
||||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||||
@ -49,6 +63,7 @@ class Chat extends LitElement {
|
|||||||
messages: { type: Array },
|
messages: { type: Array },
|
||||||
btnDisable: { type: Boolean },
|
btnDisable: { type: Boolean },
|
||||||
isLoading: { type: Boolean },
|
isLoading: { type: Boolean },
|
||||||
|
isViewOpen: { type: Boolean },
|
||||||
balance: { type: Number },
|
balance: { type: Number },
|
||||||
theme: { type: String, reflect: true },
|
theme: { type: String, reflect: true },
|
||||||
blockedUsers: { type: Array },
|
blockedUsers: { type: Array },
|
||||||
@ -56,6 +71,7 @@ class Chat extends LitElement {
|
|||||||
privateMessagePlaceholder: { type: String },
|
privateMessagePlaceholder: { type: String },
|
||||||
imageFile: { type: Object },
|
imageFile: { type: Object },
|
||||||
activeChatHeadUrl: { type: String },
|
activeChatHeadUrl: { type: String },
|
||||||
|
switchChatHeadUrl: { type: String },
|
||||||
openPrivateMessage: { type: Boolean },
|
openPrivateMessage: { type: Boolean },
|
||||||
userFound: { type: Array },
|
userFound: { type: Array },
|
||||||
userFoundModalOpen: { type: Boolean },
|
userFoundModalOpen: { type: Boolean },
|
||||||
@ -89,6 +105,7 @@ class Chat extends LitElement {
|
|||||||
this.messages = []
|
this.messages = []
|
||||||
this.btnDisable = false
|
this.btnDisable = false
|
||||||
this.isLoading = false
|
this.isLoading = false
|
||||||
|
this.isViewOpen = false
|
||||||
this.showNewMessageBar = this.showNewMessageBar.bind(this)
|
this.showNewMessageBar = this.showNewMessageBar.bind(this)
|
||||||
this.hideNewMessageBar = this.hideNewMessageBar.bind(this)
|
this.hideNewMessageBar = this.hideNewMessageBar.bind(this)
|
||||||
this.setOpenPrivateMessage = this.setOpenPrivateMessage.bind(this)
|
this.setOpenPrivateMessage = this.setOpenPrivateMessage.bind(this)
|
||||||
@ -100,6 +117,7 @@ class Chat extends LitElement {
|
|||||||
this.privateMessagePlaceholder = ''
|
this.privateMessagePlaceholder = ''
|
||||||
this.imageFile = null
|
this.imageFile = null
|
||||||
this.activeChatHeadUrl = ''
|
this.activeChatHeadUrl = ''
|
||||||
|
this.switchChatHeadUrl = ''
|
||||||
this.openPrivateMessage = false
|
this.openPrivateMessage = false
|
||||||
this.userFound = []
|
this.userFound = []
|
||||||
this.userFoundModalOpen = false
|
this.userFoundModalOpen = false
|
||||||
@ -127,6 +145,17 @@ class Chat extends LitElement {
|
|||||||
</vaadin-tooltip>
|
</vaadin-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div style="display:flex; align-items:center;gap:10px">
|
<div style="display:flex; align-items:center;gap:10px">
|
||||||
|
<div id="viewChat" class="create-chat" @click=${() => { this.openView(this.activeChatHeadUrl) }}>
|
||||||
|
<mwc-icon style="color: var(--black);">pageview</mwc-icon>
|
||||||
|
<vaadin-tooltip
|
||||||
|
for="viewChat"
|
||||||
|
position="top"
|
||||||
|
hover-delay=${200}
|
||||||
|
hide-delay=${1}
|
||||||
|
text="Switch Chat Over ID"
|
||||||
|
>
|
||||||
|
</vaadin-tooltip>
|
||||||
|
</div>
|
||||||
<div id="goToGroup" class="create-chat" @click=${() => { this.openTabToGroupManagement() }}>
|
<div id="goToGroup" class="create-chat" @click=${() => { this.openTabToGroupManagement() }}>
|
||||||
<mwc-icon style="color: var(--black);">group_add</mwc-icon>
|
<mwc-icon style="color: var(--black);">group_add</mwc-icon>
|
||||||
<vaadin-tooltip
|
<vaadin-tooltip
|
||||||
@ -161,7 +190,11 @@ class Chat extends LitElement {
|
|||||||
<span>${translate("chatpage.cchange5")} <mwc-icon style="font-size: 16px; vertical-align: bottom;">keyboard_arrow_down</mwc-icon></span>
|
<span>${translate("chatpage.cchange5")} <mwc-icon style="font-size: 16px; vertical-align: bottom;">keyboard_arrow_down</mwc-icon></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-history">
|
<div class="chat-history">
|
||||||
${this.activeChatHeadUrl ? html`${this.renderChatPage()}` : html`${this.renderChatWelcomePage()}`}
|
${this.activeChatHeadUrl ?
|
||||||
|
html`${this.renderChatPage()}`
|
||||||
|
: this.isViewOpen ? html`${this.renderChatViewPage()}`
|
||||||
|
: html`${this.renderChatWelcomePage()}`
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- Start Chatting Dialog -->
|
<!-- Start Chatting Dialog -->
|
||||||
@ -290,6 +323,26 @@ class Chat extends LitElement {
|
|||||||
${translate("general.close")}
|
${translate("general.close")}
|
||||||
</mwc-button>
|
</mwc-button>
|
||||||
</mwc-dialog>
|
</mwc-dialog>
|
||||||
|
<!-- View Chat Over ID -->
|
||||||
|
<paper-dialog id="viewChatDialog" class="viewSettings" modal>
|
||||||
|
<div style="display: inline;">
|
||||||
|
<div class="view">
|
||||||
|
<vaadin-text-field
|
||||||
|
style="width: 350px"
|
||||||
|
id="groupIdInput"
|
||||||
|
required
|
||||||
|
allowed-char-pattern="[0-9]"
|
||||||
|
placeholder="${translate("modals.mpchange87")}"
|
||||||
|
value=""
|
||||||
|
@keydown="${this.viewKeyListener}"
|
||||||
|
clear-button-visible
|
||||||
|
>
|
||||||
|
</vaadin-text-field>
|
||||||
|
<paper-icon-button icon="icons:visibility" @click="${() => this.switchChatID()}" title="${translate("general.view")}"></paper-icon-button>
|
||||||
|
<paper-icon-button icon="icons:close" @click="${() => this.closeView()}" title="${translate("general.close")}"></paper-icon-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</paper-dialog>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
@ -428,9 +481,222 @@ class Chat extends LitElement {
|
|||||||
}, 60000)
|
}, 60000)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async switchChatID() {
|
||||||
|
let viewGroupID = 0
|
||||||
|
let checkTheID = {}
|
||||||
|
let notFound = 'Group ID not found! Please try again...'
|
||||||
|
let wentWrong = 'Something went wrong! Please try again...'
|
||||||
|
|
||||||
|
viewGroupID = this.shadowRoot.getElementById('groupIdInput').value
|
||||||
|
|
||||||
|
await parentEpml.request('apiCall', {
|
||||||
|
url: `/groups/${viewGroupID}`
|
||||||
|
}).then(res => {
|
||||||
|
checkTheID = res
|
||||||
|
})
|
||||||
|
|
||||||
|
if (checkTheID.error) {
|
||||||
|
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||||
|
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||||
|
this.isViewOpen = false
|
||||||
|
this.activeChatHeadUrl = this.switchChatHeadUrl
|
||||||
|
this.switchChatHeadUrl = ''
|
||||||
|
this.resetChatEditor()
|
||||||
|
parentEpml.request('showSnackBar', `${notFound}`)
|
||||||
|
} else if (checkTheID.groupId) {
|
||||||
|
let switchToID = checkTheID.groupName
|
||||||
|
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||||
|
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||||
|
this.switchChatHeadUrl = ''
|
||||||
|
parentEpml.request('showSnackBar', `${switchToID}`)
|
||||||
|
this.processChatID(checkTheID.groupId)
|
||||||
|
} else {
|
||||||
|
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||||
|
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||||
|
this.isViewOpen = false
|
||||||
|
this.activeChatHeadUrl = this.switchChatHeadUrl
|
||||||
|
this.switchChatHeadUrl = ''
|
||||||
|
this.resetChatEditor()
|
||||||
|
parentEpml.request('showSnackBar', `${wentWrong}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openView(currentUrl) {
|
||||||
|
this.switchChatHeadUrl = currentUrl
|
||||||
|
this.activeChatHeadUrl = ''
|
||||||
|
this.isViewOpen = true
|
||||||
|
this.shadowRoot.getElementById('viewChatDialog').open()
|
||||||
|
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||||
|
this.resetChatEditor()
|
||||||
|
}
|
||||||
|
|
||||||
|
closeView() {
|
||||||
|
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||||
|
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||||
|
this.isViewOpen = false
|
||||||
|
this.activeChatHeadUrl = this.switchChatHeadUrl
|
||||||
|
this.switchChatHeadUrl = ''
|
||||||
|
this.resetChatEditor()
|
||||||
|
}
|
||||||
|
|
||||||
|
viewKeyListener(e) {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
this.switchChatID()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async processChatID(newID) {
|
||||||
|
let viewNewUrl = 'group/' + newID
|
||||||
|
this.setActiveChatHeadUrl(viewNewUrl)
|
||||||
|
this.resetChatEditor()
|
||||||
|
}
|
||||||
|
|
||||||
async setActiveChatHeadUrl(url) {
|
async setActiveChatHeadUrl(url) {
|
||||||
this.activeChatHeadUrl = url
|
await this.getSymKeyFile(url)
|
||||||
this.requestUpdate()
|
this.isViewOpen = false
|
||||||
|
}
|
||||||
|
|
||||||
|
async getSymKeyFile(url) {
|
||||||
|
this.secretKeys = {}
|
||||||
|
this.groupAdmins = {}
|
||||||
|
|
||||||
|
let data
|
||||||
|
let supArray = []
|
||||||
|
let allSymKeys = []
|
||||||
|
let gAdmin = ''
|
||||||
|
let gAddress = ''
|
||||||
|
let currentGroupId = url.substring(6)
|
||||||
|
let symIdentifier = 'symmetric-qchat-group-' + currentGroupId
|
||||||
|
let locateString = "Downloading and decrypt keys! Please wait..."
|
||||||
|
let keysToOld = "Wait until an admin re-encrypts the keys. Only unencrypted messages will be displayed."
|
||||||
|
let retryDownload = "Retry downloading and decrypt keys in 5 seconds! Please wait..."
|
||||||
|
let failDownload = "Error downloading and decrypt keys! Only unencrypted messages will be displayed. Please try again later..."
|
||||||
|
let all_ok = false
|
||||||
|
let counter = 0
|
||||||
|
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||||
|
const getNameUrl = `${nodeUrl}/arbitrary/resources?service=DOCUMENT_PRIVATE&identifier=${symIdentifier}&limit=0&reverse=true`
|
||||||
|
const getAdminUrl = `${nodeUrl}/groups/members/${currentGroupId}?onlyAdmins=true&limit=0`
|
||||||
|
|
||||||
|
if (localStorage.getItem("symKeysCurrent") === null) {
|
||||||
|
localStorage.setItem("symKeysCurrent", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
supArray = await fetch(getNameUrl).then(response => {
|
||||||
|
return response.json()
|
||||||
|
})
|
||||||
|
|
||||||
|
if (this.isEmptyArray(supArray) || currentGroupId === 0) {
|
||||||
|
this.activeChatHeadUrl = url
|
||||||
|
this.requestUpdate()
|
||||||
|
} else {
|
||||||
|
parentEpml.request('showSnackBar', `${locateString}`)
|
||||||
|
|
||||||
|
supArray.forEach(item => {
|
||||||
|
const symInfoObj = {
|
||||||
|
name: item.name,
|
||||||
|
identifier: item.identifier,
|
||||||
|
timestamp: item.updated ? item.updated : item.created
|
||||||
|
}
|
||||||
|
allSymKeys.push(symInfoObj)
|
||||||
|
})
|
||||||
|
|
||||||
|
let allSymKeysSorted = allSymKeys.sort(function(a, b) {
|
||||||
|
return b.timestamp - a.timestamp
|
||||||
|
})
|
||||||
|
|
||||||
|
gAdmin = allSymKeysSorted[0].name
|
||||||
|
|
||||||
|
const addressUrl = `${nodeUrl}/names/${gAdmin}`
|
||||||
|
|
||||||
|
let addressObject = await fetch(addressUrl).then(response => {
|
||||||
|
return response.json()
|
||||||
|
})
|
||||||
|
|
||||||
|
gAddress = addressObject.owner
|
||||||
|
|
||||||
|
let adminRes = await fetch(getAdminUrl).then(response => {
|
||||||
|
return response.json()
|
||||||
|
})
|
||||||
|
|
||||||
|
this.groupAdmins = adminRes.members
|
||||||
|
|
||||||
|
const adminExists = (adminAddress) => {
|
||||||
|
return this.groupAdmins.some(function(checkAdmin) {
|
||||||
|
return checkAdmin.member === adminAddress
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adminExists(gAddress)) {
|
||||||
|
const sleep = (t) => new Promise(r => setTimeout(r, t))
|
||||||
|
const dataUrl = `${nodeUrl}/arbitrary/DOCUMENT_PRIVATE/${gAdmin}/${symIdentifier}?encoding=base64`
|
||||||
|
const res = await fetch(dataUrl)
|
||||||
|
|
||||||
|
do {
|
||||||
|
counter++
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
parentEpml.request('showSnackBar', `${retryDownload}`)
|
||||||
|
await sleep(5000)
|
||||||
|
} else {
|
||||||
|
data = await res.text()
|
||||||
|
all_ok = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (counter > 10) {
|
||||||
|
parentEpml.request('showSnackBar', `${failDownload}`)
|
||||||
|
this.activeChatHeadUrl = url
|
||||||
|
this.requestUpdate()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} while (!all_ok)
|
||||||
|
|
||||||
|
const decryptedKey = await this.decryptGroupEncryption(data)
|
||||||
|
|
||||||
|
if (decryptedKey === undefined) {
|
||||||
|
parentEpml.request('showSnackBar', `${keysToOld}`)
|
||||||
|
this.activeChatHeadUrl = url
|
||||||
|
this.requestUpdate()
|
||||||
|
} else {
|
||||||
|
const dataint8Array = base64ToUint8Array(decryptedKey.data)
|
||||||
|
const decryptedKeyToObject = uint8ArrayToObject(dataint8Array)
|
||||||
|
|
||||||
|
if (!validateSecretKey(decryptedKeyToObject)) {
|
||||||
|
throw new Error("SecretKey is not valid")
|
||||||
|
}
|
||||||
|
|
||||||
|
localStorage.removeItem("symKeysCurrent")
|
||||||
|
localStorage.setItem("symKeysCurrent", "")
|
||||||
|
let oldSymIdentifier = JSON.parse(localStorage.getItem("symKeysCurrent") || "[]")
|
||||||
|
oldSymIdentifier.push(decryptedKeyToObject)
|
||||||
|
localStorage.setItem("symKeysCurrent", JSON.stringify(oldSymIdentifier))
|
||||||
|
|
||||||
|
let arraySecretKeys = JSON.parse(localStorage.getItem("symKeysCurrent") || "[]")
|
||||||
|
|
||||||
|
this.secretKeys = arraySecretKeys[0]
|
||||||
|
this.activeChatHeadUrl = url
|
||||||
|
this.requestUpdate()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.activeChatHeadUrl = url
|
||||||
|
this.requestUpdate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async decryptGroupEncryption(data) {
|
||||||
|
try {
|
||||||
|
const privateKey = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey)
|
||||||
|
const encryptedData = decryptGroupData(data, privateKey)
|
||||||
|
return {
|
||||||
|
data: uint8ArrayToBase64(encryptedData.decryptedData),
|
||||||
|
count: encryptedData.count
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log("Error:", error.message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resetChatEditor() {
|
resetChatEditor() {
|
||||||
@ -461,6 +727,7 @@ class Chat extends LitElement {
|
|||||||
StarterKit,
|
StarterKit,
|
||||||
Underline,
|
Underline,
|
||||||
Highlight,
|
Highlight,
|
||||||
|
Mention,
|
||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: 'Write something …'
|
placeholder: 'Write something …'
|
||||||
}),
|
}),
|
||||||
@ -905,6 +1172,22 @@ class Chat extends LitElement {
|
|||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderChatViewPage() {
|
||||||
|
return html`
|
||||||
|
<div class="view-grid">
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
renderChatHead(chatHeadArr) {
|
renderChatHead(chatHeadArr) {
|
||||||
return chatHeadArr.map(eachChatHead => {
|
return chatHeadArr.map(eachChatHead => {
|
||||||
return html`<chat-head activeChatHeadUrl=${this.activeChatHeadUrl} .setActiveChatHeadUrl=${(val) => this.setActiveChatHeadUrl(val)} chatInfo=${JSON.stringify(eachChatHead)}></chat-head>`
|
return html`<chat-head activeChatHeadUrl=${this.activeChatHeadUrl} .setActiveChatHeadUrl=${(val) => this.setActiveChatHeadUrl(val)} chatInfo=${JSON.stringify(eachChatHead)}></chat-head>`
|
||||||
@ -959,6 +1242,20 @@ class Chat extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getGroupType(newGroupId) {
|
||||||
|
try {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||||
|
const response = await fetch(`${nodeUrl}/groups/${newGroupId}`)
|
||||||
|
const data = await response.json()
|
||||||
|
|
||||||
|
return data.isOpen
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching group type', error)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async setChatHeads(chatObj) {
|
async setChatHeads(chatObj) {
|
||||||
const chatObjGroups = Array.isArray(chatObj.groups) ? chatObj.groups : []
|
const chatObjGroups = Array.isArray(chatObj.groups) ? chatObj.groups : []
|
||||||
const chatObjDirect = Array.isArray(chatObj.direct) ? chatObj.direct : []
|
const chatObjDirect = Array.isArray(chatObj.direct) ? chatObj.direct : []
|
||||||
@ -968,12 +1265,14 @@ class Chat extends LitElement {
|
|||||||
url: `group/${group.groupId}`,
|
url: `group/${group.groupId}`,
|
||||||
groupName: 'Qortal General Chat',
|
groupName: 'Qortal General Chat',
|
||||||
timestamp: group.timestamp === undefined ? 2 : group.timestamp,
|
timestamp: group.timestamp === undefined ? 2 : group.timestamp,
|
||||||
sender: group.sender
|
sender: group.sender,
|
||||||
|
isOpen: true
|
||||||
} : {
|
} : {
|
||||||
...group,
|
...group,
|
||||||
timestamp: group.timestamp === undefined ? 1 : group.timestamp,
|
timestamp: group.timestamp === undefined ? 1 : group.timestamp,
|
||||||
url: `group/${group.groupId}`,
|
url: `group/${group.groupId}`,
|
||||||
ownerName: group.ownerName === undefined ? await this.getOwnerName(group.groupId) : 'undefined'
|
ownerName: group.ownerName === undefined ? await this.getOwnerName(group.groupId) : 'undefined',
|
||||||
|
isOpen: group.isOpen === undefined ? await this.getGroupType(group.groupId) : true
|
||||||
}))
|
}))
|
||||||
|
|
||||||
let directList = chatObjDirect.map(dc => {
|
let directList = chatObjDirect.map(dc => {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -13,6 +13,7 @@ import '@vaadin/grid'
|
|||||||
|
|
||||||
// Multi language support
|
// Multi language support
|
||||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||||
|
|
||||||
registerTranslateConfig({
|
registerTranslateConfig({
|
||||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||||
})
|
})
|
||||||
@ -346,7 +347,7 @@ class RewardShare extends LitElement {
|
|||||||
getTxnRequestResponse(myTransaction)
|
getTxnRequestResponse(myTransaction)
|
||||||
}
|
}
|
||||||
} else if (accountDetails.address === recipientAddress) {
|
} else if (accountDetails.address === recipientAddress) {
|
||||||
if (accountDetails.level >= 1 && accountDetails.level <= 4) {
|
if (accountDetails.level <= 4) {
|
||||||
this.error = false
|
this.error = false
|
||||||
this.message = ''
|
this.message = ''
|
||||||
let myTransaction = await makeTransactionRequest(lastRef)
|
let myTransaction = await makeTransactionRequest(lastRef)
|
||||||
@ -361,7 +362,6 @@ class RewardShare extends LitElement {
|
|||||||
getTxnRequestResponse(myTransaction)
|
getTxnRequestResponse(myTransaction)
|
||||||
}
|
}
|
||||||
} else if (accountDetails.level >= 5) {
|
} else if (accountDetails.level >= 5) {
|
||||||
|
|
||||||
this.error = false
|
this.error = false
|
||||||
this.message = ''
|
this.message = ''
|
||||||
let myTransaction = await makeTransactionRequest(lastRef)
|
let myTransaction = await makeTransactionRequest(lastRef)
|
||||||
@ -504,7 +504,7 @@ class RewardShare extends LitElement {
|
|||||||
getTxnRequestResponse(myTransaction)
|
getTxnRequestResponse(myTransaction)
|
||||||
}
|
}
|
||||||
} else if (accountDetails.address === recipientAddress) {
|
} else if (accountDetails.address === recipientAddress) {
|
||||||
if (accountDetails.level >= 1 && accountDetails.level <= 4) {
|
if (accountDetails.level <= 4) {
|
||||||
this.error = false
|
this.error = false
|
||||||
this.message = ''
|
this.message = ''
|
||||||
let myTransaction = await makeTransactionRequest(lastRef)
|
let myTransaction = await makeTransactionRequest(lastRef)
|
||||||
@ -519,7 +519,6 @@ class RewardShare extends LitElement {
|
|||||||
getTxnRequestResponse(myTransaction)
|
getTxnRequestResponse(myTransaction)
|
||||||
}
|
}
|
||||||
} else if (accountDetails.level >= 5) {
|
} else if (accountDetails.level >= 5) {
|
||||||
|
|
||||||
this.error = false
|
this.error = false
|
||||||
this.message = ''
|
this.message = ''
|
||||||
let myTransaction = await makeTransactionRequest(lastRef)
|
let myTransaction = await makeTransactionRequest(lastRef)
|
||||||
|
@ -136,9 +136,10 @@ function attemptReconnectNodeStatusSocket() {
|
|||||||
const initBlockSocket = () => {
|
const initBlockSocket = () => {
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
let activeBlockSocketLink
|
let activeBlockSocketLink
|
||||||
|
|
||||||
if (window.parent.location.protocol === "https:") {
|
if (nodeProtocol === "https") {
|
||||||
activeBlockSocketLink = `wss://${nodeUrl}/websockets/blocks`
|
activeBlockSocketLink = `wss://${nodeUrl}/websockets/blocks`
|
||||||
} else {
|
} else {
|
||||||
activeBlockSocketLink = `ws://${nodeUrl}/websockets/blocks`
|
activeBlockSocketLink = `ws://${nodeUrl}/websockets/blocks`
|
||||||
@ -205,9 +206,10 @@ const pingactiveBlockSocket = () => {
|
|||||||
const initNodeStatusSocket = () => {
|
const initNodeStatusSocket = () => {
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
let activeNodeStatusSocketLink
|
let activeNodeStatusSocketLink
|
||||||
|
|
||||||
if (window.parent.location.protocol === "https:") {
|
if (nodeProtocol === "https") {
|
||||||
activeNodeStatusSocketLink = `wss://${nodeUrl}/websockets/admin/status`
|
activeNodeStatusSocketLink = `wss://${nodeUrl}/websockets/admin/status`
|
||||||
} else {
|
} else {
|
||||||
activeNodeStatusSocketLink = `ws://${nodeUrl}/websockets/admin/status`
|
activeNodeStatusSocketLink = `ws://${nodeUrl}/websockets/admin/status`
|
||||||
|
@ -112,9 +112,10 @@ parentEpml.subscribe('logged_in', async isLoggedIn => {
|
|||||||
const initChatHeadSocket = () => {
|
const initChatHeadSocket = () => {
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
let activeChatSocketLink
|
let activeChatSocketLink
|
||||||
|
|
||||||
if (window.parent.location.protocol === "https:") {
|
if (nodeProtocol === "https") {
|
||||||
activeChatSocketLink = `wss://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64`
|
activeChatSocketLink = `wss://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64`
|
||||||
} else {
|
} else {
|
||||||
activeChatSocketLink = `ws://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64`
|
activeChatSocketLink = `ws://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64`
|
||||||
|
@ -2882,7 +2882,7 @@ class TradeBotPortal extends LitElement {
|
|||||||
const initTradeOffersWebSocket = (restarted = false) => {
|
const initTradeOffersWebSocket = (restarted = false) => {
|
||||||
let tradeOffersSocketCounter = 0
|
let tradeOffersSocketCounter = 0
|
||||||
let socketTimeout
|
let socketTimeout
|
||||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
||||||
const socket = new WebSocket(socketLink)
|
const socket = new WebSocket(socketLink)
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
setTimeout(pingSocket, 50)
|
setTimeout(pingSocket, 50)
|
||||||
@ -2914,7 +2914,7 @@ class TradeBotPortal extends LitElement {
|
|||||||
|
|
||||||
const initTradeBotWebSocket = (restarted = false) => {
|
const initTradeBotWebSocket = (restarted = false) => {
|
||||||
let socketTimeout
|
let socketTimeout
|
||||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||||
const socket = new WebSocket(socketLink)
|
const socket = new WebSocket(socketLink)
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
setTimeout(pingSocket, 50)
|
setTimeout(pingSocket, 50)
|
||||||
@ -2943,7 +2943,7 @@ class TradeBotPortal extends LitElement {
|
|||||||
|
|
||||||
const initTradePresenceWebSocket = (restarted = false) => {
|
const initTradePresenceWebSocket = (restarted = false) => {
|
||||||
let socketTimeout
|
let socketTimeout
|
||||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence`
|
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradepresence`
|
||||||
const socket = new WebSocket(socketLink)
|
const socket = new WebSocket(socketLink)
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
setTimeout(pingSocket, 50)
|
setTimeout(pingSocket, 50)
|
||||||
@ -3289,10 +3289,19 @@ class TradeBotPortal extends LitElement {
|
|||||||
|
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ':' + myNode.port
|
let nodeUrl = myNode.domain + ':' + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
|
let checkProtocol
|
||||||
|
|
||||||
|
if (nodeProtocol === "https") {
|
||||||
|
checkProtocol = 'wss'
|
||||||
|
} else {
|
||||||
|
checkProtocol = 'ws'
|
||||||
|
}
|
||||||
|
|
||||||
const modifiers = [
|
const modifiers = [
|
||||||
|
{ searchValue: 'PROTOCOL', replaceValue: checkProtocol },
|
||||||
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
||||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin },
|
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }
|
||||||
]
|
]
|
||||||
|
|
||||||
workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers)
|
workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers)
|
||||||
|
@ -30,6 +30,7 @@ import '@polymer/paper-spinner/paper-spinner-lite.js'
|
|||||||
import '@vaadin/grid'
|
import '@vaadin/grid'
|
||||||
import '@vaadin/grid/vaadin-grid-sorter'
|
import '@vaadin/grid/vaadin-grid-sorter'
|
||||||
import '@vaadin/password-field'
|
import '@vaadin/password-field'
|
||||||
|
import '@vaadin/grid/vaadin-grid-selection-column.js'
|
||||||
|
|
||||||
// Multi language support
|
// Multi language support
|
||||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||||
@ -498,6 +499,10 @@ class TradePortal extends LitElement {
|
|||||||
|
|
||||||
this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid')
|
this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid')
|
||||||
|
|
||||||
|
this._openOrdersGrid.addEventListener("selected-items-changed", function(event){
|
||||||
|
_this.fillBuyFormMultiple(event.detail.value);
|
||||||
|
});
|
||||||
|
|
||||||
this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) {
|
this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) {
|
||||||
const priceString = get("tradepage.tchange9")
|
const priceString = get("tradepage.tchange9")
|
||||||
root.innerHTML = '<vaadin-grid-sorter path="price" direction="asc">' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')</vaadin-grid-sorter>'
|
root.innerHTML = '<vaadin-grid-sorter path="price" direction="asc">' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')</vaadin-grid-sorter>'
|
||||||
@ -733,6 +738,25 @@ class TradePortal extends LitElement {
|
|||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
coinGridSelection() {
|
||||||
|
|
||||||
|
if(this.selectedCoin == 'PIRATECHAIN') {
|
||||||
|
return html``
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return html`
|
||||||
|
<vaadin-grid-selection-column></vaadin-grid-selection-column>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clickHandler(data) {
|
||||||
|
|
||||||
|
if(this.selectedCoin == 'PIRATECHAIN') {
|
||||||
|
this.fillBuyFormSingle(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
openTradesTemplate() {
|
openTradesTemplate() {
|
||||||
return html`
|
return html`
|
||||||
<div class="open-trades myhover">
|
<div class="open-trades myhover">
|
||||||
@ -751,13 +775,14 @@ class TradePortal extends LitElement {
|
|||||||
aria-label="Open Orders"
|
aria-label="Open Orders"
|
||||||
.items="${this.listedCoins.get(this.selectedCoin).openFilteredOrders}"
|
.items="${this.listedCoins.get(this.selectedCoin).openFilteredOrders}"
|
||||||
>
|
>
|
||||||
|
${this.coinGridSelection()}
|
||||||
<vaadin-grid-column
|
<vaadin-grid-column
|
||||||
auto-width
|
auto-width
|
||||||
resizable
|
resizable
|
||||||
header="${translate("tradepage.tchange8")} (QORT)"
|
header="${translate("tradepage.tchange8")} (QORT)"
|
||||||
id="qortAmountColumn"
|
id="qortAmountColumn"
|
||||||
.renderer=${(root, column, data) => {
|
.renderer=${(root, column, data) => {
|
||||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${this.round(data.item.qortAmount)}</span>`, root)
|
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${this.round(data.item.qortAmount)}</span>`, root)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
</vaadin-grid-column>
|
</vaadin-grid-column>
|
||||||
@ -767,7 +792,7 @@ class TradePortal extends LitElement {
|
|||||||
header="${translate("tradepage.tchange9")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
|
header="${translate("tradepage.tchange9")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
|
||||||
id="priceColumn"
|
id="priceColumn"
|
||||||
.renderer=${(root, column, data) => {
|
.renderer=${(root, column, data) => {
|
||||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${this.round(data.item.price)}</span>`, root)
|
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${this.round(data.item.price)}</span>`, root)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
</vaadin-grid-column>
|
</vaadin-grid-column>
|
||||||
@ -777,7 +802,7 @@ class TradePortal extends LitElement {
|
|||||||
header="${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
|
header="${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
|
||||||
id="foreignAmountColumn"
|
id="foreignAmountColumn"
|
||||||
.renderer=${(root, column, data) => {
|
.renderer=${(root, column, data) => {
|
||||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${data.item.foreignAmount}</span>`, root)
|
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${data.item.foreignAmount}</span>`, root)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
</vaadin-grid-column>
|
</vaadin-grid-column>
|
||||||
@ -787,7 +812,7 @@ class TradePortal extends LitElement {
|
|||||||
header="${translate("tradepage.tchange13")}"
|
header="${translate("tradepage.tchange13")}"
|
||||||
id="qortalCreatorColumn"
|
id="qortalCreatorColumn"
|
||||||
.renderer=${(root, column, data) => {
|
.renderer=${(root, column, data) => {
|
||||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${data.item.qortalCreator}</span>`, root)
|
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${data.item.qortalCreator}</span>`, root)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
</vaadin-grid-column>
|
</vaadin-grid-column>
|
||||||
@ -1546,19 +1571,52 @@ class TradePortal extends LitElement {
|
|||||||
this.isLoadingOpenTrades = false
|
this.isLoadingOpenTrades = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reSelectOpenOrders() {
|
||||||
|
const qortalATAddressesString = this.shadowRoot.getElementById('qortalAtAddress').value;
|
||||||
|
const qortalATAddresses = qortalATAddressesString.split(',');
|
||||||
|
const itemsToSelect = this.tradesPresenceCleaned.filter((order) => qortalATAddresses.includes(order.qortalAtAddress));
|
||||||
|
this._openOrdersGrid.selectedItems = [...itemsToSelect];
|
||||||
|
this.fillBuyFormMultiple(itemsToSelect);
|
||||||
|
}
|
||||||
|
|
||||||
async reRenderMyOpenOrders() {
|
async reRenderMyOpenOrders() {
|
||||||
this.requestUpdate()
|
this.requestUpdate()
|
||||||
await this.updateComplete
|
await this.updateComplete
|
||||||
this.isLoadingMyOpenOrders = false
|
this.isLoadingMyOpenOrders = false
|
||||||
}
|
}
|
||||||
|
|
||||||
fillBuyForm(sellerRequest) {
|
fillBuyFormSingle(sellerRequest) {
|
||||||
this.shadowRoot.getElementById('buyAmountInput').value = parseFloat(sellerRequest.item.qortAmount)
|
this.shadowRoot.getElementById('buyAmountInput').value = parseFloat(sellerRequest.item.qortAmount)
|
||||||
this.shadowRoot.getElementById('buyPriceInput').value = this.round(parseFloat(sellerRequest.item.foreignAmount) / parseFloat(sellerRequest.item.qortAmount))
|
this.shadowRoot.getElementById('buyPriceInput').value = this.round(parseFloat(sellerRequest.item.foreignAmount) / parseFloat(sellerRequest.item.qortAmount))
|
||||||
this.shadowRoot.getElementById('buyTotalInput').value = parseFloat(sellerRequest.item.foreignAmount)
|
this.shadowRoot.getElementById('buyTotalInput').value = parseFloat(sellerRequest.item.foreignAmount)
|
||||||
this.shadowRoot.getElementById('qortalAtAddress').value = sellerRequest.item.qortalAtAddress
|
this.shadowRoot.getElementById('qortalAtAddress').value = sellerRequest.item.qortalAtAddress
|
||||||
const buyFunds = this.round(parseFloat(sellerRequest.item.foreignAmount))
|
const buyFunds = this.round(parseFloat(sellerRequest.item.foreignAmount))
|
||||||
|
this.fillBuyForm(buyFunds)
|
||||||
|
}
|
||||||
|
|
||||||
|
fillBuyFormMultiple(sellerRequests) {
|
||||||
|
let qortalATAddresses = [];
|
||||||
|
let qortAmount = 0;
|
||||||
|
let foreignAmount = 0;
|
||||||
|
|
||||||
|
sellerRequests.forEach((item, index) => {
|
||||||
|
qortalATAddresses.push(item.qortalAtAddress);
|
||||||
|
qortAmount += parseFloat(item.qortAmount);
|
||||||
|
foreignAmount += parseFloat(item.foreignAmount);
|
||||||
|
})
|
||||||
|
|
||||||
|
this.shadowRoot.getElementById('buyAmountInput').value = qortAmount
|
||||||
|
this.shadowRoot.getElementById('buyPriceInput').value = qortAmount > 0 ? this.round(foreignAmount / qortAmount) : 0
|
||||||
|
this.shadowRoot.getElementById('buyTotalInput').value = foreignAmount
|
||||||
|
this.shadowRoot.getElementById('qortalAtAddress').value = qortalATAddresses
|
||||||
|
|
||||||
|
const buyFunds = this.round(foreignAmount)
|
||||||
|
this.fillBuyForm(buyFunds)
|
||||||
|
}
|
||||||
|
|
||||||
|
fillBuyForm(buyFunds) {
|
||||||
const haveFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance))
|
const haveFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance))
|
||||||
|
|
||||||
if (Number(haveFunds) > Number(buyFunds)) {
|
if (Number(haveFunds) > Number(buyFunds)) {
|
||||||
this.buyBtnDisable = false
|
this.buyBtnDisable = false
|
||||||
this.autoBuyWarning = false
|
this.autoBuyWarning = false
|
||||||
@ -1568,7 +1626,6 @@ class TradePortal extends LitElement {
|
|||||||
this.autoBuyWarning = true
|
this.autoBuyWarning = true
|
||||||
this.displayTabContent('buy')
|
this.displayTabContent('buy')
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
processOfferingTrade(offer) {
|
processOfferingTrade(offer) {
|
||||||
@ -2124,7 +2181,7 @@ class TradePortal extends LitElement {
|
|||||||
const initTradeOffersWebSocket = (restarted = false) => {
|
const initTradeOffersWebSocket = (restarted = false) => {
|
||||||
let tradeOffersSocketCounter = 0
|
let tradeOffersSocketCounter = 0
|
||||||
let socketTimeout
|
let socketTimeout
|
||||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
||||||
const socket = new WebSocket(socketLink)
|
const socket = new WebSocket(socketLink)
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
setTimeout(pingSocket, 50)
|
setTimeout(pingSocket, 50)
|
||||||
@ -2156,7 +2213,7 @@ class TradePortal extends LitElement {
|
|||||||
|
|
||||||
const initTradeBotWebSocket = (restarted = false) => {
|
const initTradeBotWebSocket = (restarted = false) => {
|
||||||
let socketTimeout
|
let socketTimeout
|
||||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||||
const socket = new WebSocket(socketLink)
|
const socket = new WebSocket(socketLink)
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
setTimeout(pingSocket, 50)
|
setTimeout(pingSocket, 50)
|
||||||
@ -2185,7 +2242,7 @@ class TradePortal extends LitElement {
|
|||||||
|
|
||||||
const initTradePresenceWebSocket = (restarted = false) => {
|
const initTradePresenceWebSocket = (restarted = false) => {
|
||||||
let socketTimeout
|
let socketTimeout
|
||||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence`
|
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradepresence`
|
||||||
const socket = new WebSocket(socketLink)
|
const socket = new WebSocket(socketLink)
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
setTimeout(pingSocket, 50)
|
setTimeout(pingSocket, 50)
|
||||||
@ -2330,11 +2387,21 @@ class TradePortal extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const makeRequest = async () => {
|
const makeRequest = async () => {
|
||||||
return await parentEpml.request('tradeBotRespondRequest', {
|
|
||||||
atAddress: qortalAtAddress,
|
if( this.selectedCoin == 'PIRATECHAIN') {
|
||||||
foreignKey: _foreignKey,
|
return await parentEpml.request('tradeBotRespondRequest', {
|
||||||
receivingAddress: this.selectedAddress.address
|
atAddress: qortalAtAddress,
|
||||||
})
|
foreignKey: _foreignKey,
|
||||||
|
receivingAddress: this.selectedAddress.address
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return await parentEpml.request('tradeBotRespondMultipleRequest', {
|
||||||
|
addresses: qortalAtAddress.split(','),
|
||||||
|
foreignKey: _foreignKey,
|
||||||
|
receivingAddress: this.selectedAddress.address
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const manageResponse = (response) => {
|
const manageResponse = (response) => {
|
||||||
@ -2648,6 +2715,9 @@ class TradePortal extends LitElement {
|
|||||||
filterPresenceList()
|
filterPresenceList()
|
||||||
this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned
|
this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned
|
||||||
this.reRenderOpenFilteredOrders()
|
this.reRenderOpenFilteredOrders()
|
||||||
|
if( this.selectedCoin != 'PIRATECHAIN') {
|
||||||
|
this.reSelectOpenOrders()
|
||||||
|
}
|
||||||
return null
|
return null
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
@ -2656,10 +2726,19 @@ class TradePortal extends LitElement {
|
|||||||
|
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ':' + myNode.port
|
let nodeUrl = myNode.domain + ':' + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
|
let checkProtocol
|
||||||
|
|
||||||
|
if (nodeProtocol === "https") {
|
||||||
|
checkProtocol = 'wss'
|
||||||
|
} else {
|
||||||
|
checkProtocol = 'ws'
|
||||||
|
}
|
||||||
|
|
||||||
const modifiers = [
|
const modifiers = [
|
||||||
|
{ searchValue: 'PROTOCOL', replaceValue: checkProtocol },
|
||||||
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
||||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin },
|
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }
|
||||||
]
|
]
|
||||||
|
|
||||||
workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers)
|
workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers)
|
||||||
@ -2721,7 +2800,7 @@ class TradePortal extends LitElement {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const getCompletedTrades = async () => {
|
const getCompletedTrades = async () => {
|
||||||
const url = `http://NODEURL/crosschain/trades?limit=25&reverse=true&foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
const url = `PROTOCOL://NODEURL/crosschain/trades?limit=25&reverse=true&foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||||
const res = await fetch(url)
|
const res = await fetch(url)
|
||||||
const historicTrades = await res.json()
|
const historicTrades = await res.json()
|
||||||
const compareFn = (a, b) => {
|
const compareFn = (a, b) => {
|
||||||
@ -2740,7 +2819,7 @@ class TradePortal extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getOffers = async () => {
|
const getOffers = async () => {
|
||||||
const url = `http://NODEURL/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
const url = `PROTOCOL://NODEURL/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||||
const res = await fetch(url)
|
const res = await fetch(url)
|
||||||
const openTradeOrders = await res.json()
|
const openTradeOrders = await res.json()
|
||||||
const myOpenTradeOrders = await openTradeOrders.filter((order) => order.mode === 'OFFERING' && order.qortalCreator === 'SELECTED_ADDRESS')
|
const myOpenTradeOrders = await openTradeOrders.filter((order) => order.mode === 'OFFERING' && order.qortalCreator === 'SELECTED_ADDRESS')
|
||||||
@ -2802,11 +2881,20 @@ class TradePortal extends LitElement {
|
|||||||
|
|
||||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
let nodeUrl = myNode.domain + ':' + myNode.port
|
let nodeUrl = myNode.domain + ':' + myNode.port
|
||||||
|
let nodeProtocol = myNode.protocol
|
||||||
|
let checkProtocol
|
||||||
|
|
||||||
|
if (nodeProtocol === "https") {
|
||||||
|
checkProtocol = 'https'
|
||||||
|
} else {
|
||||||
|
checkProtocol = 'http'
|
||||||
|
}
|
||||||
|
|
||||||
const modifiers = [
|
const modifiers = [
|
||||||
|
{ searchValue: 'PROTOCOL', replaceValue: checkProtocol },
|
||||||
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
||||||
{ searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address, },
|
{ searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address },
|
||||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin, },
|
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin, }
|
||||||
]
|
]
|
||||||
|
|
||||||
workers.get(this.selectedCoin).handleStuckTradesConnectedWorker = this.inlineWorker(this.handleStuckTrades, modifiers)
|
workers.get(this.selectedCoin).handleStuckTradesConnectedWorker = this.inlineWorker(this.handleStuckTrades, modifiers)
|
||||||
|
@ -2310,15 +2310,16 @@ class MultiWallet extends LitElement {
|
|||||||
<div style="margin-top: 10px;">
|
<div style="margin-top: 10px;">
|
||||||
<vaadin-tabs>
|
<vaadin-tabs>
|
||||||
<vaadin-tab id="type" disabled><span style="color: var(--black);">${translate("walletpage.wchange6")} :</span></vaadin-tab>
|
<vaadin-tab id="type" disabled><span style="color: var(--black);">${translate("walletpage.wchange6")} :</span></vaadin-tab>
|
||||||
<vaadin-tab id="payment-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(0)}>PAYMENT</vaadin-tab>
|
<vaadin-tab id="all-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(0)}>ALL</vaadin-tab>
|
||||||
<vaadin-tab id="arbitary-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(1)}>ARBITARY</vaadin-tab>
|
<vaadin-tab id="payment-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(1)}>PAYMENT</vaadin-tab>
|
||||||
<vaadin-tab id="at-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(2)}>AT</vaadin-tab>
|
<vaadin-tab id="arbitrary-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(2)}>ARBITRARY</vaadin-tab>
|
||||||
<vaadin-tab id="group-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(3)}>GROUP</vaadin-tab>
|
<vaadin-tab id="at-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(3)}>AT</vaadin-tab>
|
||||||
<vaadin-tab id="name-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(4)}>NAME</vaadin-tab>
|
<vaadin-tab id="group-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(4)}>GROUP</vaadin-tab>
|
||||||
<vaadin-tab id="asset-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(5)}>ASSET</vaadin-tab>
|
<vaadin-tab id="name-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(5)}>NAME</vaadin-tab>
|
||||||
<vaadin-tab id="poll-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(6)}>POLL</vaadin-tab>
|
<vaadin-tab id="asset-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(6)}>ASSET</vaadin-tab>
|
||||||
<vaadin-tab id="rewarshare-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(7)}>REWARDSHARE</vaadin-tab>
|
<vaadin-tab id="poll-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(7)}>POLL</vaadin-tab>
|
||||||
<vaadin-tab id="misc-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(8)}>MISC</vaadin-tab>
|
<vaadin-tab id="rewarshare-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(8)}>REWARDSHARE</vaadin-tab>
|
||||||
|
<vaadin-tab id="misc-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(9)}>MISC</vaadin-tab>
|
||||||
</vaadin-tabs>
|
</vaadin-tabs>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
@ -3148,9 +3149,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.shadowRoot.querySelector('#arrrBookDialog').close()
|
this.shadowRoot.querySelector('#arrrBookDialog').close()
|
||||||
}
|
}
|
||||||
|
|
||||||
removeQortAddress(adressObj) {
|
removeQortAddress(addressObj) {
|
||||||
const theQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress
|
const theQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress
|
||||||
const addressToRemove = adressObj
|
const addressToRemove = addressObj
|
||||||
this.newQortBookFilter = []
|
this.newQortBookFilter = []
|
||||||
this.newQortBookFilter = this.qortBook.filter((item) => item.address !== addressToRemove)
|
this.newQortBookFilter = this.qortBook.filter((item) => item.address !== addressToRemove)
|
||||||
const myNewObj = JSON.stringify(this.newQortBookFilter)
|
const myNewObj = JSON.stringify(this.newQortBookFilter)
|
||||||
@ -3159,9 +3160,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.qortBook = JSON.parse(localStorage.getItem(theQortalAddressBook) || "[]")
|
this.qortBook = JSON.parse(localStorage.getItem(theQortalAddressBook) || "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
removeBtcAddress(adressObj) {
|
removeBtcAddress(addressObj) {
|
||||||
const theBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress
|
const theBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress
|
||||||
const addressToRemove = adressObj
|
const addressToRemove = addressObj
|
||||||
this.newBtcBookFilter = []
|
this.newBtcBookFilter = []
|
||||||
this.newBtcBookFilter = this.btcBook.filter((item) => item.address !== addressToRemove)
|
this.newBtcBookFilter = this.btcBook.filter((item) => item.address !== addressToRemove)
|
||||||
const myNewObj = JSON.stringify(this.newBtcBookFilter)
|
const myNewObj = JSON.stringify(this.newBtcBookFilter)
|
||||||
@ -3170,9 +3171,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.btcBook = JSON.parse(localStorage.getItem(theBitcoinAddressBook) || "[]")
|
this.btcBook = JSON.parse(localStorage.getItem(theBitcoinAddressBook) || "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
removeLtcAddress(adressObj) {
|
removeLtcAddress(addressObj) {
|
||||||
const theLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress
|
const theLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress
|
||||||
const addressToRemove = adressObj
|
const addressToRemove = addressObj
|
||||||
this.newLtcBookFilter = []
|
this.newLtcBookFilter = []
|
||||||
this.newLtcBookFilter = this.ltcBook.filter((item) => item.address !== addressToRemove)
|
this.newLtcBookFilter = this.ltcBook.filter((item) => item.address !== addressToRemove)
|
||||||
const myNewObj = JSON.stringify(this.newLtcBookFilter)
|
const myNewObj = JSON.stringify(this.newLtcBookFilter)
|
||||||
@ -3181,9 +3182,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.ltcBook = JSON.parse(localStorage.getItem(theLitecoinAddressBook) || "[]")
|
this.ltcBook = JSON.parse(localStorage.getItem(theLitecoinAddressBook) || "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
removeDogeAddress(adressObj) {
|
removeDogeAddress(addressObj) {
|
||||||
const theDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress
|
const theDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress
|
||||||
const addressToRemove = adressObj
|
const addressToRemove = addressObj
|
||||||
this.newDogeBookFilter = []
|
this.newDogeBookFilter = []
|
||||||
this.newDogeBookFilter = this.dogeBook.filter((item) => item.address !== addressToRemove)
|
this.newDogeBookFilter = this.dogeBook.filter((item) => item.address !== addressToRemove)
|
||||||
const myNewObj = JSON.stringify(this.newDogeBookFilter)
|
const myNewObj = JSON.stringify(this.newDogeBookFilter)
|
||||||
@ -3192,9 +3193,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.dogeBook = JSON.parse(localStorage.getItem(theDogecoinAddressBook) || "[]")
|
this.dogeBook = JSON.parse(localStorage.getItem(theDogecoinAddressBook) || "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
removeDgbAddress(adressObj) {
|
removeDgbAddress(addressObj) {
|
||||||
const theDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress
|
const theDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress
|
||||||
const addressToRemove = adressObj
|
const addressToRemove = addressObj
|
||||||
this.newDgbBookFilter = []
|
this.newDgbBookFilter = []
|
||||||
this.newDgbBookFilter = this.dgbBook.filter((item) => item.address !== addressToRemove)
|
this.newDgbBookFilter = this.dgbBook.filter((item) => item.address !== addressToRemove)
|
||||||
const myNewObj = JSON.stringify(this.newDgbBookFilter)
|
const myNewObj = JSON.stringify(this.newDgbBookFilter)
|
||||||
@ -3203,9 +3204,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.dgbBook = JSON.parse(localStorage.getItem(theDigibyteAddressBook) || "[]")
|
this.dgbBook = JSON.parse(localStorage.getItem(theDigibyteAddressBook) || "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
removeRvnAddress(adressObj) {
|
removeRvnAddress(addressObj) {
|
||||||
const theRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress
|
const theRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress
|
||||||
const addressToRemove = adressObj
|
const addressToRemove = addressObj
|
||||||
this.newRvnBookFilter = []
|
this.newRvnBookFilter = []
|
||||||
this.newRvnBookFilter = this.rvnBook.filter((item) => item.address !== addressToRemove)
|
this.newRvnBookFilter = this.rvnBook.filter((item) => item.address !== addressToRemove)
|
||||||
const myNewObj = JSON.stringify(this.newRvnBookFilter)
|
const myNewObj = JSON.stringify(this.newRvnBookFilter)
|
||||||
@ -3214,9 +3215,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.rvnBook = JSON.parse(localStorage.getItem(theRavencoinAddressBook) || "[]")
|
this.rvnBook = JSON.parse(localStorage.getItem(theRavencoinAddressBook) || "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
removeArrrAddress(adressObj) {
|
removeArrrAddress(addressObj) {
|
||||||
const thePiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress
|
const thePiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress
|
||||||
const addressToRemove = adressObj
|
const addressToRemove = addressObj
|
||||||
this.newArrrBookFilter = []
|
this.newArrrBookFilter = []
|
||||||
this.newArrrBookFilter = this.arrrBook.filter((item) => item.address !== addressToRemove)
|
this.newArrrBookFilter = this.arrrBook.filter((item) => item.address !== addressToRemove)
|
||||||
const myNewObj = JSON.stringify(this.newArrrBookFilter)
|
const myNewObj = JSON.stringify(this.newArrrBookFilter)
|
||||||
@ -4249,8 +4250,9 @@ class MultiWallet extends LitElement {
|
|||||||
await this.fetchWalletServer(this._selectedWallet)
|
await this.fetchWalletServer(this._selectedWallet)
|
||||||
|
|
||||||
this.shadowRoot.getElementById('type').selected = false
|
this.shadowRoot.getElementById('type').selected = false
|
||||||
this.shadowRoot.getElementById('payment-tab').selected = true
|
this.shadowRoot.getElementById('all-tab').selected = true
|
||||||
this.shadowRoot.getElementById('arbitary-tab').selected = false
|
this.shadowRoot.getElementById('payment-tab').selected = false
|
||||||
|
this.shadowRoot.getElementById('arbitrary-tab').selected = false
|
||||||
this.shadowRoot.getElementById('at-tab').selected = false
|
this.shadowRoot.getElementById('at-tab').selected = false
|
||||||
this.shadowRoot.getElementById('group-tab').selected = false
|
this.shadowRoot.getElementById('group-tab').selected = false
|
||||||
this.shadowRoot.getElementById('name-tab').selected = false
|
this.shadowRoot.getElementById('name-tab').selected = false
|
||||||
@ -4325,6 +4327,20 @@ class MultiWallet extends LitElement {
|
|||||||
async fetchWalletDetails(coin) {
|
async fetchWalletDetails(coin) {
|
||||||
switch (coin) {
|
switch (coin) {
|
||||||
case 'qort':
|
case 'qort':
|
||||||
|
const allTxsQort = await parentEpml.request('apiCall', {
|
||||||
|
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||||
|
&limit=${this.searchLimit}
|
||||||
|
&offset=${this.searchOffset}
|
||||||
|
&txType=PAYMENT&txType=REGISTER_NAME&txType=UPDATE_NAME&txType=SELL_NAME&txType=CANCEL_SELL_NAME&txType=BUY_NAME&txType=CREATE_POLL&txType=VOTE_ON_POLL&txType=ARBITRARY&txType=ISSUE_ASSET&txType=TRANSFER_ASSET&txType=CREATE_ASSET_ORDER&txType=CANCEL_ASSET_ORDER&txType=MULTI_PAYMENT&txType=DEPLOY_AT&txType=MESSAGE&txType=AIRDROP&txType=AT&txType=CREATE_GROUP&txType=UPDATE_GROUP&txType=ADD_GROUP_ADMIN&txType=REMOVE_GROUP_ADMIN&txType=GROUP_BAN&txType=CANCEL_GROUP_BAN&txType=GROUP_KICK&txType=GROUP_INVITE&txType=CANCEL_GROUP_INVITE&txType=JOIN_GROUP&txType=LEAVE_GROUP&txType=GROUP_APPROVAL&txType=SET_GROUP&txType=UPDATE_ASSET&txType=ACCOUNT_FLAGS&txType=ENABLE_FORGING&txType=REWARD_SHARE&txType=ACCOUNT_LEVEL&txType=TRANSFER_PRIVS&txType=PRESENCE
|
||||||
|
`
|
||||||
|
})
|
||||||
|
const pendingAllTxsQort = await parentEpml.request('apiCall', {
|
||||||
|
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||||
|
&limit=${this.searchLimit}
|
||||||
|
&offset=${this.searchOffset}
|
||||||
|
&txType=PAYMENT&txType=REGISTER_NAME&txType=UPDATE_NAME&txType=SELL_NAME&txType=CANCEL_SELL_NAME&txType=BUY_NAME&txType=CREATE_POLL&txType=VOTE_ON_POLL&txType=ARBITRARY&txType=ISSUE_ASSET&txType=TRANSFER_ASSET&txType=CREATE_ASSET_ORDER&txType=CANCEL_ASSET_ORDER&txType=MULTI_PAYMENT&txType=DEPLOY_AT&txType=MESSAGE&txType=AIRDROP&txType=AT&txType=CREATE_GROUP&txType=UPDATE_GROUP&txType=ADD_GROUP_ADMIN&txType=REMOVE_GROUP_ADMIN&txType=GROUP_BAN&txType=CANCEL_GROUP_BAN&txType=GROUP_KICK&txType=GROUP_INVITE&txType=CANCEL_GROUP_INVITE&txType=JOIN_GROUP&txType=LEAVE_GROUP&txType=GROUP_APPROVAL&txType=SET_GROUP&txType=UPDATE_ASSET&txType=ACCOUNT_FLAGS&txType=ENABLE_FORGING&txType=REWARD_SHARE&txType=ACCOUNT_LEVEL&txType=TRANSFER_PRIVS&txType=PRESENCE
|
||||||
|
`
|
||||||
|
})
|
||||||
const paymentTxsQort = await parentEpml.request('apiCall', {
|
const paymentTxsQort = await parentEpml.request('apiCall', {
|
||||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||||
&limit=${this.searchLimit}
|
&limit=${this.searchLimit}
|
||||||
@ -4339,14 +4355,14 @@ class MultiWallet extends LitElement {
|
|||||||
&txType=PAYMENT
|
&txType=PAYMENT
|
||||||
`
|
`
|
||||||
})
|
})
|
||||||
const arbitaryTxsQort = await parentEpml.request('apiCall', {
|
const arbitraryTxsQort = await parentEpml.request('apiCall', {
|
||||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||||
&limit=${this.searchLimit}
|
&limit=${this.searchLimit}
|
||||||
&offset=${this.searchOffset}
|
&offset=${this.searchOffset}
|
||||||
&txType=ARBITRARY
|
&txType=ARBITRARY
|
||||||
`
|
`
|
||||||
})
|
})
|
||||||
const pendingArbitaryTxsQort = await parentEpml.request('apiCall', {
|
const pendingArbitraryTxsQort = await parentEpml.request('apiCall', {
|
||||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||||
&limit=${this.searchLimit}
|
&limit=${this.searchLimit}
|
||||||
&offset=${this.searchOffset}
|
&offset=${this.searchOffset}
|
||||||
@ -4501,22 +4517,24 @@ class MultiWallet extends LitElement {
|
|||||||
})
|
})
|
||||||
if (this._selectedWallet == coin) {
|
if (this._selectedWallet == coin) {
|
||||||
if (this.visitedTab === 0) {
|
if (this.visitedTab === 0) {
|
||||||
this.wallets.get(coin).transactions = pendingPaymentTxsQort.concat(paymentTxsQort)
|
this.wallets.get(coin).transactions = pendingAllTxsQort.concat(allTxsQort)
|
||||||
} else if (this.visitedTab === 1) {
|
} else if (this.visitedTab === 1) {
|
||||||
this.wallets.get(coin).transactions = pendingArbitaryTxsQort.concat(arbitaryTxsQort)
|
this.wallets.get(coin).transactions = pendingPaymentTxsQort.concat(paymentTxsQort)
|
||||||
} else if (this.visitedTab === 2) {
|
} else if (this.visitedTab === 2) {
|
||||||
this.wallets.get(coin).transactions = pendingAtTxsQort.concat(atTxsQort)
|
this.wallets.get(coin).transactions = pendingArbitraryTxsQort.concat(arbitraryTxsQort)
|
||||||
} else if (this.visitedTab === 3) {
|
} else if (this.visitedTab === 3) {
|
||||||
this.wallets.get(coin).transactions = pendingGroupTxsQort.concat(groupTxsQort)
|
this.wallets.get(coin).transactions = pendingAtTxsQort.concat(atTxsQort)
|
||||||
} else if (this.visitedTab === 4) {
|
} else if (this.visitedTab === 4) {
|
||||||
this.wallets.get(coin).transactions = pendingNameTxsQort.concat(nameTxsQort)
|
this.wallets.get(coin).transactions = pendingGroupTxsQort.concat(groupTxsQort)
|
||||||
} else if (this.visitedTab === 5) {
|
} else if (this.visitedTab === 5) {
|
||||||
this.wallets.get(coin).transactions = pendingAssetTxsQort.concat(assetTxsQort)
|
this.wallets.get(coin).transactions = pendingNameTxsQort.concat(nameTxsQort)
|
||||||
} else if (this.visitedTab === 6) {
|
} else if (this.visitedTab === 6) {
|
||||||
this.wallets.get(coin).transactions = pendingPollTxsQort.concat(pollTxsQort)
|
this.wallets.get(coin).transactions = pendingAssetTxsQort.concat(assetTxsQort)
|
||||||
} else if (this.visitedTab === 7) {
|
} else if (this.visitedTab === 7) {
|
||||||
this.wallets.get(coin).transactions = pendingRewardshareTxsQort.concat(rewardshareTxsQort)
|
this.wallets.get(coin).transactions = pendingPollTxsQort.concat(pollTxsQort)
|
||||||
} else if (this.visitedTab === 8) {
|
} else if (this.visitedTab === 8) {
|
||||||
|
this.wallets.get(coin).transactions = pendingRewardshareTxsQort.concat(rewardshareTxsQort)
|
||||||
|
} else if (this.visitedTab === 9) {
|
||||||
this.wallets.get(coin).transactions = pendingMiscTxsQort.concat(miscTxsQort)
|
this.wallets.get(coin).transactions = pendingMiscTxsQort.concat(miscTxsQort)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
import { get } from '../../../core/translate'
|
import { get } from '../../../core/translate'
|
||||||
|
import { appendBuffer } from './utilities'
|
||||||
|
import Base58 from '../../../crypto/api/deps/Base58'
|
||||||
|
import nacl from '../../../crypto/api/deps/nacl-fast.js'
|
||||||
|
import ed2curve from '../../../crypto/api/deps/ed2curve.js'
|
||||||
|
|
||||||
const getApiKey = () => {
|
const getApiKey = () => {
|
||||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
@ -71,6 +75,10 @@ export class RequestQueueWithPromise {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const requestQueueMemberNames = new RequestQueueWithPromise(5)
|
||||||
|
export const requestQueueAdminMemberNames = new RequestQueueWithPromise(5)
|
||||||
|
export const requestQueueGetAtAddresses = new RequestQueueWithPromise(10)
|
||||||
|
|
||||||
export class Loader {
|
export class Loader {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.loader = document.createElement("div")
|
this.loader = document.createElement("div")
|
||||||
@ -664,6 +672,178 @@ export class WarningModal {
|
|||||||
export const modalHelper = ModalHelper.getInstance()
|
export const modalHelper = ModalHelper.getInstance()
|
||||||
export const warningModal = WarningModal.getInstance()
|
export const warningModal = WarningModal.getInstance()
|
||||||
|
|
||||||
|
export class TradeBotRespondRequest {
|
||||||
|
constructor() {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
createTransaction(txnReq) {
|
||||||
|
this.atAddress(txnReq.atAddress)
|
||||||
|
this.foreignKey(txnReq.foreignKey)
|
||||||
|
this.receivingAddress(txnReq.receivingAddress)
|
||||||
|
|
||||||
|
return this.txnRequest()
|
||||||
|
}
|
||||||
|
|
||||||
|
atAddress(atAddress) {
|
||||||
|
this._atAddress = atAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
foreignKey(foreignKey) {
|
||||||
|
this._foreignKey = foreignKey
|
||||||
|
}
|
||||||
|
|
||||||
|
receivingAddress(receivingAddress) {
|
||||||
|
this._receivingAddress = receivingAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
txnRequest() {
|
||||||
|
return {
|
||||||
|
atAddress: this._atAddress,
|
||||||
|
foreignKey: this._foreignKey,
|
||||||
|
receivingAddress: this._receivingAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TradeBotRespondMultipleRequest {
|
||||||
|
constructor() {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
createTransaction(txnReq) {
|
||||||
|
this.addresses(txnReq.addresses)
|
||||||
|
this.foreignKey(txnReq.foreignKey)
|
||||||
|
this.receivingAddress(txnReq.receivingAddress)
|
||||||
|
|
||||||
|
return this.txnRequest()
|
||||||
|
}
|
||||||
|
|
||||||
|
addresses(addresses) {
|
||||||
|
this._addresses = addresses
|
||||||
|
}
|
||||||
|
|
||||||
|
foreignKey(foreignKey) {
|
||||||
|
this._foreignKey = foreignKey
|
||||||
|
}
|
||||||
|
|
||||||
|
receivingAddress(receivingAddress) {
|
||||||
|
this._receivingAddress = receivingAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
txnRequest() {
|
||||||
|
return {
|
||||||
|
addresses: this._addresses,
|
||||||
|
foreignKey: this._foreignKey,
|
||||||
|
receivingAddress: this._receivingAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TradeBotCreateRequest {
|
||||||
|
constructor() {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
createTransaction(txnReq) {
|
||||||
|
this.creatorPublicKey(txnReq.creatorPublicKey)
|
||||||
|
this.qortAmount(txnReq.qortAmount)
|
||||||
|
this.fundingQortAmount(txnReq.fundingQortAmount)
|
||||||
|
this.foreignBlockchain(txnReq.foreignBlockchain)
|
||||||
|
this.foreignAmount(txnReq.foreignAmount)
|
||||||
|
this.tradeTimeout(txnReq.tradeTimeout)
|
||||||
|
this.receivingAddress(txnReq.receivingAddress)
|
||||||
|
|
||||||
|
return this.txnRequest()
|
||||||
|
}
|
||||||
|
|
||||||
|
creatorPublicKey(creatorPublicKey) {
|
||||||
|
this._creatorPublicKey = creatorPublicKey
|
||||||
|
}
|
||||||
|
|
||||||
|
qortAmount(qortAmount) {
|
||||||
|
this._qortAmount = qortAmount
|
||||||
|
}
|
||||||
|
|
||||||
|
fundingQortAmount(fundingQortAmount) {
|
||||||
|
this._fundingQortAmount = fundingQortAmount
|
||||||
|
}
|
||||||
|
|
||||||
|
foreignBlockchain(foreignBlockchain) {
|
||||||
|
this._foreignBlockchain = foreignBlockchain
|
||||||
|
}
|
||||||
|
|
||||||
|
foreignAmount(foreignAmount) {
|
||||||
|
this._foreignAmount = foreignAmount
|
||||||
|
}
|
||||||
|
|
||||||
|
tradeTimeout(tradeTimeout) {
|
||||||
|
this._tradeTimeout = tradeTimeout
|
||||||
|
}
|
||||||
|
|
||||||
|
receivingAddress(receivingAddress) {
|
||||||
|
this._receivingAddress = receivingAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
txnRequest() {
|
||||||
|
return {
|
||||||
|
creatorPublicKey: this._creatorPublicKey,
|
||||||
|
qortAmount: this._qortAmount,
|
||||||
|
fundingQortAmount: this._fundingQortAmount,
|
||||||
|
foreignBlockchain: this._foreignBlockchain,
|
||||||
|
foreignAmount: this._foreignAmount,
|
||||||
|
tradeTimeout: this._tradeTimeout,
|
||||||
|
receivingAddress: this._receivingAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DeleteTradeOffer {
|
||||||
|
constructor() {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
createTransaction(txnReq) {
|
||||||
|
this.creatorPublicKey(txnReq.creatorPublicKey)
|
||||||
|
this.atAddress(txnReq.atAddress)
|
||||||
|
|
||||||
|
return this.txnRequest()
|
||||||
|
}
|
||||||
|
|
||||||
|
creatorPublicKey(creatorPublicKey) {
|
||||||
|
this._creatorPublicKey = creatorPublicKey
|
||||||
|
}
|
||||||
|
|
||||||
|
atAddress(atAddress) {
|
||||||
|
this._atAddress = atAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
txnRequest() {
|
||||||
|
return {
|
||||||
|
creatorPublicKey: this._creatorPublicKey,
|
||||||
|
atAddress: this._atAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const processTransactionV2 = async (bytes) => {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const url = `${nodeUrl}/transactions/process?apiVersion=2`
|
||||||
|
|
||||||
|
const doProcess = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: bytes
|
||||||
|
})
|
||||||
|
|
||||||
|
const res = await doProcess.json()
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
export const publishData = async ({
|
export const publishData = async ({
|
||||||
registeredName,
|
registeredName,
|
||||||
path,
|
path,
|
||||||
@ -924,3 +1104,451 @@ export const publishData = async ({
|
|||||||
throw new Error(error.message)
|
throw new Error(error.message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getNameInfo(address) {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const response = await fetch(`${nodeUrl}/names/address/` + address)
|
||||||
|
const nameData = await response.json()
|
||||||
|
|
||||||
|
if (nameData.length > 0) {
|
||||||
|
return nameData[0].name
|
||||||
|
} else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getPublishesFromAdmins = async (admins, groupId) => {
|
||||||
|
const queryString = admins.map((name) => `name=${name}`).join("&")
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const url = `${nodeUrl}/arbitrary/resources/searchsimple?mode=ALL&service=DOCUMENT_PRIVATE&identifier=symmetric-qchat-group-${groupId}&exactmatchnames=true&limit=0&reverse=true&${queryString}&prefix=true`
|
||||||
|
const response = await fetch(url)
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
console.error("network error")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const adminData = await response.json()
|
||||||
|
const filterId = adminData.filter((data) => data.identifier === `symmetric-qchat-group-${groupId}`)
|
||||||
|
|
||||||
|
if (filterId.length === 0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortedData = filterId.sort((a, b) => {
|
||||||
|
// Get the most recent date for both a and b
|
||||||
|
const dateA = a.updated ? new Date(a.updated) : new Date(a.created)
|
||||||
|
const dateB = b.updated ? new Date(b.updated) : new Date(b.created)
|
||||||
|
|
||||||
|
// Sort by most recent
|
||||||
|
return dateB.getTime() - dateA.getTime()
|
||||||
|
})
|
||||||
|
|
||||||
|
return sortedData[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getGroupAdmins = async (groupNumber) => {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const url = `${nodeUrl}/groups/members/${groupNumber}?limit=0&onlyAdmins=true`
|
||||||
|
const response = await fetch(url)
|
||||||
|
const groupData = await response.json()
|
||||||
|
|
||||||
|
let members = []
|
||||||
|
let membersAddresses = []
|
||||||
|
let both = []
|
||||||
|
|
||||||
|
const getMemNames = groupData.members.map(async (member) => {
|
||||||
|
if (member.member) {
|
||||||
|
const name = await requestQueueAdminMemberNames.enqueue(() => {
|
||||||
|
return getNameInfo(member.member)
|
||||||
|
})
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
members.push(name)
|
||||||
|
both.push({ name, address: member.member })
|
||||||
|
}
|
||||||
|
|
||||||
|
membersAddresses.push(member.member)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
await Promise.all(getMemNames)
|
||||||
|
|
||||||
|
return { names: members, addresses: membersAddresses, both }
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getPublishesFromAdminsAdminSpace = async (admins, groupId) => {
|
||||||
|
const queryString = admins.map((name) => `name=${name}`).join("&")
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
|
||||||
|
const url = `${nodeUrl}/arbitrary/resources/searchsimple?mode=ALL&service=DOCUMENT_PRIVATE&identifier=admins-symmetric-qchat-group-${groupId}&exactmatchnames=true&limit=0&reverse=true&${queryString}&prefix=true`
|
||||||
|
const response = await fetch(url)
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
console.error("network error")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const adminData = await response.json()
|
||||||
|
|
||||||
|
const filterId = adminData.filter((data) => data.identifier === `admins-symmetric-qchat-group-${groupId}`)
|
||||||
|
|
||||||
|
if (filterId.length === 0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortedData = filterId.sort((a, b) => {
|
||||||
|
// Get the most recent date for both a and b
|
||||||
|
const dateA = a.updated ? new Date(a.updated) : new Date(a.created)
|
||||||
|
const dateB = b.updated ? new Date(b.updated) : new Date(b.created)
|
||||||
|
|
||||||
|
// Sort by most recent
|
||||||
|
return dateB.getTime() - dateA.getTime()
|
||||||
|
})
|
||||||
|
|
||||||
|
return sortedData[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const isUsingPublicNode = async () => {
|
||||||
|
let isGateway = true
|
||||||
|
|
||||||
|
const publicNodes = ['ext-node.qortal.link']
|
||||||
|
const nodeInfo = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
|
||||||
|
if (nodeInfo && (nodeInfo.domain && !publicNodes.some(publicNode => nodeInfo.domain.includes(publicNode)))) {
|
||||||
|
isGateway = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return isGateway
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getForeignKey = (foreignBlockchain) => {
|
||||||
|
switch (foreignBlockchain) {
|
||||||
|
case "LITECOIN":
|
||||||
|
return window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey
|
||||||
|
case "DOGECOIN":
|
||||||
|
return window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey
|
||||||
|
case "BITCOIN":
|
||||||
|
return window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey
|
||||||
|
case "DIGIBYTE":
|
||||||
|
return window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
||||||
|
case "RAVENCOIN":
|
||||||
|
return window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey
|
||||||
|
case "PIRATECHAIN":
|
||||||
|
return window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58
|
||||||
|
default:
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getQortalBalanceInfo() {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const address = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||||
|
const url = `${nodeUrl}/addresses/balance/${address}`
|
||||||
|
const res = await fetch(url)
|
||||||
|
|
||||||
|
if (!response.ok) throw new Error("Cannot fetch Qortal balance")
|
||||||
|
|
||||||
|
const balance = await res.json()
|
||||||
|
|
||||||
|
return (Number(balance) / 1e8).toFixed(8)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getBitcoinBalanceInfo() {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const myApiKey = myNode.apiKey
|
||||||
|
const url = `${nodeUrl}/crosschain/btc/walletbalance?apiKey=${myApiKey}`
|
||||||
|
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: `${window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey}`
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!res.ok) throw new Error("Cannot fetch Bitcoin balance")
|
||||||
|
|
||||||
|
const balance = await res.json()
|
||||||
|
|
||||||
|
return (Number(balance) / 1e8).toFixed(8)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function getLitecoinBalanceInfo() {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const myApiKey = myNode.apiKey
|
||||||
|
const url = `${nodeUrl}/crosschain/ltc/walletbalance?apiKey=${myApiKey}`
|
||||||
|
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: `${window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey}`
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!res.ok) throw new Error("Cannot fetch Litecoin balance")
|
||||||
|
|
||||||
|
const balance = await res.json()
|
||||||
|
|
||||||
|
return (Number(balance) / 1e8).toFixed(8)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createBuyOrderTx({ crosschainAtInfo, isGateway, foreignBlockchain }) {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const myApiKey = myNode.apiKey
|
||||||
|
|
||||||
|
let txn
|
||||||
|
let url
|
||||||
|
let message
|
||||||
|
let responseVar
|
||||||
|
let responseMessage
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!isGateway) {
|
||||||
|
const address = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||||
|
|
||||||
|
if (foreignBlockchain === 'PIRATECHAIN') {
|
||||||
|
message = {
|
||||||
|
atAddress: crosschainAtInfo[0].qortalAtAddress,
|
||||||
|
foreignKey: getForeignKey(foreignBlockchain),
|
||||||
|
receivingAddress: address
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
message = {
|
||||||
|
addresses: crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||||
|
foreignKey: getForeignKey(foreignBlockchain),
|
||||||
|
receivingAddress: address
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foreignBlockchain === 'PIRATECHAIN') {
|
||||||
|
txn = new TradeBotRespondRequest().createTransaction(message)
|
||||||
|
url = `${nodeUrl}/crosschain/tradebot/respond?apiKey=${myApiKey}`
|
||||||
|
} else {
|
||||||
|
txn = new TradeBotRespondMultipleRequest().createTransaction(message)
|
||||||
|
url = `${nodeUrl}/crosschain/tradebot/respondmultiple?apiKey=${myApiKey}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const responseFetch = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: JSON.stringify(txn)
|
||||||
|
})
|
||||||
|
|
||||||
|
const res = await responseFetch.json()
|
||||||
|
|
||||||
|
if(res.error && res.message) {
|
||||||
|
console.error(res.message)
|
||||||
|
throw new Error(res.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!responseFetch.ok) {
|
||||||
|
console.error('Failed to submit buy order')
|
||||||
|
throw new Error('Failed to submit buy order')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res === false) {
|
||||||
|
responseVar = { response: res, success: false }
|
||||||
|
} else {
|
||||||
|
responseVar = { response: res, success: true }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseVar.success) {
|
||||||
|
responseMessage = {
|
||||||
|
callResponse: responseVar.success,
|
||||||
|
extra: {
|
||||||
|
message: "Buy order message sended successfully!",
|
||||||
|
atAddresses: foreignBlockchain === 'PIRATECHAIN' ? [crosschainAtInfo[0].qortalAtAddress] : crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||||
|
senderAddress: address,
|
||||||
|
node: nodeUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
responseMessage = {
|
||||||
|
callResponse: responseVar.success,
|
||||||
|
extra: {
|
||||||
|
message: "Unable to execute buy order!",
|
||||||
|
atAddresses: foreignBlockchain === 'PIRATECHAIN' ? [crosschainAtInfo[0].qortalAtAddress] : crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||||
|
senderAddress: address,
|
||||||
|
node: nodeUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return responseMessage
|
||||||
|
} else {
|
||||||
|
responseVar = { response: false, success: false }
|
||||||
|
responseMessage = {
|
||||||
|
callResponse: responseVar.success,
|
||||||
|
extra: {
|
||||||
|
message: "Unable to send buy order message over Gateway!",
|
||||||
|
atAddresses: foreignBlockchain === 'PIRATECHAIN' ? [crosschainAtInfo[0].qortalAtAddress] : crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||||
|
senderAddress: address,
|
||||||
|
node: nodeUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return responseMessage
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(error.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getPirateWalletAddress = async (seed58) => {
|
||||||
|
const myApiKey = getApiKey()
|
||||||
|
const mySeed58 = seed58
|
||||||
|
|
||||||
|
let res = await parentEpml.request('apiCall', {
|
||||||
|
url: `/crosschain/arrr/walletaddress?apiKey=${myApiKey}`,
|
||||||
|
method: 'POST',
|
||||||
|
body: `${mySeed58}`
|
||||||
|
})
|
||||||
|
|
||||||
|
if (res != null && res.error != 1201) {
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
return mySeed58
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getUserWalletFunc = async (coin) => {
|
||||||
|
let userWallet = {}
|
||||||
|
|
||||||
|
switch (coin) {
|
||||||
|
case "QORT":
|
||||||
|
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||||
|
userWallet["publickey"] = Base58.encode(window.parent.reduxStore.getState().app.selectedAddress.keyPair.publicKey)
|
||||||
|
userWallet["privatekey"] = Base58.encode(window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey)
|
||||||
|
break
|
||||||
|
case "BTC":
|
||||||
|
case "BITCOIN":
|
||||||
|
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address
|
||||||
|
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey
|
||||||
|
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey
|
||||||
|
break
|
||||||
|
case "LTC":
|
||||||
|
case "LITECOIN":
|
||||||
|
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address
|
||||||
|
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey
|
||||||
|
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey
|
||||||
|
break
|
||||||
|
case "DOGE":
|
||||||
|
case "DOGECOIN":
|
||||||
|
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address
|
||||||
|
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey
|
||||||
|
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey
|
||||||
|
break
|
||||||
|
case "DGB":
|
||||||
|
case "DIGIBYTE":
|
||||||
|
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address
|
||||||
|
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey
|
||||||
|
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
||||||
|
break
|
||||||
|
case "RVN":
|
||||||
|
case "RAVENCOIN":
|
||||||
|
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address
|
||||||
|
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey
|
||||||
|
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey
|
||||||
|
break
|
||||||
|
case "ARRR":
|
||||||
|
case "PIRATECHAIN":
|
||||||
|
const arrrAddress = await getPirateWalletAddress(window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58)
|
||||||
|
userWallet["address"] = arrrAddress
|
||||||
|
userWallet["publickey"] = ""
|
||||||
|
userWallet["privatekey"] = ""
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
return userWallet
|
||||||
|
}
|
||||||
|
|
||||||
|
export const signTransaction = async (unsignedTxn, keyPair) => {
|
||||||
|
if (!unsignedTxn) {
|
||||||
|
throw new Error('Unsigned Transaction Bytes not defined')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!keyPair) {
|
||||||
|
throw new Error('keyPair not defined')
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsignedTxBytes = Base58.decode(unsignedTxn)
|
||||||
|
const signature = nacl.sign.detached(unsignedTxBytes, keyPair.privateKey)
|
||||||
|
const signedTxBytes = appendBuffer(unsignedTxBytes, signature)
|
||||||
|
|
||||||
|
return Base58.encode(signedTxBytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const tradeBotCreateRequest = async (body, keyPair) => {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const myApiKey = myNode.apiKey
|
||||||
|
const url = `${nodeUrl}/crosschain/tradebot/create?apiKey=${myApiKey}`
|
||||||
|
const txn = new TradeBotCreateRequest().createTransaction(body)
|
||||||
|
const bodyToString = JSON.stringify(txn)
|
||||||
|
|
||||||
|
const unsignedTxnResponse = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: bodyToString
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!unsignedTxnResponse.ok) throw new Error("Unable to create tradebot")
|
||||||
|
|
||||||
|
const unsignedTxn = await unsignedTxnResponse.text()
|
||||||
|
const signedTxnBytes = await signTransaction(unsignedTxn, keyPair)
|
||||||
|
const resProcess = await processTransactionV2(signedTxnBytes)
|
||||||
|
|
||||||
|
if (resProcess.signature) {
|
||||||
|
return resProcess
|
||||||
|
} else {
|
||||||
|
throw new Error("Failed to Create Sell Order. Try again!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const cancelTradeOfferTradeBot = async (body, keyPair) => {
|
||||||
|
const txn = new DeleteTradeOffer().createTransaction(body)
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||||
|
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||||
|
const myApiKey = myNode.apiKey
|
||||||
|
const url = `${nodeUrl}/crosschain/tradeoffer?apiKey=${myApiKey}`
|
||||||
|
const bodyToString = JSON.stringify(txn)
|
||||||
|
|
||||||
|
const deleteTradeBotResponse = await fetch(url, {
|
||||||
|
method: "DELETE",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: bodyToString
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!deleteTradeBotResponse.ok) throw new Error("Unable to update tradebot")
|
||||||
|
|
||||||
|
const unsignedTxn = await deleteTradeBotResponse.text()
|
||||||
|
const signedTxnBytes = await signTransaction(unsignedTxn, keyPair)
|
||||||
|
const resProcess = await processTransactionV2(signedTxnBytes)
|
||||||
|
|
||||||
|
if (resProcess.signature) {
|
||||||
|
return resProcess
|
||||||
|
} else {
|
||||||
|
throw new Error("Failed to Cancel Sell Order. Try again!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -56,7 +56,7 @@ export const getUserNameFromAddress = async (address) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isReceipient, decodeMessageFunc, _publicKey, addToUpdateMessageHashmap }) => {
|
export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isReceipient, decodeMessageFunc, _publicKey, symKeys, addToUpdateMessageHashmap }) => {
|
||||||
const MAX_CONCURRENT_REQUESTS = 5 // Maximum number of concurrent requests
|
const MAX_CONCURRENT_REQUESTS = 5 // Maximum number of concurrent requests
|
||||||
|
|
||||||
const executeWithConcurrencyLimit = async (array, asyncFn) => {
|
const executeWithConcurrencyLimit = async (array, asyncFn) => {
|
||||||
@ -82,7 +82,6 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
|||||||
|
|
||||||
const findUpdatedMessage = async (msg) => {
|
const findUpdatedMessage = async (msg) => {
|
||||||
let msgItem = { ...msg }
|
let msgItem = { ...msg }
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}`
|
let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}`
|
||||||
if (!isReceipient) {
|
if (!isReceipient) {
|
||||||
@ -96,7 +95,7 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (Array.isArray(newMsgResponse) && newMsgResponse.length > 0) {
|
if (Array.isArray(newMsgResponse) && newMsgResponse.length > 0) {
|
||||||
const decodeResponseItem = decodeMessageFunc(newMsgResponse[0], isReceipient, _publicKey)
|
const decodeResponseItem = decodeMessageFunc(newMsgResponse[0], isReceipient, _publicKey, symKeys)
|
||||||
|
|
||||||
delete decodeResponseItem.timestamp
|
delete decodeResponseItem.timestamp
|
||||||
|
|
||||||
@ -143,8 +142,8 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (originalReplyMessage && Array.isArray(replyResponse) && replyResponse.length !== 0) {
|
if (originalReplyMessage && Array.isArray(replyResponse) && replyResponse.length !== 0) {
|
||||||
const decodeOriginalReply = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey)
|
const decodeOriginalReply = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey, symKeys)
|
||||||
const decodeUpdatedReply = decodeMessageFunc(replyResponse[0], isReceipient, _publicKey)
|
const decodeUpdatedReply = decodeMessageFunc(replyResponse[0], isReceipient, _publicKey, symKeys)
|
||||||
|
|
||||||
msgItem.repliedToData = {
|
msgItem.repliedToData = {
|
||||||
...decodeUpdatedReply,
|
...decodeUpdatedReply,
|
||||||
@ -152,7 +151,7 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
|||||||
sender: decodeOriginalReply.sender
|
sender: decodeOriginalReply.sender
|
||||||
}
|
}
|
||||||
} else if (originalReplyMessage) {
|
} else if (originalReplyMessage) {
|
||||||
msgItem.repliedToData = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey)
|
msgItem.repliedToData = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey, symKeys)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,9 +164,10 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
|||||||
}
|
}
|
||||||
|
|
||||||
const sortedMessages = decodedMessages.sort((a, b) => b.timestamp - a.timestamp)
|
const sortedMessages = decodedMessages.sort((a, b) => b.timestamp - a.timestamp)
|
||||||
|
const withoutHubReactions = sortedMessages.filter(({decodedMessage}) => !decodedMessage.includes('isReaction'))
|
||||||
|
|
||||||
// Execute the functions with concurrency limit
|
// Execute the functions with concurrency limit
|
||||||
const updatedMessages = await executeWithConcurrencyLimit(sortedMessages, findUpdatedMessage)
|
const updatedMessages = await executeWithConcurrencyLimit(withoutHubReactions, findUpdatedMessage)
|
||||||
addToUpdateMessageHashmap(updatedMessages)
|
addToUpdateMessageHashmap(updatedMessages)
|
||||||
|
|
||||||
return updatedMessages
|
return updatedMessages
|
||||||
|
65
plugins/plugins/utils/utilities.js
Normal file
65
plugins/plugins/utils/utilities.js
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
export const int32ToBytes = (word) => {
|
||||||
|
var byteArray = []
|
||||||
|
for (var b = 0; b < 32; b += 8) {
|
||||||
|
byteArray.push((word >>> (24 - b % 32)) & 0xFF)
|
||||||
|
}
|
||||||
|
return byteArray
|
||||||
|
}
|
||||||
|
|
||||||
|
export const stringtoUTF8Array = (message) => {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
var s = unescape(encodeURIComponent(message))
|
||||||
|
message = new Uint8Array(s.length)
|
||||||
|
for (var i = 0; i < s.length; i++) {
|
||||||
|
message[i] = s.charCodeAt(i) & 0xff
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message
|
||||||
|
}
|
||||||
|
|
||||||
|
export const appendBuffer = (buffer1, buffer2) => {
|
||||||
|
buffer1 = new Uint8Array(buffer1)
|
||||||
|
buffer2 = new Uint8Array(buffer2)
|
||||||
|
let tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength)
|
||||||
|
tmp.set(buffer1, 0)
|
||||||
|
tmp.set(buffer2, buffer1.byteLength)
|
||||||
|
return tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
export const int64ToBytes = (int64) => {
|
||||||
|
var byteArray = [0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
for (var index = 0; index < byteArray.length; index++) {
|
||||||
|
var byte = int64 & 0xff
|
||||||
|
byteArray[byteArray.length - index - 1] = byte
|
||||||
|
int64 = (int64 - byte) / 256
|
||||||
|
}
|
||||||
|
return byteArray
|
||||||
|
}
|
||||||
|
|
||||||
|
export const hexToBytes = (hexString) => {
|
||||||
|
return new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)))
|
||||||
|
}
|
||||||
|
|
||||||
|
export const stringToHex = (bytes) => {
|
||||||
|
return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '')
|
||||||
|
}
|
||||||
|
|
||||||
|
export const equal = (buf1, buf2) => {
|
||||||
|
if (buf1.byteLength != buf2.byteLength) return false
|
||||||
|
var dv1 = new Uint8Array(buf1)
|
||||||
|
var dv2 = new Uint8Array(buf2)
|
||||||
|
for (var i = 0; i != buf1.byteLength; i++) {
|
||||||
|
if (dv1[i] != dv2[i]) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
export const bytesToHex = (byteArray) => {
|
||||||
|
var _byteArrayToHex = []
|
||||||
|
for (var index = 0; index < byteArray.length; index++) {
|
||||||
|
_byteArrayToHex.push((byteArray[index] >>> 4).toString(16))
|
||||||
|
_byteArrayToHex.push((byteArray[index] & 15).toString(16));
|
||||||
|
}
|
||||||
|
return _byteArrayToHex.join("")
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user