Merge branch 'master' into pirate-chain

# Conflicts:
#	qortal-ui-core/src/plugins/routes.js
This commit is contained in:
CalDescent 2022-08-17 08:41:11 +01:00
commit 59fb31f84d
39 changed files with 12455 additions and 10845 deletions

View File

@ -41,19 +41,7 @@ Clone the main UI repo
Installation and linking
------------------------
In `qortal-ui-core/`, `qortal-ui-plugins/`, `qortal-ui-crypto/` directories, run:
```
yarn install
yarn link
```
Finally, in the `qortal-ui` directory, run:
```
yarn link qortal-ui-core
yarn link qortal-ui-plugins
yarn link qortal-ui-crypto
```
In `qortal-ui/` install_link:all
Build UI server and files

View File

@ -16,6 +16,7 @@
"author": "QORTAL <admin@qortal.org>",
"license": "GPL-3.0",
"scripts": {
"install_link:all": "(cd qortal-ui-core && yarn install && yarn link) && (cd qortal-ui-plugins && yarn install && yarn link) && (cd qortal-ui-crypto && yarn install && yarn link) && (yarn link qortal-ui-core && yarn link qortal-ui-plugins && yarn link qortal-ui-crypto)",
"dev": "node server.js",
"prebuild": "node -p \"'export const UI_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > qortal-ui-core/src/redux/app/version.js",
"build-dev": "node build.js",
@ -31,12 +32,12 @@
"publish": "electron-builder -p always"
},
"dependencies": {
"electron-updater": "5.0.5",
"electron-updater": "5.2.1",
"electron-log": "4.4.8"
},
"devDependencies": {
"electron": "19.0.9",
"electron-builder": "23.1.0",
"electron": "19.0.11",
"electron-builder": "23.3.3",
"electron-notarize": "1.2.1",
"electron-packager": "15.5.1",
"shelljs": "0.8.5"

View File

@ -21,12 +21,15 @@
"korean":"Koreanisch"
},
"sidemenu":{
"minting":"PRÄGUNG",
"mintingdetails":"PRÄGUNGSDETAILS",
"becomeAMinter":"WERDE EIN MINTER",
"wallets":"GELDBÖRSEN",
"tradeportal":"HANDELSPORTAL",
"rewardshare":"BELOHNUNGSANTEIL",
"nameregistration":"NAMENSREGISTRIERUNG",
"websites":"WEBSEITEN",
"management":"MANAGEMENT",
"datamanagement":"DATENMANAGEMENT",
"qchat":"Q-CHAT",
"groupmanagement":"GRUPPENMANAGEMENT",
@ -180,6 +183,18 @@
"mchange37":"Wenden Sie sich einfach an einen Minter in Qortal, der hoch genug ist, um einen Sponsoring-Schlüssel auszustellen, erhalten Sie diesen Schlüssel, kommen Sie dann hierher zurück und geben Sie den Schlüssel ein, um Ihre Minting-Reise zu beginnen!",
"mchange38":"in"
},
"becomeMinterPage":{
"bchange7":"Geben Sie den Sponsoring-Schlüssel ein",
"bchange8":"Geben Sie hier den Schlüssel Ihres Sponsors ein",
"bchange10":"Aktueller Sponsoring-Status",
"bchange12":"Prägung mit Sponsorenschlüssel",
"bchange13":"Verbleibende Blöcke im Sponsoring-Zeitraum",
"bchange15":"Sponsoring-Beziehung",
"bchange16":"Sponsorkonto",
"bchange17":"Sponsoring-Schlüssel kopieren",
"bchange18":"Prägen beginnen",
"bchange19":"Erfolg! Sie prägen derzeit."
},
"walletpage":{
"wchange1":"Hole Kontostand ...",
"wchange2":"Aktuelle Brieftasche",
@ -224,7 +239,8 @@
"wchange41":"Status",
"wchange42":"Bestätigungen",
"wchange43":"Ihre Transaktion wird erst angezeigt, wenn sie bestätigt wurde. Seien Sie geduldig...",
"wchange44": "Bitte versuche es erneut..."
"wchange44":"Bitte versuche es erneut...",
"wchange45":"Sende alle"
},
"tradepage":{
"tchange1":"Handelsportal",

View File

@ -21,12 +21,15 @@
"korean":"Coreano"
},
"sidemenu":{
"minting":"ACUÑACIÓN",
"mintingdetails":"DETALLES DE ACUÑACIÓN",
"becomeAMinter":"CONVIERTASE EN UN ACUÑADOR",
"wallets":"MONEDEROS",
"tradeportal":"PORTAL DE COMERCIO",
"rewardshare":"RECOMPENSA COMPARTIDA",
"nameregistration":"REGISTRO DE NOMBRE",
"websites":"SITIOS WEB",
"management":"GESTIÓN",
"datamanagement":"GESTIÓN DE DATOS",
"qchat":"Q-CHAT",
"groupmanagement":"GESTIÓN DE GRUPO",
@ -180,6 +183,18 @@
"mchange37":"Simplemente acércate a un acuñador en Qortal que tenga el nivel suficiente para emitir una clave de patrocinio, obtén esa clave, luego vuelve aquí e introduce la clave para comenzar tu viaje de acuñación!",
"mchange38":"en"
},
"becomeMinterPage":{
"bchange7":"Introduzca la clave de patrocinio",
"bchange8":"Clave de entrada de su patrocinador aquí",
"bchange10":"Estado de patrocinio actual",
"bchange12":"Acuñación con clave de patrocinador",
"bchange13":"Bloques restantes en el período de patrocinio",
"bchange15":"Relación de patrocinio",
"bchange16":"Cuenta de patrocinador",
"bchange17":"Copiar clave de patrocinio",
"bchange18":"Empezar a acuñar",
"bchange19":"Éxito! Actualmente estás acuñando."
},
"walletpage":{
"wchange1":"Obteniendo saldo ...",
"wchange2":"Monedero Actual",
@ -224,7 +239,8 @@
"wchange41":"Estado",
"wchange42":"Confirmaciones",
"wchange43":"Su transacción no se mostrará hasta que se confirme, sea paciente...",
"wchange44": "Inténtalo de nuevo..."
"wchange44":"Inténtalo de nuevo...",
"wchange45":"Envia todo"
},
"tradepage":{
"tchange1":"Portal de Comercio",

View File

@ -21,12 +21,15 @@
"korean":"Coréen"
},
"sidemenu":{
"minting":"MONNAIE",
"mintingdetails":"DETAILS DE FRAPPE",
"becomeAMinter":"DEVENIR UN FRAPPEUR",
"wallets":"PORTEFEUILLES",
"tradeportal":"PORTAIL DE COMMERCE",
"rewardshare":"PARTAGE DE RECOMPENCES",
"nameregistration":"ENREGISTREMENT DE NOM",
"websites":"SITES WEB",
"management":"GESTIÓN",
"datamanagement":"GESTION DE DONNEES",
"qchat":"Q-CHAT",
"groupmanagement":"GESTION DE GROUPES",
@ -180,6 +183,18 @@
"mchange37":"Il vous suffit de communiquer avec un frappeur de Qortal qui est assez haut placé pour émettre une clé de parrainage, dobtenir cette clé, puis de revenir ici et dentrer la clé pour commencer à frapper. !",
"mchange38":"dans"
},
"becomeMinterPage":{
"bchange7":"Entrez la clé de parrainage",
"bchange8":"Entrez la clé de votre parrain ici",
"bchange10":"Statut actuel du parrainage",
"bchange12":"Frappe avec clé de sponsor",
"bchange13":"Blocages restants pendant la période de parrainage",
"bchange15":"Relation de parrainage",
"bchange16":"Compte Parrain",
"bchange17":"Copier la clé de parrainage",
"bchange18":"Commencer à frapper",
"bchange19":"Succès! Vous frappez actuellement."
},
"walletpage":{
"wchange1":"Récupération du solde ...",
"wchange2":"Portefeuille actuel",
@ -224,7 +239,8 @@
"wchange41":"Status",
"wchange42":"Confirmations",
"wchange43":"Votre transaction ne s'affichera pas tant qu'elle n'aura pas été confirmée, soyez patient...",
"wchange44": "Veuillez réessayer..."
"wchange44":"Veuillez réessayer...",
"wchange45":"Envoyer tout"
},
"tradepage":{
"tchange1":"Portail de commerce",

View File

@ -22,12 +22,15 @@
"korean":"कोरियाई"
},
"sidemenu":{
"minting":"मिंटिंग",
"mintingdetails":"खनन विवरण",
"becomeAMinter":"एक मिन्टर बनें",
"wallets":"वॉलेट",
"tradeportal":"व्यापार पोर्टल",
"rewardshare":"रिवॉर्ड शेयर",
"nameregistration":"नाम पंजीकरण",
"websites":"वेबसाइटों",
"management":"प्रबंधन",
"datamanagement":"डेटा प्रबंधन",
"qchat":"क्यू-चैट",
"groupmanagement":"समूह प्रबंधन",
@ -181,6 +184,18 @@
"mchange37":"बस क्वॉर्टल में एक मिन्टर तक पहुंचें जो प्रायोजन कुंजी जारी करने के लिए पर्याप्त उच्च स्तर का है, उस कुंजी को प्राप्त करें, फिर यहां वापस आएं और अपनी खनन यात्रा शुरू करने के लिए कुंजी इनपुट करें!",
"mchange38":"में"
},
"becomeMinterPage":{
"bchange7":"प्रायोजन कुंजी दर्ज करें",
"bchange8":"यहां आपके प्रायोजक से इनपुट कुंजी",
"bchange10":"वर्तमान प्रायोजन स्थिति",
"bchange12":"प्रायोजक कुंजी के साथ मिंटिंग",
"bchange13":"प्रायोजन अवधि में शेष ब्लॉक",
"bchange15":"प्रायोजन संबंध",
"bchange16":"प्रायोजक खाता",
"bchange17":"कॉपी प्रायोजन कुंजी",
"bchange18":"मिंटिंग शुरू करें",
"bchange19":"सफलता! आप वर्तमान में खनन कर रहे हैं।"
},
"walletpage":{
"wchange1":"शेष लाया जा रहा है...",
"wchange2":"वर्तमान वॉलेट",
@ -225,7 +240,8 @@
"wchange41":"स्थिति",
"wchange42":"पुष्टियों",
"wchange43":"कन्फर्म होने तक आपका ट्रांजैक्शन नहीं दिखेगा, धैर्य रखें...",
"wchange44": "कृपया पुन: प्रयास करें..."
"wchange44":"कृपया पुन: प्रयास करें...",
"wchange45":"सब भेजें"
},
"tradepage":{
"tchange1":"व्यापार पोर्टल",

View File

@ -21,12 +21,15 @@
"korean":"Korejski"
},
"sidemenu":{
"minting":"KOVANJE",
"mintingdetails":"DETALJI O MINTANJU",
"becomeAMinter":"POSTANI MINTER",
"wallets":"NOVČANICI",
"tradeportal":"PORTAL RAZMJENE",
"rewardshare":"NAGRADNI UDIO",
"nameregistration":"REGISTRACIJA IMENA",
"websites":"WEB STRANICE",
"management":"UPRAVLJANJE",
"datamanagement":"UPRAVLJANJE PODACIMA",
"qchat":"Q-ČAVRLJANJE",
"groupmanagement":"UPRAVLJANJE GRUPAMA",
@ -180,6 +183,18 @@
"mchange37":"Jednostavno kontaktirajte Mintera u Qortalu koji je dovoljno visok level za izdavanje sponzorskog ključa, nabavite taj ključ, a zatim se vratite ovdje i unesite ključ za početak vašeg minterskog putovanja!",
"mchange38":"za"
},
"becomeMinterPage":{
"bchange7":"Unesite ključ sponzorstva",
"bchange8":"Ovdje unesite ključ vašeg sponzora",
"bchange10":"Trenutačni status sponzorstva",
"bchange12":"Kovanje sa sponzorskim ključem",
"bchange13":"Preostali blokovi u razdoblju sponzoriranja",
"bchange15":"Sponzorski odnos",
"bchange16":"Račun sponzora",
"bchange17":"Kopiraj ključ sponzorstva",
"bchange18":"Pokrenite kovanje",
"bchange19":"Uspjeh! Trenutno kovate."
},
"walletpage":{
"wchange1":"Dohvaćanje stanja ...",
"wchange2":"Trenutni novčanik",
@ -224,7 +239,8 @@
"wchange41":"Status",
"wchange42":"Potvrde",
"wchange43":"Vaša transakcija se neće prikazati dok se ne potvrdi, budite strpljivi...",
"wchange44": "Molim te pokušaj ponovno..."
"wchange44":"Molim te pokušaj ponovno...",
"wchange45":"Pošalji sve"
},
"tradepage":{
"tchange1":"Portal razmjene",

View File

@ -21,12 +21,15 @@
"korean":"Koreai"
},
"sidemenu":{
"minting":"BÉRTÉS",
"mintingdetails":"VERÉSI RÉSZLETEK",
"wallets": "Pénztárca",
"becomeAMinter":"LEGYEN PÉNZVERÓ",
"wallets":"PÉNZTÁRCA",
"tradeportal":"KERESKEDELEM PORTÁL",
"rewardshare":"JUTALOM RÉSZVÉNY",
"nameregistration":"NÉV REGISZTRÁCIÓ",
"websites":"WEBHELY",
"management":"MENEDZSMENT",
"datamanagement":"ADATKEZELÉS",
"qchat":"Q-CHAT",
"groupmanagement":"CSOPORTKEZELÉS",
@ -180,6 +183,18 @@
"mchange37":"Egyszerűen lépjen kapcsolatba egy Qortal-i pénzverdével, aki elég magas ahhoz, hogy kiadjon egy szponzorációs kulcsot, megszerezze azt a kulcsot, majd jöjjön vissza ide, és adja meg a kulcsot a verési út megkezdéséhez!",
"mchange38":"Ben"
},
"becomeMinterPage":{
"bchange7":"Írja be a szponzori kulcsot",
"bchange8":"Itt adja meg a szponzorától kapott kulcsot",
"bchange10":"Jelenlegi szponzorálási állapot",
"bchange12":"Pénzverés szponzorkulccsal",
"bchange13":"A szponzorálási időszakból hátralévő blokkok",
"bchange15":"Szponzori kapcsolat",
"bchange16":"Szponzori fiók",
"bchange17":"Szponzori kulcs másolása",
"bchange18":"Kezdje el a pénzverést",
"bchange19":"Siker! Jelenleg pénzverés folyik."
},
"walletpage":{
"wchange1":"Egyenleg lekérése...",
"wchange2":"Jelenlegi Pénztárca",
@ -224,7 +239,8 @@
"wchange41":"Állapot",
"wchange42":"Visszaigazolások",
"wchange43":"A tranzakció nem jelenik meg a megerősítésig, legyen türelemmel...",
"wchange44": "Kérlek próbáld újra..."
"wchange44":"Kérlek próbáld újra...",
"wchange45":"Az összes elküldése"
},
"tradepage":{
"tchange1":"Kereskedelmi Portál",

View File

@ -21,12 +21,15 @@
"korean":"Coreano"
},
"sidemenu":{
"minting":"CONIAZIONE",
"mintingdetails":"DETTAGLI DI MINTING",
"becomeAMinter":"DIVENTA UN MINATORE",
"wallets":"PORTAFOGLI",
"tradeportal":"PORTALE COMMERCIALE",
"rewardshare":"QUOTA DI RICOMPENSA",
"nameregistration":"REGISTRAZIONE DI NOME",
"websites":"SITI",
"management":"GESTIONE",
"datamanagement":"GESTIONE DATI",
"qchat":"Q-CHAT",
"groupmanagement":"GESTIONE DEI GRUPPI",
@ -180,6 +183,18 @@
"mchange37":"Semplicemente trova uno/a minatore di un livello sufficientemente alto per poter fornire una chiave di sponsorizzazione, ottieni la chiave, poi torna qui e inserisci la chiave per iniziare il tuo viaggio nella minazione!",
"mchange38":"in"
},
"becomeMinterPage":{
"bchange7":"Inserisci la chiave di sponsorizzazione",
"bchange8":"Inserisci qui la chiave del tuo sponsor",
"bchange10":"Stato di sponsorizzazione attuale",
"bchange12":"Conio con chiave sponsor",
"bchange13":"Blocchi rimanenti nel periodo di sponsorizzazione",
"bchange15":"Relazione di sponsorizzazione",
"bchange16":"Conto sponsor",
"bchange17":"Copia la chiave di sponsorizzazione",
"bchange18":"Inizia a coniare",
"bchange19":"Successo! Attualmente stai coniando."
},
"walletpage":{
"wchange1":"Recupero saldo ...",
"wchange2":"Portafoglio corrente",
@ -224,7 +239,8 @@
"wchange41":"Stato",
"wchange42":"Conferme",
"wchange43":"La tua transazione non verrà mostrata fino a quando non sarà confermata, sii paziente...",
"wchange44": "Per favore riprova..."
"wchange44":"Per favore riprova...",
"wchange45":"Invia tutto"
},
"tradepage":{
"tchange1":"Portale commerciale",

View File

@ -21,12 +21,15 @@
"korean":"한국어"
},
"sidemenu":{
"minting":"주조",
"mintingdetails":"민팅 세부정보",
"becomeAMinter":"민터 되기",
"wallets":"지갑",
"tradeportal":"무역 포털",
"rewardshare":"보상 공유",
"nameregistration":"이름 등록",
"websites":"웹사이트",
"management":"관리",
"datamanagement":"데이터 관리",
"qchat":"Q-CHAT",
"groupmanagement":"그룹 관리",
@ -180,6 +183,18 @@
"mchange37":"qortal에 있는 후원 키를 발급할 수 있을 정도로 높은 수준의 광부에게 연락하여 해당 키를 받은 다음 여기로 돌아와 주조 여행을 시작할 수 있는 키를 입력하기만 하면 됩니다.",
"mchange38":"안"
},
"becomeMinterPage":{
"bchange7":"후원 키 입력",
"bchange8":"여기에 스폰서의 키를 입력하세요.",
"bchange10":"현재 후원현황",
"bchange12":"후원 키로 주조",
"bchange13":"후원 기간 남은 블록",
"bchange15":"후원 관계",
"bchange16":"후원자 계정",
"bchange17":"후원 키 복사",
"bchange18":"주조 시작",
"bchange19":"성공! 당신은 현재 주조 중입니다."
},
"walletpage":{
"wchange1":"밸런스를 가져오는 중...",
"wchange2":"현재 지갑",
@ -224,7 +239,8 @@
"wchange41":"상황",
"wchange42":"확인",
"wchange43":"확인될 때까지 거래가 표시되지 않습니다. 기다려 주십시오.",
"wchange44": "다시 시도하십시오..."
"wchange44":"다시 시도하십시오...",
"wchange45":"모두 보내기"
},
"tradepage":{
"tchange1":"무역 포털",

View File

@ -21,12 +21,15 @@
"korean":"Koreansk"
},
"sidemenu":{
"minting":"UTBYTTE",
"mintingdetails":"MINTEDETALJER",
"becomeAMinter":"BLI EN MINTER",
"wallets":"LOMMEBØKER",
"tradeportal":"HANDELSPORTAL",
"rewardshare":"BELØNNINGSDEL",
"nameregistration":"REGISTRERING AV NAVN",
"websites":"NETTSIDER",
"management":"LEDELSE",
"datamanagement":"DATA-ADMINISTRASJON",
"qchat":"Q-CHAT",
"groupmanagement":"GRUPPEADMINISTRASJON",
@ -180,6 +183,18 @@
"mchange37":"Simpelthen ta kontakt med en minter i Qortal som har et høyt nok nivå til å utstede en sponsenøkkel, skaff den nøkkelen, og kom så tilbake hit og fyll inn nøkkelen for å begynne mintereisen!",
"mchange38":"i"
},
"becomeMinterPage":{
"bchange7":"Skriv inn sponsornøkkel",
"bchange8":"Inntast nøkkel fra sponsoren din her",
"bchange10":"Nåværende sponsorstatus",
"bchange12":"Preging med sponsornøkkel",
"bchange13":"Blokkerer som gjenstår i sponsorperioden",
"bchange15":"Sponsorforhold",
"bchange16":"Sponsorkonto",
"bchange17":"Kopier sponsornøkkel",
"bchange18":"Start mynting",
"bchange19":"Suksess! Du preger for øyeblikket."
},
"walletpage":{
"wchange1":"Henter saldo ...",
"wchange2":"Nåværende lommebok",
@ -222,7 +237,10 @@
"wchange39":"Kan ikke kopiere adressen.",
"wchange40":"BETALING",
"wchange41":"Status",
"wchange42": "Bekreftelser"
"wchange42":"Bekreftelser",
"wchange43":"Transaksjonen din vises ikke før den er bekreftet, vær tålmodig...",
"wchange44":"Vær så snill, prøv på nytt...",
"wchange45":"Send alle"
},
"tradepage":{
"tchange1":"Handelsportal",

View File

@ -21,12 +21,15 @@
"korean":"Koreański"
},
"sidemenu":{
"minting":"BICIE",
"mintingdetails":"SZCZEGÓŁY MINTOWANIA",
"becomeAMinter":"ZOSTAN MINTEREM",
"wallets":"PORTFELE",
"tradeportal":"PORTAL HANDLOWY",
"rewardshare":"UDZIAŁ W NAGRODZIE",
"nameregistration":"REJESTRACJA IMIENIA",
"websites":"STRONY INTERNETOWE",
"management":"KIEROWNICTWO",
"datamanagement":"ZARZĄDZANIE DANYMI",
"qchat":"Q-CHAT",
"groupmanagement":"ZARZĄDZANIE GRUPAMI",
@ -180,6 +183,18 @@
"mchange37":"Po prostu skontaktuj się z minterem w Qortal, który jest wystarczająco wysoko, aby mógł wydać Ci klucz sponsorski, zdobądź ten klucz, a następnie wróć tutaj i wprowadź klucz, aby rozpocząć swoją podróż minterską!",
"mchange38":"wejdź"
},
"becomeMinterPage":{
"bchange7":"Wprowadź klucz sponsorowania",
"bchange8":"Wprowadź klucz od swojego sponsora tutaj",
"bchange10":"Aktualny status sponsorowania",
"bchange12":"Minting z kluczem sponsora",
"bchange13":"Bloki pozostałe w okresie sponsorowania",
"bchange15":"Relacja sponsorska",
"bchange16":"Konto sponsora",
"bchange17":"Kopiuj klucz sponsorski",
"bchange18":"Rozpocznij bicie",
"bchange19":"Powodzenie! Aktualnie bijesz."
},
"walletpage":{
"wchange1":"Pobieram saldo...",
"wchange2":"Bieżący Portfel",
@ -224,7 +239,8 @@
"wchange41":"Status",
"wchange42":"Potwierdzenia",
"wchange43":"Twoja transakcja nie pojawi się, dopóki nie zostanie potwierdzona, bądź cierpliwy...",
"wchange44": "Proszę spróbuj ponownie..."
"wchange44":"Proszę spróbuj ponownie...",
"wchange45":"Wyślij wszystko"
},
"tradepage":{
"tchange1":"Portal Handlowy",

View File

@ -21,12 +21,15 @@
"korean":"Coreano"
},
"sidemenu":{
"minting":"CARTEIRA",
"mintingdetails":"DETALHES DA MINERAÇÃO",
"becomeAMinter":"TORNE-SE UM MINERADOR",
"wallets":"CARTEIRAS",
"tradeportal":"PORTAL DE COMÉRCIO",
"rewardshare":"PARTICIPAÇÃO NA RECOMPENSA",
"nameregistration":"REGISTRO DE NOME",
"websites":"SITES",
"management":"GESTÃO",
"datamanagement":"GESTÃO DE DADOS",
"qchat":"Q-CHAT",
"groupmanagement":"GESTÃO DE GRUPOS",
@ -180,6 +183,18 @@
"mchange37":"Mande menssagem a um minter no Qortal que seja nível 5 ou acima para emitir uma chave de patrocínio, obtenha essa chave, e em seguida, volte aqui para inserir-la e começar sua jornada de mineração !",
"mchange38":"Dentro"
},
"becomeMinterPage":{
"bchange7":"Digite a chave de patrocínio",
"bchange8":"Insira a chave do seu patrocinador aqui",
"bchange10":"Status atual do patrocínio",
"bchange12":"Cunhagem com chave de patrocinador",
"bchange13":"Blocos restantes no período de patrocínio",
"bchange15":"Relacionamento de patrocínio",
"bchange16":"Conta do patrocinador",
"bchange17":"Copiar chave de patrocínio",
"bchange18":"Iniciar a cunhagem",
"bchange19":"Sucesso! Você está cunhando no momento."
},
"walletpage":{
"wchange1":"Buscando Saldo ...",
"wchange2":"Carteira Atual",
@ -224,7 +239,8 @@
"wchange41":"Status",
"wchange42":"Confirmações",
"wchange43":"Sua transação não será exibida até ser confirmada, seja paciente...",
"wchange44": "Por favor, tente novamente..."
"wchange44":"Por favor, tente novamente...",
"wchange45":"Envie todos"
},
"tradepage":{
"tchange1":"Portal do Comércio",

View File

@ -21,12 +21,15 @@
"korean":"Coreeana"
},
"sidemenu":{
"minting":"MONTAREA",
"mintingdetails":"DETALII RECOMPENSARE MINTING)",
"becomeAMinter":"DEVINO PRODUCATOR DE MONEDA",
"wallets":"PORTOFELE",
"tradeportal":"PORTAL TRANZACTIONARE",
"rewardshare":"COTA RECOMPENSA",
"nameregistration":"INREGISTRARE NUME",
"websites":"WEBSITE-URI",
"management":"MANAGEMENT",
"datamanagement":"GESTIONARE DATE",
"qchat":"Q-CHAT",
"groupmanagement":"GESTIONARE GRUP",
@ -180,6 +183,18 @@
"mchange37":"Pur si simplu contactati un productor de moneda din Qortal care are un nivel suficient de ridicat pentru a emite o cheie de sponsorizare, obtineti acea cheie, apoi reveniti aici si introduceti cheia pentru a va incepe calatoria de productor de moneda !",
"mchange38":"in"
},
"becomeMinterPage":{
"bchange7":"Introduceti cheia de sponsorizare",
"bchange8":"Cheia de introducere de la sponsorul dvs. aici",
"bchange10":"Starea actuala a sponsorizarii",
"bchange12":"Minting cu cheia sponsorului",
"bchange13":"Blocuri ramase în perioada de sponsorizare",
"bchange15":"Relatia de sponsorizare",
"bchange16":"Cont de sponsor",
"bchange17":"Copiati cheia de sponsorizare",
"bchange18":"Incepeti baterea",
"bchange19":"Succes! Momentan bateti."
},
"walletpage":{
"wchange1":"Se actualizeaza balanta ...",
"wchange2":"Portofel Actual",
@ -224,7 +239,8 @@
"wchange41":"Stare",
"wchange42":"Confirmari",
"wchange43":"Tranzactia nu va aparea pana ce nu este confirmata, ai rabdare...",
"wchange44": "Te rog incearca din nou..."
"wchange44":"Te rog incearca din nou...",
"wchange45":"Trimite toate"
},
"tradepage":{
"tchange1":"Portal de Tranzactionare",

View File

@ -21,12 +21,15 @@
"korean":"Korejski"
},
"sidemenu":{
"minting":"KOVANJE",
"mintingdetails":"DETALJI MINTOVANJA",
"becomeAMinter":"POSTANITE MINTER",
"wallets":"NOVČANICI",
"tradeportal":"TRGOVINSKI PROZOR",
"rewardshare":"UDEO U NAGRADI",
"nameregistration":"REGISTRACIJA IMENA",
"websites":"WEBSITEOVI",
"management":"MENADŽMENT",
"datamanagement":"MENADŽMENT PODATAKA",
"qchat":"Q-ĆASKANJE",
"groupmanagement":"MENADŽMENT GRUPA",
@ -98,7 +101,7 @@
"qr_login_menu_item":"QR Login",
"qr_login_description_1":"Skenirajte ovaj kod da biste otključali novčanik na drugom uređaju koristeći istu lozinku sa kojom ste se prijavili.",
"qr_login_description_2":"Izaberite lozinku koju ćete koristiti za otključavanje novčanika na drugom uređaju nakon skeniranja QR koda.",
"qr_login_button_1": "Prikaži QR kod za prijavu,
"qr_login_button_1":"Prikaži QR kod za prijavu",
"qr_login_button_2":"Generišite QR kod za prijavu",
"notifications":"Notifikacije",
"accountsecurity":"Bezbednost Naloga",
@ -180,6 +183,18 @@
"mchange37":"Jednostavno se javite bilo kom minteru u Qortal-u koji ima dovoljno visok nivo da dodeli sponzorski ključ, nabavite taj ključ, a zatim se vratite ovde i unesite taj ključ da bi započeli svoj minting putovanje!",
"mchange38":"U"
},
"becomeMinterPage":{
"bchange7":"Unesite ključ za sponzorstvo",
"bchange8":"Ovde unesite ključ od svog sponzora",
"bchange10":"Trenutni status sponzorstva",
"bchange12":"Kovanje sa sponzorskim ključem",
"bchange13":"Preostali blokovi u periodu sponzorstva",
"bchange15":"Sponzorski odnos",
"bchange16":"Sponzorski nalog",
"bchange17":"Kopiraj sponzorski ključ",
"bchange18":"Počnite kovati",
"bchange19":"Uspeh! Trenutno kujete."
},
"walletpage":{
"wchange1":"Proveravam stanje ...",
"wchange2":"Trenutni Novčanik",
@ -224,7 +239,8 @@
"wchange41":"Status",
"wchange42":"Potvrde",
"wchange43":"Vaša transakcija se neće prikazati dok se ne potvrdi, budite strpljivi...",
"wchange44": "Molim vas, pokušajte ponovo..."
"wchange44":"Molim vas, pokušajte ponovo...",
"wchange45":"Poslati sve"
},
"tradepage":{
"tchange1":"Trgovinski prozor",

View File

@ -21,12 +21,15 @@
"korean":"Корейский"
},
"sidemenu":{
"minting":ЕКАНКA",
"mintingdetails":"ДЕТАЛИ ЧЕКАНКИ",
"becomeAMinter":"СТАТЬ МИНТЕРОМ",
"wallets":"КОШЕЛЬКИ",
"tradeportal":"ТОРГОВЫЙ ПОРТАЛ",
"rewardshare":"ДОЛЕВОЕ УЧАСТИЕ",
"nameregistration":"РЕГИСТРАЦИЯ ИМЕНИ",
"websites":"ВЕБ-САЙТЫ",
"management":"УПРАВЛЕНИЕ",
"datamanagement":"УПРАВЛЕНИЕ ДАННЫМИ",
"qchat":"Q-ЧАТ",
"groupmanagement":"УПРАВЛЕНИЕ ГРУППАМИ",
@ -180,6 +183,18 @@
"mchange37":"Просто обратитесь к минтеру в Qortal, уровень которого позволяет выдавать спонсорские ключи, получите этот ключ, затем вернитесь сюда и введите ключ, чтобы начать чеканку!",
"mchange38":"в"
},
"becomeMinterPage":{
"bchange7":"Введите спонсорский ключ",
"bchange8":"Введите ключ от вашего спонсора здесь",
"bchange10":"Текущий спонсорский статус",
"bchange12":"Минтинг со спонсорским ключом",
"bchange13":"Блоки, оставшиеся в периоде спонсорства",
"bchange15":"Спонсорские отношения",
"bchange16":"Спонсорский аккаунт",
"bchange17":"Копировать спонсорский ключ",
"bchange18":"Начать чеканку",
"bchange19":"Успех! В настоящее время вы занимаетесь чеканкой."
},
"walletpage":{
"wchange1":"Получение баланса...",
"wchange2":"Текущий кошелек",
@ -197,7 +212,7 @@
"wchange14":"Время",
"wchange15":"Подпись транзакции",
"wchange16":"Хэш транзакции",
"wchange17": "Отправитель",
"wchange17":"Отправлять",
"wchange18":"От адреса",
"wchange19":"Доступные средства",
"wchange20":"Кому (адрес или имя)",
@ -224,7 +239,8 @@
"wchange41":"Статус",
"wchange42":"Подтверждено",
"wchange43":"Ваша транзакция не будет отображаться, пока не будет подтверждена, наберитесь терпения...",
"wchange44": "Пожалуйста, попробуйте еще раз..."
"wchange44":"Пожалуйста, попробуйте еще раз...",
"wchange45":"Отправь все"
},
"tradepage":{
"tchange1":"Торговый портал",

View File

@ -21,12 +21,15 @@
"korean":"Korean"
},
"sidemenu":{
"minting":"MINTING",
"mintingdetails":"MINTING DETAILS",
"becomeAMinter":"BECOME A MINTER",
"wallets":"WALLETS",
"tradeportal":"TRADE PORTAL",
"rewardshare":"REWARD SHARE",
"nameregistration":"NAME REGISTRATION",
"websites":"WEBSITES",
"management":"MANAGEMENT",
"datamanagement":"DATA MANAGEMENT",
"qchat":"Q-CHAT",
"groupmanagement":"GROUP MANAGEMENT",
@ -175,6 +178,18 @@
"mchange37":"Simply reach out to a minter in Qortal who is high enough level to issue a sponsorship key, obtain that key, then come back here and input the key to begin your minting journey !",
"mchange38":"in"
},
"becomeMinterPage":{
"bchange7":"Enter Sponsorship Key",
"bchange8":"Input key from your sponsor here",
"bchange10":"Current Sponsorship Status",
"bchange12":"Minting with sponsor key",
"bchange13":"Blocks Remaining in Sponsorship Period",
"bchange15":"Sponsorship Relationship",
"bchange16":"Sponsor Account",
"bchange17":"Copy Sponsorship Key",
"bchange18":"Start Minting",
"bchange19":"Success! You are currently minting."
},
"walletpage":{
"wchange1":"Fetching balance ...",
"wchange2":"Current Wallet",
@ -219,7 +234,8 @@
"wchange41":"Status",
"wchange42":"Confirmations",
"wchange43":"Your transaction will not show until confirmed, be patient...",
"wchange44": "Please try again..."
"wchange44":"Please try again...",
"wchange45":"Send all"
},
"tradepage":{
"tchange1":"Trade Portal",

View File

@ -21,12 +21,15 @@
"korean":"韩语"
},
"sidemenu":{
"minting":"铸币",
"mintingdetails":"铸币信息",
"becomeAMinter":"成为一个铸币者",
"wallets":"钱包",
"tradeportal":"交易门户",
"rewardshare":"铸币密钥",
"nameregistration":"注册名称",
"websites":"网站",
"management":"管理",
"datamanagement":"资料管理",
"qchat":"Q-CHAT",
"groupmanagement":"群组管理",
@ -180,6 +183,18 @@
"mchange37":"因此你只需寻找赞助商并获得赞助码,然后返回此处输入赞助码即可开始您的铸币之旅!",
"mchange38":"在"
},
"becomeMinterPage":{
"bchange7":"输入赞助密钥",
"bchange8":"您的赞助商在此处输入密钥",
"bchange10":"目前的赞助状态",
"bchange12":"使用赞助商密钥铸造",
"bchange13":"赞助期内剩余的区块",
"bchange15":"赞助关系",
"bchange16":"赞助商账户",
"bchange17":"复制赞助密钥",
"bchange18":"开始铸币",
"bchange19":"成功!您目前正在铸币。"
},
"walletpage":{
"wchange1":"正在加载钱包余额...",
"wchange2":"当前钱包地址",
@ -224,7 +239,8 @@
"wchange41":"状态",
"wchange42":"确认数",
"wchange43":"您的交易在确认之前不会显示,请耐心等待...",
"wchange44": "请再试一次..."
"wchange44":"请再试一次...",
"wchange45":"全部发送"
},
"tradepage":{
"tchange1":"交易门户",

View File

@ -21,12 +21,15 @@
"korean":"韓語"
},
"sidemenu":{
"minting":"鑄幣",
"mintingdetails":"鑄幣信息",
"becomeAMinter":"成為一個鑄幣者",
"wallets":"錢包",
"tradeportal":"交易門戶",
"rewardshare":"鑄幣密鑰",
"nameregistration":"註冊名稱",
"websites":"網站",
"management":"管理",
"datamanagement":"資料管理",
"qchat":"Q-CHAT",
"groupmanagement":"群組管理",
@ -180,6 +183,18 @@
"mchange37":"因此你只需尋找贊助商並獲得贊助碼,然後返回此處輸入贊助碼即可開始您的鑄幣之旅!",
"mchange38":"在"
},
"becomeMinterPage":{
"bchange7":"輸入贊助密鑰",
"bchange8":"您的讚助商在此處輸入密鑰",
"bchange10":"目前的讚助狀態",
"bchange12":"使用贊助商密鑰鑄造",
"bchange13":"贊助期內剩餘的區塊",
"bchange15":"贊助關係",
"bchange16":"贊助商賬戶",
"bchange17":"複製贊助密鑰",
"bchange18":"開始鑄幣",
"bchange19":"成功!您目前正在鑄幣。"
},
"walletpage":{
"wchange1":"正在加載錢包餘額...",
"wchange2":"當前錢包地址",
@ -224,7 +239,8 @@
"wchange41":"狀態",
"wchange42":"確認數",
"wchange43":"您的交易在確認之前不會顯示,請耐心等待...",
"wchange44": "請再試一次..."
"wchange44":"請再試一次...",
"wchange45":"全部發送"
},
"tradepage":{
"tchange1":"交易門戶",

View File

@ -19,10 +19,10 @@
"dependencies": {
"@hapi/hapi": "20.2.2",
"@hapi/inert": "7.0.0",
"sass": "1.53.0"
"sass": "1.54.3"
},
"devDependencies": {
"@babel/core": "7.18.9",
"@babel/core": "7.18.10",
"@material/mwc-button": "0.26.1",
"@material/mwc-checkbox": "0.26.1",
"@material/mwc-dialog": "0.26.1",
@ -55,24 +55,24 @@
"@polymer/paper-tooltip": "3.0.1",
"@rollup/plugin-alias": "3.1.9",
"@rollup/plugin-babel": "5.3.1",
"@rollup/plugin-commonjs": "22.0.1",
"@rollup/plugin-commonjs": "22.0.2",
"@rollup/plugin-node-resolve": "13.3.0",
"@rollup/plugin-replace": "4.0.0",
"@vaadin/grid": "23.1.4",
"@vaadin/icons": "23.1.4",
"@vaadin/password-field": "23.1.4",
"@vaadin/grid": "23.1.5",
"@vaadin/icons": "23.1.5",
"@vaadin/password-field": "23.1.5",
"asmcrypto.js": "2.3.2",
"bcryptjs": "2.4.3",
"epml": "0.3.3",
"file-saver": "2.0.5",
"lit": "2.2.7",
"lit": "2.2.8",
"lit-translate": "2.0.1",
"postcss": "8.4.14",
"postcss": "8.4.16",
"pwa-helpers": "0.9.1",
"random-sentence-generator": "0.0.8",
"redux": "4.2.0",
"redux-thunk": "2.4.1",
"rollup": "2.77.0",
"rollup": "2.77.2",
"rollup-plugin-node-globals": "1.4.0",
"rollup-plugin-postcss": "4.0.2",
"rollup-plugin-progress": "1.1.2",

View File

@ -5,6 +5,8 @@ import { translate, translateUnsafeHTML } from 'lit-translate'
import '@polymer/paper-icon-button/paper-icon-button.js'
import '@polymer/iron-icons/iron-icons.js'
import '@polymer/app-layout/app-layout.js'
import '@polymer/paper-ripple'
import './wallet-profile.js'
import './app-info.js'
@ -12,10 +14,6 @@ import './sidenav-menu.js'
import './show-plugin.js'
import './qort-theme-toggle.js'
import './language-selector.js'
import '@polymer/app-layout/app-layout.js'
import '@polymer/paper-ripple'
import './settings-view/user-settings.js'
import './logout-view/logout-view.js'

View File

@ -1,14 +1,14 @@
import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../store.js'
import { translate, translateUnsafeHTML } from 'lit-translate'
import { LitElement, html, css } from 'lit';
import { connect } from 'pwa-helpers';
import { store } from '../store.js';
import { translate, translateUnsafeHTML } from 'lit-translate';
import '@polymer/paper-ripple'
import '@vaadin/icon'
import '@vaadin/icons'
import '@polymer/paper-ripple';
import '@vaadin/icon';
import '@vaadin/icons';
import '../functional-components/side-menu.js'
import '../functional-components/side-menu-item.js'
import '../functional-components/side-menu.js';
import '../functional-components/side-menu-item.js';
class SidenavMenu extends connect(store)(LitElement) {
static get properties() {
@ -16,8 +16,9 @@ class SidenavMenu extends connect(store)(LitElement) {
config: { type: Object },
urls: { type: Object },
nodeType: { type: String, reflect: true },
theme: { type: String, reflect: true }
}
theme: { type: String, reflect: true },
addressInfo: { type: Object },
};
}
static get styles() {
@ -43,15 +44,25 @@ class SidenavMenu extends connect(store)(LitElement) {
border-top: 1px solid var(--border);
outline: none;
}
`
]
.start-minting-wrapper {
position: absolute;
bottom: 130px;
left: 50%;
transform: translateX(calc(-50% - 10px));
}
`,
];
}
constructor() {
super()
this.urls = []
this.nodeType = ''
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
super();
this.urls = [];
this.nodeType = '';
this.theme = localStorage.getItem('qortalTheme')
? localStorage.getItem('qortalTheme')
: 'light';
this.addressInfo = {};
}
render() {
@ -59,101 +70,179 @@ class SidenavMenu extends connect(store)(LitElement) {
<div class="s-menu">
<side-menu>
${this.renderNodeTypeMenu()}
${this.renderNodeManagement()}
</side-menu>
</div>
`
`;
}
firstUpdated() {
this.getNodeType()
this.getNodeType();
}
async getNodeType() {
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
const url = `${nodeUrl}/admin/info`
const myNode =
store.getState().app.nodeConfig.knownNodes[
store.getState().app.nodeConfig.node
];
const nodeUrl =
myNode.protocol + '://' + myNode.domain + ':' + myNode.port;
const url = `${nodeUrl}/admin/info`;
await fetch(url)
.then(response => {
return response.json()
.then((response) => {
return response.json();
})
.then(data => {
this.nodeType = data.type
.then((data) => {
this.nodeType = data.type;
})
.catch(err => {
.catch((err) => {
console.error('Request failed', err);
})
});
}
renderNodeTypeMenu() {
const addressInfo = this.addressInfo;
const isMinter = addressInfo?.error !== 124 && +addressInfo?.level > 0;
if (this.nodeType === 'lite') {
return html`
<side-menu-item label="${translate("sidemenu.wallets")}" href="/app/wallet" selected>
<side-menu-item
label="${translate('sidemenu.wallets')}"
href="/app/wallet"
selected
>
<vaadin-icon icon="vaadin:wallet" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.nameregistration")}" href="/app/name-registration">
<side-menu-item
label="${translate('sidemenu.nameregistration')}"
href="/app/name-registration"
>
<vaadin-icon icon="vaadin:user-check" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.datamanagement")}" href="/app/data-management">
<side-menu-item
label="${translate('sidemenu.datamanagement')}"
href="/app/data-management"
>
<vaadin-icon icon="vaadin:database" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.qchat")}" href="/app/q-chat">
<side-menu-item
label="${translate('sidemenu.qchat')}"
href="/app/q-chat"
>
<vaadin-icon icon="vaadin:chat" slot="icon"></vaadin-icon>
</side-menu-item>
`
${this.renderNodeManagement()}
`;
} else {
return html`
<side-menu-item label="${translate("sidemenu.mintingdetails")}" href="/app/minting">
<side-menu-item
label="${translate('sidemenu.minting')}"
expanded
>
<vaadin-icon icon="vaadin:info-circle" slot="icon"></vaadin-icon>
${isMinter
? html`<side-menu-item
label="${translate('sidemenu.mintingdetails')}"
href="/app/minting"
>
<vaadin-icon icon="vaadin:info-circle" slot="icon"></vaadin-icon>
</side-menu-item>`
: html`<side-menu-item
label="${translate('sidemenu.becomeAMinter')}"
href="/app/become-minter"
>
<vaadin-icon icon="vaadin:thumbs-up" slot="icon"></vaadin-icon>
</side-menu-item>`}
</side-menu-item>
<side-menu-item label="${translate("sidemenu.wallets")}" href="/app/wallet" selected>
<side-menu-item
label="${translate('sidemenu.wallets')}"
href="/app/wallet"
selected
>
<vaadin-icon icon="vaadin:wallet" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.tradeportal")}" href="/app/trade-portal">
<side-menu-item
label="${translate('sidemenu.tradeportal')}"
href="/app/trade-portal"
>
<vaadin-icon icon="vaadin:bullets" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.rewardshare")}" href="/app/reward-share">
<side-menu-item
label="${translate('sidemenu.rewardshare')}"
href="/app/reward-share"
>
<vaadin-icon icon="vaadin:share-square" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.nameregistration")}" href="/app/name-registration">
<vaadin-icon icon="vaadin:user-check" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.websites")}" href="/app/websites">
<vaadin-icon icon="vaadin:desktop" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.datamanagement")}" href="/app/data-management">
<vaadin-icon icon="vaadin:database" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.qchat")}" href="/app/q-chat">
<side-menu-item
label="${translate('sidemenu.qchat')}"
href="/app/q-chat"
>
<vaadin-icon icon="vaadin:chat" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.groupmanagement")}" href="/app/group-management">
<side-menu-item
label="${translate('sidemenu.nameregistration')}"
href="/app/name-registration"
>
<vaadin-icon icon="vaadin:user-check" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item
label="${translate('sidemenu.websites')}"
href="/app/websites"
>
<vaadin-icon icon="vaadin:desktop" slot="icon" ></vaadin-icon>
</side-menu-item>
<side-menu-item
label="${translate('sidemenu.management')}"
expanded
>
<vaadin-icon icon="vaadin:cogs" slot="icon"></vaadin-icon>
<side-menu-item
label="${translate('sidemenu.datamanagement')}"
href="/app/data-management"
>
<vaadin-icon icon="vaadin:database" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item
label="${translate('sidemenu.groupmanagement')}"
href="/app/group-management"
>
<vaadin-icon icon="vaadin:group" slot="icon"></vaadin-icon>
</side-menu-item>
<side-menu-item label="${translate("sidemenu.puzzles")}" href="/app/puzzles">
${this.renderNodeManagement()}
</side-menu-item>
<side-menu-item
label="${translate('sidemenu.puzzles')}"
href="/app/puzzles"
>
<vaadin-icon icon="vaadin:puzzle-piece" slot="icon"></vaadin-icon>
</side-menu-item>
`
`;
}
}
renderNodeManagement() {
const checkNodeManagement = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
if (checkNodeManagement.enableManagement = true) {
const checkNodeManagement =
store.getState().app.nodeConfig.knownNodes[
store.getState().app.nodeConfig.node
];
if ((checkNodeManagement.enableManagement = true)) {
return html`
<side-menu-item label="${translate("sidemenu.nodemanagement")}" href="/app/node-management">
<side-menu-item
label="${translate('sidemenu.nodemanagement')}"
href="/app/node-management"
>
<vaadin-icon icon="vaadin:cloud" slot="icon"></vaadin-icon>
</side-menu-item>
`
`;
} else {
return html``
return html``;
}
}
stateChanged(state) {
this.config = state.config
this.urls = state.app.registeredUrls
this.config = state.config;
this.urls = state.app.registeredUrls;
this.addressInfo = state.app.accountInfo.addressInfo;
}
}
window.customElements.define('sidenav-menu', SidenavMenu)
window.customElements.define('sidenav-menu', SidenavMenu);

View File

@ -0,0 +1,259 @@
import { LitElement, html, css } from 'lit';
import { connect } from 'pwa-helpers';
import { store } from '../store.js';
import { translate, get } from 'lit-translate';
import '../functional-components/my-button.js';
import { routes } from '../plugins/routes.js';
class StartMinting extends connect(store)(LitElement) {
static get properties() {
return {
addressInfo: { type: Object },
mintingAccountData: { type: Array },
errorMsg: { type: String },
};
}
static get styles() {
return [
css`
.start-minting-wrapper {
position: absolute;
left: 50%;
transform: translateX(calc(-50% - 10px));
}
`,
];
}
constructor() {
super();
this.addressInfo = {};
this.mintingAccountData = [];
this.errorMsg = '';
}
render() {
return html` ${this.renderStartMintingButton()} `;
}
firstUpdated() {
this.getMintingAcccounts();
}
async getMintingAcccounts() {
const myNode =
store.getState().app.nodeConfig.knownNodes[
store.getState().app.nodeConfig.node
];
const nodeUrl =
myNode.protocol + '://' + myNode.domain + ':' + myNode.port;
const url = `${nodeUrl}/admin/mintingaccounts`;
try {
const res = await fetch(url);
const mintingAccountData = await res.json();
this.mintingAccountData = mintingAccountData;
} catch (error) {
this.errorMsg = 'Cannot fetch minting accounts';
}
}
renderStartMintingButton() {
const myNode =
store.getState().app.nodeConfig.knownNodes[
store.getState().app.nodeConfig.node
];
const nodeUrl =
myNode.protocol + '://' + myNode.domain + ':' + myNode.port;
const mintingAccountData = this.mintingAccountData;
const addressInfo = this.addressInfo;
const rewardShares = async (minterAddr) => {
const url = `${nodeUrl}/addresses/rewardshares?minters=${minterAddr}&recipients=${minterAddr}`;
const res = await fetch(url);
const data = await res.json();
return data;
};
const address =
window.parent.reduxStore.getState().app?.selectedAddress?.address;
const nonce =
window.parent.reduxStore.getState().app?.selectedAddress?.nonce;
const publicAddress =
window.parent.reduxStore.getState().app?.selectedAddress
?.base58PublicKey;
const findMintingAccount = mintingAccountData.find((ma) =>
ma.publicKey.includes(publicAddress)
);
const isMinterButKeyMintingKeyNotAssigned =
addressInfo?.error !== 124 &&
addressInfo?.level === 1 &&
!findMintingAccount;
const removeMintingAccount = async (publicKey) => {
const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`;
return await fetch(url, {
method: 'DELETE',
body: publicKey,
});
};
const makeTransactionRequest = async (lastRef) => {
let mylastRef = lastRef;
let rewarddialog1 = get('transactions.rewarddialog1');
let rewarddialog2 = get('transactions.rewarddialog2');
let rewarddialog3 = get('transactions.rewarddialog3');
let rewarddialog4 = get('transactions.rewarddialog4');
let myTxnrequest = await routes.transaction({
data: {
type: 38,
nonce: nonce,
params: {
recipientPublicKey: publicAddress,
percentageShare: 0,
lastReference: mylastRef,
rewarddialog1: rewarddialog1,
rewarddialog2: rewarddialog2,
rewarddialog3: rewarddialog3,
rewarddialog4: rewarddialog4,
},
},
disableModal: true,
});
return myTxnrequest;
};
const getTxnRequestResponse = (txnResponse) => {
if (txnResponse.success === false && txnResponse.message) {
throw new Error(txnResponse);
} else if (
txnResponse.success === true &&
!txnResponse.data.error
) {
let err6string = get('rewardsharepage.rchange21');
return err6string;
} else {
throw new Error(txnResponse);
}
};
const createSponsorshipKey = async () => {
let lastRef = await getLastRef();
let myTransaction = await makeTransactionRequest(lastRef);
getTxnRequestResponse(myTransaction);
return myTransaction.data;
};
const addMintingAccount = async (sponsorshipKeyValue) => {
const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`;
return await fetch(url, {
method: 'POST',
body: sponsorshipKeyValue,
});
};
const getLastRef = async () => {
const url = `${nodeUrl}/addresses/lastreference/${address}`;
const res = await fetch(url);
const data = await res.text();
return data;
};
const startMinting = async () => {
this.errorMsg = '';
let rewardSharesList;
try {
rewardSharesList = await rewardShares(address);
} catch (error) {
this.errorMsg = 'Cannot fetch reward shares';
return;
}
// check to see if self-share exists
const findRewardShareData = rewardSharesList.find(
(rs) =>
rs?.mintingAccount === address && rs?.recipient === address
);
let sponsorshipKeyValue = null;
try {
if (!findRewardShareData) {
// if no self-share exits, create one.
sponsorshipKeyValue = await createSponsorshipKey();
} else {
sponsorshipKeyValue =
findRewardShareData.rewardSharePublicKey;
}
} catch (error) {
this.errorMsg = 'Cannot create sponsorship key';
return;
}
// Check to see if a sponsorship key on a newly-level 1 minter exists. If it does, remove it.
const findMintingAccountFromOtherUser = mintingAccountData.find(
(ma) => !ma.publicKey.includes(publicAddress)
);
try {
if (
findMintingAccountFromOtherUser &&
findMintingAccountFromOtherUser?.publicKey[0]
) {
await removeMintingAccount(
findMintingAccountFromOtherUser?.publicKey[0]
);
}
} catch (error) {
this.errorMsg = 'Failed to remove key';
return;
}
try {
await addMintingAccount(sponsorshipKeyValue);
routes.showSnackBar({
data: translate('becomeMinterPage.bchange19'),
});
this.getMintingAcccounts();
} catch (error) {
this.errorMsg = 'Failed to add minting key';
return;
}
};
return html`
${isMinterButKeyMintingKeyNotAssigned
? html`
<div class="start-minting-wrapper">
<my-button
label="${translate(
'becomeMinterPage.bchange18'
)}"
?isLoading=${false}
.onClick=${async () => {
await startMinting();
if (this.errorMsg) {
routes.showSnackBar({
data: this.errorMsg,
});
}
}}
></my-button>
</div>
`
: ''}
`;
}
stateChanged(state) {
this.addressInfo = state.app.accountInfo.addressInfo;
}
}
window.customElements.define('start-minting', StartMinting);

View File

@ -6,6 +6,8 @@ import { translate, translateUnsafeHTML } from 'lit-translate'
import '@polymer/paper-toast'
import '@material/mwc-icon-button'
import './start-minting.js'
class WalletProfile extends connect(store)(LitElement) {
static get properties() {
return {
@ -88,6 +90,7 @@ class WalletProfile extends connect(store)(LitElement) {
<p id="blocksMinted">${translate("walletprofile.blocksminted")} - ${this.accountInfo.addressInfo.blocksMinted + this.accountInfo.addressInfo.blocksMintedAdjustment}</p>
<p id="address">${this.wallet.addresses[0].address}</p>
</div>
<start-minting></start-minting>
</div>
<paper-toast id="toast" horizontal-align="right" vertical-align="top" vertical-offset="64"></paper-toast>
`

View File

@ -0,0 +1,47 @@
import { LitElement, html, css } from 'lit';
import '@vaadin/button';
import '@polymer/paper-spinner/paper-spinner-lite.js';
export class MyButton extends LitElement {
static properties = {
onClick: { type: Function },
isLoading: { type: Boolean },
label: { type: String },
};
static styles = css`
vaadin-button {
height: 100%;
margin: 0;
cursor: pointer;
min-width: 80px;
background-color: #03a9f4;
color: white;
}
vaadin-button:hover {
opacity: 0.8;
}
`;
constructor() {
super();
this.onClick = () => {};
this.isLoading = false;
this.label = '';
}
render() {
return html`
<vaadin-button
?disabled="${this.isLoading}"
@click="${this.onClick}"
>
${this.isLoading === false
? html`${this.label}`
: html`<paper-spinner-lite active></paper-spinner-lite>`}
</vaadin-button>
`;
}
}
customElements.define('my-button', MyButton);

View File

@ -1,84 +1,96 @@
import { store } from '../store.js'
import { doAddPluginUrl, doUpdateBlockInfo, doUpdateNodeStatus, doUpdateNodeInfo, doSetNode, doPageUrl, doSetChatHeads, doUpdateAccountInfo } from '../redux/app/app-actions.js'
import * as api from 'qortal-ui-crypto'
import { requestTransactionDialog } from '../functional-components/confirm-transaction-dialog.js'
import { doNewMessage } from '../notifications/controller.js'
import snackbar from '../functional-components/snackbar.js'
import { loadStateFromLocalStorage, saveStateToLocalStorage } from '../localStorageHelpers.js'
import copyTextMenu from '../functional-components/copy-text-menu.js'
import framePasteMenu from '../functional-components/frame-paste-menu.js'
import { store } from '../store.js';
import {
doAddPluginUrl,
doUpdateBlockInfo,
doUpdateNodeStatus,
doUpdateNodeInfo,
doSetNode,
doPageUrl,
doSetChatHeads,
doUpdateAccountInfo,
} from '../redux/app/app-actions.js';
import * as api from 'qortal-ui-crypto';
import { requestTransactionDialog } from '../functional-components/confirm-transaction-dialog.js';
import { doNewMessage } from '../notifications/controller.js';
import snackbar from '../functional-components/snackbar.js';
import {
loadStateFromLocalStorage,
saveStateToLocalStorage,
} from '../localStorageHelpers.js';
import copyTextMenu from '../functional-components/copy-text-menu.js';
import framePasteMenu from '../functional-components/frame-paste-menu.js';
const createTransaction = api.createTransaction
const processTransaction = api.processTransaction
const signChatTransaction = api.signChatTransaction
const signArbitraryTransaction = api.signArbitraryTransaction
const tradeBotCreateRequest = api.tradeBotCreateRequest
const tradeBotRespondRequest = api.tradeBotRespondRequest
const signTradeBotTxn = api.signTradeBotTxn
const deleteTradeOffer = api.deleteTradeOffer
const cancelAllOffers = api.cancelAllOffers
const sendBtc = api.sendBtc
const sendLtc = api.sendLtc
const sendDoge = api.sendDoge
const sendDgb = api.sendDgb
const sendRvn = api.sendRvn
const sendArrr = api.sendArrr
const createTransaction = api.createTransaction;
const processTransaction = api.processTransaction;
const signChatTransaction = api.signChatTransaction;
const signArbitraryTransaction = api.signArbitraryTransaction;
const tradeBotCreateRequest = api.tradeBotCreateRequest;
const tradeBotRespondRequest = api.tradeBotRespondRequest;
const signTradeBotTxn = api.signTradeBotTxn;
const deleteTradeOffer = api.deleteTradeOffer;
const cancelAllOffers = api.cancelAllOffers;
const sendBtc = api.sendBtc;
const sendLtc = api.sendLtc;
const sendDoge = api.sendDoge;
const sendDgb = api.sendDgb;
const sendRvn = api.sendRvn;
const sendArrr = api.sendArrr;
export const routes = {
hello: async (req) => {
return 'Hello from awesomeness'
return 'Hello from awesomeness';
},
registerUrl: async (req) => {
store.dispatch(doAddPluginUrl(req.data))
store.dispatch(doAddPluginUrl(req.data));
},
setAccountInfo: async (req) => {
store.dispatch(doUpdateAccountInfo(req.data))
store.dispatch(doUpdateAccountInfo(req.data));
},
getAccountInfo: async (req) => {
return store.getState().app.accountInfo
return store.getState().app.accountInfo;
},
setChatHeads: async (req) => {
return store.dispatch(doSetChatHeads(req.data))
return store.dispatch(doSetChatHeads(req.data));
},
getChatHeads: async (req) => {
return store.getState().app.chatHeads
return store.getState().app.chatHeads;
},
updateBlockInfo: async (req) => {
store.dispatch(doUpdateBlockInfo(req.data))
store.dispatch(doUpdateBlockInfo(req.data));
},
updateNodeStatus: async (req) => {
store.dispatch(doUpdateNodeStatus(req.data))
store.dispatch(doUpdateNodeStatus(req.data));
},
updateNodeInfo: async (req) => {
store.dispatch(doUpdateNodeInfo(req.data))
store.dispatch(doUpdateNodeInfo(req.data));
},
setNode: async (req) => {
store.dispatch(doSetNode(req.data))
store.dispatch(doSetNode(req.data));
},
getNodeConfig: async (req) => {
return store.getState().app.nodeConfig
return store.getState().app.nodeConfig;
},
setPageUrl: async (req) => {
return store.dispatch(doPageUrl(req.data))
return store.dispatch(doPageUrl(req.data));
},
getLocalStorage: async (req) => {
return loadStateFromLocalStorage(req.data)
return loadStateFromLocalStorage(req.data);
},
setLocalStorage: async (req) => {
return saveStateToLocalStorage(req.data.key, req.data.dataObj)
return saveStateToLocalStorage(req.data.key, req.data.dataObj);
},
openCopyTextMenu: async (req) => {
@ -86,26 +98,26 @@ export const routes = {
selectedText: req.data.selectedText,
eventObject: req.data.eventObject,
isFrame: req.data.isFrame,
}
copyTextMenu.open(textMenuObject)
};
copyTextMenu.open(textMenuObject);
},
closeCopyTextMenu: async (req) => {
copyTextMenu.close()
copyTextMenu.close();
},
openFramePasteMenu: async (req) => {
framePasteMenu.open(req.data)
framePasteMenu.open(req.data);
},
closeFramePasteMenu: async (req) => {
framePasteMenu.close()
framePasteMenu.close();
},
apiCall: async (req) => {
const url = req.data.url
delete req.data.url
return api.request(url, req.data)
const url = req.data.url;
delete req.data.url;
return api.request(url, req.data);
},
addresses: async (req) => {
@ -116,251 +128,289 @@ export const routes = {
nonce: address.nonce,
textColor: address.textColor,
base58PublicKey: address.base58PublicKey,
}
})
};
});
},
transaction: async (req) => {
let response
let response;
try {
const tx = createTransaction(req.data.type, store.getState().app.wallet._addresses[req.data.nonce].keyPair, req.data.params)
await requestTransactionDialog.requestTransaction(tx)
const res = await processTransaction(tx.signedBytes)
const tx = createTransaction(
req.data.type,
store.getState().app.wallet._addresses[req.data.nonce].keyPair,
req.data.params
);
if (!req.disableModal) {
await requestTransactionDialog.requestTransaction(tx);
}
const res = await processTransaction(tx.signedBytes);
response = {
success: true,
data: res,
}
};
} catch (e) {
console.error(e)
console.error(e.message)
console.error(e);
console.error(e.message);
response = {
success: false,
message: e.message,
};
}
}
return response
return response;
},
standaloneTransaction: async (req) => {
const rebuildUint8Array = (obj) => {
let _array = new Uint8Array(Object.keys(obj).length)
let _array = new Uint8Array(Object.keys(obj).length);
for (let i = 0; i < _array.byteLength; ++i) {
_array.set([obj[i]], i)
}
return _array
_array.set([obj[i]], i);
}
return _array;
};
let response
let response;
try {
// req.data.keyPair unfortunately "prepared" into horrible object so we need to convert back
let _keyPair = {};
for (let _keyName in req.data.keyPair) {
_keyPair[_keyName] = rebuildUint8Array(req.data.keyPair[_keyName])
_keyPair[_keyName] = rebuildUint8Array(
req.data.keyPair[_keyName]
);
}
const tx = createTransaction(req.data.type, _keyPair, req.data.params)
const res = await processTransaction(tx.signedBytes)
const tx = createTransaction(
req.data.type,
_keyPair,
req.data.params
);
const res = await processTransaction(tx.signedBytes);
response = {
success: true,
data: res,
}
};
} catch (e) {
console.error(e)
console.error(e.message)
console.error(e);
console.error(e.message);
response = {
success: false,
message: e.message,
};
}
}
return response
return response;
},
username: async (req) => {
const state = store.getState()
const username = state.user.storedWallets[state.app.wallet.addresses[0].address].name
const state = store.getState();
const username =
state.user.storedWallets[state.app.wallet.addresses[0].address]
.name;
return username
return username;
},
chat: async (req) => {
let response
let response;
try {
const tx = createTransaction(req.data.type, store.getState().app.wallet._addresses[req.data.nonce].keyPair, req.data.params)
const tx = createTransaction(
req.data.type,
store.getState().app.wallet._addresses[req.data.nonce].keyPair,
req.data.params
);
response = tx.chatBytes
response = tx.chatBytes;
} catch (e) {
console.error(e)
console.error(e.message)
response = false
console.error(e);
console.error(e.message);
response = false;
}
return response
return response;
},
sign_chat: async (req) => {
let response
let response;
try {
const signedChatBytes = await signChatTransaction(req.data.chatBytesArray, req.data.chatNonce, store.getState().app.wallet._addresses[req.data.nonce].keyPair)
const signedChatBytes = await signChatTransaction(
req.data.chatBytesArray,
req.data.chatNonce,
store.getState().app.wallet._addresses[req.data.nonce].keyPair
);
const res = await processTransaction(signedChatBytes)
response = res
const res = await processTransaction(signedChatBytes);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = false
console.error(e);
console.error(e.message);
response = false;
}
return response
return response;
},
sign_arbitrary: async (req) => {
let response
let response;
try {
const signedArbitraryBytes = await signArbitraryTransaction(req.data.arbitraryBytesBase58, req.data.arbitraryBytesForSigningBase58, req.data.arbitraryNonce, store.getState().app.wallet._addresses[req.data.nonce].keyPair)
const signedArbitraryBytes = await signArbitraryTransaction(
req.data.arbitraryBytesBase58,
req.data.arbitraryBytesForSigningBase58,
req.data.arbitraryNonce,
store.getState().app.wallet._addresses[req.data.nonce].keyPair
);
const res = await processTransaction(signedArbitraryBytes)
response = res
const res = await processTransaction(signedArbitraryBytes);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = false
console.error(e);
console.error(e.message);
response = false;
}
return response
return response;
},
showNotification: async (req) => {
doNewMessage(req.data)
doNewMessage(req.data);
},
showSnackBar: async (req) => {
snackbar.add({
labelText: req.data,
dismiss: true,
})
});
},
tradeBotCreateRequest: async (req) => {
let response
let response;
try {
const unsignedTxn = await tradeBotCreateRequest(req.data)
const unsignedTxn = await tradeBotCreateRequest(req.data);
const signedTxnBytes = await signTradeBotTxn(unsignedTxn, store.getState().app.selectedAddress.keyPair)
const signedTxnBytes = await signTradeBotTxn(
unsignedTxn,
store.getState().app.selectedAddress.keyPair
);
const res = await processTransaction(signedTxnBytes)
response = res
const res = await processTransaction(signedTxnBytes);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
tradeBotRespondRequest: async (req) => {
let response
let response;
try {
const res = await tradeBotRespondRequest(req.data)
const res = await tradeBotRespondRequest(req.data);
response = res
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
deleteTradeOffer: async (req) => {
let response
let response;
try {
const unsignedTxn = await deleteTradeOffer(req.data)
const unsignedTxn = await deleteTradeOffer(req.data);
const signedTxnBytes = await signTradeBotTxn(unsignedTxn, store.getState().app.selectedAddress.keyPair)
const signedTxnBytes = await signTradeBotTxn(
unsignedTxn,
store.getState().app.selectedAddress.keyPair
);
const res = await processTransaction(signedTxnBytes)
const res = await processTransaction(signedTxnBytes);
response = res
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
cancelAllOffers: async (req) => {
let response
let response;
try {
const res = await cancelAllOffers(store.getState().app.selectedAddress)
response = res
const res = await cancelAllOffers(
store.getState().app.selectedAddress
);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
sendBtc: async (req) => {
let response
let response;
try {
const res = await sendBtc(req.data)
response = res
const res = await sendBtc(req.data);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
sendLtc: async (req) => {
let response
let response;
try {
const res = await sendLtc(req.data)
response = res
const res = await sendLtc(req.data);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
sendDoge: async (req) => {
let response
let response;
try {
const res = await sendDoge(req.data)
response = res
const res = await sendDoge(req.data);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
sendDgb: async (req) => {
let response
let response;
try {
const res = await sendDgb(req.data)
response = res
const res = await sendDgb(req.data);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
sendRvn: async (req) => {
let response
let response;
try {
const res = await sendRvn(req.data)
response = res
const res = await sendRvn(req.data);
response = res;
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
console.error(e);
console.error(e.message);
response = e.message;
}
return response
return response;
},
sendArrr: async (req) => {
@ -375,4 +425,4 @@ export const routes = {
}
return response
},
}
};

View File

@ -1,13 +1,13 @@
require('events').EventEmitter.defaultMaxListeners = 0
const path = require("path");
const { nodeResolve } = require("@rollup/plugin-node-resolve");
const progress = require("rollup-plugin-progress");
require('events').EventEmitter.defaultMaxListeners = 0;
const path = require('path');
const { nodeResolve } = require('@rollup/plugin-node-resolve');
const progress = require('rollup-plugin-progress');
const replace = require('@rollup/plugin-replace');
const globals = require("rollup-plugin-node-globals");
const commonjs = require("@rollup/plugin-commonjs");
const alias = require("@rollup/plugin-alias");
const globals = require('rollup-plugin-node-globals');
const commonjs = require('@rollup/plugin-commonjs');
const alias = require('@rollup/plugin-alias');
const { terser } = require('rollup-plugin-terser');
const babel = require("@rollup/plugin-babel");
const babel = require('@rollup/plugin-babel');
const aliases = {};
@ -16,7 +16,7 @@ const generateRollupConfig = (inputFile, outputFile) => {
inputOptions: {
onwarn: (warning, rollupWarn) => {
if (warning.code !== 'CIRCULAR_DEPENDENCY') {
rollupWarn(warning)
rollupWarn(warning);
}
},
input: inputFile,
@ -31,30 +31,30 @@ const generateRollupConfig = (inputFile, outputFile) => {
}),
nodeResolve({
preferBuiltins: false,
mainFields: ['module', 'browser']
mainFields: ['module', 'browser'],
}),
replace({
preventAssignment: true,
"process.env.NODE_ENV": JSON.stringify("production"),
'process.env.NODE_ENV': JSON.stringify('production'),
}),
commonjs(),
globals(),
progress(),
babel.babel({
babelHelpers: 'bundled',
exclude: "node_modules/**",
exclude: 'node_modules/**',
}),
terser({
compress: true,
output: {
comments: false,
},
})
}),
],
},
outputOptions: {
file: outputFile,
format: "umd",
format: 'umd',
},
};
};
@ -62,69 +62,73 @@ const generateRollupConfig = (inputFile, outputFile) => {
const generateForPlugins = () => {
const configs = [
{
in: "plugins/core/main.src.js",
out: "plugins/core/main.js",
in: 'plugins/core/main.src.js',
out: 'plugins/core/main.js',
},
{
in: "plugins/core/trade-portal/trade-portal.src.js",
out: "plugins/core/trade-portal/trade-portal.js",
in: 'plugins/core/trade-portal/trade-portal.src.js',
out: 'plugins/core/trade-portal/trade-portal.js',
},
{
in: "plugins/core/wallet/wallet-app.src.js",
out: "plugins/core/wallet/wallet-app.js",
in: 'plugins/core/wallet/wallet-app.src.js',
out: 'plugins/core/wallet/wallet-app.js',
},
{
in: "plugins/core/reward-share/reward-share.src.js",
out: "plugins/core/reward-share/reward-share.js",
in: 'plugins/core/reward-share/reward-share.src.js',
out: 'plugins/core/reward-share/reward-share.js',
},
{
in: "plugins/core/node-management/node-management.src.js",
out: "plugins/core/node-management/node-management.js",
in: 'plugins/core/node-management/node-management.src.js',
out: 'plugins/core/node-management/node-management.js',
},
{
in: "plugins/core/group-management/group-management.src.js",
out: "plugins/core/group-management/group-management.js",
in: 'plugins/core/group-management/group-management.src.js',
out: 'plugins/core/group-management/group-management.js',
},
{
in: "plugins/core/name-registration/name-registration.src.js",
out: "plugins/core/name-registration/name-registration.js",
in: 'plugins/core/name-registration/name-registration.src.js',
out: 'plugins/core/name-registration/name-registration.js',
},
{
in: "plugins/core/qdn/websites.src.js",
out: "plugins/core/qdn/websites.js",
in: 'plugins/core/qdn/websites.src.js',
out: 'plugins/core/qdn/websites.js',
},
{
in: "plugins/core/qdn/publish/publish.src.js",
out: "plugins/core/qdn/publish/publish.js",
in: 'plugins/core/qdn/publish/publish.src.js',
out: 'plugins/core/qdn/publish/publish.js',
},
{
in: "plugins/core/qdn/browser/browser.src.js",
out: "plugins/core/qdn/browser/browser.js",
in: 'plugins/core/qdn/browser/browser.src.js',
out: 'plugins/core/qdn/browser/browser.js',
},
{
in: "plugins/core/qdn/data-management/data-management.src.js",
out: "plugins/core/qdn/data-management/data-management.js",
in: 'plugins/core/qdn/data-management/data-management.src.js',
out: 'plugins/core/qdn/data-management/data-management.js',
},
{
in: "plugins/core/messaging/messaging.src.js",
out: "plugins/core/messaging/messaging.js",
in: 'plugins/core/messaging/messaging.src.js',
out: 'plugins/core/messaging/messaging.js',
},
{
in: "plugins/core/messaging/chain-messaging/chain-messaging.src.js",
out: "plugins/core/messaging/chain-messaging/chain-messaging.js",
in: 'plugins/core/messaging/chain-messaging/chain-messaging.src.js',
out: 'plugins/core/messaging/chain-messaging/chain-messaging.js',
},
{
in: "plugins/core/messaging/q-chat/q-chat.src.js",
out: "plugins/core/messaging/q-chat/q-chat.js",
in: 'plugins/core/messaging/q-chat/q-chat.src.js',
out: 'plugins/core/messaging/q-chat/q-chat.js',
},
{
in: "plugins/core/minting/minting-info.src.js",
out: "plugins/core/minting/minting-info.js",
in: 'plugins/core/minting/minting-info.src.js',
out: 'plugins/core/minting/minting-info.js',
},
{
in: "plugins/core/puzzles/puzzles.src.js",
out: "plugins/core/puzzles/puzzles.js",
}
in: 'plugins/core/become-minter/become-minter.src.js',
out: 'plugins/core/become-minter/become-minter.js',
},
{
in: 'plugins/core/puzzles/puzzles.src.js',
out: 'plugins/core/puzzles/puzzles.js',
},
].map((file) => {
return generateRollupConfig(
path.join(__dirname, file.in),

View File

@ -22,7 +22,7 @@
"emoji-picker-js": "https://github.com/Qortal/emoji-picker-js"
},
"devDependencies": {
"@babel/core": "7.18.9",
"@babel/core": "7.18.10",
"@github/time-elements": "3.1.2",
"@material/mwc-button": "0.26.1",
"@material/mwc-checkbox": "0.26.1",
@ -43,17 +43,17 @@
"@polymer/paper-tooltip": "3.0.1",
"@rollup/plugin-alias": "3.1.9",
"@rollup/plugin-babel": "5.3.1",
"@rollup/plugin-commonjs": "22.0.1",
"@rollup/plugin-commonjs": "22.0.2",
"@rollup/plugin-node-resolve": "13.3.0",
"@rollup/plugin-replace": "4.0.0",
"@vaadin/button": "23.1.4",
"@vaadin/grid": "23.1.4",
"@vaadin/icons": "23.1.4",
"@vaadin/button": "23.1.5",
"@vaadin/grid": "23.1.5",
"@vaadin/icons": "23.1.5",
"epml": "0.3.3",
"html-escaper": "3.0.3",
"lit": "2.2.7",
"lit": "2.2.8",
"lit-translate": "2.0.1",
"rollup": "2.77.0",
"rollup": "2.77.2",
"rollup-plugin-node-globals": "1.4.0",
"rollup-plugin-progress": "1.1.2",
"rollup-plugin-terser": "7.0.2"

View File

@ -0,0 +1,229 @@
import { css } from 'lit';
export const pageStyles = css`
* {
--mdc-theme-surface: var(--white);
--mdc-dialog-content-ink-color: var(--black);
}
.header-title {
font-size: 40px;
color: var(--black);
font-weight: 400;
text-align: center;
}
.divider {
color: #eee;
border-radius: 80%;
margin-bottom: 2rem;
}
.fullWidth {
width: 100%;
}
.page-container {
display: flex;
align-items: center;
flex-direction: column;
margin-bottom: 75px;
width: 100%;
}
.inner-container {
display: flex;
align-items: center;
flex-direction: column;
width: 100%;
}
.description {
color: var(--black);
}
.message {
color: var(--gray);
}
.sub-main {
width: 95%;
display: flex;
flex-direction: column;
max-width: 800px;
}
.level-black {
font-size: 32px;
color: var(--black);
font-weight: 400;
text-align: center;
margin-top: 2rem;
}
.form-wrapper {
display: flex;
align-items: center;
width: 100%;
height: 50px;
}
.row {
display: flex;
width: 100%;
}
.column {
display: flex;
flex-direction: column;
width: 100%;
}
.column-center {
align-items: center;
}
.no-margin {
margin: 0;
}
.no-wrap {
flex-wrap: nowrap !important;
}
.row-center {
justify-content: center;
flex-wrap: wrap;
}
.form-item {
display: flex;
height: 100%;
}
.form-item--button {
flex-grow: 0;
}
.form-item--input {
flex-grow: 1;
margin-right: 25px;
}
.center-box {
position: absolute;
width: 100%;
top: 50%;
left: 50%;
transform: translate(-50%, 0%);
text-align: center;
}
.content-box {
border: 1px solid var(--border);
border-radius: 10px;
padding: 10px 25px;
text-align: center;
display: inline-block;
margin-bottom: 5px;
flex-basis: 250px;
}
.gap {
gap: 10px;
}
.level-black {
font-size: 32px;
color: var(--black);
font-weight: 400;
text-align: center;
margin-top: 2rem;
text-align: center;
}
.title {
font-weight: 600;
font-size: 20px;
line-height: 28px;
opacity: 0.66;
color: var(--switchborder);
}
.address {
overflow-wrap: anywhere;
color: var(--black);
}
h4 {
font-weight: 600;
font-size: 20px;
line-height: 28px;
color: var(--black);
}
mwc-textfield {
width: 100%;
}
vaadin-button {
height: 100%;
margin: 0;
cursor: pointer;
outline: 1px var(--black) solid;
min-width: 80px;
}
.loader,
.loader:after {
border-radius: 50%;
width: 10em;
height: 10em;
}
.loadingContainer {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 10;
}
.backdrop {
height: 100vh;
width: 100vw;
opacity: 0.6;
background-color: var(--border);
z-index: 9;
position: fixed;
}
.loading,
.loading:after {
border-radius: 50%;
width: 5em;
height: 5em;
}
.loading {
margin: 10px auto;
border-width: 0.6em;
border-style: solid;
border-color: rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2)
rgba(3, 169, 244, 0.2) rgb(3, 169, 244);
font-size: 10px;
position: relative;
text-indent: -9999em;
transform: translateZ(0px);
animation: 1.1s linear 0s infinite normal none running loadingAnimation;
}
@-webkit-keyframes loadingAnimation {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loadingAnimation {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
`;

View File

@ -0,0 +1,199 @@
import { LitElement, html } from 'lit';
import { Epml } from '../../../epml.js';
import '../components/ButtonIconCopy.js';
import { use, translate, registerTranslateConfig } from 'lit-translate';
import { blocksNeed } from '../../utils/blocks-needed.js';
registerTranslateConfig({
loader: (lang) => fetch(`/language/${lang}.json`).then((res) => res.json()),
});
import '@polymer/paper-spinner/paper-spinner-lite.js';
import '@material/mwc-button';
import '@material/mwc-textfield';
import '@vaadin/button';
import { pageStyles } from './become-minter-css.src.js';
import './components/not-sponsored.src';
import './components/yes-sponsored.src';
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent });
class BecomeMinter extends LitElement {
static get properties() {
return {
theme: { type: String, reflect: true },
sponsorshipKeyValue: { type: String },
nodeInfo: { type: Object },
isPageLoading: { type: Boolean },
addressInfo: { type: Object },
rewardSharePublicKey: { type: String },
mintingAccountData: { type: Array },
};
}
static styles = [pageStyles];
constructor() {
super();
this.theme = localStorage.getItem('qortalTheme')
? localStorage.getItem('qortalTheme')
: 'light';
this.sponsorshipKeyValue = '';
this.isPageLoading = true;
this.nodeInfo = {};
this.addressInfo = {};
this.rewardSharePublicKey = '';
this.mintingAccountData = null;
}
changeLanguage() {
const checkLanguage = localStorage.getItem('qortalLanguage');
if (checkLanguage === null || checkLanguage.length === 0) {
localStorage.setItem('qortalLanguage', 'us');
use('us');
} else {
use(checkLanguage);
}
}
_handleStorage() {
const checkLanguage = localStorage.getItem('qortalLanguage');
const checkTheme = localStorage.getItem('qortalTheme');
use(checkLanguage);
if (checkTheme === 'dark') {
this.theme = 'dark';
} else {
this.theme = 'light';
}
document.querySelector('html').setAttribute('theme', this.theme);
}
connectedCallback() {
super.connectedCallback();
window.addEventListener('storage', this._handleStorage);
}
disconnectedCallback() {
window.removeEventListener('storage', this._handleStorage);
super.disconnectedCallback();
}
async getNodeInfo() {
const nodeInfo = await parentEpml.request('apiCall', {
url: `/admin/status`,
});
return nodeInfo;
}
async getMintingAcccounts() {
const mintingAccountData = await parentEpml.request('apiCall', {
url: `/admin/mintingaccounts`,
});
return mintingAccountData;
}
async atMount() {
this.changeLanguage();
this.addressInfo =
window.parent.reduxStore.getState().app.accountInfo.addressInfo;
this.isPageLoading = true;
try {
const [nodeInfo, myRewardShareArray, mintingaccounts] =
await Promise.all([
this.getNodeInfo(),
this.getRewardShareRelationship(
window.parent.reduxStore.getState().app?.selectedAddress
?.address
),
this.getMintingAcccounts(),
]);
this.nodeInfo = nodeInfo;
this.rewardSharePublicKey =
myRewardShareArray[0]?.rewardSharePublicKey;
this.isPageLoading = false;
this.mintingAccountData = mintingaccounts;
} catch (error) {
console.error(error);
this.isPageLoading = false;
}
}
async firstUpdated() {
await this.atMount();
}
async getRewardShareRelationship(recipientAddress) {
const myRewardShareArray = await parentEpml.request('apiCall', {
type: 'api',
url: `/addresses/rewardshares?recipients=${recipientAddress}`,
});
return myRewardShareArray;
}
_levelUpBlocks() {
let countBlocksString = (
blocksNeed(0) -
(this.addressInfo?.blocksMinted +
this.addressInfo?.blocksMintedAdjustment)
).toString();
return countBlocksString;
}
render() {
console.log({ mintingAccountData: this.mintingAccountData });
const findMintingAccount = this.mintingAccountData?.find(
(ma) => !!ma.publicKey
);
const isAlreadySponsored =
this.addressInfo?.error !== 124 &&
this.addressInfo?.level === 0 &&
findMintingAccount;
return html`
${this.isPageLoading
? html`
<div class="loadingContainer">
<div class="loading"></div>
</div>
<div class="backdrop"></div>
`
: ''}
<div class="page-container">
<h1 class="header-title">
${translate('mintingpage.mchange32')}
</h1>
<div class="fullWidth">
<hr class="divider" />
</div>
${isAlreadySponsored
? ''
: html`
<not-sponsored
.atMount="${() => this.atMount()}"
></not-sponsored>
`}
${!isAlreadySponsored
? ''
: html`
<yes-sponsored
.rewardSharePublicKey=${this
.rewardSharePublicKey}
.addressInfo=${this.addressInfo}
></yes-sponsored>
`}
</div>
`;
}
}
window.customElements.define('become-minter', BecomeMinter);

View File

@ -0,0 +1,141 @@
import { LitElement, html } from 'lit';
import { Epml } from '../../../../epml.js';
import '../../components/ButtonIconCopy.js';
import { use, translate, registerTranslateConfig } from 'lit-translate';
registerTranslateConfig({
loader: (lang) => fetch(`/language/${lang}.json`).then((res) => res.json()),
});
import '@polymer/paper-spinner/paper-spinner-lite.js';
import '@material/mwc-button';
import '@material/mwc-textfield';
import '@vaadin/button';
import { pageStyles } from '../become-minter-css.src.js';
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent });
class NotSponsored extends LitElement {
static properties = {
atMount: { type: Function },
isLoadingSponsorshipKeySubmit: { type: Boolean },
sponsorshipKeyValue: { type: String },
addMintingAccountMessage: { type: String },
};
static styles = [pageStyles];
constructor() {
super();
this.isLoadingSponsorshipKeySubmit = false;
this.sponsorshipKeyValue = '';
this.addMintingAccountMessage = '';
this.atMount = () => {};
}
renderErr1Text() {
return html`${translate('nodepage.nchange27')}`;
}
renderErr2Text() {
return html`${translate('nodepage.nchange28')}`;
}
getApiKey() {
const myNode =
window.parent.reduxStore.getState().app.nodeConfig.knownNodes[
window.parent.reduxStore.getState().app.nodeConfig.node
];
let apiKey = myNode.apiKey;
return apiKey;
}
addMintingAccount(e) {
this.isLoadingSponsorshipKeySubmit = true;
this.addMintingAccountMessage = 'Loading...';
parentEpml
.request('apiCall', {
url: `/admin/mintingaccounts?apiKey=${this.getApiKey()}`,
method: 'POST',
body: this.sponsorshipKeyValue,
})
.then((res) => {
if (res === true) {
// refetch data
this.atMount();
this.sponsorshipKeyValue = '';
this.addMintingAccountMessage = this.renderErr1Text();
this.isLoadingSponsorshipKeySubmit = false;
} else {
this.sponsorshipKeyValue = '';
this.addMintingAccountMessage = this.renderErr2Text();
this.isLoadingSponsorshipKeySubmit = false;
}
});
}
inputHandler(e) {
this.sponsorshipKeyValue = e.target.value;
}
render() {
return html`
<div class="inner-container">
<div class="sub-main">
<h2 class="level-black">
${translate('mintingpage.mchange33')}
</h2>
<p class="description">
${translate('mintingpage.mchange34')}
</p>
<h2 class="level-black">
${translate('mintingpage.mchange35')}
</h2>
<p class="description">
${translate('mintingpage.mchange36')}
</p>
<p class="description">
${translate('mintingpage.mchange37')}
</p>
<p class="message">${this.addMintingAccountMessage}</p>
<div class="form-wrapper">
<div class="form-item form-item--input">
<mwc-textfield
?disabled="${this
.isLoadingSponsorshipKeySubmit}"
label="${translate(
'becomeMinterPage.bchange8'
)}"
id="addSponsorshipKey"
@input="${this.inputHandler}"
.value="${this.sponsorshipKeyValue || ''}"
fullWidth
>
</mwc-textfield>
</div>
<div class="form-item form-item--button">
<vaadin-button
?disabled="${this
.isLoadingSponsorshipKeySubmit}"
@click="${this.addMintingAccount}"
>
${this.isLoadingSponsorshipKeySubmit === false
? html`${translate(
'puzzlepage.pchange15'
)}`
: html`<paper-spinner-lite
active
></paper-spinner-lite>`}
</vaadin-button>
</div>
</div>
</div>
</div>
`;
}
}
window.customElements.define('not-sponsored', NotSponsored);

View File

@ -0,0 +1,123 @@
import { LitElement, html } from 'lit';
import { Epml } from '../../../../epml.js';
import '../../components/ButtonIconCopy.js';
import { use, translate, registerTranslateConfig } from 'lit-translate';
registerTranslateConfig({
loader: (lang) => fetch(`/language/${lang}.json`).then((res) => res.json()),
});
import '@polymer/paper-spinner/paper-spinner-lite.js';
import '@material/mwc-button';
import '@material/mwc-textfield';
import '@vaadin/button';
import { blocksNeed } from '../../../utils/blocks-needed.js';
import { pageStyles } from '../become-minter-css.src.js';
class YesSponsored extends LitElement {
static get properties() {
return {
addressInfo: { type: Object },
rewardSharePublicKey: { type: String },
};
}
constructor() {
super();
this.addressInfo = {};
this.rewardSharePublicKey = '';
}
static styles = [pageStyles];
_levelUpBlocks() {
let countBlocksString = (
blocksNeed(0) -
(this.addressInfo?.blocksMinted +
this.addressInfo?.blocksMintedAdjustment)
).toString();
return countBlocksString;
}
render() {
return html`
<div class="inner-container">
<div class="column column-center">
<div class="column column-center">
<span class="level-black"
>${translate('becomeMinterPage.bchange10')}</span
>
<hr
style="width: 50%; color: #eee; border-radius: 80%; margin-bottom: 2rem;"
/>
</div>
<br />
<div class="row row-center gap">
<div class="content-box">
<span class="title"
>${translate(
'walletpage.wchange41'
)}</span
>
<hr
style="color: #eee; border-radius: 90%; margin-bottom: 1rem;"
/>
<h4>${translate('becomeMinterPage.bchange12')}</h4>
</div>
<div class="content-box">
<span class="title"
>${translate(
'becomeMinterPage.bchange13'
)}</span
>
<hr
style="color: #eee; border-radius: 90%; margin-bottom: 1rem;"
/>
<h4>
${this._levelUpBlocks()}
${translate('mintingpage.mchange26')}
</h4>
</div>
<div class="content-box">
<span class="title"
>${translate(
'becomeMinterPage.bchange15'
)}</span
>
<hr
style="color: #eee; border-radius: 90%; margin-bottom: 1rem;"
/>
<h4 class="no-margin">
${translate('becomeMinterPage.bchange16')}
</h4>
<div class="row row-center column-center no-wrap">
<p class="address">
${this.rewardSharePublicKey}
</p>
<button-icon-copy
title="${translate('walletpage.wchange3')}"
onSuccessMessage="${translate(
'walletpage.wchange4'
)}"
onErrorMessage="${translate(
'walletpage.wchange39'
)}"
textToCopy=${this.rewardSharePublicKey}
buttonSize="28px"
iconSize="16px"
color="var(--copybutton)"
offsetLeft="4px"
>
</button-icon-copy>
</div>
</div>
</div>
<br />
</div>
</div>
`;
}
}
window.customElements.define('yes-sponsored', YesSponsored);

View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/font/material-icons.css" />
<link rel="stylesheet" href="/font/switch-theme.css" />
<script>
const checkBack = localStorage.getItem('qortalTheme');
if (checkBack === 'dark') {
newtheme = 'dark';
} else {
newtheme = 'light';
}
document.querySelector('html').setAttribute('theme', newtheme);
</script>
<style>
html {
--scrollbarBG: #a1a1a1;
--thumbBG: #6a6c75;
}
*::-webkit-scrollbar {
width: 11px;
}
* {
scrollbar-width: thin;
scrollbar-color: var(--thumbBG) var(--scrollbarBG);
}
*::-webkit-scrollbar-track {
background: var(--scrollbarBG);
}
*::-webkit-scrollbar-thumb {
background-color: var(--thumbBG);
border-radius: 6px;
border: 3px solid var(--scrollbarBG);
}
html,
body {
margin: 0;
font-family: 'Roboto', sans-serif;
background: var(--plugback);
}
</style>
</head>
<body>
<become-minter></become-minter>
<script src="become-minter.js"></script>
</body>
</html>

View File

@ -309,6 +309,10 @@ class ChatPage extends LitElement {
this.messageSignature = eachMessage.signature
let _eachMessage = this.decodeMessage(eachMessage)
return _eachMessage
} else {
this.messageSignature = eachMessage.signature
let _eachMessage = this.decodeMessage(eachMessage)
return _eachMessage
}
})
@ -329,18 +333,22 @@ class ChatPage extends LitElement {
} else {
let _newMessages = messages.map((eachMessage) => {
if (eachMessage.isText === true) {
let _eachMessage = this.decodeMessage(eachMessage)
if (this.messageSignature !== eachMessage.signature) {
this.messageSignature = eachMessage.signature
// What are we waiting for, send in the message immediately...
this.renderNewMessage(_eachMessage)
}
return _eachMessage
} else {
let _eachMessage = this.decodeMessage(eachMessage)
if (this.messageSignature !== eachMessage.signature) {
this.messageSignature = eachMessage.signature
this.renderNewMessage(_eachMessage)
}
return _eachMessage
}
})

View File

@ -1,9 +1,8 @@
import { parentEpml } from './connect.js'
import './streams/streams.js'
let config = {}
let haveRegisteredNodeManagement = false
import { parentEpml } from './connect.js';
import './streams/streams.js';
let config = {};
let haveRegisteredNodeManagement = false;
parentEpml.ready().then(() => {
// pluginUrlsConf
@ -15,7 +14,16 @@ parentEpml.ready().then(() => {
title: 'Minting Details',
icon: 'vaadin:info-circle',
menus: [],
parent: false
parent: false,
},
{
url: 'become-minter',
domain: 'core',
page: 'become-minter/index.html',
title: 'Become a Minter',
icon: 'vaadin:info-circle',
menus: [],
parent: false,
},
{
url: 'wallet',
@ -24,7 +32,7 @@ parentEpml.ready().then(() => {
title: 'Wallet',
icon: 'vaadin:wallet',
menus: [],
parent: false
parent: false,
},
{
url: 'trade-portal',
@ -33,7 +41,7 @@ parentEpml.ready().then(() => {
title: 'Trade Portal',
icon: 'vaadin:bullets',
menus: [],
parent: false
parent: false,
},
{
url: 'reward-share',
@ -42,7 +50,7 @@ parentEpml.ready().then(() => {
title: 'Reward Share',
icon: 'vaadin:share-square',
menus: [],
parent: false
parent: false,
},
{
url: 'name-registration',
@ -51,7 +59,7 @@ parentEpml.ready().then(() => {
title: 'Name Registration',
icon: 'vaadin:user-check',
menus: [],
parent: false
parent: false,
},
{
url: 'websites',
@ -60,7 +68,7 @@ parentEpml.ready().then(() => {
title: 'Websites',
icon: 'vaadin:desktop',
menus: [],
parent: false
parent: false,
},
{
url: 'data-management',
@ -69,7 +77,7 @@ parentEpml.ready().then(() => {
title: 'Data Management',
icon: 'vaadin:database',
menus: [],
parent: false
parent: false,
},
{
url: 'q-chat',
@ -78,7 +86,7 @@ parentEpml.ready().then(() => {
title: 'Q-Chat',
icon: 'vaadin:chat',
menus: [],
parent: false
parent: false,
},
{
url: 'group-management',
@ -87,7 +95,7 @@ parentEpml.ready().then(() => {
title: 'Group Management',
icon: 'vaadin:group',
menus: [],
parent: false
parent: false,
},
{
url: 'puzzles',
@ -96,22 +104,25 @@ parentEpml.ready().then(() => {
title: 'Puzzles',
icon: 'vaadin:puzzle-piece',
menus: [],
parent: false
}
]
parent: false,
},
];
const registerPlugins = (pluginInfo) => {
parentEpml.request('registerUrl', pluginInfo)
}
parentEpml.request('registerUrl', pluginInfo);
};
const checkNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
const checkNode =
window.parent.reduxStore.getState().app.nodeConfig.knownNodes[
window.parent.reduxStore.getState().app.nodeConfig.node
];
parentEpml.subscribe('config', c => {
config = JSON.parse(c)
parentEpml.subscribe('config', (c) => {
config = JSON.parse(c);
// Only register node management if node management is enabled and it hasn't already been registered
if (!haveRegisteredNodeManagement && checkNode.enableManagement) {
haveRegisteredNodeManagement = true
haveRegisteredNodeManagement = true;
let nodeManagementConf = {
url: 'node-management',
@ -120,13 +131,13 @@ parentEpml.ready().then(() => {
title: 'Node Management',
icon: 'vaadin:cloud',
menus: [],
parent: false
}
parent: false,
};
let _pluginUrlsConf = [...pluginUrlsConf, nodeManagementConf]
registerPlugins(_pluginUrlsConf)
let _pluginUrlsConf = [...pluginUrlsConf, nodeManagementConf];
registerPlugins(_pluginUrlsConf);
} else {
registerPlugins(pluginUrlsConf)
registerPlugins(pluginUrlsConf);
}
})
})
});
});

View File

@ -545,7 +545,7 @@ class Websites extends LitElement {
const blockedNamesUrl = `${nodeUrl}/lists/blockedNames?apiKey=${this.getApiKey()}`
const resources = await parentEpml.request('apiCall', {
url: `/arbitrary/resources?service=${this.service}&default=true&limit=0&reverse=false&includestatus=true&includemetadata=true`
url: `/arbitrary/resources?service=${this.service}&default=true&limit=0&reverse=false&includestatus=false&includemetadata=false`
})
this.resources = resources

View File

@ -0,0 +1,55 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/font/material-icons.css">
<link rel="stylesheet" href="/font/switch-theme.css">
<script>
const checkBack = localStorage.getItem('qortalTheme')
if (checkBack === 'dark') {
newtheme = 'dark';
} else {
newtheme = 'light';
}
document.querySelector('html').setAttribute('theme', newtheme);
</script>
<style>
html {
--scrollbarBG: #a1a1a1;
--thumbBG: #6a6c75;
}
*::-webkit-scrollbar {
width: 11px;
}
* {
scrollbar-width: thin;
scrollbar-color: var(--thumbBG) var(--scrollbarBG);
}
*::-webkit-scrollbar-track {
background: var(--scrollbarBG);
}
*::-webkit-scrollbar-thumb {
background-color: var(--thumbBG);
border-radius: 6px;
border: 3px solid var(--scrollbarBG);
}
html,
body {
margin: 0;
font-family: "Roboto", sans-serif;
background: var(--plugback);
}
</style>
</head>
<body>
<trade-bot></trade-bot>
<script src="trade-bot.js"></script>
</body>
</html>

View File

@ -19,6 +19,8 @@ import '@material/mwc-textfield'
import '@polymer/paper-progress/paper-progress.js'
import '@polymer/paper-slider/paper-slider.js'
import '@polymer/paper-spinner/paper-spinner-lite.js'
import '@polymer/paper-icon-button/paper-icon-button.js'
import '@polymer/iron-icons/iron-icons.js'
import '@vaadin/button'
import '@vaadin/grid'
import '@vaadin/icon'
@ -776,7 +778,10 @@ class MultiWallet extends LitElement {
<div><span>${this.selectedTransaction.creatorAddress}</span></div>
<span class="title"> ${translate("walletpage.wchange10")} </span>
<br />
<div><span>${this.selectedTransaction.recipient}</span></div>
<div style="display: inline;">
${this.renderSQB()}
</div>
<br />
${!this.selectedTransaction.amount ? '' : html`
<span class="title"> ${translate("walletpage.wchange11")} </span>
<br />
@ -823,9 +828,10 @@ class MultiWallet extends LitElement {
</div>
<span class="title"> ${translate("walletpage.wchange10")} </span>
<br />
<div>
<div style="display: inline;">
<span>${this.selectedTransaction.btcReceiver}</span>
</div>
<br />
<span class="title"> ${translate("walletpage.wchange12")} </span>
<br />
<div>
@ -873,9 +879,10 @@ class MultiWallet extends LitElement {
</div>
<span class="title"> ${translate("walletpage.wchange10")} </span>
<br />
<div>
<span> ${this.selectedTransaction.ltcReceiver} </span>
<div style="display: inline;">
<span>${this.selectedTransaction.ltcReceiver}</span> <paper-icon-button icon="icons:send" @click=${() => this.sendToLtcAddress()} title="Send to this address"></paper-icon-button>
</div>
<br />
<span class="title"> ${translate("walletpage.wchange12")} </span>
<br />
<div>
@ -918,9 +925,10 @@ class MultiWallet extends LitElement {
</div>
<span class="title"> ${translate("walletpage.wchange9")} </span>
<br />
<div>
<div style="display: inline;">
<span>${this.selectedTransaction.dogeSender}</span>
</div>
<br />
<span class="title"> ${translate("walletpage.wchange10")} </span>
<br />
<div>
@ -973,9 +981,10 @@ class MultiWallet extends LitElement {
</div>
<span class="title"> ${translate("walletpage.wchange10")} </span>
<br />
<div>
<div> style="display: inline;"
<span>${this.selectedTransaction.dgbReceiver}</span>
</div>
<br />
<span class="title"> ${translate("walletpage.wchange12")} </span>
<br />
<div>
@ -1023,9 +1032,10 @@ class MultiWallet extends LitElement {
</div>
<span class="title"> ${translate("walletpage.wchange10")} </span>
<br />
<div>
<div style="display: inline;">
<span>${this.selectedTransaction.rvnReceiver}</span>
</div>
<br />
<span class="title"> ${translate("walletpage.wchange12")} </span>
<br />
<div>
@ -1117,7 +1127,10 @@ class MultiWallet extends LitElement {
</p>
<p>
<span>${translate("walletpage.wchange19")}:</span><br />
<span style="font-weight: bold;">${this.balanceString}</span>
<span style="float: left; font-weight: bold; display: inline;">${this.balanceString}</span><br />
<span style="float: left; font-weight: bold; display: inline;">
<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.calculateQortAll()}><vaadin-icon icon="vaadin:coin-piles" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange45")} QORT</vaadin-button>
</span><br /><span>&nbsp;</span>
</p>
<p>
<mwc-textfield
@ -1254,7 +1267,10 @@ class MultiWallet extends LitElement {
</p>
<p>
<span>${translate("walletpage.wchange19")}:</span><br />
<span style="font-weight: bold;">${this.balanceString}</span>
<span style="float: left; font-weight: bold; display: inline;">${this.balanceString}</span><br />
<span style="float: left; font-weight: bold; display: inline;">
<vaadin-button theme="primary small" style="width: 100%;" @click=${() => this.calculateLtcAll()}><vaadin-icon icon="vaadin:coin-piles" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange45")} LTC</vaadin-button>
</span><br /><span>&nbsp;</span>
</p>
<p>
<mwc-textfield
@ -2045,6 +2061,46 @@ class MultiWallet extends LitElement {
this.errorMessage = ''
}
sendToQortAddress() {
this.recipient = this.selectedTransaction.recipient
this.openSendQort()
this.shadowRoot.querySelector('#showTransactionDetailsDialog').close()
}
sendToLtcAddress() {
this.ltcRecipient = this.selectedTransaction.ltcReceiver
this.openSendLtc()
this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close()
}
calculateQortAll() {
if (this.balance < 0.00100000) {
let not_enough_string = get("walletpage.wchange26")
parentEpml.request('showSnackBar', `${not_enough_string}`)
} else {
this.amount = (this.balance - 0.00100000).toFixed(8)
}
}
calculateLtcAll() {
if (this.balance < 0.00025000) {
let not_enough_string = get("walletpage.wchange26")
parentEpml.request('showSnackBar', `${not_enough_string}`)
} else {
this.ltcAmount = (this.balance - 0.00025000).toFixed(8)
this.ltcFeePerByte = 15
}
}
renderSQB() {
let displaybutton = this.selectedTransaction.recipient
if (displaybutton == null) {
return html`<span>${this.selectedTransaction.recipient}</span>`
} else {
return html`<span>${this.selectedTransaction.recipient}</span> <paper-icon-button icon="icons:send" @click=${() => this.sendToQortAddress()} title="Send to this address"></paper-icon-button>`
}
}
renderFetchText() {
return html`${translate("walletpage.wchange1")}`
}
@ -2646,7 +2702,6 @@ class MultiWallet extends LitElement {
}
const sortedTransactions = txs.sort(compareFn)
console.log(sortedTransactions)
if (this._selectedWallet == coin) {
this.wallets.get(this._selectedWallet).transactions = sortedTransactions
}

View File

@ -0,0 +1,23 @@
export const blocksNeed = (level) => {
if (level === 0) {
return '7200';
} else if (level === 1) {
return '72000';
} else if (level === 2) {
return '201600';
} else if (level === 3) {
return '374400';
} else if (level === 4) {
return '618400';
} else if (level === 5) {
return '964000';
} else if (level === 6) {
return '1482400';
} else if (level === 7) {
return '2173600';
} else if (level === 8) {
return '3037600';
} else if (level === 9) {
return '4074400';
}
};