From 068310679cabaa5fc7ab004aad81be70761297ad Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Thu, 7 Mar 2024 14:18:56 -0500 Subject: [PATCH 01/29] Consolidate "sendCoin" functions --- core/src/plugins/routes.js | 101 ++++++-------------------- core/src/tradebot/trade-bot-routes.js | 101 ++++++-------------------- crypto/api/tradeRequest.js | 75 +++---------------- 3 files changed, 57 insertions(+), 220 deletions(-) diff --git a/core/src/plugins/routes.js b/core/src/plugins/routes.js index 01f33410..c70ad48f 100644 --- a/core/src/plugins/routes.js +++ b/core/src/plugins/routes.js @@ -26,12 +26,23 @@ 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 sendCoin = async (coin, req) => { + let response + try { + const sendFn = api[`send${coin}`] + if (sendFn) { + const res = await sendFn(req.data) + response = res + } else { + response = `Unsupported blockchain: ${coin}` + } + } catch (e) { + console.error(e) + console.error(e.message) + response = e.message + } + return response +} export const routes = { registerUrl: async (req) => { @@ -397,81 +408,15 @@ export const routes = { return response }, - sendBtc: async (req) => { - let response - try { - const res = await sendBtc(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendBtc: async (req) => sendCoin('Btc', req), - sendLtc: async (req) => { - let response - try { - const res = await sendLtc(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendLtc: async (req) => sendCoin('Ltc', req), - sendDoge: async (req) => { - let response - try { - const res = await sendDoge(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendDoge: async (req) => sendCoin('Doge', req), - sendDgb: async (req) => { - let response - try { - const res = await sendDgb(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendDgb: async (req) => sendCoin('Dgb', req), - sendRvn: async (req) => { - let response - try { - const res = await sendRvn(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendRvn: async (req) => sendCoin('Rvn', req), - sendArrr: async (req) => { - let response - try { - const res = await sendArrr(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendArrr: async (req) => sendCoin('Arrr', req), } diff --git a/core/src/tradebot/trade-bot-routes.js b/core/src/tradebot/trade-bot-routes.js index 4fb72c4c..ad8a298e 100644 --- a/core/src/tradebot/trade-bot-routes.js +++ b/core/src/tradebot/trade-bot-routes.js @@ -9,12 +9,23 @@ 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 sendCoin = async (coin, req) => { + let response + try { + const sendFn = api[`send${coin}`] + if (sendFn) { + const res = await sendFn(req.data) + response = res + } else { + response = `Unsupported blockchain: ${coin}` + } + } catch (e) { + console.error(e) + console.error(e.message) + response = e.message + } + return response +} export const routes = { apiCall: async (req) => { @@ -173,81 +184,15 @@ export const routes = { return response }, - sendBtc: async (req) => { - let response - try { - const res = await sendBtc(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendBtc: async (req) => sendCoin('Btc', req), - sendLtc: async (req) => { - let response - try { - const res = await sendLtc(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendLtc: async (req) => sendCoin('Ltc', req), - sendDoge: async (req) => { - let response - try { - const res = await sendDoge(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendDoge: async (req) => sendCoin('Doge', req), - sendDgb: async (req) => { - let response - try { - const res = await sendDgb(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendDgb: async (req) => sendCoin('Dgb', req), - sendRvn: async (req) => { - let response - try { - const res = await sendRvn(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendRvn: async (req) => sendCoin('Rvn', req), - sendArrr: async (req) => { - let response - try { - const res = await sendArrr(req.data) - response = res - } catch (e) { - console.error(e) - console.error(e.message) - response = e.message - } - return response - }, + sendArrr: async (req) => sendCoin('Arrr', req), } diff --git a/crypto/api/tradeRequest.js b/crypto/api/tradeRequest.js index 892c1318..6a896dec 100644 --- a/crypto/api/tradeRequest.js +++ b/crypto/api/tradeRequest.js @@ -55,11 +55,10 @@ export const deleteTradeOffer = (requestObject) => { }) } -// Send BTC -export const sendBtc = (requestObject) => { +// Send Coin +const sendCoin = (coin, requestObject) => { const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - - return request(`/crosschain/btc/send?apiKey=${myNode.apiKey}`, { + return request(`/crosschain/${coin}/send?apiKey=${myNode.apiKey}`, { method: 'POST', headers: { 'Accept': 'application/json', @@ -69,72 +68,20 @@ export const sendBtc = (requestObject) => { }) } +// Send BTC +export const sendBtc = (requestObject) => sendCoin('btc', requestObject) + // Send LTC -export const sendLtc = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - - return request(`/crosschain/ltc/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) -} +export const sendLtc = (requestObject) => sendCoin('ltc', requestObject) // Send DOGE -export const sendDoge = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - - return request(`/crosschain/doge/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) -} +export const sendDoge = (requestObject) => sendCoin('doge', requestObject) // Send DGB -export const sendDgb = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - - return request(`/crosschain/dgb/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) -} +export const sendDgb = (requestObject) => sendCoin('dgb', requestObject) // Send RVN -export const sendRvn = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - - return request(`/crosschain/rvn/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) -} +export const sendRvn = (requestObject) => sendCoin('rvn', requestObject) // Send ARRR -export const sendArrr = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - - return request(`/crosschain/arrr/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) -} +export const sendArrr = (requestObject) => sendCoin('arrr', requestObject) From 82f93d327e819829b2f81dc6e2511f150f1096a2 Mon Sep 17 00:00:00 2001 From: iffi olen <157421268+iffinland@users.noreply.github.com> Date: Tue, 16 Apr 2024 14:38:27 +0300 Subject: [PATCH 02/29] Fixed translations typos & for better understanding Fixed typos and clarified translations for better understanding --- core/language/fi.json | 54 +++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/core/language/fi.json b/core/language/fi.json index 9174235f..4609d3c7 100644 --- a/core/language/fi.json +++ b/core/language/fi.json @@ -29,7 +29,7 @@ "mintingdetails": "LOUHINTA TIEDOT", "becomeAMinter": "LIITY LOUHINTA", "wallets": "LOMPAKOT", - "tradeportal": "KAUPPA PORTAALI", + "tradeportal": "KRYPTOKAUPPAA", "rewardshare": "PALKINTO JAKO", "nameregistration": "NIMEN REKISTERÖINTI", "websites": "VERKKOSIVUSTOJA", @@ -50,8 +50,8 @@ "tm2": "Liity louhinta", "tm3": "Luettelo sponsoreista", "tm4": "Lompakot", - "tm5": "Kaupan portaali", - "tm6": "Automaattinen osto", + "tm5": "Kryptokauppaa", + "tm6": "Automatisoidut kryptokaupat", "tm7": "Palkinnon jako", "tm8": "Q-Chat", "tm9": "Nimen rekisteröinti", @@ -111,7 +111,7 @@ "areyousure": "Haluatko varmasti poistaa tämän lompakon tallennetuista lompakoistasi?", "error1": "Varmuuskopion on oltava oikeassa JSON-muodossa", "error2": "Kirjautumistapaa ei ole valittu", - "createwelcome": "Tervetuloa Qortaliin! Sinulle luodaan nyt uusi satunnainen siemenlause, jota käytetään yksityisen avaimesi ja osoitteesi luomiseen Qortal-lohkoketjussa. Lisäksi, jos päätät aloittaa myös Qortal-alustalla, ts. kolikonlaskijana sinulla on mahdollisuus saavuttaa korkeampi taso Qortal-tililläsi, mikä tuo sinulle korkeamman lohkopalkkion QORT-digitaalisissa kolikoissa sekä suuremman äänivallan tulevissa Qortaliin liittyvissä päätöksissä.", + "createwelcome": "Tervetuloa Qortaliin! Sinulle luodaan nyt uusi satunnainen siemenlause, jota käytetään yksityisen avaimesi ja osoitteesi luomiseen Qortal-lohkoketjussa. Lisäksi, jos päätät aloittaa myös Qortal-alustalla, ts. louhimaan sinulla on mahdollisuus saavuttaa korkeampi taso Qortal-tililläsi, mikä tuo sinulle korkeamman lohkopalkkion QORT-digitaalisissa kolikoissa sekä suuremman äänivallan tulevissa Qortaliin liittyvissä päätöksissä.", "createa": "luo", "click": "Klikkaa tästä, et tarkastella seemnefraasi", "confirmpass": "Vahvista salasana", @@ -170,7 +170,7 @@ "generalinfo": "Yleiset tilitiedot", "address": "Osoite", "publickey": "Julkinen avain", - "settings": "Asetukset", + "settings": "Solmun Asetukset", "account": "Tili", "security": "Turvallisuus", "qr_login_menu_item": "QR-kirjautuminen", @@ -220,13 +220,13 @@ "blockheight": "Lohkon korkeus", "uiversion": "UI versio", "coreversion": "Ytimen versio", - "minting": "(Lohintaan)", + "minting": "(Louhintan)", "synchronizing": "Synkronoidaan", "peers": "Yhdistettyjä yhteistyökumppanit" }, "walletprofile": { "minterlevel": "Louhinta taso", - "blocksminted": "Lohkoiksi yhdessä", + "blocksminted": "Louhitut lohkot", "wp1": "Louhinta", "wp2": "Louhinta ei toimi", "wp3": "Perustiedot", @@ -234,12 +234,12 @@ "wp5": "Synkronoinnin tila" }, "general": { - "yes": "Joo", + "yes": "Kyllä", "no": "Ei", "confirm": "Vahvistaa", "decline": "Kieltäytyä", "open": "Avata", - "close": "Kiinni", + "close": "Sulje", "back": "Takaisin", "next": "Seuraava", "create": "Luoda", @@ -311,15 +311,15 @@ "mchange15": "Nykyinen tila", "mchange16": "Nykyinen taso", "mchange17": "Lohkoja puuttu pääsemäksi seuraavalle tasolle", - "mchange18": "Jos jatkat keksimistä 24/7, nouset tasolle", + "mchange18": "Jos jätkat louinta 24/7, nouset tasolle", "mchange19": "Lohkontaan palkintojen tiedot", "mchange20": "Nykyinen taso", "mchange21": "Lohkijaita yhteensä tällä tasolla", - "mchange22": "Osa tasosta lohkoa kohti", + "mchange22": "Oletettav palkinto päivässä", "mchange23": "Keskimääräinen palkkio lohkoa kohti", "mchange24": "Odotettu palkinto päivässä", "mchange25": "Sekuntia", - "mchange26": "Blocks", + "mchange26": "Lohkot", "mchange27": "Taso", "mchange28": "Taso", "mchange29": "päivä", @@ -347,7 +347,7 @@ }, "walletpage": { "wchange1": "Haetaan saldoa...", - "wchange2": "Nykyinen lompakko", + "wchange2": "Päivitä lompakko", "wchange3": "Kopioi lompakon osoite leikepöydälle", "wchange4": "Osoite kopioitu leikepöydälle", "wchange5": "Tapahtuman tiedot", @@ -363,10 +363,10 @@ "wchange15": "Tapahtuman allekirjoitus", "wchange16": "Tapahtuman hajautus", "wchange17": "Lähetä", - "wchange18": "Alkaen", + "wchange18": "Osoitteesta", "wchange19": "Saatavilla oleva saldo", - "wchange20": "(osoitteeseen tai nimeen)", - "wchange21": "Nykyinen staattinen varaus:", + "wchange20": "(osoite tai nimi)", + "wchange21": "Palvelumaksu:", "wchange22": "Lompakot", "wchange23": "(vastaanottajan osoite)", "wchange24": "Tarjouksen välitön maksu", @@ -385,14 +385,14 @@ "wchange37": "Kokonaismäärä", "wchange38": "Tässä osoitteessa ei ole tapahtumia.", "wchange39": "Osotetta ei voi kopioida.", - "wchange40": "PAYMENT", + "wchange40": "MAKSU", "wchange41": "Tila", "wchange42": "Vahvistukset", "wchange43": "Tapahtuma ei näy ennen vahvistusta, ole kärsivällinen...", "wchange44": "Yritä uudelleen...", "wchange45": "Lähetä kaikki", "wchange46": "Lähetä tähän osoitteeseen", - "wchange47": "Osoitekirja", + "wchange47": "Vastaanottajat", "wchange48": "Tämä osoitekirja on tyhjä!", "wchange49": "Lisää osoitekirjaan", "wchange50": "Nimisolu ei voi olla tyhjä!", @@ -533,7 +533,7 @@ }, "websitespage": { "schange1": "Selaa verkkosivuja", - "schange2": "Valvotut verkkosivustot", + "schange2": "Seuratut verkkosivustot", "schange3": "Estetyt verkkosivustot", "schange4": "Hae Web-sivuilta", "schange5": "Avatar", @@ -549,7 +549,7 @@ "schange15": "Estetyt verkkosivustot", "schange16": "Et ole estänyt yhtään verkkosivustoa", "schange17": "Nimeä ei löydy!", - "schange18": "Relay-tila on käytössä. Tämä tarkoittaa, että solmusi (tietokoneesi) auttaa siirtämään salattua dataa Qortal-verkossa, jos joku toinen solmu pyytää sitä. Jos haluat kytkeä sen pois päältä, sinun on kirjoitettava rivi, kuten Tämä", + "schange18": "Relay-tila on käytössä. Tämä tarkoittaa, että solmusi (tietokoneesi) auttaa siirtämään dataa Qortal-verkossa, jos joku toinen solmu pyytää sitä. Jos haluat kytkeä sen pois päältä, sinun on kirjoitettava rivi, kuten Tämä.", "schange19": "määritystiedosto", "schange20": "Reletila on kytketty pois päältä. Jos haluat ottaa sen käyttöön, sinun on kirjoitettava tämä rivi", "schange21": "Julkaise verkkosivusto", @@ -557,7 +557,7 @@ "schange23": "Tämän nimen seuraamisen lopettamisessa tapahtui virhe. Yritä uudelleen!", "schange24": "Tapahtui virhe tämän nimen estämisessä. Yritä uudelleen!", "schange25": "Tapahtui virhe yritettäessä poistaa tämän nimen estoa. Yritä uudelleen!", - "schange26": "Uncategorized", + "schange26": "Luokittelematon", "schange27": "Koko", "schange28": "Tila", "schange29": "Seuraa", @@ -594,7 +594,7 @@ "schange23": "Tämän nimen seuraamisen lopettamisessa tapahtui virhe. Yritä uudelleen!", "schange24": "Tapahtui virhe tämän nimen estämisessä. Yritä uudelleen!", "schange25": "Tapahtui virhe yritettäessä poistaa tämän nimen estoa. Yritä uudelleen!", - "schange26": "Uncategorized", + "schange26": "Luokittelematon", "schange27": "Koko", "schange28": "Tila", "schange29": "Seuraa", @@ -608,14 +608,14 @@ "schange37": "Ladattu", "schange38": "Päivitä", "schange39": "Avaa", - "schange40": "Näyttö", + "schange40": "Esikatselu", "schange41": "Ladataan, odota...", "schange42": "Lataukset", "schange43": "Kaikki latausyritykset jatkuvat taustalla, yritä hetken kuluttua uudelleen." }, "tubespage": { "schange1": "Selaa Q-Tubea", - "schange2": "Tracked Q-Tubes", + "schange2": "Seurattu Q-Tubes", "schange3": "Estetty Q-Tubes", "schange4": "Hae Q-Tubea", "schange5": "Kansi", @@ -639,7 +639,7 @@ "schange23": "Tämän nimen seuraamisen lopettamisessa tapahtui virhe. Yritä uudelleen!", "schange24": "Tapahtui virhe tämän nimen estämisessä. Yritä uudelleen!", "schange25": "Tapahtui virhe yritettäessä poistaa tämän nimen estoa. Yritä uudelleen!", - "schange26": "Uncategorized", + "schange26": "Luokittelematon", "schange27": "Koko", "schange28": "Tila", "schange29": "Seuraa", @@ -666,7 +666,7 @@ "pchange5": "Otsikko", "pchange6": "Kuvaus", "pchange7": "Valitse luokka", - "pchange8": "Label", + "pchange8": "Tarra", "pchange9": "Palvelu", "pchange10": "Tunnus", "pchange11": "Julkaise", @@ -804,7 +804,7 @@ "cchange37": "Ei tuloksia löytynyt", "cchange38": "Käyttäjä vahvistettu", "cchange39": "Tälle käyttäjälle ei voida lähettää salattua viestiä, koska hänen julkinen avaimensa ei ole lohkoketjussa.", - "cchange40": "PICTURE (näytä napsauttamalla)", + "cchange40": "KUVA (näytä napsauttamalla)", "cchange41": "Saldosi on alle 4 QORT", "cchange42": "Roskapostin torjumiseksi kestää kauan lähettää viestejä Q-Chatissa, jos QORT-osoitteesi saldo on alle 4. Jos haluat nopeuttaa viestien lähetystä Q-Chatissa, hanki vähintään 4 QORT:t. Tämä voidaan tehdä kaupankäyntiportaalin tapahtumilla tai joku lähettää sinulle QORT:n. Jos osoitteessa on enemmän kuin 4 QORTia, Q-Chat-viestit ovat välittömiä. Kiitos, että ymmärrät tämän välttämättömän roskapostin estomenetelmän ja toivomme, että nautit Qortalista alusta!", "cchange43": "Jätä tippi (QORT)", From 87f3a816637bf28ba7f4cb96ca65379adb200d72 Mon Sep 17 00:00:00 2001 From: indasin <140671521+indasin@users.noreply.github.com> Date: Mon, 29 Apr 2024 09:39:42 +0300 Subject: [PATCH 03/29] Update et.json --- core/language/et.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/language/et.json b/core/language/et.json index 6afb005c..ed0cef21 100644 --- a/core/language/et.json +++ b/core/language/et.json @@ -230,8 +230,8 @@ "wp1": "Mündimine", "wp2": "Ei vermita", "wp3": "Põhiteave", - "wp4": "Sünkroonitud", - "wp5": "Sünkroonimise olek" + "wp4": "sünkroniseeritud", + "wp5": "Sünkroniseerimise olek" }, "general": { "yes": "Jah", @@ -989,7 +989,7 @@ "nchange20": "Väljalaske versioon", "nchange21": "Ühendatud", "nchange22": "Tegevus", - "nchange23": "Sünkroonimise sundimine", + "nchange23": "Sünkroniseerimise sundimine", "nchange24": "Ühendatud partnereid pole", "nchange25": "Alustan sünki partneriga: ", "nchange26": "Partner edukalt eemaldatud: ", @@ -1207,8 +1207,8 @@ "notify1": "Tehingu kinnitamine", "notify2": "Tehing kinnitatud", "explanation": "Sinu tehing kinnitatakse. Edenemise jälgimiseks klõpsa kellaikoonil.", - "status1": "Täielikult sünkroonitud", - "status2": "Pole sünkroonitud", + "status1": "Täielikult sünkroniseeritud", + "status2": "Pole sünkroniseeritud", "notify3": "Märguandeid pole", "notify4": "Tx-teatised" }, @@ -1266,8 +1266,8 @@ "profile26": "Lisa sõbraks" }, "tour": { - "tour1": "Qortali kasutamiseks peab Core olema sünkroonitud. See ikoon on sünkroonimisel sinine.", - "tour2": "Sünkroonitud", + "tour1": "Qortali kasutamiseks peab Core olema sünkroniseeritud. See ikoon on Sünkroniseerimisel sinine.", + "tour2": "sünkroniseeritud", "tour3": "Sünkroonimine ja vermimine", "tour4": "Sünkroonimine", "tour5": "Sünkrooni oma tuum", @@ -1278,13 +1278,13 @@ "tour10": "See on vahekaardi vaikevaade, kus pääsete juurde olulistele Qortali sätetele ja Q-rakendustele, nagu Q-Tube.", "tour11": "Saage täielik kogemus", "tour12": "Qortali täieliku kogemuse saamiseks soovitame järgida seda kontroll-loendit.", - "tour13": "Olete täielikult sünkroonitud! Nüüd saate kogeda Qortali plokiahela võimsust.", + "tour13": "Olete täielikult sünkroniseeritud! Nüüd saate kogeda Qortali plokiahela võimsust.", "tour14": "Proovime külastada Q-Tube'i!", "tour15": "Külastage Q-Tube'i", "tour16": "Kontrollnimekiri", "tour17": "Qortali plokiahelale juurdepääsuks käivitage Core.", "tour18": "Värskenda (bootstrap)", - "tour19": "Praegu sünkroonimine... Qortali kasutamiseks peate olema täielikult sünkroonitud", + "tour19": "Praegu sünkroonimine... Qortali kasutamiseks peate olema täielikult sünkroniseeritud", "tour20": "blokeerib taga. Kas soovite sünkroonimisprotsessi kiirendamiseks värskendada (bootstrap)?", "tour21": "jäänud plokke.", "tour22": "Taotleb värskendamist (bootstrap). Palun oodake." From fbc31bf6e016e46cf600a55100f8093c23a54398 Mon Sep 17 00:00:00 2001 From: crowetic <5431064+crowetic@users.noreply.github.com> Date: Tue, 30 Apr 2024 14:35:03 -0700 Subject: [PATCH 04/29] Update us.json changed wording and made a few corrections to grammar/spelling --- core/language/us.json | 106 +++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/core/language/us.json b/core/language/us.json index 607dd058..203007d9 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -70,7 +70,7 @@ "tm22": "Remove Plugin", "tm23": "Are you sure to remove this plugin ?", "tm24": "Plugin Type:", - "tm25": "Please select a plugin type !", + "tm25": "Please select a plugin type!", "tm26": "Add New Plugin To Menu", "tm27": "Remove Plugin From Menu", "tm28": "Overview Page", @@ -80,7 +80,7 @@ "tm32": "This account does not follow any user", "tm33": "Import Tab Menu", "tm34": "Export Tab Menu", - "tm35": "Your existing tab menu will be deleted and set to uploaded tab menu.", + "tm35": "Your existing tab menu will be deleted and set to imported tab menu.", "tm36": "Tab Menu Successfully Restored", "tm37": "Tab Menu Successfully Saved As", "tm38": "DEV MODE", @@ -92,49 +92,49 @@ "login": { "login": "Log In", "createaccount": "Create Account", - "name": "Name", + "name": "Display Name", "address": "Address", "password": "Password", "youraccounts": "Your accounts", - "clickto": "Click your account to log in with it", + "clickto": "Click account to login", "needcreate": "You need to create or save an account before you can log in!", - "upload": "Upload your Qortal backup", + "upload": "Upload your Qortal backup file", "howlogin": "How would you like to log in?", "seed": "Seedphrase", "seedphrase": "seedphrase", "saved": "Saved account", - "qora": "Qora address seed", - "backup": "Qortal wallet backup", - "decrypt": "Decrypt backup", + "qora": "QORA address seed", + "backup": "Qortal backup file", + "decrypt": "Decrypt backup file", "save": "Save in this browser.", - "prepare": "Preparing Your Account", - "areyousure": "Are you sure you want to remove this wallet from saved wallets?", - "error1": "Backup must be valid JSON", + "prepare": "Preparing Your Account...", + "areyousure": "Are you sure you want to remove this wallet from saved wallets? (If removed and no backup file exists, account could be lost forever! Ensure you have a backup file before doing this!)", + "error1": "Backup file must be valid JSON", "error2": "Login option not selected", - "createwelcome": "Welcome to Qortal, you will find it to be similar to that of an RPG game, you, as a minter on the Qortal network (if you choose to become one) will have the chance to level your account up, giving you both more of the QORT block reward and also larger influence over the network in terms of voting on decisions for the platform.", + "createwelcome": "Welcome to Qortal! Your decentralized digital future awaits you! On Qortal only you have absolute control over your data. Qortal provides the base level of a new, and fully user-controlled digital world.", "createa": "A", "click": "Click to view seedphrase", "confirmpass": "Confirm Password", - "willbe": "will be randomly generated in the background. This is used as your private key generator for your blockchain account in Qortal.", + "willbe": "will be randomly generated in the background. If you wish to VIEW the seedphrase, click the highlighted 'seedphrase' in this text. This is used as your private key generator for your blockchain account in Qortal. For security by default, seedphrases are not displayed unless specifically chosen to be.", "clicknext": "Create your Qortal account by clicking NEXT below.", - "ready": "Your account is now ready to be created. It will be saved in this browser. If you do not want your new account to be saved in your browser, you can uncheck the box below. You will still be able to log in with your new account (after logging out), using your wallet backup file that you MUST download once you create your account.", + "ready": "Your account is now ready to be created. It will be saved within this copy of the Qortal UI by default, in encrypted form. If you do not want your new account to be saved herein, you may uncheck the box below. You will still be able to log in with your new account (after logging out), using your wallet backup file that you MUST download once you create your account.", "welmessage": "Welcome to Qortal", "pleaseenter": "Please enter a Password!", - "notmatch": "Passwords do not match!", - "lessthen8": "Your password is less than 5 characters! This is not recommended. You can continue to ignore this warning.", + "notmatch": "Oops! Passwords do not match! Try again!", + "lessthen8": "Your password is less than 5 characters! This is not recommended. Clicking continue will ignore this warning.", "lessthen8-2": "Your password is less than 5 characters!", - "entername": "Please enter a Name!", - "downloaded": "Your Wallet BackUp file was downloaded!", + "entername": "Please enter a Display Name!", + "downloaded": "Your Wallet Backup file was saved!", "loading": "Loading, Please wait...", - "createdseed": "Your created Seedphrase", + "createdseed": "Your created Seedphrase:", "saveseed": "Save Seedphrase", - "savein": "Save in browser", - "backup2": "This file is the ONLY way to access your account on a system that doesn't have it saved to the app/browser. BE SURE TO BACKUP THIS FILE IN MULTIPLE PLACES. The file is encrypted very securely and decrypted with your local password you created in the previous step. You can save it anywhere securely, but be sure to do that in multiple locations.", - "savewallet": "Save Wallet BackUp File", + "savein": "Save in this UI", + "backup2": "This file is the ONLY way (by default) to access your account unless saved to the UI. BE SURE TO BACKUP THIS FILE IN MULTIPLE PLACES. The file is encrypted very securely and decrypted with your local password you created in the previous step. You can save it anywhere securely, but be sure to do that in multiple locations.", + "savewallet": "Save Wallet Backup File", "created1": "Your account is now created", - "created2": " and will be saved in this browser.", - "downloadbackup": "Download Wallet BackUp File", - "passwordhint": "A password must be at least 5 characters.", + "created2": " and saved in this UI in encrypted form.", + "downloadbackup": "Save Wallet BackUp File", + "passwordhint": "Password must be at least 5 characters.", "lp1": "Lock Screen", "lp2": "No screen lock password is set!", "lp3": "Please set one", @@ -163,8 +163,8 @@ "confirmlogout": "Are you sure you want to log out?" }, "fragfile": { - "selectfile": "Select file", - "dragfile": "Drag and drop backup here" + "selectfile": "Select backup file", + "dragfile": "Drag and drop or click here to select backup file" }, "settings": { "generalinfo": "General Account Info", @@ -174,26 +174,26 @@ "account": "Account", "security": "Security", "qr_login_menu_item": "QR Login", - "qr_login_description_1": "Scan this code to unlock your wallet on another device using the same password which you logged in with.", + "qr_login_description_1": "Scan this code to save your wallet on another device using the same password that you logged in with.", "qr_login_description_2": "Choose a password which you will use to unlock your wallet on another device after scanning the QR code.", "qr_login_button_1": "Show login QR code", "qr_login_button_2": "Generate login QR code", "notifications": "Notifications", "accountsecurity": "Account Security", "password": "Password", - "download": "Download Backup File", - "choose": "Please choose a password to encrypt your backup with. (This can be the same as the one you logged in with, or different)", + "download": "Export/Save Backup File", + "choose": "Please choose a password to encrypt your backup file. (This can be the same as the one you logged in with, or a new one.)", "playsound": "Play Sound", "shownotifications": "Show Notifications", "nodeurl": "Node Url", - "nodehint": "Select a node from the default list of nodes above or add a custom node to the list above by clicking on the button below", + "nodehint": "Select a node from the default list, or add a custom node to the list by clicking on the button below", "addcustomnode": "Add Custom Node", "addandsave": "Add and Save", "protocol": "Protocol", "domain": "Domain", "port": "Port", - "import": "Import Nodes", - "export": "Export Nodes", + "import": "Import Saved Nodes", + "export": "Export Saved Nodes", "deletecustomnode": "Remove All Custom Nodes", "warning": "Your existing nodes will be deleted and reset to default.", "snack1": "Successfully deleted and added default nodes", @@ -203,17 +203,17 @@ "snack5": "Nodes successfully imported", "snack6": "Successfully removed custom node", "snack7": "Successfully edited custom node", - "exp1": "Export Private Master Key", + "exp1": "Export Master Private Key (xpriv)", "exp2": "Export Master Key", "exp3": "Export", - "exp4": "Please choose a wallet to backup the private master key.", - "core": "Start Core Settings", + "exp4": "Please choose a wallet to backup master private key.", + "core": "Core auto-start settings", "qappNotification1": "Q-App Notifications", "selectnode": "Please select an option", - "arrr1": "ARRR Wallet Not Initialized !", - "arrr2": "Please go to wallet tab and initialize your arrr wallet first.", + "arrr1": "ARRR Wallet Not Initialized!", + "arrr2": "Please go to wallet tab and access ARRR wallet to initialize wallet first.", "arrr3": "Need Core Update !", - "arrr4": "To save the private key of your arrr wallet you need a core update first !", + "arrr4": "To save the private key of your ARRR wallet you must first update the Qortal Core!", "sync_indicator": "Disable sync indicator popup" }, "appinfo": { @@ -283,15 +283,15 @@ }, "startminting": { "smchange1": "Cannot fetch minting accounts", - "smchange2": "Failed to remove key", - "smchange3": "Failed to add minting key", + "smchange2": "Failed to remove minting key", + "smchange3": "Failed to add minting key, if key was just created try waiting a few blocks and adding again", "smchange4": "Cannot create sponsorship key", "smchange5": "Creating relationship", "smchange6": "Awaiting confirmation on blockchain", "smchange7": "Finishing up relationship", "smchange8": "Adding minting key to node", "smchange9": "Complete", - "smchange10": "Only 2 minting keys are allowed per node, you are attempting to assign 3 keys, please go to Management - Node Management, and remove the key you do not want to assign to this node, thank you!" + "smchange10": "Only 2 minting keys are allowed per node, you are attempting to assign 3 keys, please go to Node Management, and remove any unnecessary keys, thank you!" }, "mintingpage": { "mchange1": "General Minting Details", @@ -466,10 +466,10 @@ "rchange6": "Recipient", "rchange7": "Action", "rchange8": "Type", - "rchange9": "Level 1 - 4 can create a Self Share and Level 5 or above can create a Reward Share!", - "rchange10": "Recipient Public Key", + "rchange9": "Levels 1 - 4 can only create a Self-Share (minting) keys. Only Level 5 or above can create a Reward Share!", + "rchange10": "Recipient's Public Key", "rchange11": "Reward share percentage", - "rchange12": "Doing something delicious", + "rchange12": "Executing requested command", "rchange13": "Adding minting account", "rchange14": "Add", "rchange15": "Account is not involved in any reward shares", @@ -507,12 +507,12 @@ "nchange23": "Sell Price", "nchange24": "No Names To Sell", "nchange25": "Name To Sell", - "nchange26": "Are you sure to sell this name?", + "nchange26": "Are you sure you want to sell this name? If name is purchased by another account it will be out of your control!", "nchange27": "For this price in QORT", - "nchange28": "On pressing confirm, the sell name request will be sent!", + "nchange28": "On pressing confirm, your name will be listed for sale!", "nchange29": "Name To Cancel", "nchange30": "Are you sure to cancel the sell for this name?", - "nchange31": "On pressing confirm, the cancel sell name request will be sent!", + "nchange31": "On pressing confirm, the name sale will be canceled!", "nchange32": "Sell Name Request Successful!", "nchange33": "Cancel Sell Name Request Successful!", "nchange34": "Buy Name Request Successful!", @@ -549,7 +549,7 @@ "schange15": "Blocked Websites", "schange16": "You have not blocked any websites", "schange17": "Name Not Found!", - "schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting", + "schange18": "Relay mode is enabled. This means that your node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting", "schange19": "in", "schange20": "Relay mode is disabled. You can enable it by setting", "schange21": "Publish Website", @@ -586,7 +586,7 @@ "schange15": "Blocked Q-Apps", "schange16": "You have not blocked any Q-Apps", "schange17": "Name Not Found!", - "schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting", + "schange18": "Relay mode is enabled. This means that your node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting", "schange19": "in", "schange20": "Relay mode is disabled. You can enable it by setting", "schange21": "Publish Q-App", @@ -806,7 +806,7 @@ "cchange39": "Cannot send an encrypted message to this user since they do not have their publickey on chain.", "cchange40": "IMAGE (click to view)", "cchange41": "Your Balance Is Under 4 QORT", - "cchange42": "Out of the need to combat spam, accounts with under 4 QORT balance will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4 QORT in your account, Q-Chat messages will be instant and this dialog will no more show. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!", + "cchange42": "Out of the need to combat spam, accounts with under 4 QORT balance will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4 QORT in your account, Q-Chat messages will be instant and this dialog will not show. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!", "cchange43": "Tip QORT to", "cchange44": "SEND MESSAGE", "cchange45": "TIP USER", @@ -1003,7 +1003,7 @@ "nchange34": "Successfully Sent Restart Request!", "nchange35": "Start Node", "nchange36": "Successfully Started Node!", - "nchange37": "Clicking on continue will refresh your Qortal Core, your db will be removed, and you will downoad a new copy of the db, called “bootstrapping“.", + "nchange37": "Clicking on continue will refresh your Qortal Core, your db will be removed, and you will download a new copy of the db, called “bootstrapping“.", "nchange38": "Repair LTC Wallet", "nchange39": "This will repair LTC wallets that show a balance that cannot be spent. It requires a single transaction to be made on the Litecoin network, after confirmation the wallet balance will be functional and the issue will not happen again.", "nchange40": "This transaction will consume a small LTC fee. Continue?", @@ -1176,7 +1176,7 @@ "inf7": "Auto Buy Information", "inf8": "Close Auto Buy Info", "inf9": "'Auto Buy' is a feature that allows 'buy orders' to be placed on the Trade Portal. These 'buy orders' are only visible by the person placing them. They are not 'public' buy orders like the 'open market sells' are, and are NOT stored on the Qortal blockchain. Auto Buy is a UI feature, and as such requires that the UI is RUNNING.", - "inf10": "To place an Auto Buy order click 'Add Auto Buy Order' button and fill out the box that comes up. Input the AMOUNT OF QORT you wish to BUY, and the PRICE you are willing to BUY UP TO. Once the order is active, Auto Buy will buy UP TO that amount of QORT for you, at UP TO the price you set (starting at the lowest order and moving up the books.)", + "inf10": "To place an Auto Buy order click 'Add Auto Buy Order' button and fill out the box that comes up. Input the AMOUNT OF QORT you wish to BUY or the amount of LTC you wish to use, and the PRICE you are willing to BUY UP TO. Once the order is active, Auto Buy will buy UP TO that amount of QORT for you, at UP TO the price you set (starting at the lowest order and moving up the books.)", "inf11": "Simply LEAVE YOUR UI RUNNING and Auto Buy does the rest, automatically!", "inf12": "You CAN browse other plugins in the UI (Q-Chat, wallets, etc.) but you CANNOT CLOSE THE UI if you want your Auto Buy to complete. Leaving the UI 'minimized' on the 'taskbar' or 'panel' is just fine, as long as the UI remains OPEN Auto Buy will function.", "inf13": "Automatically buy", From fa29ff4c43032762d0976ca5d4d479eb7cbc18c5 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 8 May 2024 13:16:23 +0200 Subject: [PATCH 05/29] Update UI Refactor and added new functioms --- README.md | 4 +- build.js | 29 +- config/build.config.js | 16 +- config/coin.config.js | 10 +- config/config.js | 46 +- config/crypto.config.js | 2 +- config/customConfig.js | 8 +- config/default.config.js | 3 +- config/styles.config.js | 2 +- config/user.config.js | 9 +- core/config/config.js | 2 +- core/config/default.build.options.js | 216 +- core/config/default.coin.config.js | 16 +- core/config/default.crypto.config.js | 16 +- core/config/default.styles.config.js | 69 +- core/config/default.user.config.js | 75 +- core/config/load-config.js | 25 +- core/font/switch-theme.css | 2 + core/language/us.json | 11 +- core/public/index.html | 254 +- core/server/ServerFactory.js | 47 +- core/server/routes/createCommonRoutes.js | 192 +- core/server/routes/createPrimaryRoutes.js | 247 +- core/server/server.js | 26 +- core/src/apiKeyUtils.js | 83 +- core/src/components/WebWorkerFile.js | 6 +- core/src/components/app-info.js | 222 +- core/src/components/app-view.js | 5671 +++---- core/src/components/base.js | 29 +- .../beginner-tour/sync-indicator.js | 80 +- .../beginner-tour/tour-component.js | 542 +- core/src/components/check-for-update.js | 15 +- core/src/components/computePowWorker.js | 114 +- core/src/components/computePowWorkerFile.js | 134 +- .../controllers/coin-balances-controller.js | 559 +- .../friends-view/ChatSideNavHeads.js | 391 +- .../friends-view/add-friends-modal.js | 633 +- core/src/components/friends-view/avatar.js | 473 +- .../friends-view/beginner-checklist.js | 454 +- .../friends-view/computePowWorkerFile.src.js | 136 +- .../friends-view/core-sync-status.js | 104 +- core/src/components/friends-view/feed-item.js | 743 +- .../friends-view/friend-item-actions.js | 250 +- .../components/friends-view/friends-feed.js | 733 +- .../friends-view/friends-side-panel-parent.js | 90 +- .../friends-view/friends-side-panel.js | 208 +- .../friends-view/friends-view-css.js | 182 - .../components/friends-view/friends-view.js | 491 +- .../friends-view/profile-modal-update.js | 896 +- core/src/components/friends-view/profile.js | 1617 +- .../friends-view/save-settings-qdn.js | 878 +- core/src/components/language-selector.js | 171 +- .../login-view/create-account-section.js | 1135 +- .../components/login-view/login-section.js | 1359 +- core/src/components/login-view/login-view.js | 655 +- .../src/components/login-view/welcome-page.js | 102 +- .../src/components/logout-view/logout-view.js | 111 +- core/src/components/main-app.js | 117 +- core/src/components/new-selector.js | 200 +- .../notification-bell-general.js | 656 +- .../notification-view/notification-bell.js | 517 +- .../components/notification-view/popover.js | 106 +- core/src/components/qort-theme-toggle.js | 172 +- core/src/components/search-modal.js | 68 +- .../components/settings-view/account-view.js | 202 +- .../components/settings-view/export-keys.js | 916 +- .../settings-view/notifications-view.js | 370 +- .../components/settings-view/qr-login-view.js | 193 +- .../components/settings-view/security-view.js | 406 +- .../components/settings-view/user-settings.js | 405 +- core/src/components/show-plugin.js | 4308 +++-- core/src/components/start-minting.js | 556 +- core/src/components/theme-toggle.js | 65 +- .../user-info-view/user-info-view.js | 3371 ++-- core/src/components/wallet-profile.js | 186 +- core/src/cryptoUtils.js | 101 +- core/src/custom-elements/frag-file-input.js | 115 - core/src/data/defaultQapps.js | 11 + core/src/epml.js | 2 +- .../confirm-transaction-dialog.js | 155 +- .../functional-components/frag-file-input.js | 93 + .../functional-components/loading-ripple.js | 277 +- core/src/functional-components/my-button.js | 60 +- core/src/functional-components/mykey-page.js | 185 +- .../random-sentence-generator.js | 78 +- .../functional-components/settings-page.js | 352 +- .../side-menu-item-style.js | 157 - .../functional-components/side-menu-item.js | 372 +- core/src/functional-components/side-menu.js | 120 +- core/src/functional-components/snackbar.js | 126 +- .../functional-components/verb-past-tense.js | 10 +- core/src/functional-components/wordlists.js | 19 +- core/src/initStore.js | 50 +- core/src/localStorageHelpers.js | 30 +- core/src/lockScreen.js | 16 +- core/src/main.js | 4 +- core/src/notifications/config.js | 18 +- core/src/notifications/controller.js | 144 +- core/src/notifications/dispatcher.js | 22 +- .../notification-actions/index.js | 2 +- .../notification-actions/new-message.js | 467 +- core/src/notifications/types.js | 2 +- core/src/persistState.js | 29 +- core/src/plugins/addPluginRoutes.js | 10 +- core/src/plugins/load-plugins.js | 69 +- core/src/plugins/plugin-mainjs-loader.html | 11 +- core/src/plugins/plugin-mainjs-loader.js | 9 +- core/src/plugins/routes.js | 130 +- core/src/plugins/streams.js | 85 +- core/src/redux/app/actions/app-core.js | 238 +- core/src/redux/app/actions/init-worker.js | 52 +- core/src/redux/app/actions/login.js | 52 +- core/src/redux/app/actions/node-config.js | 156 +- core/src/redux/app/actions/plugins.js | 46 +- core/src/redux/app/app-action-types.js | 2 +- core/src/redux/app/app-actions.js | 38 +- core/src/redux/app/app-reducer.js | 689 +- core/src/redux/app/reducers/init-workers.js | 64 +- core/src/redux/app/reducers/login-reducer.js | 44 +- core/src/redux/app/reducers/manage-node.js | 75 +- core/src/redux/config/config-actions.js | 36 +- core/src/redux/config/config-reducer.js | 56 +- .../config/reducers/load-config-from-api.js | 42 +- core/src/redux/reducers.js | 13 +- core/src/redux/user/actions/claim-airdrop.js | 18 +- .../redux/user/actions/notification-config.js | 63 +- core/src/redux/user/actions/store-wallet.js | 66 +- .../redux/user/actions/update-account-info.js | 18 +- core/src/redux/user/actions/update-name.js | 74 +- core/src/redux/user/user-actions.js | 8 +- core/src/redux/user/user-reducer.js | 122 +- core/src/stateAwait.js | 34 +- core/src/store.js | 13 +- core/src/styles/app-styles.js | 107 +- core/src/styles/app-theme.js | 98 +- core/src/styles/core-css.js | 4753 ++++++ core/src/styles/styles.scss | 4 +- core/src/styles/switch-theme.css | 19 +- core/src/tradebot/addTradeBotRoutes.js | 10 +- core/src/tradebot/trade-bot-routes.js | 62 +- core/src/transactionRequest.js | 12 +- core/src/worker.js | 22 +- core/tooling/build.js | 43 +- core/tooling/generateBuildConfig.js | 157 +- core/tooling/generateES5BuildConfig.js | 122 +- core/tooling/utils.js | 19 +- core/tooling/watch-inlines.js | 26 +- core/tooling/watch.js | 47 +- .../translate/directives/lang-changed-base.js | 58 +- core/translate/directives/lang-changed.js | 7 +- .../directives/translate-unsafe-html.js | 6 +- core/translate/directives/translate.js | 6 +- core/translate/helpers.js | 18 +- core/translate/util.js | 48 +- core/ui-core.js | 12 +- crypto/api/createTransaction.js | 3 - crypto/api/fetch-request.js | 2 + crypto/api/transactions/AirdropTransaction.js | 5 +- .../api/transactions/DelegationTransaction.js | 3 +- .../api/transactions/DeployAtTransaction.js | 17 +- crypto/api/transactions/MessageTransaction.js | 9 +- crypto/api/transactions/PaymentTransaction.js | 7 +- .../api/transactions/PublicizeTransaction.js | 11 +- crypto/api/transactions/TransactionBase.js | 11 +- .../transactions/TransferPrivsTransaction.js | 19 +- .../transactions/arbitrary/signArbitrary.js | 10 +- .../arbitrary/signArbitraryWithFee.js | 12 +- crypto/api/transactions/arbitraryV3.js | 1 + crypto/api/transactions/chat/ChatBase.js | 12 +- .../api/transactions/chat/ChatTransaction.js | 10 +- .../transactions/chat/GroupChatTransaction.js | 8 +- .../transactions/chat/decryptChatMessage.js | 29 +- crypto/api/transactions/chat/signChat.js | 4 +- .../groups/AddGroupAdminTransaction.js | 5 +- .../groups/CancelGroupBanTransaction.js | 5 +- .../groups/CancelGroupInviteTransaction.js | 5 +- .../groups/CreateGroupTransaction.js | 30 +- .../groups/GroupBanTransaction.js | 7 +- .../groups/GroupInviteTransaction.js | 5 +- .../groups/GroupKickTransaction.js | 7 +- .../groups/JoinGroupTransaction.js | 5 +- .../groups/LeaveGroupTransaction.js | 5 +- .../groups/RemoveGroupAdminTransaction.js | 5 +- .../groups/UpdateGroupTransaction.js | 155 +- .../transactions/names/BuyNameTransacion.js | 5 +- .../names/CancelSellNameTransacion.js | 5 +- .../names/RegisterNameTransaction.js | 5 +- .../transactions/names/SellNameTransacion.js | 5 +- .../names/UpdateNameTransaction.js | 5 +- .../polls/CreatePollTransaction.js | 25 +- .../polls/VoteOnPollTransaction.js | 13 +- .../RemoveRewardShareTransaction.js | 9 +- .../reward-share/RewardShareTransaction.js | 21 +- .../tradebot/signTradeBotTransaction.js | 6 +- .../tradeoffer/cancelAllOffers.js | 8 +- crypto/api/transactions/transactions.js | 54 +- electron-builder.yml | 1 + electron.js | 472 +- img/qdcgroup.png | Bin 0 -> 14569 bytes img/qgcgroup.png | Bin 0 -> 28235 bytes lib/detect-platform.js | 6 +- lib/i18n.js | 303 +- lib/preload.js | 2 +- package-lock.json | 922 +- package.json | 26 +- plugins/build-config.js | 202 +- plugins/build.js | 28 +- plugins/default-plugins.js | 6 +- plugins/epml.js | 3 +- .../become-minter/become-minter-css.src.js | 253 - .../core/become-minter/become-minter.src.js | 211 +- .../become-minter/components/not-sponsored.js | 132 - .../become-minter/components/yes-sponsored.js | 107 - .../plugins/core/components/ButtonIconCopy.js | 137 +- plugins/plugins/core/components/ChatGifs.js | 923 ++ .../core/components/ChatGifs/ChatGifs-css.js | 521 - .../core/components/ChatGifs/ChatGifs.js | 980 -- .../ChatGifs/ChatGifsExplore-css.js | 157 - .../components/ChatGifs/ChatGifsExplore.js | 170 - .../core/components/ChatGifsExplore.js | 191 + .../core/components/ChatGroupInvites.js | 346 +- .../core/components/ChatGroupManager.js | 361 +- .../core/components/ChatGroupSettings.js | 358 +- .../core/components/ChatGroupsManagement.js | 411 +- .../core/components/ChatGroupsModal.js | 119 +- plugins/plugins/core/components/ChatHead.js | 482 +- plugins/plugins/core/components/ChatImage.js | 580 +- .../plugins/core/components/ChatLeaveGroup.js | 380 +- .../plugins/core/components/ChatMessage.js | 185 +- plugins/plugins/core/components/ChatModals.js | 662 +- .../plugins/core/components/ChatPage-css.js | 1154 -- plugins/plugins/core/components/ChatPage.js | 6464 ++++---- .../plugins/core/components/ChatRightPanel.js | 430 +- .../components/ChatRightPanelResources.js | 757 +- .../core/components/ChatScroller-css.js | 819 - .../plugins/core/components/ChatScroller.js | 3288 ++-- .../core/components/ChatSeachResults.js | 66 - .../core/components/ChatSearchResults-css.js | 120 - .../core/components/ChatSearchResults.js | 137 +- plugins/plugins/core/components/ChatSelect.js | 342 +- .../core/components/ChatSideNavHeads.js | 330 +- .../core/components/ChatTextEditor copy.js | 825 - .../plugins/core/components/ChatTextEditor.js | 1060 +- .../core/components/ChatWelcomePage.js | 809 +- .../plugins/core/components/ImageComponent.js | 227 +- .../plugins/core/components/LevelFounder.js | 202 +- plugins/plugins/core/components/NameMenu.js | 930 +- plugins/plugins/core/components/QRCode.js | 917 +- .../core/components/QortalFileSaver.js | 276 +- .../core/components/QortalQrcodeGenerator.js | 349 +- .../plugins/core/components/ReusableImage.js | 264 +- plugins/plugins/core/components/TimeAgo.js | 95 +- .../plugins/core/components/TipUser-css.js | 85 - plugins/plugins/core/components/TipUser.js | 517 +- plugins/plugins/core/components/ToolTip.js | 148 +- .../core/components/TradeInfoView-css.js | 1124 -- .../plugins/core/components/TradeInfoView.js | 464 +- .../plugins/core/components/TraderInfoView.js | 3389 ++-- plugins/plugins/core/components/UserInfo.js | 145 + .../core/components/UserInfo/UserInfo-css.js | 68 - .../core/components/UserInfo/UserInfo.js | 133 - .../core/components/WrapperModal-css.js | 57 - .../plugins/core/components/WrapperModal.js | 71 +- .../core/components/computePowWorker.js | 116 +- .../core/components/computePowWorkerFile.js | 136 +- .../core/components/frag-file-input.js | 173 +- .../plugins/core/components/plugins-css.js | 13539 ++++++++++++++++ .../core/components/qdn-action-constants.js | 102 +- .../core/components/qdn-action-encryption.js | 632 +- .../core/components/qdn-action-types.js | 77 +- .../core/components/qortal-info-view.js | 3143 ++-- plugins/plugins/core/components/snackbar.js | 139 +- .../time-elements/extended-time-element.js | 180 +- .../core/components/time-elements/index.js | 1375 +- .../time-elements/local-time-element.js | 177 +- .../time-elements/relative-time-element.js | 92 +- .../components/time-elements/relative-time.js | 554 +- .../time-elements/time-ago-element.js | 39 +- .../time-elements/time-until-element.js | 39 +- .../core/components/time-elements/utils.js | 320 +- .../components/webworkerDecodeMessages.js | 4653 +++--- .../core/components/webworkerSortMessages.js | 20 +- plugins/plugins/core/connect.js | 17 +- .../data-management/data-management.src.js | 932 ++ .../core/{qdn => }/data-management/index.html | 0 .../group-management/group-management.src.js | 6865 ++++---- .../group-transaction.src.js | 169 - .../group-transaction/index.html | 55 - plugins/plugins/core/index.html | 1 - plugins/plugins/core/main.src.js | 226 +- .../chain-messaging/chain-messaging.src.js | 96 - .../core/messaging/chain-messaging/index.html | 55 - plugins/plugins/core/messaging/index.html | 55 - .../plugins/core/messaging/messaging.src.js | 201 - .../messaging/q-chat/computePowWorker.src.js | 82 - .../core/messaging/q-chat/q-chat-css.src.js | 479 - .../core/{minting => minting-info}/index.html | 0 .../core/minting-info/minting-info.src.js | 776 + .../plugins/core/minting/minting-info.src.js | 899 - .../name-registration.src.js | 1878 +-- .../core/names-market/names-market.src.js | 2013 +-- .../node-management/node-management.src.js | 1007 +- .../core/overview-page/overview-page-css.js | 745 - .../core/overview-page/overview-page.src.js | 850 +- plugins/plugins/core/puzzles/puzzles.src.js | 669 +- plugins/plugins/core/q-app/q-apps.src.js | 2502 ++- .../core/{messaging => }/q-chat/index.html | 0 .../core/{messaging => }/q-chat/q-chat.src.js | 616 +- .../core/{qdn => q-website}/index.html | 4 +- .../plugins/core/q-website/q-websites.src.js | 976 ++ .../plugins/core/qdn/browser/browser.src.js | 2025 +-- .../core/qdn/browser/computePowWorker.src.js | 82 - .../qdn/browser/computePowWorkerFile.src.js | 91 - .../data-management/data-management.src.js | 1099 -- .../plugins/core/qdn/publish/publish.src.js | 1263 +- plugins/plugins/core/qdn/websites.src.js | 1116 -- .../core/qortal-lottery/qortal-lottery.src.js | 1428 +- .../core/reward-share/reward-share.src.js | 1139 +- .../sponsorship-list-css.src.js | 484 - .../sponsorship-list/sponsorship-list.src.js | 149 +- .../plugins/core/streams/AddressWatcher.js | 112 +- .../streams/UnconfirmedTransactionWatcher.js | 78 +- plugins/plugins/core/streams/onNewBlock.js | 376 +- plugins/plugins/core/streams/streams.js | 341 +- .../core/trade-bot/trade-bot-portal-css.js | 679 - .../core/trade-bot/trade-bot-portal.src.js | 6469 ++++---- .../core/trade-portal/charts/arrr-charts.js | 68 +- .../core/trade-portal/charts/btc-charts.js | 68 +- .../core/trade-portal/charts/dgb-charts.js | 68 +- .../core/trade-portal/charts/doge-charts.js | 68 +- .../core/trade-portal/charts/ltc-charts.js | 68 +- .../core/trade-portal/charts/rvn-charts.js | 68 +- .../core/trade-portal/trade-portal-css.js | 687 - .../core/trade-portal/trade-portal.src.js | 5366 +++--- plugins/plugins/core/wallet/wallet-app.src.js | 10791 ++++++------ plugins/plugins/utils/blocks-needed.js | 23 - plugins/plugins/utils/bytesToMegabytes.js | 3 - plugins/plugins/utils/classes.js | 926 ++ plugins/plugins/utils/cropAddress.js | 8 - plugins/plugins/utils/functions.js | 208 + .../plugins/utils/getUserNameFromAddress.js | 20 - plugins/plugins/utils/id-generation.js | 14 - plugins/plugins/utils/keyCodes.js | 1 - plugins/plugins/utils/loader.js | 52 - plugins/plugins/utils/publish-image.js | 248 - plugins/plugins/utils/publish-modal.css | 147 - plugins/plugins/utils/publish-modal.js | 270 - plugins/plugins/utils/queue.js | 71 - .../plugins/utils/replace-messages-edited.js | 251 - .../plugins/utils/roundToNearestDecimal.js | 4 - plugins/plugins/utils/warning-modal.js | 252 - plugins/watch.js | 3 +- scripts/afterPack.js | 52 +- scripts/notarize.js | 33 +- server.js | 30 +- watch-inline.js | 25 +- watch.js | 19 +- 357 files changed, 82113 insertions(+), 83085 deletions(-) delete mode 100644 core/src/components/friends-view/friends-view-css.js delete mode 100644 core/src/custom-elements/frag-file-input.js create mode 100644 core/src/functional-components/frag-file-input.js delete mode 100644 core/src/functional-components/side-menu-item-style.js create mode 100644 core/src/styles/core-css.js create mode 100644 img/qdcgroup.png create mode 100644 img/qgcgroup.png delete mode 100644 plugins/plugins/core/become-minter/become-minter-css.src.js delete mode 100644 plugins/plugins/core/become-minter/components/not-sponsored.js delete mode 100644 plugins/plugins/core/become-minter/components/yes-sponsored.js create mode 100644 plugins/plugins/core/components/ChatGifs.js delete mode 100644 plugins/plugins/core/components/ChatGifs/ChatGifs-css.js delete mode 100644 plugins/plugins/core/components/ChatGifs/ChatGifs.js delete mode 100644 plugins/plugins/core/components/ChatGifs/ChatGifsExplore-css.js delete mode 100644 plugins/plugins/core/components/ChatGifs/ChatGifsExplore.js create mode 100644 plugins/plugins/core/components/ChatGifsExplore.js delete mode 100644 plugins/plugins/core/components/ChatPage-css.js delete mode 100644 plugins/plugins/core/components/ChatScroller-css.js delete mode 100644 plugins/plugins/core/components/ChatSeachResults.js delete mode 100644 plugins/plugins/core/components/ChatSearchResults-css.js delete mode 100644 plugins/plugins/core/components/ChatTextEditor copy.js delete mode 100644 plugins/plugins/core/components/TipUser-css.js delete mode 100644 plugins/plugins/core/components/TradeInfoView-css.js create mode 100644 plugins/plugins/core/components/UserInfo.js delete mode 100644 plugins/plugins/core/components/UserInfo/UserInfo-css.js delete mode 100644 plugins/plugins/core/components/UserInfo/UserInfo.js delete mode 100644 plugins/plugins/core/components/WrapperModal-css.js create mode 100644 plugins/plugins/core/components/plugins-css.js create mode 100644 plugins/plugins/core/data-management/data-management.src.js rename plugins/plugins/core/{qdn => }/data-management/index.html (100%) delete mode 100644 plugins/plugins/core/group-management/group-transaction/group-transaction.src.js delete mode 100644 plugins/plugins/core/group-management/group-transaction/index.html delete mode 100644 plugins/plugins/core/index.html delete mode 100644 plugins/plugins/core/messaging/chain-messaging/chain-messaging.src.js delete mode 100644 plugins/plugins/core/messaging/chain-messaging/index.html delete mode 100644 plugins/plugins/core/messaging/index.html delete mode 100644 plugins/plugins/core/messaging/messaging.src.js delete mode 100644 plugins/plugins/core/messaging/q-chat/computePowWorker.src.js delete mode 100644 plugins/plugins/core/messaging/q-chat/q-chat-css.src.js rename plugins/plugins/core/{minting => minting-info}/index.html (100%) create mode 100644 plugins/plugins/core/minting-info/minting-info.src.js delete mode 100644 plugins/plugins/core/minting/minting-info.src.js delete mode 100644 plugins/plugins/core/overview-page/overview-page-css.js rename plugins/plugins/core/{messaging => }/q-chat/index.html (100%) rename plugins/plugins/core/{messaging => }/q-chat/q-chat.src.js (74%) rename plugins/plugins/core/{qdn => q-website}/index.html (94%) create mode 100644 plugins/plugins/core/q-website/q-websites.src.js delete mode 100644 plugins/plugins/core/qdn/browser/computePowWorker.src.js delete mode 100644 plugins/plugins/core/qdn/browser/computePowWorkerFile.src.js delete mode 100644 plugins/plugins/core/qdn/data-management/data-management.src.js delete mode 100644 plugins/plugins/core/qdn/websites.src.js delete mode 100644 plugins/plugins/core/sponsorship-list/sponsorship-list-css.src.js delete mode 100644 plugins/plugins/core/trade-bot/trade-bot-portal-css.js delete mode 100644 plugins/plugins/core/trade-portal/trade-portal-css.js delete mode 100644 plugins/plugins/utils/blocks-needed.js delete mode 100644 plugins/plugins/utils/bytesToMegabytes.js create mode 100644 plugins/plugins/utils/classes.js delete mode 100644 plugins/plugins/utils/cropAddress.js create mode 100644 plugins/plugins/utils/functions.js delete mode 100644 plugins/plugins/utils/getUserNameFromAddress.js delete mode 100644 plugins/plugins/utils/id-generation.js delete mode 100644 plugins/plugins/utils/keyCodes.js delete mode 100644 plugins/plugins/utils/loader.js delete mode 100644 plugins/plugins/utils/publish-image.js delete mode 100644 plugins/plugins/utils/publish-modal.css delete mode 100644 plugins/plugins/utils/publish-modal.js delete mode 100644 plugins/plugins/utils/queue.js delete mode 100644 plugins/plugins/utils/replace-messages-edited.js delete mode 100644 plugins/plugins/utils/roundToNearestDecimal.js delete mode 100644 plugins/plugins/utils/warning-modal.js diff --git a/README.md b/README.md index 6af149dc..f9116d7f 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ Easiest way to install the lastest required packages on Linux is via nvm. ``` source ~/.profile ``` (For Debian based distro)
``` source ~/.bashrc ``` (For Fedora / CentOS)
``` nvm ls-remote ``` (Fetch list of available versions)
-``` nvm install v18.17.1 ``` (LTS: Hydrogen supported by Electron V27)
-``` npm --location=global install npm@10.5.0 ```
+``` nvm install v20.11.1 ``` (LTS: Iron supported by Electron V30)
+``` npm --location=global install npm@10.7.0 ```
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. diff --git a/build.js b/build.js index b635217e..f0ba308f 100644 --- a/build.js +++ b/build.js @@ -1,28 +1,23 @@ const path = require('path') const uiCore = require('./core/ui-core.js') - +const config = require('./config/config.js') +const pluginsController = require('./plugins/default-plugins.js') const generateBuildConfig = uiCore('generate_build_config') const build = uiCore('build') - -const config = require('./config/config.js') - -const pluginsController = require('./plugins/default-plugins.js') const buildDefalutPlugins = pluginsController('build') - srcConfig = { - ...config.build, - options: { - ...config.build.options, - outputDir: path.join(__dirname, '/builtWWW'), - sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css'), - } + ...config.build, + options: { + ...config.build.options, + outputDir: path.join(__dirname, '/builtWWW'), + sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css') + } } const { buildConfig, inlineConfigs } = generateBuildConfig(srcConfig) -build(buildConfig.options, buildConfig.outputs, buildConfig.outputOptions, buildConfig.inputOptions, inlineConfigs) - .then(() => { - console.log("Building and Bundling Plugins"); - buildDefalutPlugins() - }) +build(buildConfig.options, buildConfig.outputs, buildConfig.outputOptions, buildConfig.inputOptions, inlineConfigs).then(() => { + console.log("Building and Bundling Plugins") + buildDefalutPlugins() +}) \ No newline at end of file diff --git a/config/build.config.js b/config/build.config.js index 938710f4..e40f22bf 100644 --- a/config/build.config.js +++ b/config/build.config.js @@ -2,13 +2,13 @@ const path = require('path') const defaultConfig = require('./default.config.js') const build = { - options: { - outputDir: path.join(__dirname, '../build'), - imgDir: path.join(__dirname, '../img') - }, - aliases: { - 'qortal-ui-crypto': path.join(__dirname, '../crypto/api.js') - } + options: { + outputDir: path.join(__dirname, '../build'), + imgDir: path.join(__dirname, '../img') + }, + aliases: { + 'qortal-ui-crypto': path.join(__dirname, '../crypto/api.js') + } } -module.exports = build +module.exports = build \ No newline at end of file diff --git a/config/coin.config.js b/config/coin.config.js index bcd320e9..0f0f1c3d 100644 --- a/config/coin.config.js +++ b/config/coin.config.js @@ -1,8 +1,8 @@ const defaultConfig = require('./default.config.js') module.exports = { - name: 'Qortal', - symbol: 'Qort', - addressVersion: 58, // Q for Qortal - logo: '/img/QORT_LOGO.svg' -} + name: 'Qortal', + symbol: 'Qort', + addressVersion: 58, // Q for Qortal + logo: '/img/QORT_LOGO.svg' +} \ No newline at end of file diff --git a/config/config.js b/config/config.js index 8fd79649..992f6466 100644 --- a/config/config.js +++ b/config/config.js @@ -1,27 +1,33 @@ let config = require('./default.config.js') -let userConfig = {} -try { - userConfig = require('./customConfig.js') -} catch (e) { - console.warn(e) - console.warn('Error loading user config') -} -const checkKeys = (storeObj, newObj) => { - for (const key in newObj) { - if (!Object.prototype.hasOwnProperty.call(storeObj, key)) return - if (typeof newObj[key] === 'object') { - storeObj[key] = checkKeys(storeObj[key], newObj[key]) - } else { - storeObj[key] = newObj[key] - } - } - return storeObj +let userConfig = {} + +try { + userConfig = require('./customConfig.js') +} catch (e) { + console.warn(e) + console.warn('Error loading user config') +} + +const checkKeys = (storeObj, newObj) => { + for (const key in newObj) { + if (!Object.prototype.hasOwnProperty.call(storeObj, key)) { + return + } + + if (typeof newObj[key] === 'object') { + storeObj[key] = checkKeys(storeObj[key], newObj[key]) + } else { + storeObj[key] = newObj[key] + } + } + + return storeObj } const getConfig = customConfig => { - config = checkKeys(config, customConfig) - return config + config = checkKeys(config, customConfig) + return config } -module.exports = getConfig(userConfig) +module.exports = getConfig(userConfig) \ No newline at end of file diff --git a/config/crypto.config.js b/config/crypto.config.js index 968d2e8e..34ea6e98 100644 --- a/config/crypto.config.js +++ b/config/crypto.config.js @@ -1,3 +1,3 @@ const defaultConfig = require('./default.config.js') -module.exports = {} +module.exports = {} \ No newline at end of file diff --git a/config/customConfig.js b/config/customConfig.js index 6c6d12f3..ab37e550 100644 --- a/config/customConfig.js +++ b/config/customConfig.js @@ -4,10 +4,4 @@ const styles = require('./styles.config.js') const build = require('./build.config.js') const user = require('./user.config.js') -module.exports = { - coin, - styles, - build, - user, - crypto -} +module.exports = { coin, styles, build, user, crypto } \ No newline at end of file diff --git a/config/default.config.js b/config/default.config.js index 8d23d608..d0476954 100644 --- a/config/default.config.js +++ b/config/default.config.js @@ -1,5 +1,4 @@ const uiCore = require('../core/ui-core.js') const defaultConfig = uiCore('default_config') - -module.exports = defaultConfig +module.exports = defaultConfig \ No newline at end of file diff --git a/config/styles.config.js b/config/styles.config.js index 4ba52ba2..7c6d6c73 100644 --- a/config/styles.config.js +++ b/config/styles.config.js @@ -1 +1 @@ -module.exports = {} +module.exports = {} \ No newline at end of file diff --git a/config/user.config.js b/config/user.config.js index ef45ffdb..15f71ce0 100644 --- a/config/user.config.js +++ b/config/user.config.js @@ -1,10 +1,11 @@ const user = require('./default.config.js').user + module.exports = { node: 0, // set to mainnet server: { primary: { port: 12388, // set as default UI port - address: '0.0.0.0', // can specify an IP for a fixed bind - }, - }, -} + address: '0.0.0.0' // can specify an IP for a fixed bind + } + } +} \ No newline at end of file diff --git a/core/config/config.js b/core/config/config.js index 2e228fbc..ef8d5633 100644 --- a/core/config/config.js +++ b/core/config/config.js @@ -4,4 +4,4 @@ const user = require('./default.user.config.js') const styles = require('./default.styles.config.js') const build = require('./default.build.options.js') -module.exports = { coin, crypto, user, styles, build } +module.exports = { coin, crypto, user, styles, build } \ No newline at end of file diff --git a/core/config/default.build.options.js b/core/config/default.build.options.js index 0ad66df8..6940eaa1 100644 --- a/core/config/default.build.options.js +++ b/core/config/default.build.options.js @@ -4,132 +4,132 @@ const { makeSourceAbsolute } = require('../tooling/utils.js') const srcDir = '../src' const options = { - inputFile: path.join(__dirname, '../src/main.js'), - outputDir: path.join(__dirname, '../build'), - sassOutputDir: path.join(__dirname, '../build/styles.bundle.css'), - imgDir: path.join(__dirname, '../img') + inputFile: path.join(__dirname, '../src/main.js'), + outputDir: path.join(__dirname, '../build'), + sassOutputDir: path.join(__dirname, '../build/styles.bundle.css'), + imgDir: path.join(__dirname, '../img') } const aliases = { - 'qortal-ui-crypto': '../../crypto/api.js' + 'qortal-ui-crypto': '../../crypto/api.js' } const apiComponents = { - api: { - file: '../../crypto/api.js', - className: 'api' - } + api: { + file: '../../crypto/api.js', + className: 'api' + } } const functionalComponents = { - 'loading-ripple': { - file: 'functional-components/loading-ripple.js', - className: 'LoadingRipple' - }, - 'confirm-transaction-dialog': { - file: 'functional-components/confirm-transaction-dialog', - className: 'ConfirmTransactionDialog' - } + 'loading-ripple': { + file: 'functional-components/loading-ripple.js', + className: 'LoadingRipple' + }, + 'confirm-transaction-dialog': { + file: 'functional-components/confirm-transaction-dialog', + className: 'ConfirmTransactionDialog' + } } const inlineComponents = [ - { - className: 'worker', - input: path.join(__dirname, srcDir, 'worker.js'), - output: 'worker.js' - }, - { - className: 'PluginMainJSLoader', - input: path.join(__dirname, srcDir, '/plugins/plugin-mainjs-loader.js'), - output: 'plugins/plugin-mainjs-loader.js' - } + { + className: 'worker', + input: path.join(__dirname, srcDir, 'worker.js'), + output: 'worker.js' + }, + { + className: 'PluginMainJSLoader', + input: path.join(__dirname, srcDir, '/plugins/plugin-mainjs-loader.js'), + output: 'plugins/plugin-mainjs-loader.js' + } ] const elementComponents = { - 'main-app': { - file: 'components/main-app.js', - className: 'MainApp', - children: { - 'app-styles': { - file: 'styles/app-styles.js', - className: 'AppStyles', - children: { - 'app-theme': { - className: 'AppTheme', - file: 'styles/app-theme.js' - } - } - }, - 'app-view': { - file: 'components/app-view.js', - className: 'AppView', - children: { - 'show-plugin': { - file: 'components/show-plugin.js', - className: 'ShowPlugin' - }, - 'wallet-profile': { - file: 'components/wallet-profile.js', - className: 'WalletProfile' - }, - 'app-info': { - file: 'components/app-info.js', - className: 'AppInfo' - } - } - }, - 'login-view': { - file: 'components/login-view/login-view.js', - className: 'LoginView', - children: { - 'create-account-section': { - file: 'components/login-view/create-account-section.js', - className: 'CreateAccountSection' - }, - 'login-section': { - file: 'components/login-view/login-section.js', - className: 'LoginSection' - } - } - }, - 'settings-view': { - file: 'components/settings-view/user-settings.js', - className: 'UserSettings', - children: { - 'account-view': { - file: 'components/settings-view/account-view.js', - className: 'AccountView' - }, - 'security-view': { - file: 'components/settings-view/security-view.js', - className: 'SecurityView' - }, - 'qr-login-view': { - file: 'components/settings-view/qr-login-view.js', - className: 'QRLoginView' - }, - 'notifications-view': { - file: 'components/settings-view/notifications-view.js', - className: 'NotificationsView' - } - } - }, - 'user-info-view': { - file: 'components/user-info-view/user-info-view.js', - className: 'UserInfoView' - } - } - } + 'main-app': { + file: 'components/main-app.js', + className: 'MainApp', + children: { + 'app-styles': { + file: 'styles/app-styles.js', + className: 'AppStyles', + children: { + 'app-theme': { + className: 'AppTheme', + file: 'styles/app-theme.js' + } + } + }, + 'app-view': { + file: 'components/app-view.js', + className: 'AppView', + children: { + 'show-plugin': { + file: 'components/show-plugin.js', + className: 'ShowPlugin' + }, + 'wallet-profile': { + file: 'components/wallet-profile.js', + className: 'WalletProfile' + }, + 'app-info': { + file: 'components/app-info.js', + className: 'AppInfo' + } + } + }, + 'login-view': { + file: 'components/login-view/login-view.js', + className: 'LoginView', + children: { + 'create-account-section': { + file: 'components/login-view/create-account-section.js', + className: 'CreateAccountSection' + }, + 'login-section': { + file: 'components/login-view/login-section.js', + className: 'LoginSection' + } + } + }, + 'settings-view': { + file: 'components/settings-view/user-settings.js', + className: 'UserSettings', + children: { + 'account-view': { + file: 'components/settings-view/account-view.js', + className: 'AccountView' + }, + 'security-view': { + file: 'components/settings-view/security-view.js', + className: 'SecurityView' + }, + 'qr-login-view': { + file: 'components/settings-view/qr-login-view.js', + className: 'QRLoginView' + }, + 'notifications-view': { + file: 'components/settings-view/notifications-view.js', + className: 'NotificationsView' + } + } + }, + 'user-info-view': { + file: 'components/user-info-view/user-info-view.js', + className: 'UserInfoView' + } + } + } } makeSourceAbsolute(path.join(__dirname, srcDir), elementComponents) makeSourceAbsolute(path.join(__dirname, srcDir), functionalComponents) module.exports = { - options, - elementComponents, - functionalComponents, - inlineComponents, - apiComponents, - aliases -} + options, + elementComponents, + functionalComponents, + inlineComponents, + apiComponents, + aliases +} \ No newline at end of file diff --git a/core/config/default.coin.config.js b/core/config/default.coin.config.js index ef1dbb00..0f7775d1 100644 --- a/core/config/default.coin.config.js +++ b/core/config/default.coin.config.js @@ -1,11 +1,11 @@ const coin = { - name: 'Qortal', - symbol: 'QORT', - addressCount: 1, - addressVersion: 58, - decimals: 100000000, - logo: '/img/QORT_LOGO.png', - icon: '/img/QORT_LOGO.png' + name: 'Qortal', + symbol: 'QORT', + addressCount: 1, + addressVersion: 58, + decimals: 100000000, + logo: '/img/QORT_LOGO.png', + icon: '/img/QORT_LOGO.png' } -module.exports = coin +module.exports = coin \ No newline at end of file diff --git a/core/config/default.crypto.config.js b/core/config/default.crypto.config.js index f8a1b22d..270f7c5a 100644 --- a/core/config/default.crypto.config.js +++ b/core/config/default.crypto.config.js @@ -1,11 +1,11 @@ const crypto = { - kdfThreads: 16, - staticSalt: '4ghkVQExoneGqZqHTMMhhFfxXsVg2A75QeS1HCM5KAih', // Base58 encoded - bcryptRounds: 11, // Note it's kinda bcryptRounds * log.2.16, cause it runs on all 16 threads - bcryptVersion: '2a', - get staticBcryptSalt () { - return `$${this.bcryptVersion}$${this.bcryptRounds}$IxVE941tXVUD4cW0TNVm.O` - } + kdfThreads: 16, + staticSalt: '4ghkVQExoneGqZqHTMMhhFfxXsVg2A75QeS1HCM5KAih', // Base58 encoded + bcryptRounds: 11, // Note it's kinda bcryptRounds * log.2.16, cause it runs on all 16 threads + bcryptVersion: '2a', + get staticBcryptSalt() { + return `$${this.bcryptVersion}$${this.bcryptRounds}$IxVE941tXVUD4cW0TNVm.O` + } } -module.exports = crypto +module.exports = crypto \ No newline at end of file diff --git a/core/config/default.styles.config.js b/core/config/default.styles.config.js index 17123264..b99bff62 100644 --- a/core/config/default.styles.config.js +++ b/core/config/default.styles.config.js @@ -1,40 +1,41 @@ const styles = { - breakpoints: { - desktop: '', - laptop: '', - tablet: '', - mobile: '' - }, - theme: { - colors: { - primary: '#03a9f4', /* Sets the text color to the theme primary color. */ - primaryBg: '#e8eaf6', /* Sets the background color to the theme primary color. */ - onPrimary: '#fff', /* Sets the text color to the color configured for text on the primary color. */ + breakpoints: { + desktop: '', + laptop: '', + tablet: '', + mobile: '' + }, + theme: { + colors: { + primary: '#03a9f4', /* Sets the text color to the theme primary color. */ + primaryBg: '#e8eaf6', /* Sets the background color to the theme primary color. */ + onPrimary: '#fff', /* Sets the text color to the color configured for text on the primary color. */ - secondary: '#03a9f4', /* Sets the text color to the theme secondary color. */ - secondaryBg: '#fce4ec', /* Sets the background color to the theme secondary color. */ - onSecondary: '#fff', /* Sets the text color to the color configured for text on the secondary color. */ + secondary: '#03a9f4', /* Sets the text color to the theme secondary color. */ + secondaryBg: '#fce4ec', /* Sets the background color to the theme secondary color. */ + onSecondary: '#fff', /* Sets the text color to the color configured for text on the secondary color. */ - surface: '#fff', /* Sets the background color to the surface background color. */ - onSurface: '#333', /* Sets the text color to the color configured for text on the surface color. */ - background: '#eee', /* Sets the background color to the theme background color. */ + surface: '#fff', /* Sets the background color to the surface background color. */ + onSurface: '#333', /* Sets the text color to the color configured for text on the surface color. */ + background: '#eee', /* Sets the background color to the theme background color. */ - warning: '#FFA000', - error: '#F44336' - }, + warning: '#FFA000', + error: '#F44336' + }, - addressColors: [ - '#256480', - '#002530', - '#02564e', - '#d32f2f', - '#795548', - '#004d40', - '#006064', - '#9c27b0', - '#2196f3', - '#d81b60' - ] - } + addressColors: [ + '#256480', + '#002530', + '#02564e', + '#d32f2f', + '#795548', + '#004d40', + '#006064', + '#9c27b0', + '#2196f3', + '#d81b60' + ] + } } -module.exports = styles + +module.exports = styles \ No newline at end of file diff --git a/core/config/default.user.config.js b/core/config/default.user.config.js index fb0363b7..e5f02519 100644 --- a/core/config/default.user.config.js +++ b/core/config/default.user.config.js @@ -1,42 +1,43 @@ const path = require('path') const user = { - node: 0, - nodeSettings: { - pingInterval: 30 * 1000, - }, - server: { - writeHosts: { - enabled: true, - }, - relativeTo: path.join(__dirname, '../'), - primary: { - domain: '0.0.0.0', - address: '0.0.0.0', - port: 12388, - directory: './src/', - page404: './src/404.html', - host: '0.0.0.0', - }, - }, - tls: { - enabled: false, - options: { - key: '', - cert: '', - }, - }, - constants: { - pollingInterval: 30 * 1000, // How long between checking for new unconfirmed transactions and new blocks (in milliseconds). - workerURL: '/build/worker.js', - }, + node: 0, + nodeSettings: { + pingInterval: 30 * 1000 + }, + server: { + writeHosts: { + enabled: true + }, + relativeTo: path.join(__dirname, '../'), + primary: { + domain: '0.0.0.0', + address: '0.0.0.0', + port: 12388, + directory: './src/', + page404: './src/404.html', + host: '0.0.0.0' + } + }, + tls: { + enabled: false, + options: { + key: '', + cert: '' + } + }, + constants: { + pollingInterval: 30 * 1000, // How long between checking for new unconfirmed transactions and new blocks (in milliseconds). + workerURL: '/build/worker.js' + }, - // Notification Settings (All defaults to true) - notifications: { - q_chat: { - playSound: true, - showNotification: true, - }, - }, + // Notification Settings (All defaults to true) + notifications: { + q_chat: { + playSound: true, + showNotification: true + } + } } -module.exports = user + +module.exports = user \ No newline at end of file diff --git a/core/config/load-config.js b/core/config/load-config.js index c6d7ae44..0ad62ace 100644 --- a/core/config/load-config.js +++ b/core/config/load-config.js @@ -1,21 +1,22 @@ let config = require('./config.js') const checkKeys = (storeObj, newObj) => { - for (const key in newObj) { - if (!Object.prototype.hasOwnProperty.call(storeObj, key)) return + for (const key in newObj) { + if (!Object.prototype.hasOwnProperty.call(storeObj, key)) return - if (typeof newObj[key] === 'object') { - storeObj[key] = checkKeys(storeObj[key], newObj[key]) - } else { - storeObj[key] = newObj[key] - } - } - return storeObj + if (typeof newObj[key] === 'object') { + storeObj[key] = checkKeys(storeObj[key], newObj[key]) + } else { + storeObj[key] = newObj[key] + } + } + + return storeObj } const getConfig = customConfig => { - config = checkKeys(config, customConfig) - return config + config = checkKeys(config, customConfig) + return config } -module.exports = getConfig +module.exports = getConfig \ No newline at end of file diff --git a/core/font/switch-theme.css b/core/font/switch-theme.css index e7e27c5b..4c56f166 100644 --- a/core/font/switch-theme.css +++ b/core/font/switch-theme.css @@ -6,6 +6,7 @@ html { --plugback: #ffffff; --border: #d0d6de; --border2: #dde2e8; + --border3: #080808; --copybutton: #707584; --chat-group: #080808; --chat-bubble: #9f9f9f0a; @@ -83,6 +84,7 @@ html[theme="dark"] { --plugback: #0f1a2e; --border: #0b305e; --border2: #0b305e; + --border3: #767676; --copybutton: #d0d6de; --chat-group: #ffffff; --chat-bubble: #9694941a; diff --git a/core/language/us.json b/core/language/us.json index 203007d9..85af3543 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -945,7 +945,16 @@ "gchange56": "Group Name To Search", "gchange57": "Private Group Name Not Found", "gchange58": "Note that group name must be an exact match.", - "gchange59": "Show / Hide Ticker" + "gchange59": "Show / Hide Ticker", + "gchange60": "Please enter an group name", + "gchange61": "Please enter an description", + "gchange62": "Are you sure to update this group?", + "gchange63": "On pressing confirm, the update group request will be sent!", + "gchange64": "Current Owner / New Owner", + "gchange65": "Only replace this address if you want to transfer the group!", + "gchange66": "Invalid Owner / New Owner Address", + "gchange67": "Group Update Successful!", + "gchange68": "Set Group Avatar" }, "puzzlepage": { "pchange1": "Puzzles", diff --git a/core/public/index.html b/core/public/index.html index 4fdc606c..76ff26e4 100644 --- a/core/public/index.html +++ b/core/public/index.html @@ -1,139 +1,121 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Qortal UI - - - - - - - -
- - - - - -
- - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + Qortal UI + + + + +
+ + +
+ + diff --git a/core/server/ServerFactory.js b/core/server/ServerFactory.js index e4d2c5be..4c8b6a3f 100644 --- a/core/server/ServerFactory.js +++ b/core/server/ServerFactory.js @@ -3,32 +3,33 @@ const Hapi = require('@hapi/hapi') const Inert = require('@hapi/inert') function serverFactory(routes, address, port, tls) { - this.server = new Hapi.Server({ - routes: { - files: { - relativeTo: Path.join(__dirname, '../') - } - }, - address: address, - port: port, - tls: tls - }) + this.server = new Hapi.Server({ + routes: { + files: { + relativeTo: Path.join(__dirname, '../') + } + }, + address: address, + port: port, + tls: tls + }) - this.startServer = async () => { - try { - await this.server.register([Inert]) + this.startServer = async () => { + try { + await this.server.register([Inert]) - this.server.route(routes) + this.server.route(routes) - await this.server.start() + await this.server.start() - delete this.startServer - return this.server - } catch (e) { - console.error(e) - throw e - } - } + delete this.startServer + + return this.server + } catch (e) { + console.error(e) + throw e + } + } } -module.exports = serverFactory +module.exports = serverFactory \ No newline at end of file diff --git a/core/server/routes/createCommonRoutes.js b/core/server/routes/createCommonRoutes.js index 4eed35f7..5ba2df12 100644 --- a/core/server/routes/createCommonRoutes.js +++ b/core/server/routes/createCommonRoutes.js @@ -1,106 +1,106 @@ const path = require('path') const routesOptions = { - security: { - hsts: { - maxAge: 15768000, - includeSubDomains: true, - preload: true - }, - xframe: 'sameorigin' - } + security: { + hsts: { + maxAge: 15768000, + includeSubDomains: true, + preload: true + }, + xframe: 'sameorigin' + } } const createRoutes = config => [ + { + method: 'GET', + path: '/img/{param*}', + handler: { + directory: { + path: config.build.options.imgDir, + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/language/{param*}', + handler: { + directory: { + path: path.join(__dirname, '../../language'), + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/font/{param*}', + handler: { + directory: { + path: path.join(__dirname, '../../font'), + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/sound/{param*}', + handler: { + directory: { + path: path.join(__dirname, '../../sound/'), + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/emoji/{param*}', + handler: { + directory: { + path: path.join(__dirname, '../../emoji/'), + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/memory-pow/{param*}', + handler: { + directory: { + path: path.join(__dirname, '../../memory-pow/'), + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/getConfig', + handler: (request, h) => { + const response = { + config: { + ...config + } + } - { - method: 'GET', - path: '/img/{param*}', - handler: { - directory: { - path: config.build.options.imgDir, - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/language/{param*}', - handler: { - directory: { - path: path.join(__dirname, '../../language'), - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/font/{param*}', - handler: { - directory: { - path: path.join(__dirname, '../../font'), - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/sound/{param*}', - handler: { - directory: { - path: path.join(__dirname, '../../sound/'), - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/emoji/{param*}', - handler: { - directory: { - path: path.join(__dirname, '../../emoji/'), - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/memory-pow/{param*}', - handler: { - directory: { - path: path.join(__dirname, '../../memory-pow/'), - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/getConfig', - handler: (request, h) => { - const response = { - config: { - ...config - } - } + delete response.config.user.tls + delete response.config.build - delete response.config.user.tls - delete response.config.build - return JSON.stringify(response) - }, - options: routesOptions - } + return JSON.stringify(response) + }, + options: routesOptions + } ] -module.exports = createRoutes +module.exports = createRoutes \ No newline at end of file diff --git a/core/server/routes/createPrimaryRoutes.js b/core/server/routes/createPrimaryRoutes.js index ef398aae..0eae497c 100644 --- a/core/server/routes/createPrimaryRoutes.js +++ b/core/server/routes/createPrimaryRoutes.js @@ -1,141 +1,140 @@ const path = require('path') - const createCommonRoutes = require('./createCommonRoutes.js') const createPrimaryRoutes = (config, plugins) => { - const routes = createCommonRoutes(config) + const routes = createCommonRoutes(config) - let myPlugins = plugins + let myPlugins = plugins - const pluginFolders = {} + const pluginFolders = {} - const routesOptions = { - security: { - hsts: { - maxAge: 15768000, - includeSubDomains: true, - preload: true - }, - xframe: 'sameorigin' - } - } + const routesOptions = { + security: { + hsts: { + maxAge: 15768000, + includeSubDomains: true, + preload: true + }, + xframe: 'sameorigin' + } + } - plugins.reduce((obj, plugin) => { - obj[plugin.name] = plugin.folder - return obj - }, pluginFolders) + plugins.reduce((obj, plugin) => { + obj[plugin.name] = plugin.folder + return obj + }, pluginFolders) - routes.push( - { - method: 'GET', - path: '/', - handler: (request, reply) => { - return reply.redirect('/app') - }, - options: routesOptions - }, - { - method: 'GET', - path: '/{path*}', - handler: (request, h) => { - const filePath = path.join(__dirname, '../../public/index.html') - const response = h.file(filePath, { - confine: true - }) - response.header('Access-Control-Allow-Origin', request.info.host) - return response - }, - options: routesOptions - }, - { - method: 'GET', - path: '/getPlugins', - handler: (request, h) => { - return { plugins: myPlugins.map(p => p.name) } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/build/{param*}', - handler: { - directory: { - path: config.build.options.outputDir, - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/src/{param*}', - handler: { - directory: { - path: path.join(__dirname, '../../src'), - redirectToSlash: true, - index: true - } - }, - options: routesOptions - }, - { - method: 'GET', - path: '/plugin/{path*}', - handler: (request, h) => { + routes.push( + { + method: 'GET', + path: '/', + handler: (request, reply) => { + return reply.redirect('/app') + }, + options: routesOptions + }, + { + method: 'GET', + path: '/{path*}', + handler: (request, h) => { + const filePath = path.join(__dirname, '../../public/index.html') + const response = h.file(filePath, { + confine: true + }) + response.header('Access-Control-Allow-Origin', request.info.host) + return response + }, + options: routesOptions + }, + { + method: 'GET', + path: '/getPlugins', + handler: (request, h) => { + return { plugins: myPlugins.map(p => p.name) } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/build/{param*}', + handler: { + directory: { + path: config.build.options.outputDir, + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/src/{param*}', + handler: { + directory: { + path: path.join(__dirname, '../../src'), + redirectToSlash: true, + index: true + } + }, + options: routesOptions + }, + { + method: 'GET', + path: '/plugin/{path*}', + handler: (request, h) => { - const plugin = request.params.path.split('/')[0] - const filePath = path.join(pluginFolders[plugin], '../', request.params.path) + const plugin = request.params.path.split('/')[0] + const filePath = path.join(pluginFolders[plugin], '../', request.params.path) - const response = h.file(filePath, { - confine: false - }) - response.header('Access-Control-Allow-Origin', request.info.host) - return response - }, - options: routesOptions - }, - { - method: 'GET', - path: '/plugin/404', - handler: (request, h) => { - const response = h.file(path.join(config.server.primary.page404)) - response.header('Access-Control-Allow-Origin', request.info.host) - return response - }, - options: routesOptions - }, - { - method: 'GET', - path: '/qortal-components/plugin-mainjs-loader.html', - handler: (request, h) => { - const response = h.file(path.join(__dirname, '../../src/plugins/plugin-mainjs-loader.html'), { - confine: false - }) - response.header('Access-Control-Allow-Origin', request.info.host) - return response - }, - options: routesOptions - }, - { - method: 'GET', - path: '/qortal-components/plugin-mainjs-loader.js', - handler: (request, h) => { - const file = path.join(config.build.options.outputDir, '/plugins/plugin-mainjs-loader.js') + const response = h.file(filePath, { + confine: false + }) + response.header('Access-Control-Allow-Origin', request.info.host) + return response + }, + options: routesOptions + }, + { + method: 'GET', + path: '/plugin/404', + handler: (request, h) => { + const response = h.file(path.join(config.server.primary.page404)) + response.header('Access-Control-Allow-Origin', request.info.host) + return response + }, + options: routesOptions + }, + { + method: 'GET', + path: '/qortal-components/plugin-mainjs-loader.html', + handler: (request, h) => { + const response = h.file(path.join(__dirname, '../../src/plugins/plugin-mainjs-loader.html'), { + confine: false + }) + response.header('Access-Control-Allow-Origin', request.info.host) + return response + }, + options: routesOptions + }, + { + method: 'GET', + path: '/qortal-components/plugin-mainjs-loader.js', + handler: (request, h) => { + const file = path.join(config.build.options.outputDir, '/plugins/plugin-mainjs-loader.js') - const response = h.file(file, { - confine: false - }) - response.header('Access-Control-Allow-Origin', request.info.host) - return response - }, - options: routesOptions - }, + const response = h.file(file, { + confine: false + }) + response.header('Access-Control-Allow-Origin', request.info.host) + return response + }, + options: routesOptions + } - ) + ) - return routes + return routes } -module.exports = createPrimaryRoutes +module.exports = createPrimaryRoutes \ No newline at end of file diff --git a/core/server/server.js b/core/server/server.js index 5ccf2618..2a562b55 100644 --- a/core/server/server.js +++ b/core/server/server.js @@ -3,22 +3,20 @@ const ServerFactory = require('./ServerFactory.js') const createPrimaryRoutes = require('./routes/createPrimaryRoutes.js') const createServer = (config, plugins) => { - this.start = async function () { - const primaryServer = new ServerFactory(createPrimaryRoutes(config, plugins), config.user.server.primary.host, config.user.server.primary.port, config.user.tls.enabled ? config.user.tls.options : void 0) - primaryServer.startServer() - .then(server => { - console.log(`Qortal UI Server started at ${server.info.uri} and listening on ${server.info.address}`) - }) - .catch(e => { - console.error(e) - }) - } - return this -} + this.start = async function () { + const primaryServer = new ServerFactory(createPrimaryRoutes(config, plugins), config.user.server.primary.host, config.user.server.primary.port, config.user.tls.enabled ? config.user.tls.options : void 0) + primaryServer.startServer().then(server => { + console.log(`Qortal UI Server started at ${server.info.uri} and listening on ${server.info.address}`) + }).catch(e => { + console.error(e) + }) + } + return this +} const serverExports = { - createServer + createServer } -module.exports = serverExports +module.exports = serverExports \ No newline at end of file diff --git a/core/src/apiKeyUtils.js b/core/src/apiKeyUtils.js index e65772b0..08d23ce1 100644 --- a/core/src/apiKeyUtils.js +++ b/core/src/apiKeyUtils.js @@ -1,54 +1,55 @@ import * as api from 'qortal-ui-crypto' -import mykey from './functional-components/mykey-page.js' - -'use strict' +import mykey from './functional-components/mykey-page' export const checkApiKey = async (nodeConfig) => { + let selectedNode = nodeConfig.knownNodes[nodeConfig.node] + let apiKey = selectedNode.apiKey - let selectedNode = nodeConfig.knownNodes[nodeConfig.node]; - let apiKey = selectedNode.apiKey; + // Attempt to generate an API key + const generateUrl = '/admin/apikey/generate' - // Attempt to generate an API key - const generateUrl = "/admin/apikey/generate"; - let generateRes = await api.request(generateUrl, { - method: "POST" - }); + let generateRes = await api.request(generateUrl, { + method: 'POST' + }) - if (generateRes != null && generateRes.error == null && generateRes.length >= 8) { - console.log("Generated API key"); - apiKey = generateRes; + if (generateRes != null && generateRes.error == null && generateRes.length >= 8) { + console.log('Generated API key') - // Store the generated API key - selectedNode.apiKey = apiKey; - nodeConfig.knownNodes[nodeConfig.node] = selectedNode; - localStorage.setItem('myQortalNodes', JSON.stringify(nodeConfig.knownNodes)); - } - else { - console.log("Unable to generate API key"); - } + apiKey = generateRes - // Now test the API key - let testResult = await testApiKey(apiKey); - if (testResult === true) { - console.log("API key test passed"); - } - else { - console.log("API key test failed"); - mykey.show(); - this.dispatchEvent( + // Store the generated API key + selectedNode.apiKey = apiKey + nodeConfig.knownNodes[nodeConfig.node] = selectedNode + localStorage.setItem('myQortalNodes', JSON.stringify(nodeConfig.knownNodes)) + } else { + console.log("Unable to generate API key") + } + + // Now test the API key + let testResult = await testApiKey(apiKey) + + if (testResult === true) { + console.log('API key test passed') + } else { + console.log('API key test failed') + + mykey.show() + + this.dispatchEvent( new CustomEvent('disable-tour', { - bubbles: true, - composed: true - }), - ); - } + bubbles: true, + composed: true + }) + ) + } } export const testApiKey = async (apiKey) => { - const testUrl = "/admin/apikey/test?apiKey=" + apiKey; - let testRes = await api.request(testUrl, { - method: "GET" - }); - return testRes === true; + const testUrl = '/admin/apikey/test?apiKey=' + apiKey -} + let testRes = await api.request(testUrl, { + method: 'GET' + }) + + return testRes === true +} \ No newline at end of file diff --git a/core/src/components/WebWorkerFile.js b/core/src/components/WebWorkerFile.js index 3b8c2b87..ab699e69 100644 --- a/core/src/components/WebWorkerFile.js +++ b/core/src/components/WebWorkerFile.js @@ -1,5 +1,3 @@ -import WebWorker from 'web-worker:./computePowWorkerFile.js'; +import WebWorker from 'web-worker:./computePowWorkerFile.js' -// You can add any initialization or configuration for the Web Worker here - -export default WebWorker; \ No newline at end of file +export default WebWorker \ No newline at end of file diff --git a/core/src/components/app-info.js b/core/src/components/app-info.js index 46aacbbe..d05fa7ca 100644 --- a/core/src/components/app-info.js +++ b/core/src/components/app-info.js @@ -1,147 +1,107 @@ -import {css, html, LitElement} from 'lit' -import {connect} from 'pwa-helpers' -import {store} from '../store.js' -import {translate} from '../../translate' +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../store' +import { appInfoStyles } from '../styles/core-css' + +// Multi language support +import { translate } from '../../translate' class AppInfo extends connect(store)(LitElement) { - static get properties() { - return { - nodeInfo: { type: Array }, - coreInfo: { type: Array }, - nodeConfig: { type: Object }, - theme: { type: String, reflect: true } - } - } + static get properties() { + return { + nodeInfo: { type: Array }, + coreInfo: { type: Array }, + nodeConfig: { type: Object }, + theme: { type: String, reflect: true } + } + } - static get styles() { - return css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --paper-input-container-focus-color: var(--mdc-theme-primary); - } + static get styles() { + return [appInfoStyles] + } - .normal { - --mdc-theme-primary: rgb(3, 169, 244); - } + constructor() { + super() + this.nodeInfo = [] + this.coreInfo = [] + this.nodeConfig = {} + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + } - #profileInMenu { - flex: 0 0 100px; - padding:12px; - border-top: 1px solid var(--border); - background: var(--sidetopbar); - } + render() { + return html` +
+ ${translate("appinfo.uiversion")}: ${this.nodeConfig.version ? this.nodeConfig.version : ''} + ${this._renderCoreVersion()} + ${translate("appinfo.blockheight")}: ${this.nodeInfo.height ? this.nodeInfo.height : ''} ${this._renderStatus()} + ${translate("appinfo.peers")}: ${this.nodeInfo.numberOfConnections ? this.nodeInfo.numberOfConnections : ''} +
+ ` + } - .info { - margin: 0; - font-size: 14px; - font-weight: 100; - display: inline-block; - width: 100%; - padding-bottom: 8px; - color: var(--black); - } + firstUpdated() { + this.getNodeInfo() + this.getCoreInfo() - .blue { - color: #03a9f4; - margin: 0; - font-size: 14px; - font-weight: 200; - display: inline; - } + setInterval(() => { + this.getNodeInfo() + this.getCoreInfo() + }, 60000) + } - .black { - color: var(--black); - margin: 0; - font-size: 14px; - font-weight: 200; - display: inline; - } - ` - } + async getNodeInfo() { + const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port + const url = `${appinfoUrl}/admin/status` - constructor() { - super() - this.nodeInfo = [] - this.coreInfo = [] - this.nodeConfig = {} - this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' - } + await fetch(url).then(response => { + return response.json() + }).then(data => { + this.nodeInfo = data + }).catch(err => { + console.error('Request failed', err) + }) + } - render() { - return html` -
- ${translate("appinfo.uiversion")}: ${this.nodeConfig.version ? this.nodeConfig.version : ''} - ${this._renderCoreVersion()} - ${translate("appinfo.blockheight")}: ${this.nodeInfo.height ? this.nodeInfo.height : ''} ${this._renderStatus()} - ${translate("appinfo.peers")}: ${this.nodeInfo.numberOfConnections ? this.nodeInfo.numberOfConnections : ''} - -
- ` - } + async getCoreInfo() { + const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port + const url = `${appinfoUrl}/admin/info` - firstUpdated() { - this.getNodeInfo() - this.getCoreInfo() + await fetch(url).then(response => { + return response.json() + }).then(data => { + this.coreInfo = data + }).catch(err => { + console.error('Request failed', err) + }) + } - setInterval(() => { - this.getNodeInfo() - this.getCoreInfo() - }, 60000) - } + _renderStatus() { + if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === true) { + this.cssStatus = 'blue' + return html`${translate("appinfo.minting")}` + } else if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === false) { + this.cssStatus = 'blue' + return html`${translate("appinfo.minting")}` + } else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === true) { + this.cssStatus = 'black' + return html`(${translate("appinfo.synchronizing")}... ${this.nodeInfo.syncPercent !== undefined ? this.nodeInfo.syncPercent + '%' : ''})` + } else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === false) { + this.cssStatus = 'black' + return '' + } else { + return '' + } + } - async getNodeInfo() { - const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] - const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port - const url = `${appinfoUrl}/admin/status` + _renderCoreVersion() { + return html`${translate("appinfo.coreversion")}: ${this.coreInfo.buildVersion ? this.coreInfo.buildVersion : ''}` + } - await fetch(url).then(response => { - return response.json() - }).then(data => { - this.nodeInfo = data - }).catch(err => { - console.error('Request failed', err) - }) - } - - async getCoreInfo() { - const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] - const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port - const url = `${appinfoUrl}/admin/info` - - await fetch(url).then(response => { - return response.json() - }).then(data => { - this.coreInfo = data - }).catch(err => { - console.error('Request failed', err) - }) - } - - _renderStatus() { - if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === true) { - this.cssStatus = 'blue' - return html`${translate("appinfo.minting")}` - } else if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === false) { - this.cssStatus = 'blue' - return html`${translate("appinfo.minting")}` - } else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === true) { - this.cssStatus = 'black' - return html`(${translate("appinfo.synchronizing")}... ${this.nodeInfo.syncPercent !== undefined ? this.nodeInfo.syncPercent + '%' : ''})` - } else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === false) { - this.cssStatus = 'black' - return '' - } else { - return '' - } - } - - _renderCoreVersion() { - return html`${translate("appinfo.coreversion")}: ${this.coreInfo.buildVersion ? this.coreInfo.buildVersion : ''}` - } - - stateChanged(state) { - this.nodeConfig = state.app.nodeConfig - } + stateChanged(state) { + this.nodeConfig = state.app.nodeConfig + } } -window.customElements.define('app-info', AppInfo) +window.customElements.define('app-info', AppInfo) \ No newline at end of file diff --git a/core/src/components/app-view.js b/core/src/components/app-view.js index 612d3a2a..d458a54e 100644 --- a/core/src/components/app-view.js +++ b/core/src/components/app-view.js @@ -1,20 +1,43 @@ -import {css, html, LitElement} from 'lit' -import {connect} from 'pwa-helpers' -import {store} from '../store.js' -import {Epml} from '../epml.js' -import {addTradeBotRoutes} from '../tradebot/addTradeBotRoutes.js' -import {get, translate} from '../../translate' -import localForage from 'localforage' -import {decryptData, encryptData} from '../lockScreen.js' -import {setChatLastSeen} from '../redux/app/app-actions.js' +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../store' +import { Epml } from '../epml' +import { addTradeBotRoutes } from '../tradebot/addTradeBotRoutes' +import { get, translate } from '../../translate' +import { decryptData, encryptData } from '../lockScreen' +import { setChatLastSeen } from '../redux/app/app-actions' +import { appViewStyles } from '../styles/core-css' import isElectron from 'is-electron' +import localForage from 'localforage' +import './app-info' +import './check-for-update' +import './new-selector' +import './search-modal' +import './show-plugin' +import './theme-toggle' +import './wallet-profile' +import './controllers/coin-balances-controller' +import './beginner-tour/tour-component' +import './beginner-tour/sync-indicator' +import './friends-view/beginner-checklist' +import './friends-view/core-sync-status' +import './friends-view/friends-side-panel-parent' +import './friends-view/profile' +import './friends-view/save-settings-qdn' +import './logout-view/logout-view' +import './notification-view/notification-bell' +import './notification-view/notification-bell-general' +import './settings-view/user-settings' +import './user-info-view/user-info-view' +import '../functional-components/side-menu' +import '../functional-components/side-menu-item' import '@material/mwc-button' import '@material/mwc-icon' -import '@polymer/paper-icon-button/paper-icon-button.js' -import '@polymer/paper-progress/paper-progress.js' -import '@polymer/paper-dialog/paper-dialog.js' -import '@polymer/iron-icons/iron-icons.js' import '@polymer/app-layout/app-layout.js' +import '@polymer/iron-icons/iron-icons.js' +import '@polymer/paper-icon-button/paper-icon-button.js' +import '@polymer/paper-dialog/paper-dialog.js' +import '@polymer/paper-progress/paper-progress.js' import '@polymer/paper-ripple' import '@vaadin/button' import '@vaadin/icon' @@ -23,3326 +46,3042 @@ import '@vaadin/password-field' import '@vaadin/text-field' import '@vaadin/tooltip' -import './wallet-profile.js' -import './app-info.js' -import './show-plugin.js' -import './theme-toggle.js' -import './new-selector.js' -import './settings-view/user-settings.js' -import './logout-view/logout-view.js' -import './check-for-update.js' -import './search-modal.js' -import './user-info-view/user-info-view.js' -import '../functional-components/side-menu.js' -import '../functional-components/side-menu-item.js' -import './notification-view/notification-bell.js' -import './notification-view/notification-bell-general.js' -import './friends-view/friends-side-panel-parent.js' -import './friends-view/save-settings-qdn.js' -import './friends-view/core-sync-status.js' -import './friends-view/profile.js' -import './beginner-tour/tour-component.js' -import './beginner-tour/sync-indicator.js' -import './friends-view/beginner-checklist.js' -import './controllers/coin-balances-controller.js' - const chatLastSeen = localForage.createInstance({ - name: "chat-last-seen", + name: 'chat-last-seen' }) const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) class AppView extends connect(store)(LitElement) { - static get properties() { - return { - config: { type: Object }, - urls: { type: Object }, - nodeType: { type: String, reflect: true }, - theme: { type: String, reflect: true }, - addressInfo: { type: Object }, - botQortWallet: { type: String }, - botBtcWallet: { type: String }, - botLtcWallet: { type: String }, - botDogeWallet: { type: String }, - botDgbWallet: { type: String }, - botRvnWallet: { type: String }, - botArrrWallet: { type: String }, - arrrWalletAddress: { type: String }, - qortWalletBalance: { type: Number }, - btcWalletBalance: { type: Number }, - ltcWalletBalance: { type: Number }, - dogeWalletBalance: { type: Number }, - dgbWalletBalance: { type: Number }, - rvnWalletBalance: { type: Number }, - arrrWalletBalance: { type: Number }, - failedTradesList: { type: Array }, - tradesOpenBtcQortal: { type: Array }, - myTradesOpenLtcQortal: { type: Array }, - tradesFailedBtcQortal: { type: Array }, - tradesOpenBtcQortalCleaned: { type: Array }, - tradesOpenLtcQortal: { type: Array }, - tradesFailedLtcQortal: { type: Array }, - tradesOpenLtcQortalCleaned: { type: Array }, - tradesOpenDogeQortal: { type: Array }, - tradesFailedDogeQortal: { type: Array }, - tradesOpenDogeQortalCleaned: { type: Array }, - tradesOpenDgbQortal: { type: Array }, - tradesFailedDgbQortal: { type: Array }, - tradesOpenDgbQortalCleaned: { type: Array }, - tradesOpenRvnQortal: { type: Array }, - tradesFailedRvnQortal: { type: Array }, - tradesOpenRvnQortalCleaned: { type: Array }, - tradesOpenArrrQortal: { type: Array }, - tradesFailedArrrQortal: { type: Array }, - tradesOpenArrrQortalCleaned: { type: Array }, - tradeBotBtcBook: { type: Array }, - tradeBotLtcBook: { type: Array }, - tradeBotDogeBook: { type: Array }, - tradeBotDgbBook: { type: Array }, - tradeBotRvnBook: { type: Array }, - tradeBotArrrBook: { type: Array }, - tradeBotBtcAt: { type: Array }, - tradeBotLtcAt: { type: Array }, - tradeBotDogeAt: { type: Array }, - tradeBotDgbAt: { type: Array }, - tradeBotRvnAt: { type: Array }, - tradeBotArrrAt: { type: Array }, - tradeBotAvailableBtcQortal: { type: Array }, - tradeBotAvailableLtcQortal: { type: Array }, - tradeBotAvailableDogeQortal: { type: Array }, - tradeBotAvailableDgbQortal: { type: Array }, - tradeBotAvailableRvnQortal: { type: Array }, - tradeBotAvailableArrrQortal: { type: Array }, - checkBtcAlice: { type: String }, - checkLtcAlice: { type: String }, - checkDogeAlice: { type: String }, - checkDgbAlice: { type: String }, - checkRvnAlice: { type: String }, - checkArrrAlice: { type: String }, - reAddBtcAmount: { type: Number }, - reAddLtcAmount: { type: Number }, - reAddDogeAmount: { type: Number }, - reAddDgbAmount: { type: Number }, - reAddRvnAmount: { type: Number }, - reAddArrrAmount: { type: Number }, - reAddBtcPrice: { type: Number }, - reAddLtcPrice: { type: Number }, - reAddDogePrice: { type: Number }, - reAddDgbPrice: { type: Number }, - reAddRvnPrice: { type: Number }, - reAddArrrPrice: { type: Number }, - botBtcBuyAtAddress: { type: String }, - botLtcBuyAtAddress: { type: String }, - botDogeBuyAtAddress: { type: String }, - botDgbBuyAtAddress: { type: String }, - botRvnBuyAtAddress: { type: String }, - botArrrBuyAtAddress: { type: String }, - balanceTicker: { type: String }, - salt: { type: String }, - storageData: { type: String }, - lockScreenPass: { type: String }, - lockScreenSet: { type: String }, - lockPass: { type: String }, - lockSet: { type: String }, - myLockScreenPass: { type: String }, - myLockScreenSet: { type: String }, - helperMessage: { type: String }, - showSyncMessages: { type: Boolean } - } - } + static get properties() { + return { + config: { type: Object }, + urls: { type: Object }, + nodeType: { type: String, reflect: true }, + theme: { type: String, reflect: true }, + addressInfo: { type: Object }, + botQortWallet: { type: String }, + botBtcWallet: { type: String }, + botLtcWallet: { type: String }, + botDogeWallet: { type: String }, + botDgbWallet: { type: String }, + botRvnWallet: { type: String }, + botArrrWallet: { type: String }, + arrrWalletAddress: { type: String }, + qortWalletBalance: { type: Number }, + btcWalletBalance: { type: Number }, + ltcWalletBalance: { type: Number }, + dogeWalletBalance: { type: Number }, + dgbWalletBalance: { type: Number }, + rvnWalletBalance: { type: Number }, + arrrWalletBalance: { type: Number }, + failedTradesList: { type: Array }, + tradesOpenBtcQortal: { type: Array }, + myTradesOpenLtcQortal: { type: Array }, + tradesFailedBtcQortal: { type: Array }, + tradesOpenBtcQortalCleaned: { type: Array }, + tradesOpenLtcQortal: { type: Array }, + tradesFailedLtcQortal: { type: Array }, + tradesOpenLtcQortalCleaned: { type: Array }, + tradesOpenDogeQortal: { type: Array }, + tradesFailedDogeQortal: { type: Array }, + tradesOpenDogeQortalCleaned: { type: Array }, + tradesOpenDgbQortal: { type: Array }, + tradesFailedDgbQortal: { type: Array }, + tradesOpenDgbQortalCleaned: { type: Array }, + tradesOpenRvnQortal: { type: Array }, + tradesFailedRvnQortal: { type: Array }, + tradesOpenRvnQortalCleaned: { type: Array }, + tradesOpenArrrQortal: { type: Array }, + tradesFailedArrrQortal: { type: Array }, + tradesOpenArrrQortalCleaned: { type: Array }, + tradeBotBtcBook: { type: Array }, + tradeBotLtcBook: { type: Array }, + tradeBotDogeBook: { type: Array }, + tradeBotDgbBook: { type: Array }, + tradeBotRvnBook: { type: Array }, + tradeBotArrrBook: { type: Array }, + tradeBotBtcAt: { type: Array }, + tradeBotLtcAt: { type: Array }, + tradeBotDogeAt: { type: Array }, + tradeBotDgbAt: { type: Array }, + tradeBotRvnAt: { type: Array }, + tradeBotArrrAt: { type: Array }, + tradeBotAvailableBtcQortal: { type: Array }, + tradeBotAvailableLtcQortal: { type: Array }, + tradeBotAvailableDogeQortal: { type: Array }, + tradeBotAvailableDgbQortal: { type: Array }, + tradeBotAvailableRvnQortal: { type: Array }, + tradeBotAvailableArrrQortal: { type: Array }, + checkBtcAlice: { type: String }, + checkLtcAlice: { type: String }, + checkDogeAlice: { type: String }, + checkDgbAlice: { type: String }, + checkRvnAlice: { type: String }, + checkArrrAlice: { type: String }, + reAddBtcAmount: { type: Number }, + reAddLtcAmount: { type: Number }, + reAddDogeAmount: { type: Number }, + reAddDgbAmount: { type: Number }, + reAddRvnAmount: { type: Number }, + reAddArrrAmount: { type: Number }, + reAddBtcPrice: { type: Number }, + reAddLtcPrice: { type: Number }, + reAddDogePrice: { type: Number }, + reAddDgbPrice: { type: Number }, + reAddRvnPrice: { type: Number }, + reAddArrrPrice: { type: Number }, + botBtcBuyAtAddress: { type: String }, + botLtcBuyAtAddress: { type: String }, + botDogeBuyAtAddress: { type: String }, + botDgbBuyAtAddress: { type: String }, + botRvnBuyAtAddress: { type: String }, + botArrrBuyAtAddress: { type: String }, + salt: { type: String }, + storageData: { type: String }, + lockScreenPass: { type: String }, + lockScreenSet: { type: String }, + lockPass: { type: String }, + lockSet: { type: String }, + myLockScreenPass: { type: String }, + myLockScreenSet: { type: String }, + helperMessage: { type: String }, + showSyncMessages: { type: Boolean } + } + } - static get styles() { - return [ - css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --mdc-theme-error: rgb(255, 89, 89); - --lumo-primary-text-color: rgb(0, 167, 245); - --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); - --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1); - --lumo-primary-color: hsl(199, 100%, 48%); - --lumo-base-color: var(--white); - --lumo-body-text-color: var(--black); - --lumo-secondary-text-color: var(--sectxt); - --lumo-contrast-60pct: var(--vdicon); - --item-selected-color: var(--nav-selected-color); - --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); - } + static get styles() { + return [appViewStyles] + } - :host { - --app-drawer-width: 260px; - } + constructor() { + super() + this.urls = [] + this.nodeType = '' + this.addressInfo = {} + this.botQortWallet = '' + this.botBtcWallet = '' + this.botLtcWallet = '' + this.botDogeWallet = '' + this.botDgbWallet = '' + this.botRvnWallet = '' + this.botArrrWallet = '' + this.arrrWalletAddress = '' + this.qortWalletBalance = 0 + this.btcWalletBalance = 0 + this.ltcWalletBalance = 0 + this.dogeWalletBalance = 0 + this.dgbWalletBalance = 0 + this.rvnWalletBalance = 0 + this.arrrWalletBalance = 0 + this.failedTradesList = [] + this.tradesOpenBtcQortal = [] + this.myTradesOpenLtcQortal = [] + this.tradesFailedBtcQortal = [] + this.tradesOpenBtcQortalCleaned = [] + this.tradesOpenLtcQortal = [] + this.tradesFailedLtcQortal = [] + this.tradesOpenLtcQortalCleaned = [] + this.tradesOpenDogeQortal = [] + this.tradesFailedDogeQortal = [] + this.tradesOpenDogeQortalCleaned = [] + this.tradesOpenDgbQortal = [] + this.tradesFailedDgbQortal = [] + this.tradesOpenDgbQortalCleaned = [] + this.tradesOpenRvnQortal = [] + this.tradesFailedRvnQortal = [] + this.tradesOpenRvnQortalCleaned = [] + this.tradesOpenArrrQortal = [] + this.tradesFailedArrrQortal = [] + this.tradesOpenArrrQortalCleaned = [] + this.tradeBotBtcBook = [] + this.tradeBotLtcBook = [] + this.tradeBotDogeBook = [] + this.tradeBotDgbBook = [] + this.tradeBotRvnBook = [] + this.tradeBotArrrBook = [] + this.tradeBotBtcAt = [] + this.tradeBotLtcAt = [] + this.tradeBotDogeAt = [] + this.tradeBotDgbAt = [] + this.tradeBotRvnAt = [] + this.tradeBotArrrAt = [] + this.tradeBotAvailableBtcQortal = [] + this.tradeBotAvailableLtcQortal = [] + this.tradeBotAvailableDogeQortal = [] + this.tradeBotAvailableDgbQortal = [] + this.tradeBotAvailableRvnQortal = [] + this.tradeBotAvailableArrrQortal = [] + this.checkBtcAlice = '' + this.checkLtcAlice = '' + this.checkDogeAlice = '' + this.checkDgbAlice = '' + this.checkRvnAlice = '' + this.checkArrrAlice = '' + this.reAddBtcAmount = 0 + this.reAddLtcAmount = 0 + this.reAddDogeAmount = 0 + this.reAddDgbAmount = 0 + this.reAddRvnAmount = 0 + this.reAddArrrAmount = 0 + this.reAddBtcPrice = 0 + this.reAddLtcPrice = 0 + this.reAddDogePrice = 0 + this.reAddDgbPrice = 0 + this.reAddRvnPrice = 0 + this.reAddArrrPrice = 0 + this.botBtcBuyAtAddress = '' + this.botLtcBuyAtAddress = '' + this.botDogeBuyAtAddress = '' + this.botDgbBuyAtAddress = '' + this.botRvnBuyAtAddress = '' + this.botArrrBuyAtAddress = '' + this.salt = '' + this.storageData = '' + this.lockScreenPass = '' + this.lockScreenSet = '' + this.lockPass = '' + this.lockSet = '' + this.myLockScreenPass = '' + this.myLockScreenSet = '' + this.helperMessage = '' + this.getTourElements = this.getTourElements.bind(this) + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + } - app-drawer-layout:not([narrow]) [drawer-toggle]:not(side-menu-item) { - display: none; - } + render() { + return html` + + + + + + + + + + +
+ + + +
+
+ + + + + + +
+
 
+ +
     
+ +
   
+ +
  
+ ${this.renderLockButton()} +
  
+ +
  
+
+ this.openSettings()} title="${translate("settings.settings")}"> +
+
  
+ +
 
+
+ this.openLogout()} title="${translate("logout.logout")}"> +
+
  
+
+
+ + + ${!this.showSyncMessages ? html` + + ` : html``} +
+
+ + + + +
+

Qortal UI ${translate("login.lp1")}

+
+
+
+

${translate("login.lp2")}

+

${translate("login.lp3")}

+
+
+ password + +
+
+ password + +
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+

Qortal UI ${translate("login.lp1")}

+
+
+
+

${translate("login.lessthen8")}

+
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+ UI
+ ${translate("login.lp9")} + ${translate("login.lp10")} +
+
+ password + +
+ ${this.helperMessage} +
+
+
+
+ +
+
+ + ` + } - app-drawer { - box-shadow: var(--shadow-2); - } + async firstUpdated() { + addTradeBotRoutes(parentEpml) - app-header { - box-shadow: var(--shadow-2); - } + parentEpml.imReady() - app-toolbar { - background: var(--sidetopbar); - color: var(--black); - border-top: var(--border); - height: 48px; - padding: 3px; - } + this.clearTheCache() + this.helperMessage = this.renderHelperPass() + this.showSyncMessages = store.getState().app.showSyncIndicator + this.salt = '' + this.salt = Base58.encode(store.getState().app.wallet._addresses[0].keyPair.privateKey) + this.storageData = '' + this.storageData = store.getState().app.selectedAddress.address + this.lockScreenPass = '' + this.lockScreenPass = 'lockScreenPass-' + this.storageData + this.lockScreenSet = '' + this.lockScreenSet = 'lockScreenSet-' + this.storageData + this.lockPass = '' + this.lockPass = encryptData(false, this.salt) + this.lockSet = '' + this.lockSet = encryptData(false, this.salt) - paper-progress { - --paper-progress-active-color: var(--mdc-theme-primary); - } + if (localStorage.getItem(this.lockScreenPass) === null && localStorage.getItem(this.lockScreenSet) === null) { + localStorage.setItem(this.lockScreenPass, this.lockPass) + localStorage.setItem(this.lockScreenSet, this.lockSet) - .s-menu { - list-style: none; - padding: 0px 0px; - background: var(--sidetopbar); - border-radius: 2px; - width: 100%; - border-top: 1px solid var(--border); - outline: none; - } - - .search { - display: inline; - width: 50%; - align-items: center; - } - - #sideBar { - height: 100vh; - display: flex; - flex-direction: column; - background: var(--sidetopbar); - } - - .sideBarMenu { - overflow-y: auto; - flex: 1 1; - } - - .sideBarMenu::-webkit-scrollbar-track { - background-color: whitesmoke; - border-radius: 7px; - } - - .sideBarMenu::-webkit-scrollbar { - width: 6px; - border-radius: 7px; - background-color: whitesmoke; - } - - .sideBarMenu::-webkit-scrollbar-thumb { - background-color: rgb(180, 176, 176); - border-radius: 7px; - transition: all 0.3s ease-in-out; - } - - #balanceheader { - flex: 0 0 24px; - padding: 12px 12px 45px 12px; - border-bottom: 1px solid var(--border); - background: var(--sidetopbar); - } - - .balanceheadertext { - position: absolute; - margin: auto; - font-size: 14px; - font-weight: 400; - width: 250px; - display: inline; - padding-top: 5px; - padding-bottom: 5px; - color: var(--nav-text-color); - } - - #balances { - flex: 0 0 24px; - padding: 12px; - background: var(--sidetopbar); - } - - .balancelist { - align-items: center; - float: left; - opacity: 1; - position: relative; - } - - .balanceinfo { - position: absolute; - margin: auto; - font-size: 14px; - font-weight: 100; - width: 250px; - display: inline; - padding-top: 5px; - padding-bottom: 5px; - color: var(--black); - } - - .qort { - animation: animate1 4s 2s 1 ease-in-out ; - color: var(--black); - opacity: 0; - } - - .btc { - animation: animate2 4s 8s 1 ease-in-out ; - color: var(--black); - opacity: 0; - } - - .ltc { - animation: animate3 4s 14s 1 ease-in-out ; - color: var(--black); - opacity: 0; - } - - .doge { - animation: animate4 4s 20s 1 ease-in-out ; - color: var(--black); - opacity: 0; - } - - .dgb { - animation: animate5 4s 26s 1 ease-in-out ; - color: var(--black); - opacity: 0; - } - - .rvn { - animation: animate6 4s 32s 1 ease-in-out ; - color: var(--black); - opacity: 0; - } - - .arrr { - animation: animate7 4s 38s 1 ease-in-out ; - color: var(--black); - opacity: 0; - } - - @keyframes animate1 { - 0%,100% { opacity: 0; } - 50% { opacity: 10; } - } - - @keyframes animate2 { - 0%,100% { opacity: 0; } - 50% { opacity: 10; } - } - - @keyframes animate3 { - 0%,100% { opacity: 0; } - 50% { opacity: 10; } - } - - @keyframes animate4 { - 0%,100% { opacity: 0; } - 50% { opacity: 10; } - } - - @keyframes animate5 { - 0%,100% { opacity: 0; } - 50% { opacity: 10; } - } - - @keyframes animate6 { - 0%,100% { opacity: 0; } - 50% { opacity: 10; } - } - - @keyframes animate7 { - 0%,100% { opacity: 0; } - 50% { opacity: 10; } - } - - .sideBarMenu::-webkit-scrollbar-thumb:hover { - background-color: rgb(148, 146, 146); - cursor: pointer; - } - - .balanceButton { - background-color: #03a9f4; - color: #ffffff; - margin-left: 12px; - margin-right: 12px; - padding-top: 5px; - padding-bottom: 5px; - } - - .red { - --mdc-theme-primary: #C6011F; - } - - .setpass-wrapper { - width: 100%; - min-width: 400px; - max-width: 450px; - text-align: center; - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - padding: 10px 10px 0px; - box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); + this.myLockScreenPass = '' + this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) + } else { + this.myLockScreenPass = '' + this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) } - .lock-wrapper { - width: 100%; - height: 100%; - min-width: 600px; - max-width: 600px; - min-height: 400px; - max-height: 400px; - text-align: center; - background: url("/img/qortal-lock.jpg"); - border: 1px solid var(--black); - border-radius: 25px; - padding: 10px 10px 0px; + if (this.myLockScreenSet === true) { + this.shadowRoot.getElementById('lockScreenActive').open() } - .text-wrapper { - width: 100%; - height: 100%; - min-width: 280px; - max-width: 280px; - min-height: 64px; - max-height: 64px; - text-align: center; - margin-left: 35px; - margin-top: 125px; - overflow: hidden; + var drawerTog = this.shadowRoot.getElementById('mb') + var drawerOut = this.shadowRoot.getElementById('appsidebar') + + drawerTog.addEventListener('mouseover', function () { + drawerTog.click() + }) + + drawerOut.addEventListener('mouseleave', function () { + drawerTog.click() + }) + + await this.getNodeType() + + const myAppNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const nodeAppUrl = myAppNode.protocol + '://' + myAppNode.domain + ':' + myAppNode.port + const appDelay = ms => new Promise(res => setTimeout(res, ms)) + + await appDelay(3000) + + this.botQortWallet = store.getState().app.selectedAddress.address + this.botBtcWallet = store.getState().app.selectedAddress.btcWallet.address + this.botLtcWallet = store.getState().app.selectedAddress.ltcWallet.address + this.botDogeWallet = store.getState().app.selectedAddress.dogeWallet.address + this.botDgbWallet = store.getState().app.selectedAddress.dgbWallet.address + this.botRvnWallet = store.getState().app.selectedAddress.rvnWallet.address + this.botArrrWallet = store.getState().app.selectedAddress.arrrWallet.address + + await this.botBtcTradebook() + await this.botLtcTradebook() + await this.botDogeTradebook() + await this.botDgbTradebook() + await this.botRvnTradebook() + await this.botArrrTradebook() + + window.addEventListener('storage', async () => { + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') + }) + + if (localStorage.getItem('failedTrades') === null) { + localStorage.setItem('failedTrades', '') + + var oldFailedTrades = JSON.parse(localStorage.getItem('failedTrades') || '[]') + + const addFixedFail = { + timestamp: 1699792400000, + recipient: 'QSMfgUCXahYHg38RidZ4FuWbVV8KGngDjP' + } + + oldFailedTrades.push(addFixedFail) + + localStorage.setItem('failedTrades', JSON.stringify(oldFailedTrades)) + + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + } else { + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') } - .lock-title-white { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #ffffff; + const unconfirmedTransactions = async () => { + const unconfirmedTransactionslUrl = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + var addFailedTrades = JSON.parse(localStorage.getItem('failedTrades') || '[]') + await fetch(unconfirmedTransactionslUrl).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiff = Date.now() - item.timestamp + const timeOneHour = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiff) > Number(timeOneHour)) { + const addIt = { + timestamp: item.timestamp, + recipient: item.recipient + } + addFailedTrades.push(addIt) + } + }) + + localStorage.setItem('failedTrades', JSON.stringify(addFailedTrades)) + + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) } - .lock-title-red { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #df3636; + await unconfirmedTransactions() + + const filterUnconfirmedTransactions = async () => { + let cleanFailedTrades = this.failedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } + + return newArray + }, []) + + localStorage.setItem('failedTrades', JSON.stringify(cleanFailedTrades)) + + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') } - ` - ] - } - constructor() { - super() - this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' - this.urls = [] - this.nodeType = '' - this.addressInfo = {} - this.botQortWallet = '' - this.botBtcWallet = '' - this.botLtcWallet = '' - this.botDogeWallet = '' - this.botDgbWallet = '' - this.botRvnWallet = '' - this.botArrrWallet = '' - this.arrrWalletAddress = '' - this.qortWalletBalance = 0 - this.btcWalletBalance = 0 - this.ltcWalletBalance = 0 - this.dogeWalletBalance = 0 - this.dgbWalletBalance = 0 - this.rvnWalletBalance = 0 - this.arrrWalletBalance = 0 - this.failedTradesList = [] - this.tradesOpenBtcQortal = [] - this.myTradesOpenLtcQortal = [] - this.tradesFailedBtcQortal = [] - this.tradesOpenBtcQortalCleaned = [] - this.tradesOpenLtcQortal = [] - this.tradesFailedLtcQortal = [] - this.tradesOpenLtcQortalCleaned = [] - this.tradesOpenDogeQortal = [] - this.tradesFailedDogeQortal = [] - this.tradesOpenDogeQortalCleaned = [] - this.tradesOpenDgbQortal = [] - this.tradesFailedDgbQortal = [] - this.tradesOpenDgbQortalCleaned = [] - this.tradesOpenRvnQortal = [] - this.tradesFailedRvnQortal = [] - this.tradesOpenRvnQortalCleaned = [] - this.tradesOpenArrrQortal = [] - this.tradesFailedArrrQortal = [] - this.tradesOpenArrrQortalCleaned = [] - this.tradeBotBtcBook = [] - this.tradeBotLtcBook = [] - this.tradeBotDogeBook = [] - this.tradeBotDgbBook = [] - this.tradeBotRvnBook = [] - this.tradeBotArrrBook = [] - this.tradeBotBtcAt = [] - this.tradeBotLtcAt = [] - this.tradeBotDogeAt = [] - this.tradeBotDgbAt = [] - this.tradeBotRvnAt = [] - this.tradeBotArrrAt = [] - this.tradeBotAvailableBtcQortal = [] - this.tradeBotAvailableLtcQortal = [] - this.tradeBotAvailableDogeQortal = [] - this.tradeBotAvailableDgbQortal = [] - this.tradeBotAvailableRvnQortal = [] - this.tradeBotAvailableArrrQortal = [] - this.checkBtcAlice = '' - this.checkLtcAlice = '' - this.checkDogeAlice = '' - this.checkDgbAlice = '' - this.checkRvnAlice = '' - this.checkArrrAlice = '' - this.reAddBtcAmount = 0 - this.reAddLtcAmount = 0 - this.reAddDogeAmount = 0 - this.reAddDgbAmount = 0 - this.reAddRvnAmount = 0 - this.reAddArrrAmount = 0 - this.reAddBtcPrice = 0 - this.reAddLtcPrice = 0 - this.reAddDogePrice = 0 - this.reAddDgbPrice = 0 - this.reAddRvnPrice = 0 - this.reAddArrrPrice = 0 - this.botBtcBuyAtAddress = '' - this.botLtcBuyAtAddress = '' - this.botDogeBuyAtAddress = '' - this.botDgbBuyAtAddress = '' - this.botRvnBuyAtAddress = '' - this.botArrrBuyAtAddress = '' - this.balanceTicker = html` -
-
-
- ` - this.salt = '' - this.storageData = '' - this.lockScreenPass = '' - this.lockScreenSet = '' - this.lockPass = '' - this.lockSet = '' - this.myLockScreenPass = '' - this.myLockScreenSet = '' - this.helperMessage = '' - this.getTourElements = this.getTourElements.bind(this) - } + await filterUnconfirmedTransactions() - getTourElements(){ - let els = {} - const el1 = this.shadowRoot.querySelector("core-sync-status").shadowRoot.getElementById("core-sync-status-id") - const el2 = this.shadowRoot.querySelector("show-plugin").shadowRoot.getElementById("showPluginId") - const el3 = this.shadowRoot.querySelector("beginner-checklist").shadowRoot.getElementById("popover-notification") - if(el1) { - els['core-sync-status-id'] = el1 - } - if(el2) { - els['tab'] = el2 - } - if(el3) { - els['checklist'] = el3 - } + const getOpenTradesBTC = async () => { + let timerBTC - return els - } + if (this.isEmptyArray(this.tradeBotBtcBook) === true) { + clearTimeout(timerBTC) + timerBTC = setTimeout(getOpenTradesBTC, 150000) + } else { + await this.updateBtcWalletBalance() + const tradesOpenBtcQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=BITCOIN&limit=0` - render() { - return html` - - - - - - - - - - -
- - - -
-
- - - - - - -
-
 
- -
     
- -
   
- -
  
- ${this.renderLockButton()} -
  
- -
  
-
- this.openSettings()} title="${translate("settings.settings")}"> -
-
  
- -
 
-
- this.openLogout()} title="${translate("logout.logout")}"> -
-
  
-
-
- - - ${!this.showSyncMessages ? html`` : html``} -
-
- - - - -
-

Qortal UI ${translate("login.lp1")}

-
-
-
-

${translate("login.lp2")}

-

${translate("login.lp3")}

-
-
- password - -
-
- password - -
-
- ${translate("login.lp4")} - ${translate("login.lp5")} -
-
- -
-

Qortal UI ${translate("login.lp1")}

-
-
-
-

${translate("login.lessthen8")}

-
-
- ${translate("login.lp4")} - ${translate("login.lp5")} -
-
- -
- UI
- ${translate("login.lp9")} - ${translate("login.lp10")} -
-
- password - -
- ${this.helperMessage} -
-
-
-
- -
-
-
- - ` - } + const tradesOpenBtcQortal = await fetch(tradesOpenBtcQortalUrl).then(response => { + return response.json() + }) - async firstUpdated() { + this.tradesOpenBtcQortal = tradesOpenBtcQortal.map(item => { + const expiryTime = item.creatorPresenceExpiry + if (Number(expiryTime) > Date.now()) { + const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) + const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) + return { + qortAmount: item.qortAmount, + price: roundedPrice, + foreignAmount: item.expectedForeignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - addTradeBotRoutes(parentEpml) - parentEpml.imReady() + const unconfirmedTransactionsBTC = async () => { + const unconfirmedTransactionsUrlBTC = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + var addFailedTradesBTC = JSON.parse(localStorage.getItem('failedTrades') || '[]') - this.clearTheCache() + await fetch(unconfirmedTransactionsUrlBTC).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiffBTC = Date.now() - item.timestamp + const timeOneHourBTC = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiffBTC) > Number(timeOneHourBTC)) { + const addItBTC = { + timestamp: item.timestamp, + recipient: item.recipient + } + addFailedTradesBTC.push(addItBTC) + } + }) - this.helperMessage = this.renderHelperPass() + localStorage.setItem('failedTrades', JSON.stringify(addFailedTradesBTC)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } - this.showSyncMessages = store.getState().app.showSyncIndicator + await unconfirmedTransactionsBTC() - this.salt = '' - this.salt = Base58.encode(store.getState().app.wallet._addresses[0].keyPair.privateKey) + const filterUnconfirmedTransactionsBTC = async () => { + let cleanFailedTradesBTC = this.failedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } - this.storageData = '' - this.storageData = store.getState().app.selectedAddress.address + return newArray + }, []) - this.lockScreenPass = '' - this.lockScreenPass = 'lockScreenPass-' + this.storageData + localStorage.setItem('failedTrades', JSON.stringify(cleanFailedTradesBTC)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + } - this.lockScreenSet = '' - this.lockScreenSet = 'lockScreenSet-' + this.storageData + await filterUnconfirmedTransactionsBTC() - this.lockPass = '' - this.lockPass = encryptData(false, this.salt) + this.tradesOpenBtcQortalCleaned = this.tradesOpenBtcQortal - this.lockSet = '' - this.lockSet = encryptData(false, this.salt) + const filterOpenOfferBTC = async () => { + this.failedTradesList.forEach(item => { + const recipientToRemove = item.recipient - if (localStorage.getItem(this.lockScreenPass) === null && localStorage.getItem(this.lockScreenSet) === null) { - localStorage.setItem(this.lockScreenPass, this.lockPass) - localStorage.setItem(this.lockScreenSet, this.lockSet) - this.myLockScreenPass = '' - this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) - this.myLockScreenSet = '' - this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) - } else { - this.myLockScreenPass = '' - this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) - this.myLockScreenSet = '' - this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) - } + this.tradesOpenBtcQortalCleaned = this.tradesOpenBtcQortalCleaned.filter(obj => { + return obj.qortalCreatorTradeAddress !== recipientToRemove + }) + }) + } - if (this.myLockScreenSet === true) { - this.shadowRoot.getElementById('lockScreenActive').open() - } + await filterOpenOfferBTC() + await appDelay(1000) + await filterMyBotPriceTradesBTC() - var drawerTog = this.shadowRoot.getElementById("mb") - var drawerOut = this.shadowRoot.getElementById("appsidebar") + setTimeout(getOpenTradesBTC, 150000) + } + } - drawerTog.addEventListener('mouseover', function () { - drawerTog.click() - }) - - drawerOut.addEventListener('mouseleave', function () { - drawerTog.click() - }) - - await this.getNodeType() - - const myAppNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] - const nodeAppUrl = myAppNode.protocol + '://' + myAppNode.domain + ':' + myAppNode.port - const appDelay = ms => new Promise(res => setTimeout(res, ms)) - - await appDelay(3000) - - this.botQortWallet = store.getState().app.selectedAddress.address - this.botBtcWallet = store.getState().app.selectedAddress.btcWallet.address - this.botLtcWallet = store.getState().app.selectedAddress.ltcWallet.address - this.botDogeWallet = store.getState().app.selectedAddress.dogeWallet.address - this.botDgbWallet = store.getState().app.selectedAddress.dgbWallet.address - this.botRvnWallet = store.getState().app.selectedAddress.rvnWallet.address - this.botArrrWallet = store.getState().app.selectedAddress.arrrWallet.address - - await this.botBtcTradebook() - await this.botLtcTradebook() - await this.botDogeTradebook() - await this.botDgbTradebook() - await this.botRvnTradebook() - await this.botArrrTradebook() - - window.addEventListener('storage', async () => { - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") - }) - - if (localStorage.getItem("failedTrades") === null) { - localStorage.setItem("failedTrades", "") - - var oldFailedTrades = JSON.parse(localStorage.getItem("failedTrades") || "[]") - - const addFixedFail = { - timestamp: 1699792400000, - recipient: 'QSMfgUCXahYHg38RidZ4FuWbVV8KGngDjP' - } - - oldFailedTrades.push(addFixedFail) - - localStorage.setItem("failedTrades", JSON.stringify(oldFailedTrades)) - - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } else { - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } - - const unconfirmedTransactions = async () => { - const unconfirmedTransactionslUrl = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - var addFailedTrades = JSON.parse(localStorage.getItem("failedTrades") || "[]") - await fetch(unconfirmedTransactionslUrl).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiff = Date.now() - item.timestamp - const timeOneHour = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiff) > Number(timeOneHour)) { - const addIt = { - timestamp: item.timestamp, - recipient: item.recipient - } - addFailedTrades.push(addIt) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addFailedTrades)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - }) - } - - await unconfirmedTransactions() - - const filterUnconfirmedTransactions = async () => { - let cleanFailedTrades = this.failedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanFailedTrades)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } - - await filterUnconfirmedTransactions() - - const getOpenTradesBTC = async () => { - let timerBTC - - if (this.isEmptyArray(this.tradeBotBtcBook) === true) { - clearTimeout(timerBTC) - timerBTC = setTimeout(getOpenTradesBTC, 150000) - } else { - await this.updateBtcWalletBalance() - const tradesOpenBtcQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=BITCOIN&limit=0` - - const tradesOpenBtcQortal = await fetch(tradesOpenBtcQortalUrl).then(response => { - return response.json() - }) - - this.tradesOpenBtcQortal = tradesOpenBtcQortal.map(item => { - const expiryTime = item.creatorPresenceExpiry - if (Number(expiryTime) > Date.now()) { - const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) - const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) - return { - qortAmount: item.qortAmount, - price: roundedPrice, - foreignAmount: item.expectedForeignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) - - const unconfirmedTransactionsBTC = async () => { - const unconfirmedTransactionsUrlBTC = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - var addFailedTradesBTC = JSON.parse(localStorage.getItem("failedTrades") || "[]") - await fetch(unconfirmedTransactionsUrlBTC).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiffBTC = Date.now() - item.timestamp - const timeOneHourBTC = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiffBTC) > Number(timeOneHourBTC)) { - const addItBTC = { - timestamp: item.timestamp, - recipient: item.recipient - } - addFailedTradesBTC.push(addItBTC) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addFailedTradesBTC)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - }) - } - - await unconfirmedTransactionsBTC() - - const filterUnconfirmedTransactionsBTC = async () => { - let cleanFailedTradesBTC = this.failedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanFailedTradesBTC)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } - - await filterUnconfirmedTransactionsBTC() - - this.tradesOpenBtcQortalCleaned = this.tradesOpenBtcQortal - - const filterOpenOfferBTC = async () => { - this.failedTradesList.forEach(item => { - const recipientToRemove = item.recipient - this.tradesOpenBtcQortalCleaned = this.tradesOpenBtcQortalCleaned.filter(obj => { - return obj.qortalCreatorTradeAddress !== recipientToRemove - }) - }) - } - - await filterOpenOfferBTC() - await appDelay(1000) - await filterMyBotPriceTradesBTC() - setTimeout(getOpenTradesBTC, 150000) - } - } - - const filterMyBotPriceTradesBTC = async () => { - const tradeBotBtcUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=BITCOIN&apiKey=${this.getApiKey()}` + const filterMyBotPriceTradesBTC = async () => { + const tradeBotBtcUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=BITCOIN&apiKey=${this.getApiKey()}` this.tradeBotBtcAt = await fetch(tradeBotBtcUrl).then(response => { return response.json() }) - await appDelay(1000) + await appDelay(1000) - this.tradeBotAvailableBtcQortal = this.tradesOpenBtcQortalCleaned.map(item => { - const listprice = parseFloat(item.price) - const listamount = parseFloat(item.qortAmount) - const checkprice = parseFloat(this.tradeBotBtcBook[0].botBtcPrice) - const checkamount = parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) - if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { - return { - qortAmount: item.qortAmount, - price: item.price, - foreignAmount: item.foreignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + this.tradeBotAvailableBtcQortal = this.tradesOpenBtcQortalCleaned.map(item => { + const listprice = parseFloat(item.price) + const listamount = parseFloat(item.qortAmount) + const checkprice = parseFloat(this.tradeBotBtcBook[0].botBtcPrice) + const checkamount = parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) - this.tradeBotAvailableBtcQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) + if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { + return { + qortAmount: item.qortAmount, + price: item.price, + foreignAmount: item.foreignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - if (this.isEmptyArray(this.tradeBotAvailableBtcQortal) === true) { - return - } else { - this.checkBtcAlice = this.tradeBotAvailableBtcQortal[0].qortalAtAddress - } + this.tradeBotAvailableBtcQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) - await appDelay(1000) + if (this.isEmptyArray(this.tradeBotAvailableBtcQortal) === true) { + return + } else { + this.checkBtcAlice = this.tradeBotAvailableBtcQortal[0].qortalAtAddress + } - if (this.tradeBotBtcAt.some(item => item.atAddress === this.checkBtcAlice)) { - return - } + await appDelay(1000) - await appDelay(1000) + if (this.tradeBotBtcAt.some(item => item.atAddress === this.checkBtcAlice)) { + return + } - if (this.isEmptyArray(this.tradeBotAvailableBtcQortal) === true) { + await appDelay(1000) - } else { - const botbtcprice = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcPrice)) - const changebtcamount = parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) - const reducebtcamount = parseFloat(this.tradeBotAvailableBtcQortal[0].qortAmount) - const tradebtcataddress = this.tradeBotAvailableBtcQortal[0].qortalAtAddress - const newbtcamount = this.round(parseFloat(changebtcamount - reducebtcamount)) + if (this.isEmptyArray(this.tradeBotAvailableBtcQortal) === true) { - this.reAddBtcAmount = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount)) - this.reAddBtcPrice = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcPrice)) + } else { + const botbtcprice = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcPrice)) + const changebtcamount = parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) + const reducebtcamount = parseFloat(this.tradeBotAvailableBtcQortal[0].qortAmount) + const tradebtcataddress = this.tradeBotAvailableBtcQortal[0].qortalAtAddress + const newbtcamount = this.round(parseFloat(changebtcamount - reducebtcamount)) - localStorage.removeItem(this.botBtcWallet) - localStorage.setItem(this.botBtcWallet, "") + this.reAddBtcAmount = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount)) + this.reAddBtcPrice = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcPrice)) - var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") + localStorage.removeItem(this.botBtcWallet) + localStorage.setItem(this.botBtcWallet, '') - const newBtcTradebookItem = { - botBtcQortAmount: newbtcamount, - botBtcPrice: botbtcprice - } + var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') - oldBtcTradebook.push(newBtcTradebookItem) + const newBtcTradebookItem = { + botBtcQortAmount: newbtcamount, + botBtcPrice: botbtcprice + } - localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook)) + oldBtcTradebook.push(newBtcTradebookItem) - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") + localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook)) - this.botBtcBuyAtAddress = tradebtcataddress + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') - await appDelay(1000) + this.botBtcBuyAtAddress = tradebtcataddress - await this.buyBtcAction() + await appDelay(1000) - if (this.isEmptyArray(this.tradeBotBtcBook) === true) { - return - } else { - const botamount = parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) + await this.buyBtcAction() - if (Number(botamount) === 0) { - this.removeBotBTCTradebook() - } - } + if (this.isEmptyArray(this.tradeBotBtcBook) === true) { + return + } else { + const botamount = parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) - if (this.isEmptyArray(this.tradeBotBtcBook) === true) { + if (Number(botamount) === 0) { + this.removeBotBTCTradebook() + } + } - } else { - const checkBotBtcFunds = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) * parseFloat(this.tradeBotBtcBook[0].botBtcPrice)) - const myBotBtcFunds = this.round(parseFloat(this.btcWalletBalance)) + if (this.isEmptyArray(this.tradeBotBtcBook) === true) { - if (Number(myBotBtcFunds) < Number(checkBotBtcFunds)) { - this.removeBotBTCTradebook() - } - } - } - } + } else { + const checkBotBtcFunds = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) * parseFloat(this.tradeBotBtcBook[0].botBtcPrice)) + const myBotBtcFunds = this.round(parseFloat(this.btcWalletBalance)) - const getOpenTradesLTC = async () => { - let timerLTC + if (Number(myBotBtcFunds) < Number(checkBotBtcFunds)) { + this.removeBotBTCTradebook() + } + } + } + } - if (this.isEmptyArray(this.tradeBotLtcBook) === true) { - clearTimeout(timerLTC) - timerLTC = setTimeout(getOpenTradesLTC, 150000) - } else { - await this.updateLtcWalletBalance() + const getOpenTradesLTC = async () => { + let timerLTC - const getTradesOpenLtcQortal = async () => { - const tradesOpenLtcQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=LITECOIN&limit=0` + if (this.isEmptyArray(this.tradeBotLtcBook) === true) { + clearTimeout(timerLTC) + timerLTC = setTimeout(getOpenTradesLTC, 150000) + } else { + await this.updateLtcWalletBalance() - await fetch(tradesOpenLtcQortalUrl).then(response => { - return response.json() - }).then(data => { - this.myTradesOpenLtcQortal = data - }) - } + const getTradesOpenLtcQortal = async () => { + const tradesOpenLtcQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=LITECOIN&limit=0` - await getTradesOpenLtcQortal() + await fetch(tradesOpenLtcQortalUrl).then(response => { + return response.json() + }).then(data => { + this.myTradesOpenLtcQortal = data + }) + } - const filterTradesOpenLtcQortal = async () => { - this.tradesOpenLtcQortal = this.myTradesOpenLtcQortal.map(item => { - const expiryTime = item.creatorPresenceExpiry - if (Number(expiryTime) > Date.now()) { - const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) - const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) - return { - qortAmount: item.qortAmount, - price: roundedPrice, - foreignAmount: item.expectedForeignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) - } + await getTradesOpenLtcQortal() - await filterTradesOpenLtcQortal() + const filterTradesOpenLtcQortal = async () => { + this.tradesOpenLtcQortal = this.myTradesOpenLtcQortal.map(item => { + const expiryTime = item.creatorPresenceExpiry + if (Number(expiryTime) > Date.now()) { + const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) + const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) + return { + qortAmount: item.qortAmount, + price: roundedPrice, + foreignAmount: item.expectedForeignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) + } - const unconfirmedTransactionsLTC = async () => { - const unconfirmedTransactionsUrlLTC = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - var addFailedTradesLTC = JSON.parse(localStorage.getItem("failedTrades") || "[]") - await fetch(unconfirmedTransactionsUrlLTC).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiffLTC = Date.now() - item.timestamp - const timeOneHourLTC = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiffLTC) > Number(timeOneHourLTC)) { - const addItLTC = { - timestamp: item.timestamp, - recipient: item.recipient - } - addFailedTradesLTC.push(addItLTC) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addFailedTradesLTC)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - }) - } + await filterTradesOpenLtcQortal() - await unconfirmedTransactionsLTC() + const unconfirmedTransactionsLTC = async () => { + const unconfirmedTransactionsUrlLTC = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + var addFailedTradesLTC = JSON.parse(localStorage.getItem('failedTrades') || '[]') - const filterUnconfirmedTransactionsLTC = async () => { - let cleanFailedTradesLTC = this.failedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanFailedTradesLTC)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } + await fetch(unconfirmedTransactionsUrlLTC).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiffLTC = Date.now() - item.timestamp + const timeOneHourLTC = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiffLTC) > Number(timeOneHourLTC)) { + const addItLTC = { + timestamp: item.timestamp, + recipient: item.recipient + } + addFailedTradesLTC.push(addItLTC) + } + }) - await filterUnconfirmedTransactionsLTC() + localStorage.setItem('failedTrades', JSON.stringify(addFailedTradesLTC)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } - this.tradesOpenLtcQortalCleaned = this.tradesOpenLtcQortal + await unconfirmedTransactionsLTC() - const filterOpenOfferLTC = async () => { - this.failedTradesList.forEach(item => { - const recipientToRemove = item.recipient - this.tradesOpenLtcQortalCleaned = this.tradesOpenLtcQortalCleaned.filter(obj => { - return obj.qortalCreatorTradeAddress !== recipientToRemove - }) - }) - } + const filterUnconfirmedTransactionsLTC = async () => { + let cleanFailedTradesLTC = this.failedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } - await filterOpenOfferLTC() - await appDelay(1000) - await filterMyBotPriceTradesLTC() - setTimeout(getOpenTradesLTC, 150000) - } - } + return newArray + }, []) - const filterMyBotPriceTradesLTC = async () => { - const tradeBotLtcUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=LITECOIN&apiKey=${this.getApiKey()}` + localStorage.setItem('failedTrades', JSON.stringify(cleanFailedTradesLTC)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + } + + await filterUnconfirmedTransactionsLTC() + + this.tradesOpenLtcQortalCleaned = this.tradesOpenLtcQortal + + const filterOpenOfferLTC = async () => { + this.failedTradesList.forEach(item => { + const recipientToRemove = item.recipient + this.tradesOpenLtcQortalCleaned = this.tradesOpenLtcQortalCleaned.filter(obj => { + return obj.qortalCreatorTradeAddress !== recipientToRemove + }) + }) + } + + await filterOpenOfferLTC() + await appDelay(1000) + await filterMyBotPriceTradesLTC() + + setTimeout(getOpenTradesLTC, 150000) + } + } + + const filterMyBotPriceTradesLTC = async () => { + const tradeBotLtcUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=LITECOIN&apiKey=${this.getApiKey()}` this.tradeBotLtcAt = await fetch(tradeBotLtcUrl).then(response => { return response.json() }) - await appDelay(1000) + await appDelay(1000) - this.tradeBotAvailableLtcQortal = this.tradesOpenLtcQortalCleaned.map(item => { - const listprice = parseFloat(item.price) - const listamount = parseFloat(item.qortAmount) - const checkprice = parseFloat(this.tradeBotLtcBook[0].botLtcPrice) - const checkamount = parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) - if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { - return { - qortAmount: item.qortAmount, - price: item.price, - foreignAmount: item.foreignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + this.tradeBotAvailableLtcQortal = this.tradesOpenLtcQortalCleaned.map(item => { + const listprice = parseFloat(item.price) + const listamount = parseFloat(item.qortAmount) + const checkprice = parseFloat(this.tradeBotLtcBook[0].botLtcPrice) + const checkamount = parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) - this.tradeBotAvailableLtcQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) + if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { + return { + qortAmount: item.qortAmount, + price: item.price, + foreignAmount: item.foreignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - if (this.isEmptyArray(this.tradeBotAvailableLtcQortal) === true) { - return - } else { - this.checkLtcAlice = this.tradeBotAvailableLtcQortal[0].qortalAtAddress - } + this.tradeBotAvailableLtcQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) - await appDelay(1000) + if (this.isEmptyArray(this.tradeBotAvailableLtcQortal) === true) { + return + } else { + this.checkLtcAlice = this.tradeBotAvailableLtcQortal[0].qortalAtAddress + } - if (this.tradeBotLtcAt.some(item => item.atAddress === this.checkLtcAlice)) { - return - } + await appDelay(1000) - await appDelay(1000) + if (this.tradeBotLtcAt.some(item => item.atAddress === this.checkLtcAlice)) { + return + } - if (this.isEmptyArray(this.tradeBotAvailableLtcQortal) === true) { + await appDelay(1000) - } else { - const botltcprice = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcPrice)) - const changeltcamount = parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) - const reduceltcamount = parseFloat(this.tradeBotAvailableLtcQortal[0].qortAmount) - const tradeltcataddress = this.tradeBotAvailableLtcQortal[0].qortalAtAddress - const newltcamount = this.round(parseFloat(changeltcamount - reduceltcamount)) + if (this.isEmptyArray(this.tradeBotAvailableLtcQortal) === true) { - this.reAddLtcAmount = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount)) - this.reAddLtcPrice = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcPrice)) + } else { + const botltcprice = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcPrice)) + const changeltcamount = parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) + const reduceltcamount = parseFloat(this.tradeBotAvailableLtcQortal[0].qortAmount) + const tradeltcataddress = this.tradeBotAvailableLtcQortal[0].qortalAtAddress + const newltcamount = this.round(parseFloat(changeltcamount - reduceltcamount)) - localStorage.removeItem(this.botLtcWallet) - localStorage.setItem(this.botLtcWallet, "") + this.reAddLtcAmount = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount)) + this.reAddLtcPrice = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcPrice)) - var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") + localStorage.removeItem(this.botLtcWallet) + localStorage.setItem(this.botLtcWallet, '') - const newLtcTradebookItem = { - botLtcQortAmount: newltcamount, - botLtcPrice: botltcprice - } + var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') - oldLtcTradebook.push(newLtcTradebookItem) + const newLtcTradebookItem = { + botLtcQortAmount: newltcamount, + botLtcPrice: botltcprice + } - localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook)) + oldLtcTradebook.push(newLtcTradebookItem) - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") + localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook)) - this.botLtcBuyAtAddress = tradeltcataddress + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') - await appDelay(1000) + this.botLtcBuyAtAddress = tradeltcataddress - await this.buyLtcAction() + await appDelay(1000) - if (this.isEmptyArray(this.tradeBotLtcBook) === true) { - return - } else { - const botamount = parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) + await this.buyLtcAction() - if (Number(botamount) === 0) { - this.removeBotLTCTradebook() - } - } + if (this.isEmptyArray(this.tradeBotLtcBook) === true) { + return + } else { + const botamount = parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) - if (this.isEmptyArray(this.tradeBotLtcBook) === true) { + if (Number(botamount) === 0) { + this.removeBotLTCTradebook() + } + } - } else { - const checkBotLtcFunds = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) * parseFloat(this.tradeBotLtcBook[0].botLtcPrice)) - const myBotLtcFunds = this.round(parseFloat(this.ltcWalletBalance)) + if (this.isEmptyArray(this.tradeBotLtcBook) === true) { - if (Number(myBotLtcFunds) < Number(checkBotLtcFunds)) { - this.removeBotLTCTradebook() - } - } - } - } + } else { + const checkBotLtcFunds = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) * parseFloat(this.tradeBotLtcBook[0].botLtcPrice)) + const myBotLtcFunds = this.round(parseFloat(this.ltcWalletBalance)) - const getOpenTradesDOGE = async () => { - let timerDOGE + if (Number(myBotLtcFunds) < Number(checkBotLtcFunds)) { + this.removeBotLTCTradebook() + } + } + } + } - if (this.isEmptyArray(this.tradeBotDogeBook) === true) { - clearTimeout(timerDOGE) - timerDOGE = setTimeout(getOpenTradesDOGE, 150000) - } else { - await this.updateDogeWalletBalance() - const tradesOpenDogeQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=DOGECOIN&limit=0` + const getOpenTradesDOGE = async () => { + let timerDOGE - const tradesOpenDogeQortal = await fetch(tradesOpenDogeQortalUrl).then(response => { - return response.json() - }) + if (this.isEmptyArray(this.tradeBotDogeBook) === true) { + clearTimeout(timerDOGE) + timerDOGE = setTimeout(getOpenTradesDOGE, 150000) + } else { + await this.updateDogeWalletBalance() + const tradesOpenDogeQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=DOGECOIN&limit=0` - this.tradesOpenDogeQortal = tradesOpenDogeQortal.map(item => { - const expiryTime = item.creatorPresenceExpiry - if (Number(expiryTime) > Date.now()) { - const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) - const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) - return { - qortAmount: item.qortAmount, - price: roundedPrice, - foreignAmount: item.expectedForeignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + const tradesOpenDogeQortal = await fetch(tradesOpenDogeQortalUrl).then(response => { + return response.json() + }) - const unconfirmedTransactionsDOGE = async () => { - const unconfirmedTransactionsUrlDOGE = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - var addFailedTradesDOGE = JSON.parse(localStorage.getItem("failedTrades") || "[]") - await fetch(unconfirmedTransactionsUrlDOGE).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiffDOGE = Date.now() - item.timestamp - const timeOneHourDOGE = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiffDOGE) > Number(timeOneHourDOGE)) { - const addItDOGE = { - timestamp: item.timestamp, - recipient: item.recipient - } - addFailedTradesDOGE.push(addItDOGE) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addFailedTradesDOGE)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - }) - } + this.tradesOpenDogeQortal = tradesOpenDogeQortal.map(item => { + const expiryTime = item.creatorPresenceExpiry + if (Number(expiryTime) > Date.now()) { + const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) + const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) + return { + qortAmount: item.qortAmount, + price: roundedPrice, + foreignAmount: item.expectedForeignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - await unconfirmedTransactionsDOGE() + const unconfirmedTransactionsDOGE = async () => { + const unconfirmedTransactionsUrlDOGE = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + var addFailedTradesDOGE = JSON.parse(localStorage.getItem('failedTrades') || '[]') - const filterUnconfirmedTransactionsDOGE = async () => { - let cleanFailedTradesDOGE = this.failedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanFailedTradesDOGE)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } + await fetch(unconfirmedTransactionsUrlDOGE).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiffDOGE = Date.now() - item.timestamp + const timeOneHourDOGE = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiffDOGE) > Number(timeOneHourDOGE)) { + const addItDOGE = { + timestamp: item.timestamp, + recipient: item.recipient + } + addFailedTradesDOGE.push(addItDOGE) + } + }) - await filterUnconfirmedTransactionsDOGE() + localStorage.setItem('failedTrades', JSON.stringify(addFailedTradesDOGE)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } - this.tradesOpenDogeQortalCleaned = this.tradesOpenDogeQortal + await unconfirmedTransactionsDOGE() - const filterOpenOfferDOGE = async () => { - this.failedTradesList.forEach(item => { - const recipientToRemove = item.recipient - this.tradesOpenDogeQortalCleaned = this.tradesOpenDogeQortalCleaned.filter(obj => { - return obj.qortalCreatorTradeAddress !== recipientToRemove - }) - }) - } + const filterUnconfirmedTransactionsDOGE = async () => { + let cleanFailedTradesDOGE = this.failedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } - await filterOpenOfferDOGE() - await appDelay(1000) - await filterMyBotPriceTradesDOGE() - setTimeout(getOpenTradesDOGE, 150000) - } - } + return newArray + }, []) - const filterMyBotPriceTradesDOGE = async () => { - const tradeBotDogeUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=DOGECOIN&apiKey=${this.getApiKey()}` + localStorage.setItem('failedTrades', JSON.stringify(cleanFailedTradesDOGE)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + } + + await filterUnconfirmedTransactionsDOGE() + + this.tradesOpenDogeQortalCleaned = this.tradesOpenDogeQortal + + const filterOpenOfferDOGE = async () => { + this.failedTradesList.forEach(item => { + const recipientToRemove = item.recipient + this.tradesOpenDogeQortalCleaned = this.tradesOpenDogeQortalCleaned.filter(obj => { + return obj.qortalCreatorTradeAddress !== recipientToRemove + }) + }) + } + + await filterOpenOfferDOGE() + await appDelay(1000) + await filterMyBotPriceTradesDOGE() + + setTimeout(getOpenTradesDOGE, 150000) + } + } + + const filterMyBotPriceTradesDOGE = async () => { + const tradeBotDogeUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=DOGECOIN&apiKey=${this.getApiKey()}` this.tradeBotDogeAt = await fetch(tradeBotDogeUrl).then(response => { return response.json() }) - await appDelay(1000) + await appDelay(1000) - this.tradeBotAvailableDogeQortal = this.tradesOpenDogeQortalCleaned.map(item => { - const listprice = parseFloat(item.price) - const listamount = parseFloat(item.qortAmount) - const checkprice = parseFloat(this.tradeBotDogeBook[0].botDogePrice) - const checkamount = parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) - if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { - return { - qortAmount: item.qortAmount, - price: item.price, - foreignAmount: item.foreignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + this.tradeBotAvailableDogeQortal = this.tradesOpenDogeQortalCleaned.map(item => { + const listprice = parseFloat(item.price) + const listamount = parseFloat(item.qortAmount) + const checkprice = parseFloat(this.tradeBotDogeBook[0].botDogePrice) + const checkamount = parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) - this.tradeBotAvailableDogeQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) + if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { + return { + qortAmount: item.qortAmount, + price: item.price, + foreignAmount: item.foreignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - if (this.isEmptyArray(this.tradeBotAvailableDogeQortal) === true) { - return - } else { - this.checkDogeAlice = this.tradeBotAvailableDogeQortal[0].qortalAtAddress - } + this.tradeBotAvailableDogeQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) - await appDelay(1000) + if (this.isEmptyArray(this.tradeBotAvailableDogeQortal) === true) { + return + } else { + this.checkDogeAlice = this.tradeBotAvailableDogeQortal[0].qortalAtAddress + } - if (this.tradeBotDogeAt.some(item => item.atAddress === this.checkDogeAlice)) { - return - } + await appDelay(1000) - await appDelay(1000) + if (this.tradeBotDogeAt.some(item => item.atAddress === this.checkDogeAlice)) { + return + } - if (this.isEmptyArray(this.tradeBotAvailableDogeQortal) === true) { + await appDelay(1000) - } else { - const botdogeprice = this.round(parseFloat(this.tradeBotDogeBook[0].botDogePrice)) - const changedogeamount = parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) - const reducedogeamount = parseFloat(this.tradeBotAvailableDogeQortal[0].qortAmount) - const tradedogeataddress = this.tradeBotAvailableDogeQortal[0].qortalAtAddress - const newdogeamount = this.round(parseFloat(changedogeamount - reducedogeamount)) + if (this.isEmptyArray(this.tradeBotAvailableDogeQortal) === true) { - this.reAddDogeAmount = this.round(parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount)) - this.reAddDogePrice = this.round(parseFloat(this.tradeBotDogeBook[0].botDogePrice)) + } else { + const botdogeprice = this.round(parseFloat(this.tradeBotDogeBook[0].botDogePrice)) + const changedogeamount = parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) + const reducedogeamount = parseFloat(this.tradeBotAvailableDogeQortal[0].qortAmount) + const tradedogeataddress = this.tradeBotAvailableDogeQortal[0].qortalAtAddress + const newdogeamount = this.round(parseFloat(changedogeamount - reducedogeamount)) - localStorage.removeItem(this.botDogeWallet) - localStorage.setItem(this.botDogeWallet, "") + this.reAddDogeAmount = this.round(parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount)) + this.reAddDogePrice = this.round(parseFloat(this.tradeBotDogeBook[0].botDogePrice)) - var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") + localStorage.removeItem(this.botDogeWallet) + localStorage.setItem(this.botDogeWallet, '') - const newDogeTradebookItem = { - botDogeQortAmount: newdogeamount, - botDogePrice: botdogeprice - } + var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') - oldDogeTradebook.push(newDogeTradebookItem) + const newDogeTradebookItem = { + botDogeQortAmount: newdogeamount, + botDogePrice: botdogeprice + } - localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook)) + oldDogeTradebook.push(newDogeTradebookItem) - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") + localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook)) - this.botDogeBuyAtAddress = tradedogeataddress + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') - await appDelay(1000) + this.botDogeBuyAtAddress = tradedogeataddress - await this.buyDogeAction() + await appDelay(1000) - if (this.isEmptyArray(this.tradeBotDogeBook) === true) { - return - } else { - const botamount = parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) + await this.buyDogeAction() - if (Number(botamount) === 0) { - this.removeBotDOGETradebook() - } - } + if (this.isEmptyArray(this.tradeBotDogeBook) === true) { + return + } else { + const botamount = parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) - if (this.isEmptyArray(this.tradeBotDogeBook) === true) { + if (Number(botamount) === 0) { + this.removeBotDOGETradebook() + } + } - } else { - const checkBotDogeFunds = this.round(parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) * parseFloat(this.tradeBotDogeBook[0].botDogePrice)) - const myBotDogeFunds = this.round(parseFloat(this.dogeWalletBalance)) + if (this.isEmptyArray(this.tradeBotDogeBook) === true) { - if (Number(myBotDogeFunds) < Number(checkBotDogeFunds)) { - this.removeBotDOGETradebook() - } - } - } - } + } else { + const checkBotDogeFunds = this.round(parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) * parseFloat(this.tradeBotDogeBook[0].botDogePrice)) + const myBotDogeFunds = this.round(parseFloat(this.dogeWalletBalance)) - const getOpenTradesDGB = async () => { - let timerDGB + if (Number(myBotDogeFunds) < Number(checkBotDogeFunds)) { + this.removeBotDOGETradebook() + } + } + } + } - if (this.isEmptyArray(this.tradeBotDgbBook) === true) { - clearTimeout(timerDGB) - timerDGB = setTimeout(getOpenTradesDGB, 150000) - } else { - await this.updateDgbWalletBalance() - const tradesOpenDgbQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=DIGIYBYTE&limit=0` + const getOpenTradesDGB = async () => { + let timerDGB - const tradesOpenDgbQortal = await fetch(tradesOpenDgbQortalUrl).then(response => { - return response.json() - }) + if (this.isEmptyArray(this.tradeBotDgbBook) === true) { + clearTimeout(timerDGB) + timerDGB = setTimeout(getOpenTradesDGB, 150000) + } else { + await this.updateDgbWalletBalance() + const tradesOpenDgbQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=DIGIYBYTE&limit=0` - this.tradesOpenDgbQortal = tradesOpenDgbQortal.map(item => { - const expiryTime = item.creatorPresenceExpiry - if (Number(expiryTime) > Date.now()) { - const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) - const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) - return { - qortAmount: item.qortAmount, - price: roundedPrice, - foreignAmount: item.expectedForeignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + const tradesOpenDgbQortal = await fetch(tradesOpenDgbQortalUrl).then(response => { + return response.json() + }) - const unconfirmedTransactionsDGB = async () => { - const unconfirmedTransactionsUrlDGB = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - var addFailedTradesDGB = JSON.parse(localStorage.getItem("failedTrades") || "[]") - await fetch(unconfirmedTransactionsUrlDGB).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiffDGB = Date.now() - item.timestamp - const timeOneHourDGB = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiffDGB) > Number(timeOneHourDGB)) { - const addItDGB = { - timestamp: item.timestamp, - recipient: item.recipient - } - addFailedTradesDGB.push(addItDGB) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addFailedTradesDGB)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - }) - } + this.tradesOpenDgbQortal = tradesOpenDgbQortal.map(item => { + const expiryTime = item.creatorPresenceExpiry + if (Number(expiryTime) > Date.now()) { + const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) + const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) + return { + qortAmount: item.qortAmount, + price: roundedPrice, + foreignAmount: item.expectedForeignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - await unconfirmedTransactionsDGB() + const unconfirmedTransactionsDGB = async () => { + const unconfirmedTransactionsUrlDGB = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + var addFailedTradesDGB = JSON.parse(localStorage.getItem('failedTrades') || '[]') - const filterUnconfirmedTransactionsDGB = async () => { - let cleanFailedTradesDGB = this.failedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanFailedTradesDGB)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } + await fetch(unconfirmedTransactionsUrlDGB).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiffDGB = Date.now() - item.timestamp + const timeOneHourDGB = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiffDGB) > Number(timeOneHourDGB)) { + const addItDGB = { + timestamp: item.timestamp, + recipient: item.recipient + } + addFailedTradesDGB.push(addItDGB) + } + }) - await filterUnconfirmedTransactionsDGB() + localStorage.setItem('failedTrades', JSON.stringify(addFailedTradesDGB)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } - this.tradesOpenDgbQortalCleaned = this.tradesOpenDgbQortal + await unconfirmedTransactionsDGB() - const filterOpenOfferDGB = async () => { - this.failedTradesList.forEach(item => { - const recipientToRemove = item.recipient - this.tradesOpenDgbQortalCleaned = this.tradesOpenDgbQortalCleaned.filter(obj => { - return obj.qortalCreatorTradeAddress !== recipientToRemove - }) - }) - } + const filterUnconfirmedTransactionsDGB = async () => { + let cleanFailedTradesDGB = this.failedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } - await filterOpenOfferDGB() - await appDelay(1000) - await filterMyBotPriceTradesDGB() - setTimeout(getOpenTradesDGB, 150000) - } - } + return newArray + }, []) - const filterMyBotPriceTradesDGB = async () => { - const tradeBotDgbUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=DIGIBYTE&apiKey=${this.getApiKey()}` + localStorage.setItem('failedTrades', JSON.stringify(cleanFailedTradesDGB)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + } + + await filterUnconfirmedTransactionsDGB() + + this.tradesOpenDgbQortalCleaned = this.tradesOpenDgbQortal + + const filterOpenOfferDGB = async () => { + this.failedTradesList.forEach(item => { + const recipientToRemove = item.recipient + this.tradesOpenDgbQortalCleaned = this.tradesOpenDgbQortalCleaned.filter(obj => { + return obj.qortalCreatorTradeAddress !== recipientToRemove + }) + }) + } + + await filterOpenOfferDGB() + await appDelay(1000) + await filterMyBotPriceTradesDGB() + + setTimeout(getOpenTradesDGB, 150000) + } + } + + const filterMyBotPriceTradesDGB = async () => { + const tradeBotDgbUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=DIGIBYTE&apiKey=${this.getApiKey()}` this.tradeBotDgbAt = await fetch(tradeBotDgbUrl).then(response => { return response.json() }) - await appDelay(1000) + await appDelay(1000) - this.tradeBotAvailableDgbQortal = this.tradesOpenDgbQortalCleaned.map(item => { - const listprice = parseFloat(item.price) - const listamount = parseFloat(item.qortAmount) - const checkprice = parseFloat(this.tradeBotDgbBook[0].botDgbPrice) - const checkamount = parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) - if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { - return { - qortAmount: item.qortAmount, - price: item.price, - foreignAmount: item.foreignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + this.tradeBotAvailableDgbQortal = this.tradesOpenDgbQortalCleaned.map(item => { + const listprice = parseFloat(item.price) + const listamount = parseFloat(item.qortAmount) + const checkprice = parseFloat(this.tradeBotDgbBook[0].botDgbPrice) + const checkamount = parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) - this.tradeBotAvailableDgbQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) + if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { + return { + qortAmount: item.qortAmount, + price: item.price, + foreignAmount: item.foreignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - if (this.isEmptyArray(this.tradeBotAvailableDgbQortal) === true) { - return - } else { - this.checkDgbAlice = this.tradeBotAvailableDgbQortal[0].qortalAtAddress - } + this.tradeBotAvailableDgbQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) - await appDelay(1000) + if (this.isEmptyArray(this.tradeBotAvailableDgbQortal) === true) { + return + } else { + this.checkDgbAlice = this.tradeBotAvailableDgbQortal[0].qortalAtAddress + } - if (this.tradeBotDgbAt.some(item => item.atAddress === this.checkDgbAlice)) { - return - } + await appDelay(1000) - await appDelay(1000) + if (this.tradeBotDgbAt.some(item => item.atAddress === this.checkDgbAlice)) { + return + } - if (this.isEmptyArray(this.tradeBotAvailableDgbQortal) === true) { + await appDelay(1000) - } else { - const botdgbprice = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbPrice)) - const changedgbamount = parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) - const reducedgbamount = parseFloat(this.tradeBotAvailableDgbQortal[0].qortAmount) - const tradedgbataddress = this.tradeBotAvailableDgbQortal[0].qortalAtAddress - const newdgbamount = this.round(parseFloat(changedgbamount - reducedgbamount)) + if (this.isEmptyArray(this.tradeBotAvailableDgbQortal) === true) { - this.reAddDgbAmount = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount)) - this.reAddDgbPrice = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbPrice)) + } else { + const botdgbprice = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbPrice)) + const changedgbamount = parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) + const reducedgbamount = parseFloat(this.tradeBotAvailableDgbQortal[0].qortAmount) + const tradedgbataddress = this.tradeBotAvailableDgbQortal[0].qortalAtAddress + const newdgbamount = this.round(parseFloat(changedgbamount - reducedgbamount)) - localStorage.removeItem(this.botDgbWallet) - localStorage.setItem(this.botDgbWallet, "") + this.reAddDgbAmount = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount)) + this.reAddDgbPrice = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbPrice)) - var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") + localStorage.removeItem(this.botDgbWallet) + localStorage.setItem(this.botDgbWallet, '') - const newDgbTradebookItem = { - botDgbQortAmount: newdgbamount, - botDgbPrice: botdgbprice - } + var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') - oldDgbTradebook.push(newDgbTradebookItem) + const newDgbTradebookItem = { + botDgbQortAmount: newdgbamount, + botDgbPrice: botdgbprice + } - localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook)) + oldDgbTradebook.push(newDgbTradebookItem) - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") + localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook)) - this.botDgbBuyAtAddress = tradedgbataddress + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') - await appDelay(1000) + this.botDgbBuyAtAddress = tradedgbataddress - await this.buyDgbAction() + await appDelay(1000) - if (this.isEmptyArray(this.tradeBotDgbBook) === true) { - return - } else { - const botamount = parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) + await this.buyDgbAction() - if (Number(botamount) === 0) { - this.removeBotDGBTradebook() - } - } + if (this.isEmptyArray(this.tradeBotDgbBook) === true) { + return + } else { + const botamount = parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) - if (this.isEmptyArray(this.tradeBotDgbBook) === true) { + if (Number(botamount) === 0) { + this.removeBotDGBTradebook() + } + } - } else { - const checkBotDgbFunds = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) * parseFloat(this.tradeBotDgbBook[0].botDgbPrice)) - const myBotDgbFunds = this.round(parseFloat(this.dgbWalletBalance)) + if (this.isEmptyArray(this.tradeBotDgbBook) === true) { - if (Number(myBotDgbFunds) < Number(checkBotDgbFunds)) { - this.removeBotDGBTradebook() - } - } - } - } + } else { + const checkBotDgbFunds = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) * parseFloat(this.tradeBotDgbBook[0].botDgbPrice)) + const myBotDgbFunds = this.round(parseFloat(this.dgbWalletBalance)) - const getOpenTradesRVN = async () => { - let timerRVN + if (Number(myBotDgbFunds) < Number(checkBotDgbFunds)) { + this.removeBotDGBTradebook() + } + } + } + } - if (this.isEmptyArray(this.tradeBotRvnBook) === true) { - clearTimeout(timerRVN) - timerRVN = setTimeout(getOpenTradesRVN, 150000) - } else { - await this.updateRvnWalletBalance() - const tradesOpenRvnQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=RAVENCOIN&limit=0` + const getOpenTradesRVN = async () => { + let timerRVN - const tradesOpenRvnQortal = await fetch(tradesOpenRvnQortalUrl).then(response => { - return response.json() - }) + if (this.isEmptyArray(this.tradeBotRvnBook) === true) { + clearTimeout(timerRVN) + timerRVN = setTimeout(getOpenTradesRVN, 150000) + } else { + await this.updateRvnWalletBalance() + const tradesOpenRvnQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=RAVENCOIN&limit=0` - this.tradesOpenRvnQortal = tradesOpenRvnQortal.map(item => { - const expiryTime = item.creatorPresenceExpiry - if (Number(expiryTime) > Date.now()) { - const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) - const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) - return { - qortAmount: item.qortAmount, - price: roundedPrice, - foreignAmount: item.expectedForeignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + const tradesOpenRvnQortal = await fetch(tradesOpenRvnQortalUrl).then(response => { + return response.json() + }) - const unconfirmedTransactionsRVN = async () => { - const unconfirmedTransactionsUrlRVN = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - var addFailedTradesRVN = JSON.parse(localStorage.getItem("failedTrades") || "[]") - await fetch(unconfirmedTransactionsUrlRVN).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiffRVN = Date.now() - item.timestamp - const timeOneHourRVN = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiffRVN) > Number(timeOneHourRVN)) { - const addItRVN = { - timestamp: item.timestamp, - recipient: item.recipient - } - addFailedTradesRVN.push(addItRVN) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addFailedTradesRVN)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - }) - } + this.tradesOpenRvnQortal = tradesOpenRvnQortal.map(item => { + const expiryTime = item.creatorPresenceExpiry + if (Number(expiryTime) > Date.now()) { + const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) + const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) + return { + qortAmount: item.qortAmount, + price: roundedPrice, + foreignAmount: item.expectedForeignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - await unconfirmedTransactionsRVN() + const unconfirmedTransactionsRVN = async () => { + const unconfirmedTransactionsUrlRVN = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + var addFailedTradesRVN = JSON.parse(localStorage.getItem('failedTrades') || '[]') - const filterUnconfirmedTransactionsRVN = async () => { - let cleanFailedTradesRVN = this.failedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanFailedTradesRVN)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } + await fetch(unconfirmedTransactionsUrlRVN).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiffRVN = Date.now() - item.timestamp + const timeOneHourRVN = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiffRVN) > Number(timeOneHourRVN)) { + const addItRVN = { + timestamp: item.timestamp, + recipient: item.recipient + } + addFailedTradesRVN.push(addItRVN) + } + }) - await filterUnconfirmedTransactionsRVN() + localStorage.setItem('failedTrades', JSON.stringify(addFailedTradesRVN)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } - this.tradesOpenRvnQortalCleaned = this.tradesOpenRvnQortal + await unconfirmedTransactionsRVN() - const filterOpenOfferRVN = async () => { - this.failedTradesList.forEach(item => { - const recipientToRemove = item.recipient - this.tradesOpenRvnQortalCleaned = this.tradesOpenRvnQortalCleaned.filter(obj => { - return obj.qortalCreatorTradeAddress !== recipientToRemove - }) - }) - } + const filterUnconfirmedTransactionsRVN = async () => { + let cleanFailedTradesRVN = this.failedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } - await filterOpenOfferRVN() - await appDelay(1000) - await filterMyBotPriceTradesRVN() - setTimeout(getOpenTradesRVN, 150000) - } - } + return newArray + }, []) - const filterMyBotPriceTradesRVN = async () => { - const tradeBotRvnUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=RAVENCOIN&apiKey=${this.getApiKey()}` + localStorage.setItem('failedTrades', JSON.stringify(cleanFailedTradesRVN)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + } + + await filterUnconfirmedTransactionsRVN() + + this.tradesOpenRvnQortalCleaned = this.tradesOpenRvnQortal + + const filterOpenOfferRVN = async () => { + this.failedTradesList.forEach(item => { + const recipientToRemove = item.recipient + this.tradesOpenRvnQortalCleaned = this.tradesOpenRvnQortalCleaned.filter(obj => { + return obj.qortalCreatorTradeAddress !== recipientToRemove + }) + }) + } + + await filterOpenOfferRVN() + await appDelay(1000) + await filterMyBotPriceTradesRVN() + + setTimeout(getOpenTradesRVN, 150000) + } + } + + const filterMyBotPriceTradesRVN = async () => { + const tradeBotRvnUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=RAVENCOIN&apiKey=${this.getApiKey()}` this.tradeBotRvnAt = await fetch(tradeBotRvnUrl).then(response => { return response.json() }) - await appDelay(1000) + await appDelay(1000) - this.tradeBotAvailableRvnQortal = this.tradesOpenRvnQortalCleaned.map(item => { - const listprice = parseFloat(item.price) - const listamount = parseFloat(item.qortAmount) - const checkprice = parseFloat(this.tradeBotRvnBook[0].botRvnPrice) - const checkamount = parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) - if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { - return { - qortAmount: item.qortAmount, - price: item.price, - foreignAmount: item.foreignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + this.tradeBotAvailableRvnQortal = this.tradesOpenRvnQortalCleaned.map(item => { + const listprice = parseFloat(item.price) + const listamount = parseFloat(item.qortAmount) + const checkprice = parseFloat(this.tradeBotRvnBook[0].botRvnPrice) + const checkamount = parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) + if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { + return { + qortAmount: item.qortAmount, + price: item.price, + foreignAmount: item.foreignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - this.tradeBotAvailableRvnQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) + this.tradeBotAvailableRvnQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) - if (this.isEmptyArray(this.tradeBotAvailableRvnQortal) === true) { - return - } else { - this.checkRvnAlice = this.tradeBotAvailableRvnQortal[0].qortalAtAddress - } + if (this.isEmptyArray(this.tradeBotAvailableRvnQortal) === true) { + return + } else { + this.checkRvnAlice = this.tradeBotAvailableRvnQortal[0].qortalAtAddress + } - await appDelay(1000) + await appDelay(1000) - if (this.tradeBotRvnAt.some(item => item.atAddress === this.checkRvnAlice)) { - return - } + if (this.tradeBotRvnAt.some(item => item.atAddress === this.checkRvnAlice)) { + return + } - await appDelay(1000) + await appDelay(1000) - if (this.isEmptyArray(this.tradeBotAvailableRvnQortal) === true) { + if (this.isEmptyArray(this.tradeBotAvailableRvnQortal) === true) { - } else { - const botrvnprice = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnPrice)) - const changervnamount = parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) - const reducervnamount = parseFloat(this.tradeBotAvailableRvnQortal[0].qortAmount) - const tradervnataddress = this.tradeBotAvailableRvnQortal[0].qortalAtAddress - const newrvnamount = this.round(parseFloat(changervnamount - reducervnamount)) + } else { + const botrvnprice = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnPrice)) + const changervnamount = parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) + const reducervnamount = parseFloat(this.tradeBotAvailableRvnQortal[0].qortAmount) + const tradervnataddress = this.tradeBotAvailableRvnQortal[0].qortalAtAddress + const newrvnamount = this.round(parseFloat(changervnamount - reducervnamount)) - this.reAddRvnAmount = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount)) - this.reAddRvnPrice = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnPrice)) + this.reAddRvnAmount = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount)) + this.reAddRvnPrice = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnPrice)) - localStorage.removeItem(this.botRvnWallet) - localStorage.setItem(this.botRvnWallet, "") + localStorage.removeItem(this.botRvnWallet) + localStorage.setItem(this.botRvnWallet, '') - var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") + var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') - const newRvnTradebookItem = { - botRvnQortAmount: newrvnamount, - botRvnPrice: botrvnprice - } + const newRvnTradebookItem = { + botRvnQortAmount: newrvnamount, + botRvnPrice: botrvnprice + } - oldRvnTradebook.push(newRvnTradebookItem) + oldRvnTradebook.push(newRvnTradebookItem) - localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook)) + localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook)) - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') - this.botRvnBuyAtAddress = tradervnataddress + this.botRvnBuyAtAddress = tradervnataddress - await appDelay(1000) + await appDelay(1000) - await this.buyRvnAction() + await this.buyRvnAction() - if (this.isEmptyArray(this.tradeBotRvnBook) === true) { - return - } else { - const botamount = parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) + if (this.isEmptyArray(this.tradeBotRvnBook) === true) { + return + } else { + const botamount = parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) - if (Number(botamount) === 0) { - this.removeBotRVNTradebook() - } - } + if (Number(botamount) === 0) { + this.removeBotRVNTradebook() + } + } - if (this.isEmptyArray(this.tradeBotRvnBook) === true) { + if (this.isEmptyArray(this.tradeBotRvnBook) === true) { - } else { - const checkBotRvnFunds = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) * parseFloat(this.tradeBotRvnBook[0].botRvnPrice)) - const myBotRvnFunds = this.round(parseFloat(this.rvnWalletBalance)) + } else { + const checkBotRvnFunds = this.round(parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount) * parseFloat(this.tradeBotRvnBook[0].botRvnPrice)) + const myBotRvnFunds = this.round(parseFloat(this.rvnWalletBalance)) - if (Number(myBotRvnFunds) < Number(checkBotRvnFunds)) { - this.removeBotRVNTradebook() - } - } - } - } + if (Number(myBotRvnFunds) < Number(checkBotRvnFunds)) { + this.removeBotRVNTradebook() + } + } + } + } - const getOpenTradesARRR = async () => { - let timerARRR + const getOpenTradesARRR = async () => { + let timerARRR - if (this.isEmptyArray(this.tradeBotArrrBook) === true) { - clearTimeout(timerARRR) - timerARRR = setTimeout(getOpenTradesARRR, 150000) - } else { - await this.updateArrrWalletBalance() - const tradesOpenArrrQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=PIRATECHAIN&limit=0` + if (this.isEmptyArray(this.tradeBotArrrBook) === true) { + clearTimeout(timerARRR) + timerARRR = setTimeout(getOpenTradesARRR, 150000) + } else { + await this.updateArrrWalletBalance() + const tradesOpenArrrQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=PIRATECHAIN&limit=0` - const tradesOpenArrrQortal = await fetch(tradesOpenArrrQortalUrl).then(response => { - return response.json() - }) + const tradesOpenArrrQortal = await fetch(tradesOpenArrrQortalUrl).then(response => { + return response.json() + }) - this.tradesOpenArrrQortal = tradesOpenArrrQortal.map(item => { - const expiryTime = item.creatorPresenceExpiry - if (Number(expiryTime) > Date.now()) { - const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) - const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) - return { - qortAmount: item.qortAmount, - price: roundedPrice, - foreignAmount: item.expectedForeignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) + this.tradesOpenArrrQortal = tradesOpenArrrQortal.map(item => { + const expiryTime = item.creatorPresenceExpiry + if (Number(expiryTime) > Date.now()) { + const calcedPrice = parseFloat(item.expectedForeignAmount) / parseFloat(item.qortAmount) + const roundedPrice = (Math.round(parseFloat(calcedPrice) * 1e8) / 1e8).toFixed(8) + return { + qortAmount: item.qortAmount, + price: roundedPrice, + foreignAmount: item.expectedForeignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) - const unconfirmedTransactionsARRR = async () => { - const unconfirmedTransactionsUrlARRR = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - var addFailedTradesARRR = JSON.parse(localStorage.getItem("failedTrades") || "[]") - await fetch(unconfirmedTransactionsUrlARRR).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiffARRR = Date.now() - item.timestamp - const timeOneHourARRR = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiffARRR) > Number(timeOneHourARRR)) { - const addItARRR = { - timestamp: item.timestamp, - recipient: item.recipient - } - addFailedTradesARRR.push(addItARRR) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addFailedTradesARRR)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - }) - } + const unconfirmedTransactionsARRR = async () => { + const unconfirmedTransactionsUrlARRR = `${nodeAppUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + var addFailedTradesARRR = JSON.parse(localStorage.getItem('failedTrades') || '[]') - await unconfirmedTransactionsARRR() + await fetch(unconfirmedTransactionsUrlARRR).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiffARRR = Date.now() - item.timestamp + const timeOneHourARRR = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiffARRR) > Number(timeOneHourARRR)) { + const addItARRR = { + timestamp: item.timestamp, + recipient: item.recipient + } + addFailedTradesARRR.push(addItARRR) + } + }) - const filterUnconfirmedTransactionsARRR = async () => { - let cleanFailedTradesARRR = this.failedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanFailedTradesARRR)) - this.failedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } + localStorage.setItem('failedTrades', JSON.stringify(addFailedTradesARRR)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } - await filterUnconfirmedTransactionsARRR() + await unconfirmedTransactionsARRR() - this.tradesOpenArrrQortalCleaned = this.tradesOpenArrrQortal + const filterUnconfirmedTransactionsARRR = async () => { + let cleanFailedTradesARRR = this.failedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } - const filterOpenOfferARRR = async () => { - this.failedTradesList.forEach(item => { - const recipientToRemove = item.recipient - this.tradesOpenArrrQortalCleaned = this.tradesOpenArrrQortalCleaned.filter(obj => { - return obj.qortalCreatorTradeAddress !== recipientToRemove - }) - }) - } + return newArray + }, []) - await filterOpenOfferARRR() - await appDelay(1000) - await filterMyBotPriceTradesARRR() - setTimeout(getOpenTradesARRR, 150000) - } - } + localStorage.setItem('failedTrades', JSON.stringify(cleanFailedTradesARRR)) + this.failedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + } - const filterMyBotPriceTradesARRR = async () => { - const tradeBotArrrUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=PIRATECHAIN&apiKey=${this.getApiKey()}` + await filterUnconfirmedTransactionsARRR() + + this.tradesOpenArrrQortalCleaned = this.tradesOpenArrrQortal + + const filterOpenOfferARRR = async () => { + this.failedTradesList.forEach(item => { + const recipientToRemove = item.recipient + this.tradesOpenArrrQortalCleaned = this.tradesOpenArrrQortalCleaned.filter(obj => { + return obj.qortalCreatorTradeAddress !== recipientToRemove + }) + }) + } + + await filterOpenOfferARRR() + await appDelay(1000) + await filterMyBotPriceTradesARRR() + + setTimeout(getOpenTradesARRR, 150000) + } + } + + const filterMyBotPriceTradesARRR = async () => { + const tradeBotArrrUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=PIRATECHAIN&apiKey=${this.getApiKey()}` this.tradeBotArrrAt = await fetch(tradeBotArrrUrl).then(response => { return response.json() }) - await appDelay(1000) + await appDelay(1000) - this.tradeBotAvailableArrrQortal = this.tradesOpenArrrQortalCleaned.map(item => { - const listprice = parseFloat(item.price) - const listamount = parseFloat(item.qortAmount) - const checkprice = parseFloat(this.tradeBotArrrBook[0].botArrrPrice) - const checkamount = parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) - if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { - return { - qortAmount: item.qortAmount, - price: item.price, - foreignAmount: item.foreignAmount, - qortalCreator: item.qortalCreator, - qortalAtAddress: item.qortalAtAddress, - qortalCreatorTradeAddress: item.qortalCreatorTradeAddress - } - } - }).filter(item => !!item) - - this.tradeBotAvailableArrrQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) - - if (this.isEmptyArray(this.tradeBotAvailableArrrQortal) === true) { - return - } else { - this.checkArrrAlice = this.tradeBotAvailableArrrQortal[0].qortalAtAddress - } - - await appDelay(1000) - - if (this.tradeBotArrrAt.some(item => item.atAddress === this.checkArrrAlice)) { - return - } - - await appDelay(1000) - - if (this.isEmptyArray(this.tradeBotAvailableArrrQortal) === true) { - - } else { - const botarrrprice = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrPrice)) - const changearrramount = parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) - const reducearrramount = parseFloat(this.tradeBotAvailableArrrQortal[0].qortAmount) - const tradearrrataddress = this.tradeBotAvailableArrrQortal[0].qortalAtAddress - const newarrramount = this.round(parseFloat(changearrramount - reducearrramount)) - - this.reAddArrrAmount = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount)) - this.reAddArrrPrice = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrPrice)) - - localStorage.removeItem(this.botArrrWallet) - localStorage.setItem(this.botArrrWallet, "") - - var oldArrrTradebook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") - - const newArrrTradebookItem = { - botArrrQortAmount: newarrramount, - botArrrPrice: botarrrprice - } - - oldArrrTradebook.push(newArrrTradebookItem) - - localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook)) - - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") - - this.botArrrBuyAtAddress = tradearrrataddress - - await appDelay(1000) - - await this.buyArrrAction() - - if (this.isEmptyArray(this.tradeBotArrrBook) === true) { - return - } else { - const botamount = parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) - - if (Number(botamount) === 0) { - this.removeBotARRRTradebook() - } - } - - if (this.isEmptyArray(this.tradeBotArrrBook) === true) { - - } else { - const checkBotArrrFunds = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) * parseFloat(this.tradeBotArrrBook[0].botArrrPrice)) - const myBotArrrFunds = this.round(parseFloat(this.arrrWalletBalance)) - - if (Number(myBotArrrFunds) < Number(checkBotArrrFunds)) { - this.removeBotARRRTradebook() - } - } - } - } - - const getChatLastSeen = async () => { - let items = [] - - await chatLastSeen.iterate(function (value, key, iterationNumber) { - items.push({ key, timestamp: value }) - }) - - store.dispatch(setChatLastSeen(items)) - return items - } - - await getOpenTradesBTC() - await appDelay(1000) - await getOpenTradesLTC() - await appDelay(1000) - await getOpenTradesDOGE() - await appDelay(1000) - await getOpenTradesDGB() - await appDelay(1000) - await getOpenTradesRVN() - await appDelay(1000) - await getOpenTradesARRR() - await getChatLastSeen() - setInterval(() => { - this.clearTheCache() - }, 60000) - } - - clearTheCache() { - if (!isElectron()) { - } else { - console.clear() - window.parent.electronAPI.clearMyCache() - window.parent.electronAPI.clearCache() - } - } - - async getNodeType() { - const myAppNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] - const nodeAppUrl = myAppNode.protocol + '://' + myAppNode.domain + ':' + myAppNode.port - const url = `${nodeAppUrl}/admin/info` - await fetch(url).then((response) => { - return response.json() - }).then((data) => { - this.nodeType = data.type - }) - } - - renderNodeTypeMenu() { - const addressInfo = this.addressInfo - const isMinter = addressInfo?.error !== 124 && +addressInfo?.level > 0 - const isSponsor = +addressInfo?.level >= 5 - - if (this.nodeType === 'lite') { - return html` - - - - - - - - - - - - - - - - - ${this.renderNodeManagement()} - ` - } else { - return html` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${this.renderNodeManagement()} - - ` - } - } - - renderLockButton() { - if (this.myLockScreenPass === false && this.myLockScreenSet === false) { - return html` -
- this.openSetScreenLockPass()} title="${translate("login.lp11")}"> -
- ` - } else if (this.myLockScreenSet === false) { - return html` -
- this.setLockQortal()} title="${translate("login.lp11")}"> -
- ` - } else if (this.myLockScreenSet === true) { - return html` -
- -
- ` - } - } - - openSetScreenLockPass() { - this.shadowRoot.getElementById('lockPassword').value = '' - this.shadowRoot.getElementById('lockPasswordConfirm').value = '' - this.shadowRoot.getElementById('setLockScreenPass').open() - } - - closeSetScreenLockPass() { - this.shadowRoot.getElementById('setLockScreenPass').close() - } - - checkPass() { - const password = this.shadowRoot.getElementById('lockPassword').value - const rePassword = this.shadowRoot.getElementById('lockPasswordConfirm').value - - if (password === '') { - let snackbar1string = get("login.pleaseenter") - parentEpml.request('showSnackBar', `${snackbar1string}`) - return - } - - if (password != rePassword) { - let snackbar2string = get("login.notmatch") - parentEpml.request('showSnackBar', `${snackbar2string}`) - return - } - - if (password.length < 8) { - let snackbar3string = get("login.lessthen8") - parentEpml.request('showSnackBar', `${snackbar3string}`) - this.lowPass = '' - this.lowPass = password - this.extraConfirm() - } - - if (password.length >= 8) { - this.setNewScreenPass() - let snackbar4string = get("login.lp6") - parentEpml.request('showSnackBar', `${snackbar4string}`) - } - } - - extraConfirm() { - this.shadowRoot.getElementById('setLockScreenPass').close() - this.shadowRoot.getElementById('extraConfirmPass').open() - } - - closExtraConfirmPass() { - this.shadowRoot.getElementById('extraConfirmPass').close() - this.shadowRoot.getElementById('lockPassword').value = '' - this.shadowRoot.getElementById('lockPasswordConfirm').value = '' - } - - setNewScreenPass() { - const rawPassword = this.shadowRoot.getElementById('lockPassword').value - const cryptPassword = encryptData(rawPassword, this.salt) - localStorage.setItem(this.lockScreenPass, cryptPassword) - this.myLockScreenPass = '' - this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) - this.shadowRoot.getElementById('setLockScreenPass').close() - this.shadowRoot.getElementById('extraConfirmPass').close() - this.shadowRoot.getElementById('lockPassword').value = '' - this.shadowRoot.getElementById('lockPasswordConfirm').value = '' - } - - setLockQortal() { - this.helperMessage = this.renderHelperPass() - this.lockSet = '' - this.lockSet = encryptData(true, this.salt) - localStorage.setItem(this.lockScreenSet, this.lockSet) - this.myLockScreenSet = '' - this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) - this.shadowRoot.getElementById('lockScreenActive').open() - } - - passKeyListener(e) { - if (e.key === 'Enter') { - this.closeLockScreenActive() - } - } - - async closeLockScreenActive() { - const myPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) - const checkPass = this.shadowRoot.getElementById('unlockPassword').value - const errDelay = ms => new Promise(res => setTimeout(res, ms)) - - if (checkPass === myPass) { - this.lockSet = '' - this.lockSet = encryptData(false, this.salt) - localStorage.setItem(this.lockScreenSet, this.lockSet) - this.myLockScreenSet = '' - this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) - this.shadowRoot.getElementById('lockScreenActive').close() - this.shadowRoot.getElementById('unlockPassword').value = '' - this.helperMessage = this.renderHelperPass() - } else { - this.shadowRoot.getElementById('unlockPassword').value = '' - this.helperMessage = this.renderHelperErr() - await errDelay(3000) - this.helperMessage = this.renderHelperPass() - - } - } - - renderHelperPass() { - return html`${translate("login.pleaseenter")}` - } - - renderHelperErr() { - return html`${translate("login.lp8")}` - } - - renderNodeManagement() { - const checkNodeManagement = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] - if ((checkNodeManagement.enableManagement = true)) { - return html` - - - - ` - } else { - return html`` - } - } - - async updateQortWalletBalance() { - let qortAddress = store.getState().app.selectedAddress.address - - await parentEpml.request('apiCall', { - url: `/addresses/balance/${qortAddress}?apiKey=${this.getApiKey()}`, - }).then((res) => { - this.qortWalletBalance = res - }) - } - - async updateBtcWalletBalance() { - let _url = `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}` - let _body = store.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.btcWalletBalance = (Number(res) / 1e8).toFixed(8) - } - }) - } - - async updateLtcWalletBalance() { - let _url = `/crosschain/ltc/walletbalance?apiKey=${this.getApiKey()}` - let _body = store.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.ltcWalletBalance = (Number(res) / 1e8).toFixed(8) - } - }) - } - - async updateDogeWalletBalance() { - let _url = `/crosschain/doge/walletbalance?apiKey=${this.getApiKey()}` - let _body = store.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.dogeWalletBalance = (Number(res) / 1e8).toFixed(8) - } - }) - } - - async updateDgbWalletBalance() { - let _url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}` - let _body = store.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.dgbWalletBalance = (Number(res) / 1e8).toFixed(8) - } - }) - } - - async updateRvnWalletBalance() { - let _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` - let _body = store.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.rvnWalletBalance = (Number(res) / 1e8).toFixed(8) - } - }) - } - - async updateArrrWalletBalance() { - let _url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}` - let _body = store.getState().app.selectedAddress.arrrWallet.seed58 - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.arrrWalletBalance = (Number(res) / 1e8).toFixed(8) - } - }) - } - - botBtcTradebook() { - if (localStorage.getItem(this.botBtcWallet) === null) { - localStorage.setItem(this.botBtcWallet, "") - } else { - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") - } - } - - removeBotBTCTradebook() { - localStorage.removeItem(this.botBtcWallet) - localStorage.setItem(this.botBtcWallet, "") - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") - this.tradeBotAvailableBtcQortal = [] - } - - botLtcTradebook() { - if (localStorage.getItem(this.botLtcWallet) === null) { - localStorage.setItem(this.botLtcWallet, "") - } else { - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") - } - } - - removeBotLTCTradebook() { - localStorage.removeItem(this.botLtcWallet) - localStorage.setItem(this.botLtcWallet, "") - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") - this.tradeBotAvailableLtcQortal = [] - } - - botDogeTradebook() { - if (localStorage.getItem(this.botDogeWallet) === null) { - localStorage.setItem(this.botDogeWallet, "") - } else { - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") - } - } - - removeBotDOGETradebook() { - localStorage.removeItem(this.botDogeWallet) - localStorage.setItem(this.botDogeWallet, "") - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") - this.tradeBotAvailableDogeQortal = [] - } - - botDgbTradebook() { - if (localStorage.getItem(this.botDgbWallet) === null) { - localStorage.setItem(this.botDgbWallet, "") - } else { - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") - } - } - - botRvnTradebook() { - if (localStorage.getItem(this.botRvnWallet) === null) { - localStorage.setItem(this.botRvnWallet, "") - } else { - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") - } - } - - botArrrTradebook() { - if (localStorage.getItem(this.botArrrWallet) === null) { - localStorage.setItem(this.botArrrWallet, "") - } else { - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") - } - } - - async buyBtcAction() { - const makeRequest = async () => { + this.tradeBotAvailableArrrQortal = this.tradesOpenArrrQortalCleaned.map(item => { + const listprice = parseFloat(item.price) + const listamount = parseFloat(item.qortAmount) + const checkprice = parseFloat(this.tradeBotArrrBook[0].botArrrPrice) + const checkamount = parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) + + if (Number(listprice) <= Number(checkprice) && Number(listamount) <= Number(checkamount)) { + return { + qortAmount: item.qortAmount, + price: item.price, + foreignAmount: item.foreignAmount, + qortalCreator: item.qortalCreator, + qortalAtAddress: item.qortalAtAddress, + qortalCreatorTradeAddress: item.qortalCreatorTradeAddress + } + } + }).filter(item => !!item) + + this.tradeBotAvailableArrrQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)) + + if (this.isEmptyArray(this.tradeBotAvailableArrrQortal) === true) { + return + } else { + this.checkArrrAlice = this.tradeBotAvailableArrrQortal[0].qortalAtAddress + } + + await appDelay(1000) + + if (this.tradeBotArrrAt.some(item => item.atAddress === this.checkArrrAlice)) { + return + } + + await appDelay(1000) + + if (this.isEmptyArray(this.tradeBotAvailableArrrQortal) === true) { + + } else { + const botarrrprice = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrPrice)) + const changearrramount = parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) + const reducearrramount = parseFloat(this.tradeBotAvailableArrrQortal[0].qortAmount) + const tradearrrataddress = this.tradeBotAvailableArrrQortal[0].qortalAtAddress + const newarrramount = this.round(parseFloat(changearrramount - reducearrramount)) + + this.reAddArrrAmount = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount)) + this.reAddArrrPrice = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrPrice)) + + localStorage.removeItem(this.botArrrWallet) + localStorage.setItem(this.botArrrWallet, '') + + var oldArrrTradebook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') + + const newArrrTradebookItem = { + botArrrQortAmount: newarrramount, + botArrrPrice: botarrrprice + } + + oldArrrTradebook.push(newArrrTradebookItem) + + localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook)) + + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') + + this.botArrrBuyAtAddress = tradearrrataddress + + await appDelay(1000) + + await this.buyArrrAction() + + if (this.isEmptyArray(this.tradeBotArrrBook) === true) { + return + } else { + const botamount = parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) + + if (Number(botamount) === 0) { + this.removeBotARRRTradebook() + } + } + + if (this.isEmptyArray(this.tradeBotArrrBook) === true) { + + } else { + const checkBotArrrFunds = this.round(parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount) * parseFloat(this.tradeBotArrrBook[0].botArrrPrice)) + const myBotArrrFunds = this.round(parseFloat(this.arrrWalletBalance)) + + if (Number(myBotArrrFunds) < Number(checkBotArrrFunds)) { + this.removeBotARRRTradebook() + } + } + } + } + + const getChatLastSeen = async () => { + let items = [] + + await chatLastSeen.iterate(function (value, key, iterationNumber) { + items.push({ key, timestamp: value }) + }) + + store.dispatch(setChatLastSeen(items)) + return items + } + + await getOpenTradesBTC() + await appDelay(1000) + await getOpenTradesLTC() + await appDelay(1000) + await getOpenTradesDOGE() + await appDelay(1000) + await getOpenTradesDGB() + await appDelay(1000) + await getOpenTradesRVN() + await appDelay(1000) + await getOpenTradesARRR() + await getChatLastSeen() + + setInterval(() => { + this.clearTheCache() + }, 60000) + } + + getTourElements() { + let els = {} + + const el1 = this.shadowRoot.querySelector('core-sync-status').shadowRoot.getElementById('core-sync-status-id') + const el2 = this.shadowRoot.querySelector('show-plugin').shadowRoot.getElementById('showPluginId') + const el3 = this.shadowRoot.querySelector('beginner-checklist').shadowRoot.getElementById('popover-notification') + + if (el1) { + els['core-sync-status-id'] = el1 + } + + if (el2) { + els['tab'] = el2 + } + + if (el3) { + els['checklist'] = el3 + } + + return els + } + + clearTheCache() { + if (!isElectron()) { + } else { + console.clear() + + window.parent.electronAPI.clearMyCache() + window.parent.electronAPI.clearCache() + } + } + + async getNodeType() { + const myAppNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const nodeAppUrl = myAppNode.protocol + '://' + myAppNode.domain + ':' + myAppNode.port + const url = `${nodeAppUrl}/admin/info` + + await fetch(url).then((response) => { + return response.json() + }).then((data) => { + this.nodeType = data.type + }) + } + + renderNodeTypeMenu() { + const addressInfo = this.addressInfo + const isMinter = addressInfo?.error !== 124 && +addressInfo?.level > 0 + const isSponsor = +addressInfo?.level >= 5 + + if (this.nodeType === 'lite') { + return html` + + + + + + + + + + + + + ${this.renderNodeManagement()} + ` + } else { + return html` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${this.renderNodeManagement()} + + ` + } + } + + renderLockButton() { + if (this.myLockScreenPass === false && this.myLockScreenSet === false) { + return html` +
+ this.openSetScreenLockPass()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myLockScreenSet === false) { + return html` +
+ this.setLockQortal()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myLockScreenSet === true) { + return html` +
+ +
+ ` + } + } + + openSetScreenLockPass() { + this.shadowRoot.getElementById('lockPassword').value = '' + this.shadowRoot.getElementById('lockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setLockScreenPass').open() + } + + closeSetScreenLockPass() { + this.shadowRoot.getElementById('setLockScreenPass').close() + } + + checkPass() { + const password = this.shadowRoot.getElementById('lockPassword').value + const rePassword = this.shadowRoot.getElementById('lockPasswordConfirm').value + + if (password === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (password != rePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (password.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.lowPass = '' + this.lowPass = password + this.extraConfirm() + } + + if (password.length >= 8) { + this.setNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + extraConfirm() { + this.shadowRoot.getElementById('setLockScreenPass').close() + this.shadowRoot.getElementById('extraConfirmPass').open() + } + + closExtraConfirmPass() { + this.shadowRoot.getElementById('extraConfirmPass').close() + this.shadowRoot.getElementById('lockPassword').value = '' + this.shadowRoot.getElementById('lockPasswordConfirm').value = '' + } + + setNewScreenPass() { + const rawPassword = this.shadowRoot.getElementById('lockPassword').value + const cryptPassword = encryptData(rawPassword, this.salt) + + localStorage.setItem(this.lockScreenPass, cryptPassword) + + this.myLockScreenPass = '' + this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + this.shadowRoot.getElementById('setLockScreenPass').close() + this.shadowRoot.getElementById('extraConfirmPass').close() + this.shadowRoot.getElementById('lockPassword').value = '' + this.shadowRoot.getElementById('lockPasswordConfirm').value = '' + } + + setLockQortal() { + this.helperMessage = this.renderHelperPass() + this.lockSet = '' + this.lockSet = encryptData(true, this.salt) + + localStorage.setItem(this.lockScreenSet, this.lockSet) + + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) + this.shadowRoot.getElementById('lockScreenActive').open() + } + + passKeyListener(e) { + if (e.key === 'Enter') { + this.closeLockScreenActive() + } + } + + async closeLockScreenActive() { + const myPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + const checkPass = this.shadowRoot.getElementById('unlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (checkPass === myPass) { + this.lockSet = '' + this.lockSet = encryptData(false, this.salt) + + localStorage.setItem(this.lockScreenSet, this.lockSet) + + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) + this.shadowRoot.getElementById('lockScreenActive').close() + this.shadowRoot.getElementById('unlockPassword').value = '' + this.helperMessage = this.renderHelperPass() + } else { + this.shadowRoot.getElementById('unlockPassword').value = '' + this.helperMessage = this.renderHelperErr() + + await errDelay(3000) + + this.helperMessage = this.renderHelperPass() + } + } + + renderHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderHelperErr() { + return html`${translate("login.lp8")}` + } + + renderNodeManagement() { + const checkNodeManagement = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + + if ((checkNodeManagement.enableManagement = true)) { + return html` + + + + ` + } else { + return html`` + } + } + + async updateQortWalletBalance() { + let qortAddress = store.getState().app.selectedAddress.address + + await parentEpml.request('apiCall', { + url: `/addresses/balance/${qortAddress}?apiKey=${this.getApiKey()}`, + }).then((res) => { + this.qortWalletBalance = res + }) + } + + async updateBtcWalletBalance() { + let _url = `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}` + let _body = store.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body, + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.btcWalletBalance = (Number(res) / 1e8).toFixed(8) + } + }) + } + + async updateLtcWalletBalance() { + let _url = `/crosschain/ltc/walletbalance?apiKey=${this.getApiKey()}` + let _body = store.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body, + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.ltcWalletBalance = (Number(res) / 1e8).toFixed(8) + } + }) + } + + async updateDogeWalletBalance() { + let _url = `/crosschain/doge/walletbalance?apiKey=${this.getApiKey()}` + let _body = store.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body, + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.dogeWalletBalance = (Number(res) / 1e8).toFixed(8) + } + }) + } + + async updateDgbWalletBalance() { + let _url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}` + let _body = store.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body, + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.dgbWalletBalance = (Number(res) / 1e8).toFixed(8) + } + }) + } + + async updateRvnWalletBalance() { + let _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` + let _body = store.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body, + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.rvnWalletBalance = (Number(res) / 1e8).toFixed(8) + } + }) + } + + async updateArrrWalletBalance() { + let _url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}` + let _body = store.getState().app.selectedAddress.arrrWallet.seed58 + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body, + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.arrrWalletBalance = (Number(res) / 1e8).toFixed(8) + } + }) + } + + botBtcTradebook() { + if (localStorage.getItem(this.botBtcWallet) === null) { + localStorage.setItem(this.botBtcWallet, '') + } else { + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') + } + } + + removeBotBTCTradebook() { + localStorage.removeItem(this.botBtcWallet) + localStorage.setItem(this.botBtcWallet, '') + + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') + this.tradeBotAvailableBtcQortal = [] + } + + botLtcTradebook() { + if (localStorage.getItem(this.botLtcWallet) === null) { + localStorage.setItem(this.botLtcWallet, '') + } else { + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') + } + } + + removeBotLTCTradebook() { + localStorage.removeItem(this.botLtcWallet) + localStorage.setItem(this.botLtcWallet, '') + + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') + this.tradeBotAvailableLtcQortal = [] + } + + botDogeTradebook() { + if (localStorage.getItem(this.botDogeWallet) === null) { + localStorage.setItem(this.botDogeWallet, '') + } else { + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') + } + } + + removeBotDOGETradebook() { + localStorage.removeItem(this.botDogeWallet) + localStorage.setItem(this.botDogeWallet, '') + + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') + this.tradeBotAvailableDogeQortal = [] + } + + botDgbTradebook() { + if (localStorage.getItem(this.botDgbWallet) === null) { + localStorage.setItem(this.botDgbWallet, '') + } else { + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') + } + } + + botRvnTradebook() { + if (localStorage.getItem(this.botRvnWallet) === null) { + localStorage.setItem(this.botRvnWallet, '') + } else { + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') + } + } + + botArrrTradebook() { + if (localStorage.getItem(this.botArrrWallet) === null) { + localStorage.setItem(this.botArrrWallet, '') + } else { + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') + } + } + + async buyBtcAction() { + const makeRequest = async () => { return await parentEpml.request('tradeBotRespondRequest', { atAddress: this.botBtcBuyAtAddress, foreignKey: store.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey, - receivingAddress: store.getState().app.selectedAddress.address, + receivingAddress: store.getState().app.selectedAddress.address }) - } + } - const manageResponse = (response) => { - if (response === true) { - let snack5string = get("tradepage.tchange23") - parentEpml.request('showSnackBar', `${snack5string}`) - } else if (response === false) { - localStorage.removeItem(this.botBtcWallet) - localStorage.setItem(this.botBtcWallet, "") + const manageResponse = (response) => { + if (response === true) { + let snack5string = get('tradepage.tchange23') + parentEpml.request('showSnackBar', `${snack5string}`) + } else if (response === false) { + localStorage.removeItem(this.botBtcWallet) + localStorage.setItem(this.botBtcWallet, '') - var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") + var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') - const newBtcTradebookItem = { - botBtcQortAmount: this.reAddBtcAmount, - botBtcPrice: this.reAddBtcPrice - } + const newBtcTradebookItem = { + botBtcQortAmount: this.reAddBtcAmount, + botBtcPrice: this.reAddBtcPrice + } - oldBtcTradebook.push(newBtcTradebookItem) + oldBtcTradebook.push(newBtcTradebookItem) - localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook)) + localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook)) - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') - let snack6string = get("tradepage.tchange24") - parentEpml.request('showSnackBar', `${snack6string}`) - } else { - localStorage.removeItem(this.botBtcWallet) - localStorage.setItem(this.botBtcWallet, "") + let snack6string = get('tradepage.tchange24') + parentEpml.request('showSnackBar', `${snack6string}`) + } else { + localStorage.removeItem(this.botBtcWallet) + localStorage.setItem(this.botBtcWallet, '') - var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") + var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') - const newBtcTradebookItem = { - botBtcQortAmount: this.reAddBtcAmount, - botBtcPrice: this.reAddBtcPrice - } + const newBtcTradebookItem = { + botBtcQortAmount: this.reAddBtcAmount, + botBtcPrice: this.reAddBtcPrice + } - oldBtcTradebook.push(newBtcTradebookItem) + oldBtcTradebook.push(newBtcTradebookItem) - localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook)) + localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook)) - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]") + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || '[]') - let snack7string = get("tradepage.tchange25") - parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + let snack7string = get('tradepage.tchange25') + parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) + } + } - async buyLtcAction() { - const makeRequest = async () => { + const res = await makeRequest() + manageResponse(res) + } + + async buyLtcAction() { + const makeRequest = async () => { return await parentEpml.request('tradeBotRespondRequest', { atAddress: this.botLtcBuyAtAddress, foreignKey: store.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey, - receivingAddress: store.getState().app.selectedAddress.address, + receivingAddress: store.getState().app.selectedAddress.address }) - } + } - const manageResponse = (response) => { - if (response === true) { - let snack5string = get("tradepage.tchange23") - parentEpml.request('showSnackBar', `${snack5string}`) - } else if (response === false) { - localStorage.removeItem(this.botLtcWallet) - localStorage.setItem(this.botLtcWallet, "") + const manageResponse = (response) => { + if (response === true) { + let snack5string = get('tradepage.tchange23') + parentEpml.request('showSnackBar', `${snack5string}`) + } else if (response === false) { + localStorage.removeItem(this.botLtcWallet) + localStorage.setItem(this.botLtcWallet, '') - var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") + var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') - const newLtcTradebookItem = { - botLtcQortAmount: this.reAddLtcAmount, - botLtcPrice: this.reAddLtcPrice - } + const newLtcTradebookItem = { + botLtcQortAmount: this.reAddLtcAmount, + botLtcPrice: this.reAddLtcPrice + } - oldLtcTradebook.push(newLtcTradebookItem) + oldLtcTradebook.push(newLtcTradebookItem) - localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook)) + localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook)) - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') - let snack6string = get("tradepage.tchange24") - parentEpml.request('showSnackBar', `${snack6string}`) - } else { - localStorage.removeItem(this.botLtcWallet) - localStorage.setItem(this.botLtcWallet, "") + let snack6string = get('tradepage.tchange24') + parentEpml.request('showSnackBar', `${snack6string}`) + } else { + localStorage.removeItem(this.botLtcWallet) + localStorage.setItem(this.botLtcWallet, '') - var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") + var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') - const newLtcTradebookItem = { - botLtcQortAmount: this.reAddLtcAmount, - botLtcPrice: this.reAddLtcPrice - } + const newLtcTradebookItem = { + botLtcQortAmount: this.reAddLtcAmount, + botLtcPrice: this.reAddLtcPrice + } - oldLtcTradebook.push(newLtcTradebookItem) + oldLtcTradebook.push(newLtcTradebookItem) - localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook)) + localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook)) - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]") + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || '[]') - let snack7string = get("tradepage.tchange25") - parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + let snack7string = get('tradepage.tchange25') + parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) + } + } - async buyDogeAction() { - const makeRequest = async () => { + const res = await makeRequest() + manageResponse(res) + } + + async buyDogeAction() { + const makeRequest = async () => { return await parentEpml.request('tradeBotRespondRequest', { atAddress: this.botDogeBuyAtAddress, foreignKey: store.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey, - receivingAddress: store.getState().app.selectedAddress.address, + receivingAddress: store.getState().app.selectedAddress.address }) - } + } - const manageResponse = (response) => { - if (response === true) { - let snack5string = get("tradepage.tchange23") - parentEpml.request('showSnackBar', `${snack5string}`) - } else if (response === false) { - localStorage.removeItem(this.botDogeWallet) - localStorage.setItem(this.botDogeWallet, "") + const manageResponse = (response) => { + if (response === true) { + let snack5string = get('tradepage.tchange23') + parentEpml.request('showSnackBar', `${snack5string}`) + } else if (response === false) { + localStorage.removeItem(this.botDogeWallet) + localStorage.setItem(this.botDogeWallet, '') - var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") + var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') - const newDogeTradebookItem = { - botDogeQortAmount: this.reAddDogeAmount, - botDogePrice: this.reAddDogePrice - } + const newDogeTradebookItem = { + botDogeQortAmount: this.reAddDogeAmount, + botDogePrice: this.reAddDogePrice + } - oldDogeTradebook.push(newDogeTradebookItem) + oldDogeTradebook.push(newDogeTradebookItem) - localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook)) + localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook)) - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') - let snack6string = get("tradepage.tchange24") - parentEpml.request('showSnackBar', `${snack6string}`) - } else { - localStorage.removeItem(this.botDogeWallet) - localStorage.setItem(this.botDogeWallet, "") + let snack6string = get('tradepage.tchange24') + parentEpml.request('showSnackBar', `${snack6string}`) + } else { + localStorage.removeItem(this.botDogeWallet) + localStorage.setItem(this.botDogeWallet, '') - var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") + var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') - const newDogeTradebookItem = { - botDogeQortAmount: this.reAddDogeAmount, - botDogePrice: this.reAddDogePrice - } + const newDogeTradebookItem = { + botDogeQortAmount: this.reAddDogeAmount, + botDogePrice: this.reAddDogePrice + } - oldDogeTradebook.push(newDogeTradebookItem) + oldDogeTradebook.push(newDogeTradebookItem) - localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook)) + localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook)) - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]") + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || '[]') - let snack7string = get("tradepage.tchange25") - parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + let snack7string = get('tradepage.tchange25') + parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) + } + } - async buyDgbAction() { - const makeRequest = async () => { + const res = await makeRequest() + manageResponse(res) + } + + async buyDgbAction() { + const makeRequest = async () => { return await parentEpml.request('tradeBotRespondRequest', { atAddress: this.botDgbBuyAtAddress, foreignKey: store.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey, - receivingAddress: store.getState().app.selectedAddress.address, + receivingAddress: store.getState().app.selectedAddress.address }) - } + } - const manageResponse = (response) => { - if (response === true) { - let snack5string = get("tradepage.tchange23") - parentEpml.request('showSnackBar', `${snack5string}`) - } else if (response === false) { - localStorage.removeItem(this.botDgbWallet) - localStorage.setItem(this.botDgbWallet, "") + const manageResponse = (response) => { + if (response === true) { + let snack5string = get('tradepage.tchange23') + parentEpml.request('showSnackBar', `${snack5string}`) + } else if (response === false) { + localStorage.removeItem(this.botDgbWallet) + localStorage.setItem(this.botDgbWallet, '') - var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") + var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') - const newDgbTradebookItem = { - botDgbQortAmount: this.reAddDgbAmount, - botDgbPrice: this.reAddDgbPrice - } + const newDgbTradebookItem = { + botDgbQortAmount: this.reAddDgbAmount, + botDgbPrice: this.reAddDgbPrice + } - oldDgbTradebook.push(newDgbTradebookItem) + oldDgbTradebook.push(newDgbTradebookItem) - localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook)) + localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook)) - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') - let snack6string = get("tradepage.tchange24") - parentEpml.request('showSnackBar', `${snack6string}`) - } else { - localStorage.removeItem(this.botDgbWallet) - localStorage.setItem(this.botDgbWallet, "") + let snack6string = get('tradepage.tchange24') + parentEpml.request('showSnackBar', `${snack6string}`) + } else { + localStorage.removeItem(this.botDgbWallet) + localStorage.setItem(this.botDgbWallet, '') - var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") + var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') - const newDgbTradebookItem = { - botDgbQortAmount: this.reAddDgbAmount, - botDgbPrice: this.reAddDgbPrice - } + const newDgbTradebookItem = { + botDgbQortAmount: this.reAddDgbAmount, + botDgbPrice: this.reAddDgbPrice + } - oldDgbTradebook.push(newDgbTradebookItem) + oldDgbTradebook.push(newDgbTradebookItem) - localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook)) + localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook)) - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]") + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || '[]') - let snack7string = get("tradepage.tchange25") - parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + let snack7string = get('tradepage.tchange25') + parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) + } + } - async buyRvnAction() { - const makeRequest = async () => { + const res = await makeRequest() + manageResponse(res) + } + + async buyRvnAction() { + const makeRequest = async () => { return await parentEpml.request('tradeBotRespondRequest', { atAddress: this.botRvnBuyAtAddress, foreignKey: store.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey, - receivingAddress: store.getState().app.selectedAddress.address, + receivingAddress: store.getState().app.selectedAddress.address }) - } + } - const manageResponse = (response) => { - if (response === true) { - let snack5string = get("tradepage.tchange23") - parentEpml.request('showSnackBar', `${snack5string}`) - } else if (response === false) { - localStorage.removeItem(this.botRvnWallet) - localStorage.setItem(this.botRvnWallet, "") + const manageResponse = (response) => { + if (response === true) { + let snack5string = get('tradepage.tchange23') + parentEpml.request('showSnackBar', `${snack5string}`) + } else if (response === false) { + localStorage.removeItem(this.botRvnWallet) + localStorage.setItem(this.botRvnWallet, '') - var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") + var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') - const newRvnTradebookItem = { - botRvnQortAmount: this.reAddRvnAmount, - botRvnPrice: this.reAddRvnPrice - } + const newRvnTradebookItem = { + botRvnQortAmount: this.reAddRvnAmount, + botRvnPrice: this.reAddRvnPrice + } - oldRvnTradebook.push(newRvnTradebookItem) + oldRvnTradebook.push(newRvnTradebookItem) - localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook)) + localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook)) - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') - let snack6string = get("tradepage.tchange24") - parentEpml.request('showSnackBar', `${snack6string}`) - } else { - localStorage.removeItem(this.botRvnWallet) - localStorage.setItem(this.botRvnWallet, "") + let snack6string = get('tradepage.tchange24') + parentEpml.request('showSnackBar', `${snack6string}`) + } else { + localStorage.removeItem(this.botRvnWallet) + localStorage.setItem(this.botRvnWallet, '') - var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") + var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') - const newRvnTradebookItem = { - botRvnQortAmount: this.reAddRvnAmount, - botRvnPrice: this.reAddRvnPrice - } + const newRvnTradebookItem = { + botRvnQortAmount: this.reAddRvnAmount, + botRvnPrice: this.reAddRvnPrice + } - oldRvnTradebook.push(newRvnTradebookItem) + oldRvnTradebook.push(newRvnTradebookItem) - localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook)) + localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook)) - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]") + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || '[]') - let snack7string = get("tradepage.tchange25") - parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + let snack7string = get('tradepage.tchange25') + parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) + } + } - async buyArrrAction() { - const makeRequest = async () => { + const res = await makeRequest() + manageResponse(res) + } + + async buyArrrAction() { + const makeRequest = async () => { return await parentEpml.request('tradeBotRespondRequest', { atAddress: this.botArrrBuyAtAddress, foreignKey: store.getState().app.selectedAddress.arrrWallet.seed58, - receivingAddress: store.getState().app.selectedAddress.address, + receivingAddress: store.getState().app.selectedAddress.address }) - } + } - const manageResponse = (response) => { - if (response === true) { - let snack5string = get("tradepage.tchange23") - parentEpml.request('showSnackBar', `${snack5string}`) - } else if (response === false) { - localStorage.removeItem(this.botArrrWallet) - localStorage.setItem(this.botArrrWallet, "") + const manageResponse = (response) => { + if (response === true) { + let snack5string = get('tradepage.tchange23') + parentEpml.request('showSnackBar', `${snack5string}`) + } else if (response === false) { + localStorage.removeItem(this.botArrrWallet) + localStorage.setItem(this.botArrrWallet, '') - var oldArrrTradebook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") + var oldArrrTradebook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') - const newArrrTradebookItem = { - botArrrQortAmount: this.reAddArrrAmount, - botArrrPrice: this.reAddArrrPrice - } + const newArrrTradebookItem = { + botArrrQortAmount: this.reAddArrrAmount, + botArrrPrice: this.reAddArrrPrice + } - oldArrrTradebook.push(newArrrTradebookItem) + oldArrrTradebook.push(newArrrTradebookItem) - localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook)) + localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook)) - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') - let snack6string = get("tradepage.tchange24") - parentEpml.request('showSnackBar', `${snack6string}`) - } else { - localStorage.removeItem(this.botArrrWallet) - localStorage.setItem(this.botArrrWallet, "") + let snack6string = get('tradepage.tchange24') + parentEpml.request('showSnackBar', `${snack6string}`) + } else { + localStorage.removeItem(this.botArrrWallet) + localStorage.setItem(this.botArrrWallet, '') - var oldArrrTradebook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") + var oldArrrTradebook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') - const newArrrTradebookItem = { - botArrrQortAmount: this.reAddArrrAmount, - botArrrPrice: this.reAddArrrPrice - } + const newArrrTradebookItem = { + botArrrQortAmount: this.reAddArrrAmount, + botArrrPrice: this.reAddArrrPrice + } - oldArrrTradebook.push(newArrrTradebookItem) + oldArrrTradebook.push(newArrrTradebookItem) - localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook)) + localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook)) - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]") + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || '[]') - let snack7string = get("tradepage.tchange25") - parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + let snack7string = get('tradepage.tchange25') + parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) + } + } - stateChanged(state) { - const split = state.app.url.split('/') - const sideurl = split[2] - this.config = state.config - this.urls = state.app.registeredUrls - this.addressInfo = state.app.accountInfo.addressInfo - this.showSyncMessages = state.app.showSyncIndicator + const res = await makeRequest() + manageResponse(res) + } - if (sideurl === "minting") { - this.shadowRoot.getElementById('qminter').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "become-minter") { - this.shadowRoot.getElementById('qbminter').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "sponsorship-list") { - this.shadowRoot.getElementById('qiminter').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "wallet") { - this.shadowRoot.getElementById('qwallet').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "trade-portal") { - this.shadowRoot.getElementById('qtrade').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "trade-bot-portal") { - this.shadowRoot.getElementById('qbot').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "reward-share") { - this.shadowRoot.getElementById('qrewardshare').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "q-chat") { - this.shadowRoot.getElementById('qchat').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "name-registration") { - this.shadowRoot.getElementById('qnamereg').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "names-market") { - this.shadowRoot.getElementById('qnamemarket').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "websites") { - this.shadowRoot.getElementById('qweb').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "qapps") { - this.shadowRoot.getElementById('qapp').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "group-management") { - this.shadowRoot.getElementById('qgroupmange').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "puzzles") { - this.shadowRoot.getElementById('qpuzzles').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "data-management") { - this.shadowRoot.getElementById('qdata').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnode').removeAttribute('selected') - } - } else if (sideurl === "node-management") { - this.shadowRoot.getElementById('qnode').setAttribute('selected', 'selected') - if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { - this.shadowRoot.getElementById('qiminter').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { - this.shadowRoot.getElementById('qwallet').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { - this.shadowRoot.getElementById('qtrade').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { - this.shadowRoot.getElementById('qbot').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { - this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { - this.shadowRoot.getElementById('qchat').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { - this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { - this.shadowRoot.getElementById('qweb').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { - this.shadowRoot.getElementById('qapp').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { - this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { - this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') - } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { - this.shadowRoot.getElementById('qdata').removeAttribute('selected') - } - } - } + stateChanged(state) { + const split = state.app.url.split('/') + const sideurl = split[2] + this.config = state.config + this.urls = state.app.registeredUrls + this.addressInfo = state.app.accountInfo.addressInfo + this.showSyncMessages = state.app.showSyncIndicator - openSettings() { - const settingsDialog = document.getElementById('main-app').shadowRoot.querySelector('app-view').shadowRoot.querySelector('user-settings') - settingsDialog.openSettings() - } + if (sideurl === 'minting') { + this.shadowRoot.getElementById('qminter').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'become-minter') { + this.shadowRoot.getElementById('qbminter').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'sponsorship-list') { + this.shadowRoot.getElementById('qiminter').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'wallet') { + this.shadowRoot.getElementById('qwallet').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'trade-portal') { + this.shadowRoot.getElementById('qtrade').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'trade-bot-portal') { + this.shadowRoot.getElementById('qbot').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'reward-share') { + this.shadowRoot.getElementById('qrewardshare').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'q-chat') { + this.shadowRoot.getElementById('qchat').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'name-registration') { + this.shadowRoot.getElementById('qnamereg').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'names-market') { + this.shadowRoot.getElementById('qnamemarket').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'websites') { + this.shadowRoot.getElementById('qweb').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'qapps') { + this.shadowRoot.getElementById('qapp').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'group-management') { + this.shadowRoot.getElementById('qgroupmange').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'puzzles') { + this.shadowRoot.getElementById('qpuzzles').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'data-management') { + this.shadowRoot.getElementById('qdata').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnode').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnode').removeAttribute('selected') + } + } else if (sideurl === 'node-management') { + this.shadowRoot.getElementById('qnode').setAttribute('selected', 'selected') + if (this.shadowRoot.getElementById('qminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qiminter').hasAttribute('selected')) { + this.shadowRoot.getElementById('qiminter').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qwallet').hasAttribute('selected')) { + this.shadowRoot.getElementById('qwallet').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qtrade').hasAttribute('selected')) { + this.shadowRoot.getElementById('qtrade').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qbot').hasAttribute('selected')) { + this.shadowRoot.getElementById('qbot').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qrewardshare').hasAttribute('selected')) { + this.shadowRoot.getElementById('qrewardshare').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qchat').hasAttribute('selected')) { + this.shadowRoot.getElementById('qchat').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamereg').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamereg').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qnamemarket').hasAttribute('selected')) { + this.shadowRoot.getElementById('qnamemarket').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qweb').hasAttribute('selected')) { + this.shadowRoot.getElementById('qweb').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qapp').hasAttribute('selected')) { + this.shadowRoot.getElementById('qapp').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qgroupmange').hasAttribute('selected')) { + this.shadowRoot.getElementById('qgroupmange').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qpuzzles').hasAttribute('selected')) { + this.shadowRoot.getElementById('qpuzzles').removeAttribute('selected') + } else if (this.shadowRoot.getElementById('qdata').hasAttribute('selected')) { + this.shadowRoot.getElementById('qdata').removeAttribute('selected') + } + } + } - openLogout() { - const logoutDialog = document.getElementById('main-app').shadowRoot.querySelector('app-view').shadowRoot.querySelector('logout-view') - logoutDialog.openLogout() - } + openSettings() { + const settingsDialog = document.getElementById('main-app').shadowRoot.querySelector('app-view').shadowRoot.querySelector('user-settings') + settingsDialog.openSettings() + } - getApiKey() { - const apiNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + openLogout() { + const logoutDialog = document.getElementById('main-app').shadowRoot.querySelector('app-view').shadowRoot.querySelector('logout-view') + logoutDialog.openLogout() + } + + getApiKey() { + const apiNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] return apiNode.apiKey - } + } - isEmptyArray(arr) { - if (!arr) { - return true - } - return arr.length === 0 - } + isEmptyArray(arr) { + if (!arr) { + return true + } - round(number) { + return arr.length === 0 + } + + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) - } + } } window.customElements.define('app-view', AppView) diff --git a/core/src/components/base.js b/core/src/components/base.js index e5382038..1928cdf0 100644 --- a/core/src/components/base.js +++ b/core/src/components/base.js @@ -1,26 +1,11 @@ -import {css, html, LitElement} from 'lit' -import {connect} from 'pwa-helpers' -import {store} from '../store.js' +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../store' class MyElement extends connect(store)(LitElement) { - static get properties () { - return { - } - } - - static get styles () { - return css`` - } - - render () { - return html` - - ` - } - - stateChanged (state) { - } + render () { + return html`` + } } -window.customElements.define('my-element', MyElement) +window.customElements.define('my-element', MyElement) \ No newline at end of file diff --git a/core/src/components/beginner-tour/sync-indicator.js b/core/src/components/beginner-tour/sync-indicator.js index 520344b1..6071f535 100644 --- a/core/src/components/beginner-tour/sync-indicator.js +++ b/core/src/components/beginner-tour/sync-indicator.js @@ -1,11 +1,13 @@ -import {css, html, LitElement} from 'lit' -import {store} from '../../store' -import {connect} from 'pwa-helpers' -import {translate} from '../../../translate' -import {parentEpml} from '../show-plugin' - +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { parentEpml } from '../show-plugin' +import { syncIndicator2Styles } from '../../styles/core-css' import '@material/mwc-icon' +// Multi language support +import {translate} from '../../../translate' + class SyncIndicator extends connect(store)(LitElement) { static get properties() { return { @@ -18,6 +20,10 @@ class SyncIndicator extends connect(store)(LitElement) { } } + static get styles() { + return [syncIndicator2Styles] + } + constructor() { super() this.blocksBehind = 0 @@ -32,64 +38,6 @@ class SyncIndicator extends connect(store)(LitElement) { this.hasOpened = false } - static get styles() { - return css` - * { - --mdc-theme-text-primary-on-background: var(--black); - box-sizing: border-box; - } - - :host { - box-sizing: border-box; - position: fixed; - bottom: 50px; - right: 25px; - z-index: 50000; - } - - .parent { - width: 360px; - padding: 10px; - border-radius: 8px; - border: 1px solid var(--black); - display: flex; - align-items: center; - gap: 10px; - user-select: none; - background: var(--white); - } - - .row { - display: flex; - gap: 10px; - width: 100%; - } - - .column { - display: flex; - flex-direction: column; - gap: 10px; - width: 100%; - } - - .bootstrap-button { - font-family: Roboto, sans-serif; - font-size: 16px; - color: var(--mdc-theme-primary); - background-color: transparent; - padding: 8px 10px; - border-radius: 5px; - border: none; - transition: all 0.3s ease-in-out; - } - - .bootstrap-button:hover { - cursor: pointer; - background-color: #03a8f475; - } - ` - } - render() { return html` ${!this.hasCoreRunning ? html` @@ -225,7 +173,7 @@ class SyncIndicator extends connect(store)(LitElement) { this.dispatchEvent( new CustomEvent('open-welcome-modal-sync', { bubbles: true, - composed: true, + composed: true }) ) } @@ -257,4 +205,4 @@ class SyncIndicator extends connect(store)(LitElement) { } } -customElements.define('sync-indicator', SyncIndicator) \ No newline at end of file +window.customElements.define('sync-indicator', SyncIndicator) \ No newline at end of file diff --git a/core/src/components/beginner-tour/tour-component.js b/core/src/components/beginner-tour/tour-component.js index 26b16276..7496a16d 100644 --- a/core/src/components/beginner-tour/tour-component.js +++ b/core/src/components/beginner-tour/tour-component.js @@ -1,16 +1,19 @@ -import {css, html, LitElement} from 'lit'; -import {driver} from 'driver.js'; -import 'driver.js/dist/driver.css'; -import '@material/mwc-icon'; -import '@polymer/paper-spinner/paper-spinner-lite.js'; -import '@vaadin/tooltip'; -import '@material/mwc-button'; -import {get, translate} from '../../../translate'; -import '@polymer/paper-dialog/paper-dialog.js'; -import {setNewTab} from '../../redux/app/app-actions.js'; -import {store} from '../../store.js'; -import {connect} from 'pwa-helpers'; -import './tour.css'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { setNewTab } from '../../redux/app/app-actions' +import { tourComponentStyles } from '../../styles/core-css' +import { driver } from 'driver.js' +import 'driver.js/dist/driver.css' +import './tour.css' +import '@material/mwc-button' +import '@material/mwc-icon' +import '@polymer/paper-dialog/paper-dialog.js' +import '@polymer/paper-spinner/paper-spinner-lite.js' +import '@vaadin/tooltip' + +// Multi language support +import { get, translate } from '../../../translate' class TourComponent extends connect(store)(LitElement) { static get properties() { @@ -18,242 +21,112 @@ class TourComponent extends connect(store)(LitElement) { getElements: { attribute: false }, dialogOpenedCongrats: { type: Boolean }, hasViewedTour: { type: Boolean }, - disableTour: {type: Boolean} - }; + disableTour: { type: Boolean }, + nodeUrl: { type: String }, + address: { type: String } + } + } + + static get styles() { + return [tourComponentStyles] } constructor() { - super(); - this.dialogOpenedCongrats = false; - this._controlOpenWelcomeModal = - this._controlOpenWelcomeModal.bind(this); - this.hasName = false; - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); + super() + this.dialogOpenedCongrats = false + this._controlOpenWelcomeModal = this._controlOpenWelcomeModal.bind(this) + this.hasName = false + this.nodeUrl = '' + this.address = '' this._disableTour = this._disableTour.bind(this) this.disableTour = false } - static get styles() { - return css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --mdc-theme-surface: var(--white); - --mdc-dialog-content-ink-color: var(--black); - box-sizing: border-box; - color: var(--black); - background: var(--white); - } - - :host { - box-sizing: border-box; - position: fixed; - bottom: 25px; - right: 25px; - z-index: 50000; - } - - .full-info-wrapper { - width: 100%; - min-width: 600px; - max-width: 600px; - text-align: center; - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - padding: 25px; - box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); - display: block !important; - } - - .buttons { - display: inline; - } - .accept-button { - font-family: Roboto, sans-serif; - letter-spacing: 0.3px; - font-weight: 300; - padding: 8px 5px; - border-radius: 3px; - text-align: center; - color: var(--black); - transition: all 0.3s ease-in-out; - display: flex; - align-items: center; - gap: 10px; - font-size: 18px; - justify-content: center; - outline: 1px solid var(--black); - } - - .accept-button:hover { - cursor: pointer; - background-color: #03a8f485; - } - - .close-button { - font-family: Roboto, sans-serif; - letter-spacing: 0.3px; - font-weight: 300; - padding: 8px 5px; - border-radius: 3px; - text-align: center; - color: #f44336; - transition: all 0.3s ease-in-out; - display: flex; - align-items: center; - gap: 10px; - font-size: 18px; - width:auto; - } - - .close-button:hover { - cursor: pointer; - background-color: #f4433663; - } - `; + render() { + return html` + + ${this.dialogOpenedCongrats && this.hasViewedTour ? html` + +

Congratulations!

+
+ ${translate("tour.tour13")} +
+
+ ${translate("tour.tour14")} +
+
+ ${translate("tour.tour15")} +
+
+
{ this.onClose() }}> + ${translate("general.close")} +
+
+
+ ` : ''} + ` } - _controlOpenWelcomeModal() { - this.isSynced = true - - const seenWelcomeSync = JSON.parse( - localStorage.getItem('welcome-sync') || 'false' - ); - if (this.hasName) return; - if (seenWelcomeSync) return; - if(!this.hasViewedTour) return - this.dialogOpenedCongrats = true; - } - - openWelcomeModal() { - this.dispatchEvent( - new CustomEvent('send-tour-finished', { - bubbles: true, - composed: true, - }) - ); - const seenWelcomeSync = JSON.parse( - localStorage.getItem('welcome-sync') || 'false' - ); - if (this.hasName) return; - if (seenWelcomeSync) return; - if(!this.isSynced) return - this.dialogOpenedCongrats = true; - } - - _disableTour(){ - this.disableTour = true - driver.reset() - } - - connectedCallback() { - super.connectedCallback(); - window.addEventListener( - 'open-welcome-modal-sync', - this._controlOpenWelcomeModal - ); - window.addEventListener( - 'disable-tour', - this._disableTour - ); - } - - disconnectedCallback() { - window.removeEventListener( - 'open-welcome-modal-sync', - this._controlOpenWelcomeModal - ); - window.addEventListener( - 'disable-tour', - this._disableTour - ); - super.disconnectedCallback(); - } - - getNodeUrl() { - const myNode = - window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - - return myNode.protocol + '://' + myNode.domain + ':' + myNode.port - } - getMyNode() { - return window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - } - - async getName(recipient) { - try { - const endpoint = `${this.nodeUrl}/names/address/${recipient}`; - const res = await fetch(endpoint); - const getNames = await res.json(); - - if (Array.isArray(getNames) && getNames.length > 0) { - return getNames[0].name; - } else { - return ''; - } - } catch (error) { - return ''; - } - } async firstUpdated() { + this.getNodeUrl() this.address = store.getState().app.selectedAddress.address - const hasViewedTour = JSON.parse( - localStorage.getItem(`hasViewedTour-${this.address}`) || 'false' - ); - const name = await this.getName(this.address); + + const hasViewedTour = JSON.parse(localStorage.getItem(`hasViewedTour-${this.address}`) || 'false') + const name = await this.getName(this.address) + if (name) { - this.hasName = true; + this.hasName = true } - this.hasViewedTour = hasViewedTour; + + this.hasViewedTour = hasViewedTour + if (!hasViewedTour) { try { if (name) { - this.hasViewedTour = true; - this.hasName = true; + this.hasViewedTour = true + this.hasName = true localStorage.setItem(`hasViewedTour-${this.address}`, JSON.stringify(true)) } } catch (error) { - console.log({ error }); + console.log({ error }) } } + await new Promise((res) => { setTimeout(() => { - res(); - }, 1000); - }); + res() + }, 1000) + }) + if (!this.hasViewedTour && this.disableTour !== true) { - const elements = this.getElements(); - let steps = [ - { - popover: { - title: get("tour.tour6"), - description: ` -
- -
-
-

${get("tour.tour7")}

-
-
-

${get("tour.tour8")}

-
-
-

${get("tour.tour9")}

-
- `, - // ... other options - }, - }, - ]; - const step2 = elements['core-sync-status-id']; - const step3 = elements['tab']; - const step4 = elements['checklist']; + const elements = this.getElements() + + let steps = [{ + popover: { + title: get("tour.tour6"), + description: ` +
+ +
+
+
+

${get("tour.tour7")}

+
+
+
+

${get("tour.tour8")}

+
+
+
+

${get("tour.tour9")}

+
+ ` + } + }] + + const step2 = elements['core-sync-status-id'] + const step3 = elements['tab'] + const step4 = elements['checklist'] if (step2) { steps.push({ @@ -261,58 +134,54 @@ class TourComponent extends connect(store)(LitElement) { popover: { title: get("tour.tour5"), description: ` -
-

${get("tour.tour1")}

-
-
- -

${get("tour.tour2")}

-
-
- -

${get("tour.tour3")}

-
-
- -

${get("tour.tour4")}

-
+
+

${get("tour.tour1")}

+
+
+ +

${get("tour.tour2")}

+
+
+ +

${get("tour.tour3")}

+
+
+ +

${get("tour.tour4")}

+
- `, - }, - }); + ` + } + }) } + if (step3) { steps.push({ element: step3, popover: { title: 'Tab View', description: ` -
-

${get("tour.tour10")} -

-
-
- -

You can also bookmark other Q-Apps and Plugins by clicking on the ${get( - 'tabmenu.tm19' - )} button

-
- `, - }, - }); - } - if (step4) { - steps.push( - { - element: step4, - popover: { - title: get("tour.tour11"), - description: get("tour.tour12"), - }, +
+

${get("tour.tour10")}

+
+
+ +

+ You can also bookmark other Q-Apps and Plugins by clicking on the ${get('tabmenu.tm19')} button +

+
+ ` } - );this.hasViewedTour + }) } - let currentStepIndex = 0; + + if (step4) { + steps.push({ element: step4, popover: { title: get("tour.tour11"), description: get("tour.tour12")}}) + this.hasViewedTour + } + + let currentStepIndex = 0 + const driverObj = driver({ popoverClass: 'driverjs-theme', showProgress: true, @@ -321,25 +190,93 @@ class TourComponent extends connect(store)(LitElement) { allowClose: false, onDestroyed: () => { localStorage.setItem(`hasViewedTour-${this.address}`, JSON.stringify(true)) - this.hasViewedTour = true; - this.openWelcomeModal(); + this.hasViewedTour = true + this.openWelcomeModal() } - }); + }) - driverObj.drive(); + driverObj.drive() } else { this.dispatchEvent( new CustomEvent('send-tour-finished', { bubbles: true, - composed: true, + composed: true }) - ); + ) + } + } + + _controlOpenWelcomeModal() { + this.isSynced = true + + const seenWelcomeSync = JSON.parse(localStorage.getItem('welcome-sync') || 'false') + + if (this.hasName) return + if (seenWelcomeSync) return + if (!this.hasViewedTour) return + + this.dialogOpenedCongrats = true + } + + openWelcomeModal() { + this.dispatchEvent( + new CustomEvent('send-tour-finished', { + bubbles: true, + composed: true + }) + ) + + const seenWelcomeSync = JSON.parse(localStorage.getItem('welcome-sync') || 'false') + + if (this.hasName) return + if (seenWelcomeSync) return + if (!this.isSynced) return + + this.dialogOpenedCongrats = true + } + + _disableTour() { + this.disableTour = true + driver.reset() + } + + connectedCallback() { + super.connectedCallback() + window.addEventListener('open-welcome-modal-sync', this._controlOpenWelcomeModal) + window.addEventListener('disable-tour', this._disableTour) + } + + disconnectedCallback() { + window.removeEventListener('open-welcome-modal-sync', this._controlOpenWelcomeModal) + window.addEventListener('disable-tour', this._disableTour) + super.disconnectedCallback() + } + + getNodeUrl() { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const myNodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port + this.nodeUrl = myNodeUrl + } + + async getName(recipient) { + try { + const endpoint = `${this.nodeUrl}/names/address/${recipient}` + const res = await fetch(endpoint) + const getNames = await res.json() + + if (Array.isArray(getNames) && getNames.length > 0) { + return getNames[0].name + } else { + return '' + } + } catch (error) { + return '' } } visitQtube() { - this.onClose(); - const query = `?service=APP&name=Q-Tube`; + this.onClose() + const query = `?service=APP&name=Q-Tube` store.dispatch( setNewTab({ url: `qdn/browser/index.html${query}`, @@ -350,59 +287,16 @@ class TourComponent extends connect(store)(LitElement) { page: `qdn/browser/index.html${query}`, title: 'Q-Tube', menus: [], - parent: false, - }, + parent: false + } }) - ); + ) } onClose() { localStorage.setItem(`welcome-sync-${this.address}`, JSON.stringify(true)) - this.dialogOpenedCongrats = false; - } - - render() { - return html` - - ${this.dialogOpenedCongrats && this.hasViewedTour - ? html` - -

Congratulations!

-
- ${translate("tour.tour13")} -
-
- ${translate("tour.tour14")} -
- -
- ${translate("tour.tour15")} -
-
-
{ - this.onClose() - - }} - > - ${translate("general.close")} -
-
-
- ` - : ''} - `; + this.dialogOpenedCongrats = false } } -customElements.define('tour-component', TourComponent); + +window.customElements.define('tour-component', TourComponent) \ No newline at end of file diff --git a/core/src/components/check-for-update.js b/core/src/components/check-for-update.js index 26a9a70e..4b9fcacb 100644 --- a/core/src/components/check-for-update.js +++ b/core/src/components/check-for-update.js @@ -1,10 +1,11 @@ -import {css, html, LitElement} from 'lit' -import {translate} from '../../translate' +import { html, LitElement } from 'lit' import isElectron from 'is-electron' - import '@polymer/paper-icon-button/paper-icon-button.js' import '@polymer/iron-icons/iron-icons.js' +// Multi language support +import { translate } from '../../translate' + class CheckForUpdate extends LitElement { static get properties() { return { @@ -17,11 +18,6 @@ class CheckForUpdate extends LitElement { this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' } - static styles = [ - css` - ` - ] - render() { return html` ${this.renderUpdateButton()} @@ -29,6 +25,7 @@ class CheckForUpdate extends LitElement { } firstUpdated() { + // ... } renderUpdateButton() { @@ -48,4 +45,4 @@ class CheckForUpdate extends LitElement { } } -window.customElements.define('check-for-update', CheckForUpdate) +window.customElements.define('check-for-update', CheckForUpdate) \ No newline at end of file diff --git a/core/src/components/computePowWorker.js b/core/src/components/computePowWorker.js index b89b9d84..37736224 100644 --- a/core/src/components/computePowWorker.js +++ b/core/src/components/computePowWorker.js @@ -1,82 +1,58 @@ -import {Sha256} from 'asmcrypto.js' +import { Sha256 } from 'asmcrypto.js' - -function sbrk(size, heap){ - let brk = 512 * 1024 // stack top - let old = brk - brk += size - - if (brk > heap.length) - throw new Error('heap exhausted') - - return old +function sbrk(size, heap) { + let brk = 512 * 1024 // stack top + let old = brk + brk += size + if (brk > heap.length) throw new Error('heap exhausted') + return old } self.addEventListener('message', async e => { - const response = await computePow(e.data.chatBytes, e.data.path, e.data.difficulty) - postMessage(response) + const response = await computePow(e.data.chatBytes, e.data.path, e.data.difficulty) + postMessage(response) }) - const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }) const heap = new Uint8Array(memory.buffer) - - const computePow = async (chatBytes, path, difficulty) => { - - let response = null - - await new Promise((resolve, reject)=> { - - const _chatBytesArray = Object.keys(chatBytes).map(function (key) { return chatBytes[key]; }); - const chatBytesArray = new Uint8Array(_chatBytesArray); - const chatBytesHash = new Sha256().process(chatBytesArray).finish().result; - const hashPtr = sbrk(32, heap); - const hashAry = new Uint8Array(memory.buffer, hashPtr, 32); - hashAry.set(chatBytesHash); - - - const workBufferLength = 8 * 1024 * 1024; - const workBufferPtr = sbrk(workBufferLength, heap); - - - - const importObject = { - env: { - memory: memory - }, - }; - - function loadWebAssembly(filename, imports) { - // Fetch the file and compile it - return fetch(filename) - .then(response => response.arrayBuffer()) - .then(buffer => WebAssembly.compile(buffer)) - .then(module => { - - // Create the instance. - return new WebAssembly.Instance(module, importObject); - }); -} - - -loadWebAssembly(path) - .then(wasmModule => { - response = { - nonce : wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), - chatBytesArray - } - - resolve() - - }); - - - }) - - return response -} + let response = null + await new Promise((resolve, reject) => { + const _chatBytesArray = Object.keys(chatBytes).map(function (key) { return chatBytes[key]; }) + const chatBytesArray = new Uint8Array(_chatBytesArray) + const chatBytesHash = new Sha256().process(chatBytesArray).finish().result + const hashPtr = sbrk(32, heap) + const hashAry = new Uint8Array(memory.buffer, hashPtr, 32) + hashAry.set(chatBytesHash) + const workBufferLength = 8 * 1024 * 1024 + const workBufferPtr = sbrk(workBufferLength, heap) + const importObject = { + env: { + memory: memory + } + } + function loadWebAssembly(filename, imports) { + // Fetch the file and compile it + return fetch(filename) + .then(response => response.arrayBuffer()) + .then(buffer => WebAssembly.compile(buffer)) + .then(module => { + // Create the instance. + return new WebAssembly.Instance(module, importObject) + }) + } + loadWebAssembly(path) + .then(wasmModule => { + response = { + nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), + chatBytesArray + } + resolve() + }) + }) + return response +} \ No newline at end of file diff --git a/core/src/components/computePowWorkerFile.js b/core/src/components/computePowWorkerFile.js index d9f5f662..a13e6ec7 100644 --- a/core/src/components/computePowWorkerFile.js +++ b/core/src/components/computePowWorkerFile.js @@ -1,92 +1,68 @@ import { Sha256 } from 'asmcrypto.js' - - -function sbrk(size, heap){ - let brk = 512 * 1024 // stack top - let old = brk - brk += size - - if (brk > heap.length) - throw new Error('heap exhausted') - - return old +function sbrk(size, heap) { + let brk = 512 * 1024 // stack top + let old = brk + brk += size + if (brk > heap.length) throw new Error('heap exhausted') + return old } - - - self.addEventListener('message', async e => { - const response = await computePow(e.data.convertedBytes, e.data.path) - postMessage(response) - -}) + const response = await computePow(e.data.convertedBytes, e.data.path) + postMessage(response) +}) const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }) const heap = new Uint8Array(memory.buffer) - - const computePow = async (convertedBytes, path) => { + let response = null + await new Promise((resolve, reject) => { + const _convertedBytesArray = Object.keys(convertedBytes).map( + function (key) { + return convertedBytes[key] + } + ) + const convertedBytesArray = new Uint8Array(_convertedBytesArray) + const convertedBytesHash = new Sha256() + .process(convertedBytesArray) + .finish().result + const hashPtr = sbrk(32, heap) + const hashAry = new Uint8Array( + memory.buffer, + hashPtr, + 32 + ) + hashAry.set(convertedBytesHash) + const difficulty = 14 + const workBufferLength = 8 * 1024 * 1024 + const workBufferPtr = sbrk( + workBufferLength, + heap + ) + const importObject = { + env: { + memory: memory + } + } + function loadWebAssembly(filename, imports) { + return fetch(filename) + .then(response => response.arrayBuffer()) + .then(buffer => WebAssembly.compile(buffer)) + .then(module => { + return new WebAssembly.Instance(module, importObject) + }) + } + loadWebAssembly(path) + .then(wasmModule => { + response = { + nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), - - let response = null - - await new Promise((resolve, reject)=> { - - const _convertedBytesArray = Object.keys(convertedBytes).map( - function (key) { - return convertedBytes[key] - } -) -const convertedBytesArray = new Uint8Array(_convertedBytesArray) -const convertedBytesHash = new Sha256() - .process(convertedBytesArray) - .finish().result -const hashPtr = sbrk(32, heap) -const hashAry = new Uint8Array( - memory.buffer, - hashPtr, - 32 -) - -hashAry.set(convertedBytesHash) -const difficulty = 14 -const workBufferLength = 8 * 1024 * 1024 -const workBufferPtr = sbrk( - workBufferLength, - heap -) - - const importObject = { - env: { - memory: memory - }, - }; - - function loadWebAssembly(filename, imports) { - return fetch(filename) - .then(response => response.arrayBuffer()) - .then(buffer => WebAssembly.compile(buffer)) - .then(module => { - return new WebAssembly.Instance(module, importObject); - }); -} - - -loadWebAssembly(path) - .then(wasmModule => { - response = { - nonce : wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), - - } - resolve() - - }); - - - }) - - return response + } + resolve() + }) + }) + return response } \ No newline at end of file diff --git a/core/src/components/controllers/coin-balances-controller.js b/core/src/components/controllers/coin-balances-controller.js index 7bcdabad..b5b8c483 100644 --- a/core/src/components/controllers/coin-balances-controller.js +++ b/core/src/components/controllers/coin-balances-controller.js @@ -1,320 +1,303 @@ -import {html, LitElement} from 'lit'; -import '@material/mwc-icon'; -import {store} from '../../store'; -import {connect} from 'pwa-helpers'; -import '@vaadin/tooltip'; -import {parentEpml} from '../show-plugin'; -import {setCoinBalances} from '../../redux/app/app-actions'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { parentEpml } from '../show-plugin' +import { setCoinBalances } from '../../redux/app/app-actions' class CoinBalancesController extends connect(store)(LitElement) { static get properties() { return { - coinList: { type: Object }, - }; + coinList: { type: Object } + } } constructor() { super(); this.coinList = {} - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); - this.fetchBalance = this.fetchBalance.bind(this) - this._updateCoinList = this._updateCoinList.bind(this) - this.stop = false + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() + this.fetchBalance = this.fetchBalance.bind(this) + this._updateCoinList = this._updateCoinList.bind(this) + this.stop = false } - getNodeUrl() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - store.getState().app.nodeConfig.node - ] + render() { + return html`` + } + getNodeUrl() { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] return myNode.protocol + '://' + myNode.domain + ':' + myNode.port } + getMyNode() { - return store.getState().app.nodeConfig.knownNodes[ - store.getState().app.nodeConfig.node - ] + return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] } + async updateQortWalletBalance() { + let qortAddress = store.getState().app.selectedAddress.address - async updateArrrWalletBalance() { - let _url = `/crosschain/arrr/walletbalance?apiKey=${this.myNode.apiKey}` - let _body = store.getState().app.selectedAddress.arrrWallet.seed58 - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.arrrWalletBalance = (Number(res) / 1e8).toFixed(8) - store.dispatch( - setCoinBalances({ - type: 'arrr', - fullValue: Number(res) - }) - ); - } - }).catch(()=> { - console.log('error') - }) - } - async updateQortWalletBalance() { - let qortAddress = store.getState().app.selectedAddress.address - - await parentEpml.request('apiCall', { - url: `/addresses/balance/${qortAddress}?apiKey=${this.myNode.apiKey}`, - }).then((res) => { - this.qortWalletBalance = res - store.dispatch( - setCoinBalances({ - type: 'qort', - fullValue: Number(res) - }) - ); - }).catch(()=> { - console.log('error') - }) - } - - async updateRvnWalletBalance() { - let _url = `/crosschain/rvn/walletbalance?apiKey=${this.myNode.apiKey}` - let _body = store.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.rvnWalletBalance = (Number(res) / 1e8).toFixed(8) - store.dispatch( - setCoinBalances({ - type: 'rvn', - fullValue: Number(res) - }) - ); - } - }).catch(()=> { - console.log('error') - }) - } - - async updateDgbWalletBalance() { - let _url = `/crosschain/dgb/walletbalance?apiKey=${this.myNode.apiKey}` - let _body = store.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.dgbWalletBalance = (Number(res) / 1e8).toFixed(8) - store.dispatch( - setCoinBalances({ - type: 'dgb', - fullValue: Number(res) - }) - ); - } - }).catch(()=> { - console.log('error') - }) - } - - async updateDogeWalletBalance() { - let _url = `/crosschain/doge/walletbalance?apiKey=${this.myNode.apiKey}` - let _body = store.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.dogeWalletBalance = (Number(res) / 1e8).toFixed(8) - store.dispatch( - setCoinBalances({ - type: 'doge', - fullValue: Number(res) - }) - ); - } - }).catch(()=> { - console.log('error') - }) - } - - async updateBtcWalletBalance() { - let _url = `/crosschain/btc/walletbalance?apiKey=${this.myNode.apiKey}` - let _body = store.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.btcWalletBalance = (Number(res) / 1e8).toFixed(8) - store.dispatch( - setCoinBalances({ - type: 'btc', - fullValue: Number(res) - }) - ); - } - }).catch(()=> { - console.log('error') - }) - } - - async updateLtcWalletBalance() { - let _url = `/crosschain/ltc/walletbalance?apiKey=${this.myNode.apiKey}` - let _body = store.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.ltcWalletBalance = (Number(res) / 1e8).toFixed(8) - store.dispatch( - setCoinBalances({ - type: 'ltc', - fullValue: Number(res) - }) - ); - - } - }).catch(()=> { - console.log('error') - }) - } - - _updateCoinList(event) { - const copyCoinList = {...this.coinList} - const coin = event.detail - if(!copyCoinList[coin]){ - try { - if(coin === 'ltc'){ - this.updateLtcWalletBalance() - } else if(coin === 'qort'){ - this.updateQortWalletBalance() - } else if(coin === 'doge'){ - this.updateDogeWalletBalance() - } else if(coin === 'btc'){ - this.updateBtcWalletBalance() - } else if(coin === 'dgb'){ - this.updateDgbWalletBalance() - } else if(coin === 'rvn'){ - this.updateRvnWalletBalance() - }else if(coin === 'arrr'){ - this.updateArrrWalletBalance() - } - } catch (error) { - - } - } - copyCoinList[coin] = Date.now() + 120000; - this.coinList = copyCoinList - - this.requestUpdate() + await parentEpml.request('apiCall', { + url: `/addresses/balance/${qortAddress}?apiKey=${this.myNode.apiKey}`, + }).then((res) => { + this.qortWalletBalance = res + store.dispatch( + setCoinBalances({ + type: 'qort', + fullValue: Number(res) + }) + ) + }).catch(() => { + console.log('error') + }) } + async updateBtcWalletBalance() { + let _url = `/crosschain/btc/walletbalance?apiKey=${this.myNode.apiKey}` + let _body = store.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey - async fetchCoins(arrayOfCoins){ - const getCoinBalances = (arrayOfCoins || []).map( - async (coin) => { - if(coin === 'ltc'){ - await this.updateLtcWalletBalance() - } else if(coin === 'qort'){ - await this.updateQortWalletBalance() - } else if(coin === 'doge'){ - await this.updateDogeWalletBalance() - } else if(coin === 'btc'){ - await this.updateBtcWalletBalance() - } else if(coin === 'dgb'){ - await this.updateDgbWalletBalance() - } else if(coin === 'rvn'){ - await this.updateRvnWalletBalance() - }else if(coin === 'arrr'){ - await this.updateArrrWalletBalance() - } - }) + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.btcWalletBalance = (Number(res) / 1e8).toFixed(8) + store.dispatch( + setCoinBalances({ + type: 'btc', + fullValue: Number(res) + }) + ) + } + }).catch(() => { + console.log('error') + }) + } - await Promise.all(getCoinBalances); + async updateLtcWalletBalance() { + let _url = `/crosschain/ltc/walletbalance?apiKey=${this.myNode.apiKey}` + let _body = store.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey - } + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.ltcWalletBalance = (Number(res) / 1e8).toFixed(8) + store.dispatch( + setCoinBalances({ + type: 'ltc', + fullValue: Number(res) + }) + ) - async fetchBalance(){ - try { - let arrayOfCoins = [] - const copyObject = {...this.coinList} - const currentDate = Date.now() - const array = Object.keys(this.coinList) - for (const key of array) { - const item = this.coinList[key] + } + }).catch(() => { + console.log('error') + }) + } - if(item < currentDate){ - delete copyObject[key] - } else { - arrayOfCoins.push(key) - } - } - if(!this.stop){ - this.stop = true - await this.fetchCoins(arrayOfCoins) - this.stop = false - } - this.coinList = copyObject - } catch (error) { - this.stop = false - } - } + async updateDogeWalletBalance() { + let _url = `/crosschain/doge/walletbalance?apiKey=${this.myNode.apiKey}` + let _body = store.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey - connectedCallback() { - super.connectedCallback(); - this.intervalID = setInterval(this.fetchBalance, 45000); - window.addEventListener( - 'ping-coin-controller-with-coin', - this._updateCoinList - ); + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.dogeWalletBalance = (Number(res) / 1e8).toFixed(8) + store.dispatch( + setCoinBalances({ + type: 'doge', + fullValue: Number(res) + }) + ) + } + }).catch(() => { + console.log('error') + }) + } + + async updateDgbWalletBalance() { + let _url = `/crosschain/dgb/walletbalance?apiKey=${this.myNode.apiKey}` + let _body = store.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.dgbWalletBalance = (Number(res) / 1e8).toFixed(8) + store.dispatch( + setCoinBalances({ + type: 'dgb', + fullValue: Number(res) + }) + ) + } + }).catch(() => { + console.log('error') + }) + } + + async updateRvnWalletBalance() { + let _url = `/crosschain/rvn/walletbalance?apiKey=${this.myNode.apiKey}` + let _body = store.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.rvnWalletBalance = (Number(res) / 1e8).toFixed(8) + store.dispatch( + setCoinBalances({ + type: 'rvn', + fullValue: Number(res) + }) + ) + } + }).catch(() => { + console.log('error') + }) + } + + async updateArrrWalletBalance() { + let _url = `/crosschain/arrr/walletbalance?apiKey=${this.myNode.apiKey}` + let _body = store.getState().app.selectedAddress.arrrWallet.seed58 + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body, + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.arrrWalletBalance = (Number(res) / 1e8).toFixed(8) + store.dispatch( + setCoinBalances({ + type: 'arrr', + fullValue: Number(res) + }) + ) + } + }).catch(() => { + console.log('error') + }) + } + + _updateCoinList(event) { + const copyCoinList = { ...this.coinList } + const coin = event.detail + + if (!copyCoinList[coin]) { + try { + if (coin === 'qort') { + this.updateQortWalletBalance() + } else if (coin === 'btc') { + this.updateBtcWalletBalance() + } else if (coin === 'ltc') { + this.updateLtcWalletBalance() + } else if (coin === 'doge') { + this.updateDogeWalletBalance() + } else if (coin === 'dgb') { + this.updateDgbWalletBalance() + } else if (coin === 'rvn') { + this.updateRvnWalletBalance() + } else if (coin === 'arrr') { + this.updateArrrWalletBalance() + } + } catch (error) { } + } + + copyCoinList[coin] = Date.now() + 120000 + + this.coinList = copyCoinList + this.requestUpdate() + } + + async fetchCoins(arrayOfCoins) { + const getCoinBalances = (arrayOfCoins || []).map(async (coin) => { + if (coin === 'qort') { + await this.updateQortWalletBalance() + } else if (coin === 'btc') { + await this.updateBtcWalletBalance() + } else if (coin === 'ltc') { + await this.updateLtcWalletBalance() + } else if (coin === 'doge') { + await this.updateDogeWalletBalance() + } else if (coin === 'dgb') { + await this.updateDgbWalletBalance() + } else if (coin === 'rvn') { + await this.updateRvnWalletBalance() + } else if (coin === 'arrr') { + await this.updateArrrWalletBalance() + } + }) + + await Promise.all(getCoinBalances) + } + + async fetchBalance() { + try { + let arrayOfCoins = [] + + const copyObject = { ...this.coinList } + const currentDate = Date.now() + const array = Object.keys(this.coinList) + + for (const key of array) { + const item = this.coinList[key] + + if (item < currentDate) { + delete copyObject[key] + } else { + arrayOfCoins.push(key) + } + } + + if (!this.stop) { + this.stop = true + + await this.fetchCoins(arrayOfCoins) + + this.stop = false + } + + this.coinList = copyObject + } catch (error) { + this.stop = false + } + } + + connectedCallback() { + super.connectedCallback() + this.intervalID = setInterval(this.fetchBalance, 45000) + window.addEventListener('ping-coin-controller-with-coin', this._updateCoinList) } disconnectedCallback() { - - super.disconnectedCallback(); - window.removeEventListener( - 'ping-coin-controller-with-coin', - this._updateCoinList - ); - if(this.intervalID){ - clearInterval(this.intervalID); - - } - - } - - - - render() { - return html``; + if (this.intervalID) { clearInterval(this.intervalID) } + window.removeEventListener('ping-coin-controller-with-coin', this._updateCoinList) + super.disconnectedCallback() } } -customElements.define('coin-balances-controller', CoinBalancesController); +window.customElements.define('coin-balances-controller', CoinBalancesController) \ No newline at end of file diff --git a/core/src/components/friends-view/ChatSideNavHeads.js b/core/src/components/friends-view/ChatSideNavHeads.js index d2f6ebdd..c69b09f8 100644 --- a/core/src/components/friends-view/ChatSideNavHeads.js +++ b/core/src/components/friends-view/ChatSideNavHeads.js @@ -1,221 +1,204 @@ -import {css, html, LitElement} from 'lit' -import {get} from '../../../translate' -import '@material/mwc-icon' -import '@vaadin/tooltip'; - +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { get } from '../../../translate' +import { chatSideNavHeadsStyles } from '../../styles/core-css' import './friend-item-actions' +import '@material/mwc-icon' +import '@vaadin/tooltip' -class ChatSideNavHeads extends LitElement { - static get properties() { - return { - selectedAddress: { type: Object }, - config: { type: Object }, - chatInfo: { type: Object }, - iconName: { type: String }, - activeChatHeadUrl: { type: String }, - isImageLoaded: { type: Boolean }, - setActiveChatHeadUrl: {attribute: false}, - openEditFriend: {attribute: false}, - closeSidePanel: {attribute: false, type: Object} - } - } +class ChatSideNavHeads extends connect(store)(LitElement) { + static get properties() { + return { + selectedAddress: { type: Object }, + config: { type: Object }, + chatInfo: { type: Object }, + iconName: { type: String }, + activeChatHeadUrl: { type: String }, + isImageLoaded: { type: Boolean }, + setActiveChatHeadUrl: { attribute: false }, + openEditFriend: { attribute: false }, + closeSidePanel: { attribute: false, type: Object } + } + } - static get styles() { - return css` - :host { - width: 100%; - } - ul { - list-style-type: none; - } - li { - padding: 10px 2px 10px 5px; - cursor: pointer; - width: 100%; - display: flex; - box-sizing: border-box; - font-size: 14px; - transition: 0.2s background-color; - } + static get styles() { + return [chatSideNavHeadsStyles] + } - li:hover { - background-color: var(--lightChatHeadHover); - } - - .active { - background: var(--menuactive); - border-left: 4px solid #3498db; - } - - .img-icon { - font-size:40px; - color: var(--chat-group); - } - - .status { - color: #92959e; - } - - .clearfix { - display: flex; - align-items: center; - } - - .clearfix:after { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; - } - ` - } - - constructor() { - super() - this.selectedAddress = {} - this.config = { - user: { - node: { - - } - } - } - this.chatInfo = {} - this.iconName = '' - this.activeChatHeadUrl = '' - this.isImageLoaded = false - this.imageFetches = 0 - } - - createImage(imageUrl) { - const imageHTMLRes = new Image(); - imageHTMLRes.src = imageUrl; - imageHTMLRes.style= "width:30px; height:30px; float: left; border-radius:50%; font-size:14px"; - imageHTMLRes.onclick= () => { - this.openDialogImage = true; - } - imageHTMLRes.onload = () => { - this.isImageLoaded = true; - } - imageHTMLRes.onerror = () => { - if (this.imageFetches < 4) { - setTimeout(() => { - this.imageFetches = this.imageFetches + 1; - imageHTMLRes.src = imageUrl; - }, 500); - } else { - this.isImageLoaded = false - } - }; - return imageHTMLRes; - } - - render() { - let avatarImg = "" - if (this.chatInfo.name) { - 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 avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.name}/qortal_avatar?async=true&apiKey=${myNode.apiKey}`; - avatarImg = this.createImage(avatarUrl) - } - - return html` -
  • { - const target = e.target - const popover = - this.shadowRoot.querySelector('friend-item-actions'); - if (popover) { - popover.openPopover(target); + constructor() { + super() + this.selectedAddress = {} + this.config = { + user: { + node: { } - }} class="clearfix" id=${`friend-item-parent-${this.chatInfo.name}`}> -
    - ${this.isImageLoaded ? html`${avatarImg}` : html``} - ${!this.isImageLoaded && !this.chatInfo.name && !this.chatInfo.groupName - ? html`account_circle` - : html``} - ${!this.isImageLoaded && this.chatInfo.name - ? html`
    - ${this.chatInfo.name.charAt(0)} -
    ` - : ""} - ${!this.isImageLoaded && this.chatInfo.groupName - ? html`
    - ${this.chatInfo.groupName.charAt(0)} -
    ` - : ""} -
    -
    - - ${this.chatInfo.groupName - ? this.chatInfo.groupName - : this.chatInfo.name !== undefined - ? (this.chatInfo.alias || this.chatInfo.name) - : this.chatInfo.address.substr(0, 15)} - -
    -
    + } + } + this.chatInfo = {} + this.iconName = '' + this.activeChatHeadUrl = '' + this.isImageLoaded = false + this.imageFetches = 0 + } -
    -
    - ${this.chatInfo.willFollow ? html` - connect_without_contact - - - ` : ''} -
    -
  • - { - this.openEditFriend(this.chatInfo) - }} - name=${this.chatInfo.name} - .closeSidePanel=${this.closeSidePanel} - > - ` - } + if (this.chatInfo.name) { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port + const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.name}/qortal_avatar?async=true` + avatarImg = this.createImage(avatarUrl) + } + return html` +
  • { + const target = e.target + const popover = this.shadowRoot.querySelector('friend-item-actions'); + if (popover) { + popover.openPopover(target); + } + }} + class="clearfix" id=${`friend-item-parent-${this.chatInfo.name}`} + > +
    + ${this.isImageLoaded ? html`${avatarImg}` : html``} + ${!this.isImageLoaded && !this.chatInfo.name && !this.chatInfo.groupName ? + html` + account_circle + ` + : html`` + } + ${!this.isImageLoaded && this.chatInfo.name ? + html` +
    + ${this.chatInfo.name.charAt(0)} +
    + ` : '' + } + ${!this.isImageLoaded && this.chatInfo.groupName ? + html` +
    + ${this.chatInfo.groupName.charAt(0)} +
    + ` : '' + } +
    +
    + + ${this.chatInfo.groupName + ? this.chatInfo.groupName + : this.chatInfo.name !== undefined + ? (this.chatInfo.alias || this.chatInfo.name) + : this.chatInfo.address.substr(0, 15) + } + +
    +
    +
    +
    + ${this.chatInfo.willFollow ? + html` + connect_without_contact + + ` : '' + } +
    +
  • + { + this.openEditFriend(this.chatInfo) + }} + name=${this.chatInfo.name} + .closeSidePanel=${this.closeSidePanel} + > + ` + } + firstUpdated() { + // ... + } - shouldUpdate(changedProperties) { - if(changedProperties.has('activeChatHeadUrl')){ - return true - } - if(changedProperties.has('chatInfo')){ - return true - } - return !!changedProperties.has('isImageLoaded'); + createImage(imageUrl) { + const imageHTMLRes = new Image() + imageHTMLRes.src = imageUrl + imageHTMLRes.style = "width:30px; height:30px; float: left; border-radius:50%; font-size:14px" + imageHTMLRes.onclick = () => { + this.openDialogImage = true + } - } + imageHTMLRes.onload = () => { + this.isImageLoaded = true + } - getUrl(chatUrl) { - this.setActiveChatHeadUrl(chatUrl) - } + imageHTMLRes.onerror = () => { + if (this.imageFetches < 4) { + setTimeout(() => { + this.imageFetches = this.imageFetches + 1 + imageHTMLRes.src = imageUrl + }, 500) + } else { + this.isImageLoaded = false + } + } + return imageHTMLRes + } + shouldUpdate(changedProperties) { + if (changedProperties.has('activeChatHeadUrl')) { + return true + } + + if (changedProperties.has('chatInfo')) { + return true + } + + return !!changedProperties.has('isImageLoaded') + } + + getUrl(chatUrl) { + this.setActiveChatHeadUrl(chatUrl) + } + + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -window.customElements.define('chat-side-nav-heads', ChatSideNavHeads) +window.customElements.define('chat-side-nav-heads', ChatSideNavHeads) \ No newline at end of file diff --git a/core/src/components/friends-view/add-friends-modal.js b/core/src/components/friends-view/add-friends-modal.js index 1e6f4ddd..b2026b8d 100644 --- a/core/src/components/friends-view/add-friends-modal.js +++ b/core/src/components/friends-view/add-friends-modal.js @@ -1,10 +1,11 @@ -import {css, html, LitElement} from 'lit'; -import {translate,} from '../../../translate' -import '@material/mwc-button'; -import '@material/mwc-dialog'; -import '@material/mwc-checkbox'; -import {connect} from 'pwa-helpers'; -import {store} from '../../store'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { translate, } from '../../../translate' +import { addFriendsModalStyles } from '../../styles/core-css' +import '@material/mwc-button' +import '@material/mwc-checkbox' +import '@material/mwc-dialog' import '@polymer/paper-spinner/paper-spinner-lite.js' class AddFriendsModal extends connect(store)(LitElement) { @@ -21,199 +22,195 @@ class AddFriendsModal extends connect(store)(LitElement) { editContent: { type: Object }, onClose: { attribute: false }, mySelectedFeeds: { type: Array }, - availableFeeedSchemas: {type: Array}, - isLoadingSchemas: {type: Boolean} - }; - } - - constructor() { - super(); - this.isOpen = false; - this.isLoading = false; - this.alias = ''; - this.willFollow = true; - this.notes = ''; - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); - this.mySelectedFeeds = []; - this.availableFeeedSchemas = []; - this.isLoadingSchemas= false; + availableFeeedSchemas: { type: Array }, + isLoadingSchemas: { type: Boolean } + } } static get styles() { - return css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --mdc-theme-surface: var(--white); - --mdc-dialog-content-ink-color: var(--black); - --mdc-dialog-min-width: 400px; - --mdc-dialog-max-width: 1024px; - box-sizing:border-box; - } - .input { - width: 90%; - outline: 0; - border-width: 0 0 2px; - border-color: var(--mdc-theme-primary); - background-color: transparent; - padding: 10px; - font-family: Roboto, sans-serif; - font-size: 15px; - color: var(--chat-bubble-msg-color); - box-sizing: border-box; - } - - .input::selection { - background-color: var(--mdc-theme-primary); - color: white; - } - - .input::placeholder { - opacity: 0.6; - color: var(--black); - } - - .modal-button { - font-family: Roboto, sans-serif; - font-size: 16px; - color: var(--mdc-theme-primary); - background-color: transparent; - padding: 8px 10px; - border-radius: 5px; - border: none; - transition: all 0.3s ease-in-out; - } - - .modal-button-red { - font-family: Roboto, sans-serif; - font-size: 16px; - color: #f44336; - background-color: transparent; - padding: 8px 10px; - border-radius: 5px; - border: none; - transition: all 0.3s ease-in-out; - } - - .modal-button-red:hover { - cursor: pointer; - background-color: #f4433663; - } - - .modal-button:hover { - cursor: pointer; - background-color: #03a8f475; - } - .checkbox-row { - position: relative; - display: flex; - align-items: center; - align-content: center; - font-family: Montserrat, sans-serif; - font-weight: 600; - color: var(--black); - } - .modal-overlay { - display: block; - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba( - 0, - 0, - 0, - 0.5 - ); /* Semi-transparent backdrop */ - z-index: 1000; - } - - .modal-content { - position: fixed; - top: 50vh; - left: 50vw; - transform: translate(-50%, -50%); - background-color: var(--mdc-theme-surface); - width: 80vw; - max-width: 600px; - padding: 20px; - box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px; - z-index: 1001; - border-radius: 5px; - display: flex; - flex-direction:column; - } - - - .modal-overlay.hidden { - display: none; - } - .avatar { - width: 36px; - height: 36px; - display: flex; - align-items: center; - } - - .app-name { - display: flex; - gap: 20px; - align-items: center; - width: 100%; - cursor: pointer; - padding: 5px; - border-radius: 5px; - margin-bottom: 10px; - } - .inner-content { - display: flex; - flex-direction: column; - max-height: 75vh; - flex-grow: 1; - overflow: auto; - } - - .inner-content::-webkit-scrollbar-track { - background-color: whitesmoke; - border-radius: 7px; - } - - .inner-content::-webkit-scrollbar { - width: 12px; - border-radius: 7px; - background-color: whitesmoke; - } - - .inner-content::-webkit-scrollbar-thumb { - background-color: rgb(180, 176, 176); - border-radius: 7px; - transition: all 0.3s ease-in-out; - } - `; + return [addFriendsModalStyles] } - firstUpdated() {} + constructor() { + super() + this.isOpen = false + this.isLoading = false + this.alias = '' + this.willFollow = true + this.notes = '' + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() + this.mySelectedFeeds = [] + this.availableFeeedSchemas = [] + this.isLoadingSchemas = false + } + + render() { + return html` + + ` + } + + firstUpdated() { + // ... + } getNodeUrl() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; - - return myNode.protocol + '://' + myNode.domain + ':' + myNode.port; + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return myNode.protocol + '://' + myNode.domain + ':' + myNode.port } + getMyNode() { - return store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; + return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] } clearFields() { - this.alias = ''; - this.willFollow = true; - this.notes = ''; + this.alias = '' + this.willFollow = true + this.notes = '' } addFriend() { @@ -223,10 +220,10 @@ class AddFriendsModal extends connect(store)(LitElement) { notes: this.notes, willFollow: this.willFollow, mySelectedFeeds: this.mySelectedFeeds + }) - }); - this.clearFields(); - this.onClose(); + this.clearFields() + this.onClose() } removeFriend() { @@ -239,244 +236,60 @@ class AddFriendsModal extends connect(store)(LitElement) { mySelectedFeeds: this.mySelectedFeeds }, true - ); - this.clearFields(); - this.onClose(); + ) + + this.clearFields() + this.onClose() } async updated(changedProperties) { - if ( - changedProperties && - changedProperties.has('editContent') && - this.editContent - ) { - this.userSelected = { - name: this.editContent.name ?? '', - }; - this.notes = this.editContent.notes ?? ''; - this.willFollow = this.editContent.willFollow ?? true; - this.alias = this.editContent.alias ?? ''; + if (changedProperties && changedProperties.has('editContent') && this.editContent) { + this.userSelected = { name: this.editContent.name ?? '' } + this.notes = this.editContent.notes ?? '' + this.willFollow = this.editContent.willFollow ?? true + this.alias = this.editContent.alias ?? '' this.requestUpdate() } - if ( - changedProperties && - changedProperties.has('isOpen') && this.isOpen - ) { + + if (changedProperties && changedProperties.has('isOpen') && this.isOpen) { await this.getAvailableFeedSchemas() } - } async getAvailableFeedSchemas() { try { - this.isLoadingSchemas= true - const url = `${this.nodeUrl}/arbitrary/resources/search?service=DOCUMENT&identifier=ui_schema_feed&prefix=true`; - const res = await fetch(url); - const data = await res.json(); + this.isLoadingSchemas = true + const url = `${this.nodeUrl}/arbitrary/resources/search?service=DOCUMENT&identifier=ui_schema_feed&prefix=true` + const res = await fetch(url) + const data = await res.json() + if (data.error === 401) { - this.availableFeeedSchemas = []; + this.availableFeeedSchemas = [] } else { - this.availableFeeedSchemas = data.filter( - (item) => item.identifier === 'ui_schema_feed' - ); + this.availableFeeedSchemas = data.filter((item) => item.identifier === 'ui_schema_feed') } - this.userFoundModalOpen = true; - } catch (error) {} finally { - this.isLoadingSchemas= false + + this.userFoundModalOpen = true + } catch (error) { + } finally { + this.isLoadingSchemas = false } } - render() { - return html` - - `; + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } } -customElements.define('add-friends-modal', AddFriendsModal); +window.customElements.define('add-friends-modal', AddFriendsModal) \ No newline at end of file diff --git a/core/src/components/friends-view/avatar.js b/core/src/components/friends-view/avatar.js index e0714032..f00a9904 100644 --- a/core/src/components/friends-view/avatar.js +++ b/core/src/components/friends-view/avatar.js @@ -1,16 +1,17 @@ -import {css, html, LitElement} from 'lit'; -import axios from 'axios'; -import '@material/mwc-menu'; -import '@material/mwc-list/mwc-list-item.js'; -import {RequestQueueWithPromise} from '../../../../plugins/plugins/utils/queue'; -import '../../../../plugins/plugins/core/components/TimeAgo'; -import {connect} from 'pwa-helpers'; -import {store} from '../../store'; -import ShortUniqueId from 'short-unique-id'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { RequestQueueWithPromise } from '../../../../plugins/plugins/utils/classes' +import { avatarComponentStyles } from '../../styles/core-css' +import axios from 'axios' +import ShortUniqueId from 'short-unique-id' +import '../../../../plugins/plugins/core/components/TimeAgo' +import '@material/mwc-menu' +import '@material/mwc-list/mwc-list-item.js' -const requestQueue = new RequestQueueWithPromise(3); -const requestQueueRawData = new RequestQueueWithPromise(3); -const requestQueueStatus = new RequestQueueWithPromise(3); +const requestQueue = new RequestQueueWithPromise(3) +const requestQueueRawData = new RequestQueueWithPromise(3) +const requestQueueStatus = new RequestQueueWithPromise(3) export class AvatarComponent extends connect(store)(LitElement) { static get properties() { @@ -18,284 +19,210 @@ export class AvatarComponent extends connect(store)(LitElement) { resource: { type: Object }, isReady: { type: Boolean }, status: { type: Object }, - name: { type: String }, - }; + name: { type: String } + } } static get styles() { - return css` - * { - --mdc-theme-text-primary-on-background: var(--black); - box-sizing: border-box; - } - :host { - width: 100%; - box-sizing: border-box; - } - img { - width: 100%; - max-height: 30vh; - border-radius: 5px; - cursor: pointer; - position: relative; - } - .smallLoading, - .smallLoading:after { - border-radius: 50%; - width: 2px; - height: 2px; - } - - .defaultSize { - width: 100%; - height: 160px; - } - .parent-feed-item { - position: relative; - display: flex; - background-color: var(--chat-bubble-bg); - flex-grow: 0; - flex-direction: column; - align-items: flex-start; - justify-content: center; - border-radius: 5px; - padding: 12px 15px 4px 15px; - min-width: 150px; - width: 100%; - box-sizing: border-box; - cursor: pointer; - font-size: 16px; - } - .avatar { - width: 36px; - height: 36px; - border-radius: 50%; - overflow: hidden; - display: flex; - align-items: center; - } - .avatarApp { - width: 30px; - height: 30px; - border-radius: 50%; - overflow: hidden; - display: flex; - align-items: center; - } - .feed-item-name { - user-select: none; - color: #03a9f4; - margin-bottom: 5px; - } - - .app-name { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - } - - mwc-menu { - position: absolute; - } - `; + return [avatarComponentStyles] } constructor() { - super(); + super() this.resource = { identifier: '', name: '', - service: '', - }; + service: '' + } this.status = { - status: '', - }; - this.isReady = false; - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); - this.isFetching = false; - this.uid = new ShortUniqueId(); - } - getNodeUrl() { - const myNode = - window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; - - return myNode.protocol + '://' + myNode.domain + ':' + myNode.port; - } - getMyNode() { - return window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; - } - - getApiKey() { - const myNode = - window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; - return myNode.apiKey; - } - - async fetchResource() { - try { - if (this.isFetching) return; - this.isFetching = true; - await axios.get( - `${this.nodeUrl}/arbitrary/resource/properties/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` - ); - this.isFetching = false; - } catch (error) { - this.isFetching = false; + status: '' } - } - - async fetchVideoUrl() { - await this.fetchResource(); - } - - async getRawData() { - const url = `${this.nodeUrl}/arbitrary/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`; - return await requestQueueRawData.enqueue(() => { - return axios.get(url); - }); - // const response2 = await fetch(url, { - // method: 'GET', - // headers: { - // 'Content-Type': 'application/json' - // } - // }) - - // const responseData2 = await response2.json() - // return responseData2 - } - - updateDisplayWithPlaceholders(display, resource, rawdata) { - const pattern = /\$\$\{([a-zA-Z0-9_\.]+)\}\$\$/g; - - for (const key in display) { - const value = display[key]; - - display[key] = value.replace(pattern, (match, p1) => { - if (p1.startsWith('rawdata.')) { - const dataKey = p1.split('.')[1]; - if (rawdata[dataKey] === undefined) { - console.error('rawdata key not found:', dataKey); - } - return rawdata[dataKey] || match; - } else if (p1.startsWith('resource.')) { - const resourceKey = p1.split('.')[1]; - if (resource[resourceKey] === undefined) { - console.error('resource key not found:', resourceKey); - } - return resource[resourceKey] || match; - } - return match; - }); - } - } - - async fetchStatus() { - let isCalling = false; - let percentLoaded = 0; - let timer = 24; - const response = await requestQueueStatus.enqueue(() => { - return axios.get( - `${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` - ); - }); - if (response && response.data && response.data.status === 'READY') { - this.status = response.data; - - return; - } - const intervalId = setInterval(async () => { - if (isCalling) return; - isCalling = true; - - const data = await requestQueue.enqueue(() => { - return axios.get( - `${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` - ); - }); - const res = data.data; - - isCalling = false; - if (res.localChunkCount) { - if (res.percentLoaded) { - if ( - res.percentLoaded === percentLoaded && - res.percentLoaded !== 100 - ) { - timer = timer - 5; - } else { - timer = 24; - } - if (timer < 0) { - clearInterval(intervalId); - } - percentLoaded = res.percentLoaded; - } - - this.status = res; - if (this.status.status === 'DOWNLOADED') { - await this.fetchResource(); - } - } - - // check if progress is 100% and clear interval if true - if (res.status === 'READY') { - clearInterval(intervalId); - this.status = res; - this.isReady = true; - } - }, 5000); // 1 second interval - } - - async _fetchImage() { - try { - await this.fetchVideoUrl(); - await this.fetchStatus(); - } catch (error) { - /* empty */ - } - } - - firstUpdated() { - this._fetchImage(); + this.isReady = false + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() + this.isFetching = false + this.uid = new ShortUniqueId() } render() { return html`
    - ${this.status.status !== 'READY' - ? html` - account_circle - ` - : ''} - ${this.status.status === 'READY' - ? html` -
    - -
    - ` - : ''} + ${this.status.status !== 'READY' ? + html` + account_circle + ` : '' + } + ${this.status.status === 'READY' ? + html` +
    + +
    + ` : '' + }
    - `; + ` + } + + firstUpdated() { + this._fetchImage() + } + + getNodeUrl() { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return myNode.protocol + '://' + myNode.domain + ':' + myNode.port + } + + getMyNode() { + return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + } + + async fetchResource() { + try { + if (this.isFetching) return + + this.isFetching = true + + await axios.get( + `${this.nodeUrl}/arbitrary/resource/properties/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` + ) + + this.isFetching = false + } catch (error) { + this.isFetching = false + } + } + + async fetchVideoUrl() { + await this.fetchResource() + } + + async getRawData() { + const url = `${this.nodeUrl}/arbitrary/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` + + return await requestQueueRawData.enqueue(() => { + return axios.get(url) + }) + } + + updateDisplayWithPlaceholders(display, resource, rawdata) { + const pattern = /\$\$\{([a-zA-Z0-9_\.]+)\}\$\$/g + + for (const key in display) { + const value = display[key] + + display[key] = value.replace(pattern, (match, p1) => { + if (p1.startsWith('rawdata.')) { + const dataKey = p1.split('.')[1] + + if (rawdata[dataKey] === undefined) { + console.error('rawdata key not found:', dataKey) + } + + return rawdata[dataKey] || match + } else if (p1.startsWith('resource.')) { + const resourceKey = p1.split('.')[1] + + if (resource[resourceKey] === undefined) { + console.error('resource key not found:', resourceKey) + } + + return resource[resourceKey] || match + } + + return match + }) + } + } + + async fetchStatus() { + let isCalling = false + let percentLoaded = 0 + let timer = 24 + + const response = await requestQueueStatus.enqueue(() => { + return axios.get( + `${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` + ) + }) + + if (response && response.data && response.data.status === 'READY') { + this.status = response.data + return + } + + const intervalId = setInterval(async () => { + if (isCalling) return + + isCalling = true + + const data = await requestQueue.enqueue(() => { + return axios.get( + `${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` + ) + }) + + const res = data.data + + isCalling = false + + if (res.localChunkCount) { + if (res.percentLoaded) { + if (res.percentLoaded === percentLoaded && res.percentLoaded !== 100) { + timer = timer - 5 + } else { + timer = 24 + } + + if (timer < 0) { + clearInterval(intervalId) + } + + percentLoaded = res.percentLoaded + } + + this.status = res + + if (this.status.status === 'DOWNLOADED') { + await this.fetchResource() + } + } + + // check if progress is 100% and clear interval if true + if (res.status === 'READY') { + clearInterval(intervalId) + this.status = res + this.isReady = true + } + }, 5000) // 5 second interval + } + + async _fetchImage() { + try { + await this.fetchVideoUrl() + await this.fetchStatus() + } catch (error) { + /* empty */ + } + } + + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } } -customElements.define('avatar-component', AvatarComponent); +window.customElements.define('avatar-component', AvatarComponent) \ No newline at end of file diff --git a/core/src/components/friends-view/beginner-checklist.js b/core/src/components/friends-view/beginner-checklist.js index 4a688aed..8ef4bd6c 100644 --- a/core/src/components/friends-view/beginner-checklist.js +++ b/core/src/components/friends-view/beginner-checklist.js @@ -1,344 +1,214 @@ -import {css, html, LitElement} from 'lit'; -import {connect} from 'pwa-helpers'; - -import '@vaadin/item'; -import '@vaadin/list-box'; -import '@polymer/paper-icon-button/paper-icon-button.js'; -import '@polymer/iron-icons/iron-icons.js'; -import {store} from '../../store.js'; -import {setNewTab} from '../../redux/app/app-actions.js'; -import '@material/mwc-icon'; -import {get} from '../../../translate'; -import '../../../../plugins/plugins/core/components/TimeAgo.js'; -import '../notification-view/popover.js'; -import ShortUniqueId from 'short-unique-id'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { setNewTab } from '../../redux/app/app-actions' +import { get } from '../../../translate' +import { beginnerChecklistStyles } from '../../styles/core-css' +import ShortUniqueId from 'short-unique-id' +import '../notification-view/popover' +import '../../../../plugins/plugins/core/components/TimeAgo' +import '@material/mwc-icon' +import '@polymer/paper-icon-button/paper-icon-button.js' +import '@polymer/iron-icons/iron-icons.js' +import '@vaadin/item' +import '@vaadin/list-box' class BeginnerChecklist extends connect(store)(LitElement) { - static properties = { - notifications: { type: Array }, - showChecklist: { type: Boolean }, - theme: { type: String, reflect: true }, - isSynced: { type: Boolean }, - hasName: { type: Boolean }, - hasTourFinished: { type: Boolean }, - }; - - constructor() { - super(); - this.showChecklist = false; - this.initialFetch = false; - this.theme = localStorage.getItem('qortalTheme') - ? localStorage.getItem('qortalTheme') - : 'light'; - this.isSynced = false; - this.hasName = null; - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); - this.hasTourFinished = null; - this._controlTourFinished = this._controlTourFinished.bind(this); - this.uid = new ShortUniqueId(); + static get properties() { + return { + notifications: { type: Array }, + showChecklist: { type: Boolean }, + isSynced: { type: Boolean }, + hasName: { type: Boolean }, + hasTourFinished: { type: Boolean }, + theme: { type: String, reflect: true } + } } - _controlTourFinished() { - this.hasTourFinished = true; + static get styles() { + return [beginnerChecklistStyles] + } + + constructor() { + super() + this.showChecklist = false + this.initialFetch = false + this.isSynced = false + this.hasName = null + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() + this.hasTourFinished = null + this._controlTourFinished = this._controlTourFinished.bind(this) + this.uid = new ShortUniqueId() + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + } + + render() { + return this.hasName === false || this.hasTourFinished === false ? + html` +
    + +
    this._toggleChecklist()}> + + checklist + + +
    +
    +
    +
    +

    Are you synced?

    + ${this.syncPercentage === 100 ? + html` + + task_alt + + ` + : html` + + radio_button_unchecked + + ` + } +
    +
    { + store.dispatch( + setNewTab({ + url: `group-management`, + id: this.uid.rnd(), + myPlugObj: { + url: 'name-registration', + domain: 'core', + page: 'name-registration/index.html', + title: 'Name Registration', + icon: 'vaadin:user-check', + mwcicon: 'manage_accounts', + pluginNumber: 'plugin-qCmtXAQmtu', + menus: [], + parent: false + }, + openExisting: true + }) + ); + this.handleBlur(); + }} + > +

    Do you have a name registered?

    + ${this.hasName ? + html` + + task_alt + + ` : html` + + radio_button_unchecked + + ` + } +
    +
    +
    +
    + ` + : '' } firstUpdated() { - this.address = store.getState().app.selectedAddress.address; - this.hasTourFinished = JSON.parse( - localStorage.getItem(`hasViewedTour-${this.address}`) || 'null' - ); + this.address = store.getState().app.selectedAddress.address + this.hasTourFinished = JSON.parse(localStorage.getItem(`hasViewedTour-${this.address}`) || 'null') + } + + _controlTourFinished() { + this.hasTourFinished = true } connectedCallback() { - super.connectedCallback(); - window.addEventListener( - 'send-tour-finished', - this._controlTourFinished - ); + super.connectedCallback() + window.addEventListener('send-tour-finished', this._controlTourFinished) } disconnectedCallback() { - window.removeEventListener( - 'send-tour-finished', - this._controlTourFinished - ); - - super.disconnectedCallback(); + window.removeEventListener('send-tour-finished', this._controlTourFinished) + super.disconnectedCallback() } getNodeUrl() { - const myNode = - window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; - - return myNode.protocol + '://' + myNode.domain + ':' + myNode.port; + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return myNode.protocol + '://' + myNode.domain + ':' + myNode.port } + getMyNode() { - return window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; + return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] } async getName(recipient) { try { - if (!recipient) return ''; - const endpoint = `${this.nodeUrl}/names/address/${recipient}`; - const res = await fetch(endpoint); - const getNames = await res.json(); + if (!recipient) return '' - this.hasName = Array.isArray(getNames) && getNames.length > 0; + const endpoint = `${this.nodeUrl}/names/address/${recipient}` + const res = await fetch(endpoint) + const getNames = await res.json() + + this.hasName = Array.isArray(getNames) && getNames.length > 0 } catch (error) { - return ''; + return '' } } stateChanged(state) { - if ( - state.app.nodeStatus && - state.app.nodeStatus.syncPercent !== this.syncPercentage - ) { - this.syncPercentage = state.app.nodeStatus.syncPercent; + if (state.app.nodeStatus && state.app.nodeStatus.syncPercent !== this.syncPercentage) { + this.syncPercentage = state.app.nodeStatus.syncPercent - if ( - !this.hasAttempted && - state.app.selectedAddress && - state.app.nodeStatus.syncPercent === 100 - ) { - this.hasAttempted = true; - this.getName(state.app.selectedAddress.address); + if (!this.hasAttempted && state.app.selectedAddress && state.app.nodeStatus.syncPercent === 100) { + this.hasAttempted = true + this.getName(state.app.selectedAddress.address) } } - if ( - state.app.accountInfo && - state.app.accountInfo.names.length && - state.app.nodeStatus && - state.app.nodeStatus.syncPercent === 100 && - this.hasName === false && - this.hasAttempted && - state.app.accountInfo && - state.app.accountInfo.names && + + if (state.app.accountInfo && + state.app.accountInfo.names.length && state.app.nodeStatus && state.app.nodeStatus.syncPercent === 100 && + this.hasName === false && this.hasAttempted && state.app.accountInfo && state.app.accountInfo.names && state.app.accountInfo.names.length > 0 ) { - this.hasName = true; + this.hasName = true } } handleBlur() { setTimeout(() => { if (!this.shadowRoot.contains(document.activeElement)) { - this.showChecklist = false; + this.showChecklist = false } - }, 0); - } - - render() { - return this.hasName === false || this.hasTourFinished === false - ? html` -
    - -
    this._toggleChecklist()} - > - checklist - - -
    - -
    -
    -
    -

    Are you synced?

    - ${this.syncPercentage === 100 - ? html` - task_alt - ` - : html` - radio_button_unchecked - `} -
    - -
    { - store.dispatch( - setNewTab({ - url: `group-management`, - id: this.uid.rnd(), - myPlugObj: { - url: 'name-registration', - domain: 'core', - page: 'name-registration/index.html', - title: 'Name Registration', - icon: 'vaadin:user-check', - mwcicon: 'manage_accounts', - pluginNumber: - 'plugin-qCmtXAQmtu', - menus: [], - parent: false, - }, - openExisting: true, - }) - ); - this.handleBlur(); - }} - > -

    Do you have a name registered?

    - ${this.hasName - ? html` - task_alt - ` - : html` - radio_button_unchecked - `} -
    -
    -
    -
    - ` - : ''; + }, 0) } _toggleChecklist() { - this.showChecklist = !this.showChecklist; + this.showChecklist = !this.showChecklist + if (this.showChecklist) { requestAnimationFrame(() => { - this.shadowRoot.getElementById('checklist-panel').focus(); - }); + this.shadowRoot.getElementById('checklist-panel').focus() + }) } } - static styles = css` - .layout { - display: flex; - flex-direction: column; - align-items: center; - position: relative; - } + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } - .count { - position: absolute; - top: -5px; - right: -5px; - font-size: 12px; - background-color: red; - color: white; - border-radius: 50%; - width: 16px; - height: 16px; - display: flex; - align-items: center; - justify-content: center; - } + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } - .nocount { - display: none; - } - - .popover-panel { - position: absolute; - width: 200px; - padding: 10px; - background-color: var(--white); - border: 1px solid var(--black); - border-radius: 4px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - top: 40px; - max-height: 350px; - overflow: auto; - scrollbar-width: thin; - scrollbar-color: #6a6c75 #a1a1a1; - } - - .popover-panel::-webkit-scrollbar { - width: 11px; - } - - .popover-panel::-webkit-scrollbar-track { - background: #a1a1a1; - } - - .popover-panel::-webkit-scrollbar-thumb { - background-color: #6a6c75; - border-radius: 6px; - border: 3px solid #a1a1a1; - } - - .list { - display: flex; - flex-direction: column; - gap: 15px; - } - - .task-list-item { - display: flex; - gap: 15px; - justify-content: space-between; - align-items: center; - } - - .checklist-item { - padding: 5px; - border-bottom: 1px solid; - display: flex; - justify-content: space-between; - cursor: pointer; - transition: 0.2s all; - } - - .checklist-item:hover { - background: var(--nav-color-hover); - } - - p { - font-size: 16px; - color: var(--black); - margin: 0px; - padding: 0px; - } - `; + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -customElements.define('beginner-checklist', BeginnerChecklist); +window.customElements.define('beginner-checklist', BeginnerChecklist) \ No newline at end of file diff --git a/core/src/components/friends-view/computePowWorkerFile.src.js b/core/src/components/friends-view/computePowWorkerFile.src.js index b8bd962d..eb4cb775 100644 --- a/core/src/components/friends-view/computePowWorkerFile.src.js +++ b/core/src/components/friends-view/computePowWorkerFile.src.js @@ -1,91 +1,67 @@ -import {Sha256} from 'asmcrypto.js' +import { Sha256 } from 'asmcrypto.js' - -function sbrk(size, heap){ - let brk = 512 * 1024 // stack top - let old = brk - brk += size - - if (brk > heap.length) - throw new Error('heap exhausted') - - return old +function sbrk(size, heap) { + let brk = 512 * 1024 // stack top + let old = brk + brk += size + if (brk > heap.length) throw new Error('heap exhausted') + return old } - - - self.addEventListener('message', async e => { - const response = await computePow(e.data.convertedBytes, e.data.path) - postMessage(response) - + const response = await computePow(e.data.convertedBytes, e.data.path) + postMessage(response) }) - const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }) const heap = new Uint8Array(memory.buffer) - - const computePow = async (convertedBytes, path) => { + let response = null + await new Promise((resolve, reject) => { + const _convertedBytesArray = Object.keys(convertedBytes).map( + function (key) { + return convertedBytes[key] + } + ) + const convertedBytesArray = new Uint8Array(_convertedBytesArray) + const convertedBytesHash = new Sha256() + .process(convertedBytesArray) + .finish().result + const hashPtr = sbrk(32, heap) + const hashAry = new Uint8Array( + memory.buffer, + hashPtr, + 32 + ) + hashAry.set(convertedBytesHash) + const difficulty = 14 + const workBufferLength = 8 * 1024 * 1024 + const workBufferPtr = sbrk( + workBufferLength, + heap + ) + const importObject = { + env: { + memory: memory + } + } + function loadWebAssembly(filename, imports) { + return fetch(filename) + .then(response => response.arrayBuffer()) + .then(buffer => WebAssembly.compile(buffer)) + .then(module => { + return new WebAssembly.Instance(module, importObject) + }) + } + loadWebAssembly(path) + .then(wasmModule => { + response = { + nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), - - let response = null - - await new Promise((resolve, reject)=> { - - const _convertedBytesArray = Object.keys(convertedBytes).map( - function (key) { - return convertedBytes[key] - } -) -const convertedBytesArray = new Uint8Array(_convertedBytesArray) -const convertedBytesHash = new Sha256() - .process(convertedBytesArray) - .finish().result -const hashPtr = sbrk(32, heap) -const hashAry = new Uint8Array( - memory.buffer, - hashPtr, - 32 -) - -hashAry.set(convertedBytesHash) -const difficulty = 14 -const workBufferLength = 8 * 1024 * 1024 -const workBufferPtr = sbrk( - workBufferLength, - heap -) - - const importObject = { - env: { - memory: memory - }, - }; - - function loadWebAssembly(filename, imports) { - return fetch(filename) - .then(response => response.arrayBuffer()) - .then(buffer => WebAssembly.compile(buffer)) - .then(module => { - return new WebAssembly.Instance(module, importObject); - }); -} - - -loadWebAssembly(path) - .then(wasmModule => { - response = { - nonce : wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), - - } - resolve() - - }); - - - }) - - return response -} + } + resolve() + }) + }) + return response +} \ No newline at end of file diff --git a/core/src/components/friends-view/core-sync-status.js b/core/src/components/friends-view/core-sync-status.js index a4345671..8c695b4d 100644 --- a/core/src/components/friends-view/core-sync-status.js +++ b/core/src/components/friends-view/core-sync-status.js @@ -1,7 +1,8 @@ -import {css, html, LitElement} from 'lit' -import {store} from '../../store' -import {connect} from 'pwa-helpers' -import {translate} from '../../../translate' +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { translate } from '../../../translate' +import { coreSyncStatusStyles } from '../../styles/core-css' class CoreSyncStatus extends connect(store)(LitElement) { static get properties() { @@ -12,6 +13,10 @@ class CoreSyncStatus extends connect(store)(LitElement) { } } + static get styles() { + return [coreSyncStatusStyles] + } + constructor() { super() this.nodeInfos = [] @@ -19,69 +24,6 @@ class CoreSyncStatus extends connect(store)(LitElement) { this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' } - static get styles() { - return css` - .lineHeight { - line-height: 33%; - } - - .tooltip { - display: inline-block; - position: relative; - text-align: left; - } - - .tooltip .bottom { - min-width: 200px; - max-width: 250px; - top: 35px; - left: 50%; - transform: translate(-50%, 0); - padding: 10px 10px; - color: var(--black); - background-color: var(--white); - font-weight: normal; - font-size: 13px; - border-radius: 8px; - position: absolute; - z-index: 99999999; - box-sizing: border-box; - box-shadow: 0 1px 8px rgba(0,0,0,0.5); - border: 1px solid var(--black); - visibility: hidden; - opacity: 0; - transition: opacity 0.8s; - } - - .tooltip:hover .bottom { - visibility: visible; - opacity: 1; - } - - .tooltip .bottom i { - position: absolute; - bottom: 100%; - left: 50%; - margin-left: -12px; - width: 24px; - height: 12px; - overflow: hidden; - } - - .tooltip .bottom i::after { - content: ''; - position: absolute; - width: 12px; - height: 12px; - left: 50%; - transform: translate(-50%,50%) rotate(45deg); - background-color: var(--white); - border: 1px solid var(--black); - box-shadow: 0 1px 8px rgba(0,0,0,0.5); - } - ` - } - render() { return html`
    @@ -136,7 +78,7 @@ class CoreSyncStatus extends connect(store)(LitElement) {

    ${translate("walletprofile.wp3")}

    -

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0,12) : ''}

    +

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}

    ${translate("appinfo.synchronizing")}... ${this.nodeInfos.syncPercent !== undefined ? this.nodeInfos.syncPercent + '%' : ''}

    ${translate("appinfo.blockheight")}: ${this.nodeInfos.height ? this.nodeInfos.height : ''}

    ${translate("appinfo.peers")}: ${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}

    @@ -150,7 +92,7 @@ class CoreSyncStatus extends connect(store)(LitElement) {

    ${translate("walletprofile.wp3")}

    -

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0,12) : ''}

    +

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}

    ${translate("walletprofile.wp4")} ${translate("walletprofile.wp2")}

    ${translate("appinfo.blockheight")}: ${this.nodeInfos.height ? this.nodeInfos.height : ''}

    ${translate("appinfo.peers")}: ${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}

    @@ -164,7 +106,7 @@ class CoreSyncStatus extends connect(store)(LitElement) {

    ${translate("walletprofile.wp3")}

    -

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0,12) : ''}

    +

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}

    ${translate("walletprofile.wp4")} ${translate("walletprofile.wp2")}

    ${translate("appinfo.blockheight")}: ${this.nodeInfos.height ? this.nodeInfos.height : ''}

    ${translate("appinfo.peers")}: ${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}

    @@ -178,7 +120,7 @@ class CoreSyncStatus extends connect(store)(LitElement) {

    ${translate("walletprofile.wp3")}

    -

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0,12) : ''}

    +

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}

    ${translate("walletprofile.wp4")} ( ${translate("walletprofile.wp1")} )

    ${translate("appinfo.blockheight")}: ${this.nodeInfos.height ? this.nodeInfos.height : ''}

    ${translate("appinfo.peers")}: ${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}

    @@ -192,7 +134,7 @@ class CoreSyncStatus extends connect(store)(LitElement) {

    ${translate("walletprofile.wp3")}

    -

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0,12) : ''}

    +

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}

    ${translate("walletprofile.wp4")} ( ${translate("walletprofile.wp1")} )

    ${translate("appinfo.blockheight")}: ${this.nodeInfos.height ? this.nodeInfos.height : ''}

    ${translate("appinfo.peers")}: ${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}

    @@ -206,7 +148,7 @@ class CoreSyncStatus extends connect(store)(LitElement) {

    ${translate("walletprofile.wp3")}

    -

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0,12) : ''}

    +

    ${translate("appinfo.coreversion")}: ${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}

    ${translate("appinfo.synchronizing")}... ${this.nodeInfos.syncPercent !== undefined ? this.nodeInfos.syncPercent + '%' : ''}

    ${translate("appinfo.blockheight")}: ${this.nodeInfos.height ? this.nodeInfos.height : ''}

    ${translate("appinfo.peers")}: ${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}

    @@ -221,6 +163,20 @@ class CoreSyncStatus extends connect(store)(LitElement) { // ... } + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -customElements.define('core-sync-status', CoreSyncStatus) \ No newline at end of file +window.customElements.define('core-sync-status', CoreSyncStatus) \ No newline at end of file diff --git a/core/src/components/friends-view/feed-item.js b/core/src/components/friends-view/feed-item.js index 2410c5ff..07e11d64 100644 --- a/core/src/components/friends-view/feed-item.js +++ b/core/src/components/friends-view/feed-item.js @@ -1,366 +1,282 @@ -import {css, html, LitElement} from 'lit'; -import {translate,} from '../../../translate' +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { setNewTab } from '../../redux/app/app-actions' +import { RequestQueueWithPromise } from '../../../../plugins/plugins/utils/classes' +import { translate, } from '../../../translate' +import { feedItemStyles } from '../../styles/core-css' import axios from 'axios' -import '@material/mwc-menu'; -import '@material/mwc-list/mwc-list-item.js' -import {RequestQueueWithPromise} from '../../../../plugins/plugins/utils/queue'; +import ShortUniqueId from 'short-unique-id' import '../../../../plugins/plugins/core/components/TimeAgo' -import {connect} from 'pwa-helpers'; -import {store} from '../../store'; -import {setNewTab} from '../../redux/app/app-actions'; -import ShortUniqueId from 'short-unique-id'; - -const requestQueue = new RequestQueueWithPromise(3); -const requestQueueRawData = new RequestQueueWithPromise(3); -const requestQueueStatus = new RequestQueueWithPromise(3); +import '@material/mwc-menu' +import '@material/mwc-list/mwc-list-item.js' +const requestQueue = new RequestQueueWithPromise(3) +const requestQueueRawData = new RequestQueueWithPromise(3) +const requestQueueStatus = new RequestQueueWithPromise(3) export class FeedItem extends connect(store)(LitElement) { - static get properties() { - return { - resource: { type: Object }, - isReady: { type: Boolean}, - status: {type: Object}, - feedItem: {type: Object}, - appName: {type: String}, - link: {type: String} - }; - } - - static get styles() { - return css` - * { - --mdc-theme-text-primary-on-background: var(--black); - box-sizing: border-box; - } - :host { - width: 100%; - box-sizing: border-box; - } - img { - width:100%; - max-height:30vh; - border-radius: 5px; - cursor: pointer; - position: relative; - } - .smallLoading, - .smallLoading:after { - border-radius: 50%; - width: 2px; - height: 2px; - } - - .smallLoading { - border-width: 0.8em; - 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: 30px; - position: relative; - text-indent: -9999em; - transform: translateZ(0px); - animation: 1.1s linear 0s infinite normal none running loadingAnimation; - } - - .defaultSize { - width: 100%; - height: 160px; - } - .parent-feed-item { - position: relative; - display: flex; - background-color: var(--chat-bubble-bg); - flex-grow: 0; - flex-direction: column; - align-items: flex-start; - justify-content: center; - border-radius: 5px; - padding: 12px 15px 4px 15px; - min-width: 150px; - width: 100%; - box-sizing: border-box; - cursor: pointer; - font-size: 16px; - } - .avatar { - width: 36px; - height: 36px; - border-radius:50%; - overflow: hidden; - display:flex; - align-items:center; - } - .avatarApp { - width: 30px; - height: 30px; - border-radius:50%; - overflow: hidden; - display:flex; - align-items:center; - } - .feed-item-name { - user-select: none; - color: #03a9f4; - margin-bottom: 5px; + static get properties() { + return { + resource: { type: Object }, + isReady: { type: Boolean }, + status: { type: Object }, + feedItem: { type: Object }, + appName: { type: String }, + link: { type: String } + } } - .app-name { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - } + static get styles() { + return [feedItemStyles] + } - mwc-menu { - position: absolute; - } + constructor() { + super() + this.resource = { + identifier: "", + name: "", + service: "" + } + this.status = { + status: '' + } + this.isReady = false + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() + this.hasCalledWhenDownloaded = false + this.isFetching = false + this.uid = new ShortUniqueId() + this.observer = new IntersectionObserver(entries => { + for (const entry of entries) { + if (entry.isIntersecting && this.status.status !== 'READY') { + this._fetchImage() + // Stop observing after the image has started loading + this.observer.unobserve(this) + } + } + }) + this.feedItem = null + } + render() { + let avatarImg + const avatarUrl = `${this.nodeUrl}/arbitrary/THUMBNAIL/${this.resource.name}/qortal_avatar?async=true` + avatarImg = html`` + let avatarImgApp + const avatarUrl2 = `${this.nodeUrl}/arbitrary/THUMBNAIL/${this.appName}/qortal_avatar?async=true` + avatarImgApp = html`` + return html` +
    + ${this.status.status !== 'READY' ? + html` +
    +
    +

    + ${`${Math.round(this.status.percentLoaded || 0).toFixed(0)}% `}${translate('chatpage.cchange94')} +

    +
    + ` + : '' + } + ${this.status.status === 'READY' && this.feedItem ? + html` +
    +
    +
    ${avatarImg}
    + ${this.resource.name} +
    +
    +

    ${this.feedItem.title}

    +
    +
    +
    ${avatarImgApp}
    + +
    +
    + ` + : '' + } +
    + ` + } - @-webkit-keyframes loadingAnimation { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } + firstUpdated() { + this.observer.observe(this) + } - @keyframes loadingAnimation { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } - `; - } + getNodeUrl() { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return myNode.protocol + '://' + myNode.domain + ':' + myNode.port + } - constructor() { - super(); - this.resource = { - identifier: "", - name: "", - service: "" - } - this.status = { - status: '' - } - this.isReady = false - this.nodeUrl = this.getNodeUrl() - this.myNode = this.getMyNode() - this.hasCalledWhenDownloaded = false - this.isFetching = false - this.uid = new ShortUniqueId() + getMyNode() { + return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + } - this.observer = new IntersectionObserver(entries => { - for (const entry of entries) { - if (entry.isIntersecting && this.status.status !== 'READY') { - this._fetchImage(); - // Stop observing after the image has started loading - this.observer.unobserve(this); - } - } - }); - this.feedItem = null - } - getNodeUrl(){ - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + async fetchResource() { + try { + if (this.isFetching) return + this.isFetching = true + await axios.get(`${this.nodeUrl}/arbitrary/resource/properties/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`) + this.isFetching = false - return myNode.protocol + '://' + myNode.domain + ':' + myNode.port -} -getMyNode(){ - return window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] -} + } catch (error) { + this.isFetching = false + } + } - getApiKey() { - const myNode = - window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ]; - return myNode.apiKey; - } + async fetchVideoUrl() { + await this.fetchResource() + } - async fetchResource() { - try { - if(this.isFetching) return - this.isFetching = true - await axios.get(`${this.nodeUrl}/arbitrary/resource/properties/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`) - this.isFetching = false + async getRawData() { + const url = `${this.nodeUrl}/arbitrary/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` - } catch (error) { - this.isFetching = false - } - } + return await requestQueueRawData.enqueue(() => { + return axios.get(url) + }) + } - async fetchVideoUrl() { + updateDisplayWithPlaceholders(display, resource, rawdata) { + const pattern = /\$\$\{([a-zA-Z0-9_\.]+)\}\$\$/g - await this.fetchResource() + for (const key in display) { + const value = display[key] - } + display[key] = value.replace(pattern, (match, p1) => { + if (p1.startsWith('rawdata.')) { + const dataKey = p1.split('.')[1] + if (rawdata[dataKey] === undefined) { + console.error("rawdata key not found:", dataKey) + } + return rawdata[dataKey] || match + } else if (p1.startsWith('resource.')) { + const resourceKey = p1.split('.')[1] + if (resource[resourceKey] === undefined) { + console.error("resource key not found:", resourceKey) + } + return resource[resourceKey] || match + } + return match + }) + } + } - async getRawData(){ - const url = `${this.nodeUrl}/arbitrary/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}` - return await requestQueueRawData.enqueue(()=> { - return axios.get(url) - }) - // const response2 = await fetch(url, { - // method: 'GET', - // headers: { - // 'Content-Type': 'application/json' - // } - // }) + async fetchStatus() { + let isCalling = false + let percentLoaded = 0 + let timer = 24 - // const responseData2 = await response2.json() - // return responseData2 - } + const response = await requestQueueStatus.enqueue(() => { + return axios.get(`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`) + }) - updateDisplayWithPlaceholders(display, resource, rawdata) { - const pattern = /\$\$\{([a-zA-Z0-9_\.]+)\}\$\$/g; + if (response && response.data && response.data.status === 'READY') { + const rawData = await this.getRawData() - for (const key in display) { - const value = display[key]; + const object = { + ...this.resource.schema.display + } - display[key] = value.replace(pattern, (match, p1) => { - if (p1.startsWith('rawdata.')) { - const dataKey = p1.split('.')[1]; - if (rawdata[dataKey] === undefined) { - console.error("rawdata key not found:", dataKey); - } - return rawdata[dataKey] || match; - } else if (p1.startsWith('resource.')) { - const resourceKey = p1.split('.')[1]; - if (resource[resourceKey] === undefined) { - console.error("resource key not found:", resourceKey); - } - return resource[resourceKey] || match; - } - return match; - }); - } -} + this.updateDisplayWithPlaceholders(object, {}, rawData.data) + this.feedItem = object + this.status = response.data + return + } + const intervalId = setInterval(async () => { + if (isCalling) return + isCalling = true + const data = await requestQueue.enqueue(() => { + return axios.get(`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`) + }) - async fetchStatus(){ - let isCalling = false - let percentLoaded = 0 - let timer = 24 - const response = await requestQueueStatus.enqueue(()=> { - return axios.get(`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`) - }) - if(response && response.data && response.data.status === 'READY'){ - const rawData = await this.getRawData() - const object = { - ...this.resource.schema.display - } - this.updateDisplayWithPlaceholders(object, {},rawData.data) - this.feedItem = object - this.status = response.data + const res = data.data - return - } - const intervalId = setInterval(async () => { - if (isCalling) return - isCalling = true + isCalling = false + if (res.localChunkCount) { + if (res.percentLoaded) { + if (res.percentLoaded === percentLoaded && res.percentLoaded !== 100) { + timer = timer - 5 + } else { + timer = 24 + } + if (timer < 0) { + timer = 24 + isCalling = true + this.status = { + ...res, + status: 'REFETCHING' + } - const data = await requestQueue.enqueue(() => { - return axios.get(`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`) - }); - const res = data.data + setTimeout(() => { + isCalling = false + this.fetchResource() + }, 25000) - isCalling = false - if (res.localChunkCount) { - if (res.percentLoaded) { - if ( - res.percentLoaded === percentLoaded && - res.percentLoaded !== 100 - ) { - timer = timer - 5 - } else { - timer = 24 - } - if (timer < 0) { - timer = 24 - isCalling = true - this.status = { - ...res, - status: 'REFETCHING' - } + return + } + percentLoaded = res.percentLoaded + } - setTimeout(() => { - isCalling = false - this.fetchResource() - }, 25000) - return - } - percentLoaded = res.percentLoaded - } + this.status = res - this.status = res - if(this.status.status === 'DOWNLOADED'){ - await this.fetchResource() - } - } + if (this.status.status === 'DOWNLOADED') { + await this.fetchResource() + } + } - // check if progress is 100% and clear interval if true - if (res.status === 'READY') { - const rawData = await this.getRawData() - const object = { - ...this.resource.schema.display - } - this.updateDisplayWithPlaceholders(object, {},rawData.data) - this.feedItem = object - clearInterval(intervalId) - this.status = res - this.isReady = true - } - }, 5000) // 1 second interval - } + // check if progress is 100% and clear interval if true + if (res.status === 'READY') { + const rawData = await this.getRawData() + const object = { + ...this.resource.schema.display + } + this.updateDisplayWithPlaceholders(object, {}, rawData.data) + this.feedItem = object + clearInterval(intervalId) + this.status = res + this.isReady = true + } + }, 5000) // 5 second interval + } - async _fetchImage() { - try { - await this.fetchVideoUrl() - await this.fetchStatus() - } catch (error) { /* empty */ } - } + async _fetchImage() { + try { + await this.fetchVideoUrl() + await this.fetchStatus() + } catch (error) { /* empty */ } + } - firstUpdated(){ - this.observer.observe(this); + async goToFeedLink() { + try { + let newQuery = this.link + if (newQuery.endsWith('/')) { + newQuery = newQuery.slice(0, -1) + } + const res = await this.extractComponents(newQuery) + if (!res) return + const { service, name, identifier, path } = res + let query = `?service=${service}` + if (name) { + query = query + `&name=${name}` + } + if (identifier) { + query = query + `&identifier=${identifier}` + } + if (path) { + query = query + `&path=${path}` + } - } - - - - async goToFeedLink(){ - try { - let newQuery = this.link - if (newQuery.endsWith('/')) { - newQuery = newQuery.slice(0, -1) - } - const res = await this.extractComponents(newQuery) - if (!res) return - const { service, name, identifier, path } = res - let query = `?service=${service}` - if (name) { - query = query + `&name=${name}` - } - if (identifier) { - query = query + `&identifier=${identifier}` - } - if (path) { - query = query + `&path=${path}` - } - - store.dispatch(setNewTab({ + store.dispatch(setNewTab({ url: `qdn/browser/index.html${query}`, id: this.uid.rnd(), myPlugObj: { @@ -373,137 +289,72 @@ getMyNode(){ "menus": [], "parent": false }, - openExisting: true + openExisting: true })) - } catch (error) { - console.log({error}) - } - } + } catch (error) { + console.log({ error }) + } + } + async extractComponents(url) { + if (!url.startsWith("qortal://")) { + return null + } + url = url.replace(/^(qortal\:\/\/)/, "") - async extractComponents(url) { - if (!url.startsWith("qortal://")) { - return null - } + if (url.includes("/")) { + let parts = url.split("/") + const service = parts[0].toUpperCase() + parts.shift() + const name = parts[0] + parts.shift() + let identifier - url = url.replace(/^(qortal\:\/\/)/, "") - if (url.includes("/")) { - let parts = url.split("/") - const service = parts[0].toUpperCase() - parts.shift() - const name = parts[0] - parts.shift() - let identifier + if (parts.length > 0) { + identifier = parts[0] // Do not shift yet + // Check if a resource exists with this service, name and identifier combination + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port + const url = `${nodeUrl}/arbitrary/resource/status/${service}/${name}/${identifier}?apiKey=${myNode.apiKey}}` - if (parts.length > 0) { - identifier = parts[0] // Do not shift yet - // Check if a resource exists with this service, name and identifier combination - const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] - const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port - const url = `${nodeUrl}/arbitrary/resource/status/${service}/${name}/${identifier}?apiKey=${myNode.apiKey}}` + const res = await fetch(url); + const data = await res.json(); + if (data.totalChunkCount > 0) { + // Identifier exists, so don't include it in the path + parts.shift() + } + else { + identifier = null + } + } - const res = await fetch(url); - const data = await res.json(); - if (data.totalChunkCount > 0) { - // Identifier exists, so don't include it in the path - parts.shift() - } - else { - identifier = null - } - } + const path = parts.join("/") - const path = parts.join("/") + const components = {} + components["service"] = service + components["name"] = name + components["identifier"] = identifier + components["path"] = path + return components + } + return null + } - const components = {} - components["service"] = service - components["name"] = name - components["identifier"] = identifier - components["path"] = path - return components - } - return null + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } - - - - - - - - render() { - let avatarImg - const avatarUrl = `${this.nodeUrl}/arbitrary/THUMBNAIL/${this.resource.name}/qortal_avatar?async=true&apiKey=${this.myNode.apiKey}`; - avatarImg = html``; - let avatarImgApp - const avatarUrl2 = `${this.nodeUrl}/arbitrary/THUMBNAIL/${this.appName}/qortal_avatar?async=true&apiKey=${this.myNode.apiKey}`; - avatarImgApp = html``; - return html` -
    - ${ - this.status.status !== 'READY' - ? html` -
    -
    -

    ${`${Math.round(this.status.percentLoaded || 0 - ).toFixed(0)}% `}${translate('chatpage.cchange94')}

    -
    - ` - : '' - } - ${this.status.status === 'READY' && this.feedItem ? html` -
    -
    -
    - ${avatarImg}
    ${this.resource.name} -
    -
    -

    ${this.feedItem.title}

    -
    -
    -
    - ${avatarImgApp} -
    - -
    -
    - ` : ''} - -
    - - ` - - - } -} - -customElements.define('feed-item', FeedItem); +window.customElements.define('feed-item', FeedItem) \ No newline at end of file diff --git a/core/src/components/friends-view/friend-item-actions.js b/core/src/components/friends-view/friend-item-actions.js index 06b1217a..1f57893c 100644 --- a/core/src/components/friends-view/friend-item-actions.js +++ b/core/src/components/friends-view/friend-item-actions.js @@ -1,146 +1,42 @@ -// popover-component.js -import {css, html, LitElement} from 'lit'; -import {createPopper} from '@popperjs/core'; -import '@material/mwc-icon'; -import {translate} from '../../../translate' -import {store} from '../../store'; -import {connect} from 'pwa-helpers'; -import {setNewTab, setSideEffectAction} from '../../redux/app/app-actions'; -import ShortUniqueId from 'short-unique-id'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { createPopper } from '@popperjs/core' +import { setNewTab, setSideEffectAction } from '../../redux/app/app-actions' +import { translate } from '../../../translate' +import { friendItemActionsStyles } from '../../styles/core-css' +import ShortUniqueId from 'short-unique-id' +import '@material/mwc-icon' export class FriendItemActions extends connect(store)(LitElement) { - static styles = css` - :host { - display: none; - position: absolute; - background-color: var(--white); - border: 1px solid #ddd; - padding: 8px; - z-index: 10; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - color: var(--black); - max-width: 250px; - } - - .close-icon { - cursor: pointer; - float: right; - margin-left: 10px; - color: var(--black); - } - - .send-message-button { - font-family: Roboto, sans-serif; - letter-spacing: 0.3px; - font-weight: 300; - padding: 8px 5px; - border-radius: 3px; - text-align: center; - color: var(--mdc-theme-primary); - transition: all 0.3s ease-in-out; - display: flex; - align-items: center; - gap: 10px; - } - - .send-message-button:hover { - cursor: pointer; - background-color: #03a8f485; - } - .action-parent { - display: flex; - flex-direction: column; - width: 100%; - } - - div[tabindex='0']:focus { - outline: none; - } - `; - static get properties() { return { for: { type: String, reflect: true }, message: { type: String }, openEditFriend: { attribute: false }, name: { type: String }, - closeSidePanel: { attribute: false, type: Object }, - }; + closeSidePanel: { attribute: false, type: Object } + } + } + + static get styles() { + return [friendItemActionsStyles] } constructor() { - super(); - this.message = ''; - this.nodeUrl = this.getNodeUrl(); - this.uid = new ShortUniqueId(); - this.getUserAddress = this.getUserAddress.bind(this); - } - getNodeUrl() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - - return myNode.protocol + '://' + myNode.domain + ':' + myNode.port - } - - firstUpdated() { - // We'll defer the popper attachment to the openPopover() method to ensure target availability - } - - attachToTarget(target) { - if (!this.popperInstance && target) { - this.popperInstance = createPopper(target, this, { - placement: 'bottom', - }); - } - } - - openPopover(target) { - this.attachToTarget(target); - this.style.display = 'block'; - setTimeout(() => { - this.shadowRoot.getElementById('parent-div').focus(); - }, 50); - } - - closePopover() { - this.style.display = 'none'; - if (this.popperInstance) { - this.popperInstance.destroy(); - this.popperInstance = null; - } - this.requestUpdate(); - } - handleBlur() { - setTimeout(() => { - this.closePopover(); - }, 0); - } - - async getUserAddress() { - try { - const url = `${this.nodeUrl}/names/${this.name}`; - const res = await fetch(url); - const result = await res.json(); - if (result.error === 401) { - return ''; - } else { - return result.owner; - } - } catch (error) { - return ''; - } + super() + this.message = '' + this.nodeUrl = this.getNodeUrl() + this.uid = new ShortUniqueId() + this.getUserAddress = this.getUserAddress.bind(this) } render() { return html`
    - close + + close +
    - person + person ${translate('profile.profile18')}
    - `; + ` + } + + firstUpdated() { + // ... + } + + getNodeUrl() { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return myNode.protocol + '://' + myNode.domain + ':' + myNode.port + } + + attachToTarget(target) { + if (!this.popperInstance && target) { + this.popperInstance = createPopper(target, this, { + placement: 'bottom' + }) + } + } + + openPopover(target) { + this.attachToTarget(target) + this.style.display = 'block' + setTimeout(() => { + this.shadowRoot.getElementById('parent-div').focus() + }, 50) + } + + closePopover() { + this.style.display = 'none' + if (this.popperInstance) { + this.popperInstance.destroy() + this.popperInstance = null + } + this.requestUpdate() + } + + handleBlur() { + setTimeout(() => { + this.closePopover() + }, 0) + } + + async getUserAddress() { + try { + const url = `${this.nodeUrl}/names/${this.name}` + const res = await fetch(url) + const result = await res.json() + if (result.error === 401) { + return '' + } else { + return result.owner + } + } catch (error) { + return '' + } + } + + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } } -customElements.define('friend-item-actions', FriendItemActions); +window.customElements.define('friend-item-actions', FriendItemActions) diff --git a/core/src/components/friends-view/friends-feed.js b/core/src/components/friends-view/friends-feed.js index 597fa8e1..b20a18e2 100644 --- a/core/src/components/friends-view/friends-feed.js +++ b/core/src/components/friends-view/friends-feed.js @@ -1,476 +1,461 @@ -import {html, LitElement} from 'lit'; -import '@material/mwc-icon'; -import './friends-view' -import {friendsViewStyles} from './friends-view-css'; -import {connect} from 'pwa-helpers'; -import {store} from '../../store'; +import { html, LitElement } from 'lit' +import { store } from '../../store' +import { connect } from 'pwa-helpers' +import { translate } from '../../../translate' +import { friendsViewStyles } from '../../styles/core-css' import './feed-item' -import {translate} from '../../../translate' - +import './friends-view' +import '@material/mwc-icon' import '@polymer/paper-spinner/paper-spinner-lite.js' +const perEndpointCount = 20 +const totalDesiredCount = 100 +const maxResultsInMemory = 300 -const perEndpointCount = 20; -const totalDesiredCount = 100; -const maxResultsInMemory = 300; class FriendsFeed extends connect(store)(LitElement) { - static get properties() { + static get properties() { return { - feed: {type: Array}, - setHasNewFeed: {attribute:false}, - isLoading: {type: Boolean}, - hasFetched: {type: Boolean}, - mySelectedFeeds: {type: Array} - }; - } - constructor(){ - super() - this.feed = [] - this.feedToRender = [] - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); - this.endpoints = [] - this.endpointOffsets = [] // Initialize offsets for each endpoint to 0 - - this.loadAndMergeData = this.loadAndMergeData.bind(this) - this.hasInitialFetch = false - this.observerHandler = this.observerHandler.bind(this); - this.elementObserver = this.elementObserver.bind(this) - this.mySelectedFeeds = [] - this.getSchemas = this.getSchemas.bind(this) - this.hasFetched = false - this._updateFeeds = this._updateFeeds.bind(this) - + feed: { type: Array }, + setHasNewFeed: { attribute: false }, + isLoading: { type: Boolean }, + hasFetched: { type: Boolean }, + mySelectedFeeds: { type: Array } + } } static get styles() { - return [friendsViewStyles]; + return [friendsViewStyles] + } + + constructor() { + super() + this.feed = [] + this.feedToRender = [] + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() + this.endpoints = [] + this.endpointOffsets = [] // Initialize offsets for each endpoint to 0 + this.loadAndMergeData = this.loadAndMergeData.bind(this) + this.hasInitialFetch = false + this.observerHandler = this.observerHandler.bind(this) + this.elementObserver = this.elementObserver.bind(this) + this.mySelectedFeeds = [] + this.getSchemas = this.getSchemas.bind(this) + this.hasFetched = false + this._updateFeeds = this._updateFeeds.bind(this) + } + + render() { + return html` +
    +
    + ${this.isLoading ? html` +
    + +
    + ` : ''} + ${this.hasFetched && !this.isLoading && this.feed.length === 0 ? html` +
    +

    ${translate('friends.friend17')}

    +
    + ` : ''} + ${this.feedToRender.map((item) => { + return html` + + + ` + })} +
    +
    +
    + ` } + async firstUpdated() { + this.viewElement = this.shadowRoot.getElementById('viewElement') + this.downObserverElement = this.shadowRoot.getElementById('downObserver') + this.elementObserver() + + try { + await new Promise((res) => { + setTimeout(() => { + res() + }, 5000) + }) + + if (this.mySelectedFeeds.length === 0) { + await this.getEndpoints() + await this.loadAndMergeData() + } + + this.getFeedOnInterval() + } catch (error) { + console.log(error) + } + } getNodeUrl() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] return myNode.protocol + '://' + myNode.domain + ':' + myNode.port } + getMyNode() { - return store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] + return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] } - _updateFeeds(event) { + _updateFeeds(event) { this.mySelectedFeeds = event.detail - this.reFetchFeedData() - this.requestUpdate() + this.reFetchFeedData() + this.requestUpdate() } connectedCallback() { super.connectedCallback() - window.addEventListener('friends-my-selected-feeds-event', this._updateFeeds) } + window.addEventListener('friends-my-selected-feeds-event', this._updateFeeds) + } disconnectedCallback() { window.removeEventListener('friends-my-selected-feeds-event', this._updateFeeds) super.disconnectedCallback() } - async getSchemas(){ - this.mySelectedFeeds = JSON.parse(localStorage.getItem('friends-my-selected-feeds') || "[]") - const schemas = this.mySelectedFeeds - const getAllSchemas = (schemas || []).map( - async (schema) => { - try { - const url = `${this.nodeUrl}/arbitrary/${schema.service}/${schema.name}/${schema.identifier}`; - const res = await fetch(url) - const data = await res.json() - if(data.error) return false - return data - } catch (error) { - console.log(error); - return false - } - } - ); - const res = await Promise.all(getAllSchemas); - return res.filter((item)=> !!item) - } + async getSchemas() { + this.mySelectedFeeds = JSON.parse(localStorage.getItem('friends-my-selected-feeds') || "[]") + const schemas = this.mySelectedFeeds - getFeedOnInterval(){ - let interval = null; - let stop = false; - const getAnswer = async () => { - - if (!stop) { - stop = true; + const getAllSchemas = (schemas || []).map( + async (schema) => { try { - await this.reFetchFeedData() - } catch (error) {} - stop = false; + const url = `${this.nodeUrl}/arbitrary/${schema.service}/${schema.name}/${schema.identifier}` + const res = await fetch(url) + const data = await res.json() + if (data.error) return false + return data + } catch (error) { + console.log(error) + return false + } } - }; - interval = setInterval(getAnswer, 900000); + ) - } - - async getEndpoints(){ - const dynamicVars = { - - } - const schemas = await this.getSchemas() - const friendList = JSON.parse(localStorage.getItem('friends-my-friend-list') || "[]") - const names = friendList.map(friend => `name=${friend.name}`).join('&'); - if(names.length === 0){ - this.endpoints= [] - this.endpointOffsets = Array(this.endpoints.length).fill(0); - return - } - const baseurl = `${this.nodeUrl}/arbitrary/resources/search?reverse=true&mode=ALL&exactmatchnames=true&${names}` - let formEndpoints = [] - schemas.forEach((schema)=> { - const feedData = schema.feed[0] - if(feedData){ - const copyFeedData = {...feedData} - const fullUrl = constructUrl(baseurl, copyFeedData.search, dynamicVars); - if(fullUrl){ - formEndpoints.push({ - url: fullUrl, schemaName: schema.name, schema: copyFeedData - }) - } - } - - - }) - this.endpoints= formEndpoints - this.endpointOffsets = Array(this.endpoints.length).fill(0); - } - - async firstUpdated(){ - this.viewElement = this.shadowRoot.getElementById('viewElement'); - this.downObserverElement = - this.shadowRoot.getElementById('downObserver'); - this.elementObserver(); - - - try { - await new Promise((res)=> { - setTimeout(() => { - res() - }, 5000); - }) - if(this.mySelectedFeeds.length === 0){ - await this.getEndpoints() - -await this.loadAndMergeData(); - } - -this.getFeedOnInterval() - - } catch (error) { - console.log(error) - } + const res = await Promise.all(getAllSchemas) + return res.filter((item) => !!item) } - getMoreFeed(){ - if(!this.hasInitialFetch) return - if(this.feedToRender.length === this.feed.length ) return - this.feedToRender = this.feed.slice(0, this.feedToRender.length + 20) - this.requestUpdate() - } + getFeedOnInterval() { + let interval = null + let stop = false - async refresh(){ - try { - await this.getEndpoints() - await this.reFetchFeedData() - } catch (error) { + const getAnswer = async () => { + if (!stop) { + stop = true + try { + await this.reFetchFeedData() + } catch (error) { } + stop = false + } + } - } - } + interval = setInterval(getAnswer, 900000) + } + async getEndpoints() { + const dynamicVars = { } + const schemas = await this.getSchemas() + const friendList = JSON.parse(localStorage.getItem('friends-my-friend-list') || "[]") + const names = friendList.map(friend => `name=${friend.name}`).join('&') + + if (names.length === 0) { + this.endpoints = [] + this.endpointOffsets = Array(this.endpoints.length).fill(0) + return + } + + const baseurl = `${this.nodeUrl}/arbitrary/resources/search?reverse=true&mode=ALL&exactmatchnames=true&${names}` + let formEndpoints = [] + + schemas.forEach((schema) => { + const feedData = schema.feed[0] + if (feedData) { + const copyFeedData = { ...feedData } + const fullUrl = constructUrl(baseurl, copyFeedData.search, dynamicVars) + if (fullUrl) { + formEndpoints.push({ + url: fullUrl, schemaName: schema.name, schema: copyFeedData + }) + } + } + }) + + this.endpoints = formEndpoints + this.endpointOffsets = Array(this.endpoints.length).fill(0) + } + + getMoreFeed() { + if (!this.hasInitialFetch) return + if (this.feedToRender.length === this.feed.length) return + this.feedToRender = this.feed.slice(0, this.feedToRender.length + 20) + this.requestUpdate() + } + + async refresh() { + try { + await this.getEndpoints() + await this.reFetchFeedData() + } catch (error) { + + } + } elementObserver() { const options = { rootMargin: '0px', - threshold: 1, - }; + threshold: 1 + } + // identify an element to observe - const elementToObserve = this.downObserverElement; + const elementToObserve = this.downObserverElement + // passing it a callback function const observer = new IntersectionObserver( this.observerHandler, options - ); + ) + // call `observe()` on that MutationObserver instance, // passing it the element to observe, and the options object - observer.observe(elementToObserve); + observer.observe(elementToObserve) } observerHandler(entries) { if (!entries[0].isIntersecting) { - } else { if (this.feedToRender.length < 20) { - return; + return } - this.getMoreFeed(); + this.getMoreFeed() } } - async fetchDataFromEndpoint(endpointIndex, count) { - const offset = this.endpointOffsets[endpointIndex]; - const url = `${this.endpoints[endpointIndex].url}&limit=${count}&offset=${offset}`; - const res = await fetch(url) - const data = await res.json() - return data.map((i)=> { - return { - ...this.endpoints[endpointIndex], - ...i - } - }) + async fetchDataFromEndpoint(endpointIndex, count) { + const offset = this.endpointOffsets[endpointIndex] + const url = `${this.endpoints[endpointIndex].url}&limit=${count}&offset=${offset}` + const res = await fetch(url) + const data = await res.json() - } + return data.map((i) => { + return { + ...this.endpoints[endpointIndex], + ...i + } + }) + } + async initialLoad() { + let results = [] + let totalFetched = 0 + let i = 0 + let madeProgress = true + let exhaustedEndpoints = new Set() - async initialLoad() { - let results = []; - let totalFetched = 0; - let i = 0; - let madeProgress = true; - let exhaustedEndpoints = new Set(); + while (totalFetched < totalDesiredCount && madeProgress) { + madeProgress = false + this.isLoading = true + for (i = 0; i < this.endpoints.length; i++) { + if (exhaustedEndpoints.has(i)) { + continue + } - while (totalFetched < totalDesiredCount && madeProgress) { - madeProgress = false; - this.isLoading = true - for (i = 0; i < this.endpoints.length; i++) { - if (exhaustedEndpoints.has(i)) { - continue; - } + const remainingCount = totalDesiredCount - totalFetched - const remainingCount = totalDesiredCount - totalFetched; + // If we've already reached the desired count, break + if (remainingCount <= 0) { + break; + } - // If we've already reached the desired count, break - if (remainingCount <= 0) { - break; - } + let fetchCount = Math.min(perEndpointCount, remainingCount) + let data = await this.fetchDataFromEndpoint(i, fetchCount) - let fetchCount = Math.min(perEndpointCount, remainingCount); - let data = await this.fetchDataFromEndpoint(i, fetchCount); + // Increment the offset for this endpoint by the number of items fetched + this.endpointOffsets[i] += data.length - // Increment the offset for this endpoint by the number of items fetched - this.endpointOffsets[i] += data.length; + if (data.length > 0) { + madeProgress = true + } - if (data.length > 0) { - madeProgress = true; - } + if (data.length < fetchCount) { + exhaustedEndpoints.add(i) + } - if (data.length < fetchCount) { - exhaustedEndpoints.add(i); - } + results = results.concat(data) + totalFetched += data.length + } - results = results.concat(data); - totalFetched += data.length; - } + if (exhaustedEndpoints.size === this.endpoints.length) { + break + } + } - if (exhaustedEndpoints.size === this.endpoints.length) { - break; - } - } - this.isLoading = false - this.hasFetched = true; - // Trim the results if somehow they are over the totalDesiredCount - return results.slice(0, totalDesiredCount); - } + this.isLoading = false + this.hasFetched = true + // Trim the results if somehow they are over the totalDesiredCount + return results.slice(0, totalDesiredCount) + } + trimDataToLimit(data, limit) { + return data.slice(0, limit) + } + mergeData(newData, existingData) { + const existingIds = new Set(existingData.map(item => item.identifier)) // Assume each item has a unique 'id' + const uniqueNewData = newData.filter(item => !existingIds.has(item.identifier)) + return uniqueNewData.concat(existingData) + } + async addExtraData(data) { + let newData = [] + for (let item of data) { + let newItem = { + ...item, + schema: { + ...item.schema, + customParams: { ...item.schema.customParams } - trimDataToLimit(data, limit) { - return data.slice(0, limit); - } + } + } - mergeData(newData, existingData) { - const existingIds = new Set(existingData.map(item => item.identifier)); // Assume each item has a unique 'id' - const uniqueNewData = newData.filter(item => !existingIds.has(item.identifier)); - return uniqueNewData.concat(existingData); - } + let newResource = { + identifier: newItem.identifier, + service: newItem.service, + name: newItem.name + } + if (newItem.schema) { + const resource = newItem - async addExtraData(data){ - let newData = [] - for (let item of data) { - let newItem = { - ...item, - schema: { - ...item.schema, - customParams: {...item.schema.customParams} - - } - } - let newResource = { - identifier: newItem.identifier, - service: newItem.service, - name: newItem.name - } - if(newItem.schema){ - const resource = newItem - - let clickValue1 = newItem.schema.click; + let clickValue1 = newItem.schema.click; newItem.link = replacePlaceholders(clickValue1, resource, newItem.schema.customParams) - newData.push(newItem) - } - } - return newData + newData.push(newItem) + } + } + return newData + } - } - async reFetchFeedData() { - // Resetting offsets to start fresh. - this.endpointOffsets = Array(this.endpoints.length).fill(0); - await this.getEndpoints() - const oldIdentifiers = new Set(this.feed.map(item => item.identifier)); - const newData = await this.initialLoad(); + async reFetchFeedData() { + // Resetting offsets to start fresh. + this.endpointOffsets = Array(this.endpoints.length).fill(0) + await this.getEndpoints() + const oldIdentifiers = new Set(this.feed.map(item => item.identifier)) + const newData = await this.initialLoad() - // Filter out items that are already in the feed - const trulyNewData = newData.filter(item => !oldIdentifiers.has(item.identifier)); + // Filter out items that are already in the feed + const trulyNewData = newData.filter(item => !oldIdentifiers.has(item.identifier)) - if (trulyNewData.length > 0) { - // Adding extra data and merging with old data - const enhancedNewData = await this.addExtraData(trulyNewData); + if (trulyNewData.length > 0) { + // Adding extra data and merging with old data + const enhancedNewData = await this.addExtraData(trulyNewData) - // Merge new data with old data immutably - this.feed = [...enhancedNewData, ...this.feed]; - this.feed = this.removeDuplicates(this.feed) - this.feed.sort((a, b) => new Date(b.created) - new Date(a.created)); // Sort by timestamp, most recent first - this.feed = this.trimDataToLimit(this.feed, maxResultsInMemory); // Trim to the maximum allowed in memory - this.feedToRender = this.feed.slice(0, 20); - this.hasInitialFetch = true; + // Merge new data with old data immutably + this.feed = [...enhancedNewData, ...this.feed] + this.feed = this.removeDuplicates(this.feed) + this.feed.sort((a, b) => new Date(b.created) - new Date(a.created)) // Sort by timestamp, most recent first + this.feed = this.trimDataToLimit(this.feed, maxResultsInMemory) // Trim to the maximum allowed in memory + this.feedToRender = this.feed.slice(0, 20) + this.hasInitialFetch = true - const created = trulyNewData[0].created; - let value = localStorage.getItem('lastSeenFeed'); - if (((+value || 0) < created)) { - this.setHasNewFeed(true); - } - } - } - - - removeDuplicates(array) { - const seenIds = new Set(); - return array.filter(item => { - if (!seenIds.has(item.identifier)) { - seenIds.add(item.identifier); - return true; - } - return false; - }); - } - - - async loadAndMergeData() { - let allData = this.feed - const newData = await this.initialLoad(); - allData = await this.addExtraData(newData) - allData = this.mergeData(newData, allData); - allData.sort((a, b) => new Date(b.created) - new Date(a.created)); // Sort by timestamp, most recent first - allData = this.trimDataToLimit(allData, maxResultsInMemory); // Trim to the maximum allowed in memory - allData = this.removeDuplicates(allData) - this.feed = [...allData] - this.feedToRender = this.feed.slice(0,20) - this.hasInitialFetch = true - if(allData.length > 0){ - const created = allData[0].created - let value = localStorage.getItem('lastSeenFeed') + const created = trulyNewData[0].created + let value = localStorage.getItem('lastSeenFeed') if (((+value || 0) < created)) { this.setHasNewFeed(true) } - } - } - - - - - - render() { - return html` -
    -
    - ${this.isLoading ? html` -
    - -
    - ` : ''} - ${this.hasFetched && !this.isLoading && this.feed.length === 0 ? html` -
    -

    ${translate('friends.friend17')}

    -
    - ` : ''} - ${this.feedToRender.map((item) => { - return html``; - })} -
    -
    -
    - `; + } } + removeDuplicates(array) { + const seenIds = new Set() + return array.filter(item => { + if (!seenIds.has(item.identifier)) { + seenIds.add(item.identifier) + return true + } + return false + }) + } + + async loadAndMergeData() { + let allData = this.feed + const newData = await this.initialLoad(); + allData = await this.addExtraData(newData) + allData = this.mergeData(newData, allData); + allData.sort((a, b) => new Date(b.created) - new Date(a.created)); // Sort by timestamp, most recent first + allData = this.trimDataToLimit(allData, maxResultsInMemory); // Trim to the maximum allowed in memory + allData = this.removeDuplicates(allData) + this.feed = [...allData] + this.feedToRender = this.feed.slice(0, 20) + this.hasInitialFetch = true + if (allData.length > 0) { + const created = allData[0].created + let value = localStorage.getItem('lastSeenFeed') + if (((+value || 0) < created)) { + this.setHasNewFeed(true) + } + } + } + + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -customElements.define('friends-feed', FriendsFeed); +window.customElements.define('friends-feed', FriendsFeed) export function substituteDynamicVar(value, dynamicVars) { - if (typeof value !== 'string') return value; - - const pattern = /\$\$\{([a-zA-Z0-9_]+)\}\$\$/g; // Adjusted pattern to capture $${name}$$ with curly braces - - return value.replace(pattern, (match, p1) => { - return dynamicVars[p1] !== undefined ? dynamicVars[p1] : match; - }); + if (typeof value !== 'string') return value + const pattern = /\$\$\{([a-zA-Z0-9_]+)\}\$\$/g // Adjusted pattern to capture $${name}$$ with curly braces + return value.replace(pattern, (match, p1) => { + return dynamicVars[p1] !== undefined ? dynamicVars[p1] : match + }) } export function constructUrl(base, search, dynamicVars) { - let queryStrings = []; - - for (const [key, value] of Object.entries(search)) { - const substitutedValue = substituteDynamicVar(value, dynamicVars); - queryStrings.push(`${key}=${encodeURIComponent(substitutedValue)}`); - } - - return queryStrings.length > 0 ? `${base}&${queryStrings.join('&')}` : base; + let queryStrings = [] + for (const [key, value] of Object.entries(search)) { + const substitutedValue = substituteDynamicVar(value, dynamicVars) + queryStrings.push(`${key}=${encodeURIComponent(substitutedValue)}`) + } + return queryStrings.length > 0 ? `${base}&${queryStrings.join('&')}` : base } - - - - - - - export function replacePlaceholders(template, resource, customParams) { - const dataSource = { resource, customParams }; - - return template.replace(/\$\$\{(.*?)\}\$\$/g, (match, p1) => { - const keys = p1.split('.'); - let value = dataSource; - - for (let key of keys) { - if (value[key] !== undefined) { - value = value[key]; - } else { - return match; // Return placeholder unchanged - } - } - return value; - }); -} - - - - + const dataSource = { resource, customParams } + return template.replace(/\$\$\{(.*?)\}\$\$/g, (match, p1) => { + const keys = p1.split('.') + let value = dataSource + for (let key of keys) { + if (value[key] !== undefined) { + value = value[key] + } else { + return match // Return placeholder unchanged + } + } + return value + }) +} \ No newline at end of file diff --git a/core/src/components/friends-view/friends-side-panel-parent.js b/core/src/components/friends-view/friends-side-panel-parent.js index 42984e65..1af1c69e 100644 --- a/core/src/components/friends-view/friends-side-panel-parent.js +++ b/core/src/components/friends-view/friends-side-panel-parent.js @@ -1,68 +1,43 @@ -import {css, html, LitElement} from 'lit' +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { translate } from '../../../translate' +import { friendsSidePanelParentStyles } from '../../styles/core-css' +import './friends-side-panel' import '@material/mwc-icon' -import './friends-side-panel.js' import '@vaadin/tooltip' -import {translate} from '../../../translate' -class FriendsSidePanelParent extends LitElement { +class FriendsSidePanelParent extends connect(store)(LitElement) { static get properties() { return { - isOpen: {type: Boolean}, - hasNewFeed: {type: Boolean} + isOpen: { type: Boolean }, + hasNewFeed: { type: Boolean } } } + static get styles() { + return [friendsSidePanelParentStyles] + } + constructor() { super() this.isOpen = false this.hasNewFeed = false } - static styles = css` - .header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 16px; - border-bottom: 1px solid #e0e0e0; - } - - .content { - padding: 16px; - } - .close { - visibility: hidden; - position: fixed; - z-index: -100; - right: -1000px; - } - - .parent-side-panel { - transform: translateX(100%); /* start from outside the right edge */ - transition: transform 0.3s ease-in-out; - } - .parent-side-panel.open { - transform: translateX(0); /* slide in to its original position */ - - } - ` - - setHasNewFeed(val){ - this.hasNewFeed = val - } - render() { return html` { + @click=${() => { this.isOpen = !this.isOpen - if(this.isOpen && this.hasNewFeed) { + if (this.isOpen && this.hasNewFeed) { localStorage.setItem('lastSeenFeed', Date.now()) this.hasNewFeed = false this.shadowRoot.querySelector("friends-side-panel").selected = 'feed' } - }} style="color: ${this.hasNewFeed ? 'green' : 'var(--black)'}; cursor:pointer;user-select:none" + }} + style="color: ${this.hasNewFeed ? 'green' : 'var(--black)'}; cursor:pointer;user-select:none" > group @@ -72,12 +47,33 @@ class FriendsSidePanelParent extends LitElement { hover-delay=${400} hide-delay=${1} text=${translate('friends.friend12')} - > - - this.setHasNewFeed(val)} ?isOpen=${this.isOpen} .setIsOpen=${(val)=> this.isOpen = val}> - + > + this.setHasNewFeed(val)} ?isOpen=${this.isOpen} .setIsOpen=${(val) => this.isOpen = val}> ` } + + firstUpdated() { + // ... + } + + setHasNewFeed(val) { + this.hasNewFeed = val + } + + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -customElements.define('friends-side-panel-parent', FriendsSidePanelParent) +window.customElements.define('friends-side-panel-parent', FriendsSidePanelParent) \ No newline at end of file diff --git a/core/src/components/friends-view/friends-side-panel.js b/core/src/components/friends-view/friends-side-panel.js index 3e4a0370..11485887 100644 --- a/core/src/components/friends-view/friends-side-panel.js +++ b/core/src/components/friends-view/friends-side-panel.js @@ -1,158 +1,94 @@ -import {css, html, LitElement} from 'lit'; -import '@material/mwc-icon'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { translate } from '../../../translate' +import { friendsSidePanelStyles } from '../../styles/core-css' import './friends-view' import './friends-feed' -import {translate} from '../../../translate' +import '@material/mwc-icon' -class FriendsSidePanel extends LitElement { - static get properties() { +class FriendsSidePanel extends connect(store)(LitElement) { + static get properties() { return { - setIsOpen: { attribute: false}, - isOpen: {type: Boolean}, - selected: {type: String}, - setHasNewFeed: {attribute: false}, - closeSidePanel: {attribute: false, type: Object}, - openSidePanel: {attribute: false, type: Object} - }; + setIsOpen: { attribute: false }, + isOpen: { type: Boolean }, + selected: { type: String }, + setHasNewFeed: { attribute: false }, + closeSidePanel: { attribute: false, type: Object }, + openSidePanel: { attribute: false, type: Object } + } } - constructor(){ + static get styles() { + return [friendsSidePanelStyles] + } + + constructor() { super() this.selected = 'friends' this.closeSidePanel = this.closeSidePanel.bind(this) this.openSidePanel = this.openSidePanel.bind(this) - - } - - static styles = css` - :host { - display: block; - position: fixed; - top: 55px; - right: 0px; - width: 420px; - max-width: 95%; - height: calc(100vh - 55px); - background-color: var(--white); - border-left: 1px solid rgb(224, 224, 224); - z-index: 1; - transform: translateX(100%); /* start from outside the right edge */ - transition: transform 0.3s ease-in-out; - } - :host([isOpen]) { - transform: unset; /* slide in to its original position */ - } - - .header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 16px; - border-bottom: 1px solid #e0e0e0; - } - - .content { - padding: 16px; - display: flex; - flex-direction: column; - flex-grow: 1; - overflow: auto; - } - .content::-webkit-scrollbar-track { - background-color: whitesmoke; - border-radius: 7px; - } - - .content::-webkit-scrollbar { - width: 12px; - border-radius: 7px; - background-color: whitesmoke; - } - - .content::-webkit-scrollbar-thumb { - background-color: rgb(180, 176, 176); - border-radius: 7px; - transition: all 0.3s ease-in-out; - } - .parent { - display: flex; - flex-direction: column; - height: 100%; - } - - .active { - font-size: 16px; - background: var(--black); - color: var(--white); - padding: 5px; - border-radius: 2px; - cursor: pointer; - } - - .default { - font-size: 16px; - color: var(--black); - padding: 5px; - border-radius: 2px; - cursor: pointer; - } - - .default-content { - visibility: hidden; - position: absolute; - z-index: -50; - } - - `; - - refreshFeed(){ - - this.shadowRoot.querySelector('friends-feed').refresh() - - - } - - closeSidePanel(){ - this.setIsOpen(false) - } - openSidePanel(){ - this.setIsOpen(true) } render() { return html`
    -
    -
    - this.selected = 'friends'} class="${this.selected === 'friends' ? 'active' : 'default'}">${translate('friends.friend12')} - this.selected = 'feed'} class="${this.selected === 'feed' ? 'active' : 'default'}">${translate('friends.friend13')} -
    -
    - { - this.refreshFeed() - }} style="color: var(--black); cursor:pointer;">refresh - { - this.setIsOpen(false) - }}>close -
    - -
    -
    -
    - this.refreshFeed()}> +
    +
    + this.selected = 'friends'} class="${this.selected === 'friends' ? 'active' : 'default'}">${translate('friends.friend12')} + this.selected = 'feed'} class="${this.selected === 'feed' ? 'active' : 'default'}">${translate('friends.friend13')} +
    +
    + { this.refreshFeed(); }} style="color: var(--black); cursor:pointer;"> + refresh + + { this.setIsOpen(false); }}> + close + +
    -
    - this.setHasNewFeed(val)}> +
    +
    + this.refreshFeed()}> +
    +
    + this.setHasNewFeed(val)}> +
    - - - -
    -
    - `; + ` } + firstUpdated() { + // ... + } + + refreshFeed() { + this.shadowRoot.querySelector('friends-feed').refresh() + } + + closeSidePanel() { + this.setIsOpen(false) + } + + openSidePanel() { + this.setIsOpen(true) + } + + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -customElements.define('friends-side-panel', FriendsSidePanel); +window.customElements.define('friends-side-panel', FriendsSidePanel) \ No newline at end of file diff --git a/core/src/components/friends-view/friends-view-css.js b/core/src/components/friends-view/friends-view-css.js deleted file mode 100644 index aa3aa5be..00000000 --- a/core/src/components/friends-view/friends-view-css.js +++ /dev/null @@ -1,182 +0,0 @@ -import {css} from 'lit' - -export const friendsViewStyles = css` -* { - box-sizing: border-box; -} - .top-bar-icon { - cursor: pointer; - height: 18px; - width: 18px; - transition: 0.2s all; - } - - .top-bar-icon:hover { - color: var(--black); - } - - .modal-button { - font-family: Roboto, sans-serif; - font-size: 16px; - color: var(--mdc-theme-primary); - background-color: transparent; - padding: 8px 10px; - border-radius: 5px; - border: none; - transition: all 0.3s ease-in-out; - } - - .close-row { - width: 100%; - display: flex; - justify-content: flex-end; - height: 50px; - flex:0 - - } - - .container-body { - width: 100%; - display: flex; - flex-direction: column; - flex-grow: 1; - margin-top: 5px; - padding: 0px 6px; - box-sizing: border-box; - align-items: center; - gap: 10px; - } - - .container-body::-webkit-scrollbar-track { - background-color: whitesmoke; - border-radius: 7px; - } - - .container-body::-webkit-scrollbar { - width: 6px; - border-radius: 7px; - background-color: whitesmoke; - } - - .container-body::-webkit-scrollbar-thumb { - background-color: rgb(180, 176, 176); - border-radius: 7px; - transition: all 0.3s ease-in-out; - } - - .container-body::-webkit-scrollbar-thumb:hover { - background-color: rgb(148, 146, 146); - cursor: pointer; - } - - p { - color: var(--black); - margin: 0px; - padding: 0px; - word-break: break-all; - } - - .container { - display: flex; - width: 100%; - flex-direction: column; - height: 100%; - } - - .chat-right-panel-label { - font-family: Montserrat, sans-serif; - color: var(--group-header); - padding: 5px; - font-size: 13px; - user-select: none; - } - - .group-info { - display: flex; - flex-direction: column; - justify-content: flex-start; - gap: 10px; - } - - .group-name { - font-family: Raleway, sans-serif; - font-size: 20px; - color: var(--chat-bubble-msg-color); - text-align: center; - user-select: none; - } - - .group-description { - font-family: Roboto, sans-serif; - color: var(--chat-bubble-msg-color); - letter-spacing: 0.3px; - font-weight: 300; - font-size: 14px; - margin-top: 15px; - word-break: break-word; - user-select: none; - } - - .group-subheader { - font-family: Montserrat, sans-serif; - font-size: 14px; - color: var(--chat-bubble-msg-color); - } - - .group-data { - font-family: Roboto, sans-serif; - letter-spacing: 0.3px; - font-weight: 300; - font-size: 14px; - color: var(--chat-bubble-msg-color); - } - .search-results-div { - position: absolute; - top: 25px; - right: 25px; - } - - .name-input { - width: 100%; - outline: 0; - border-width: 0 0 2px; - border-color: var(--mdc-theme-primary); - background-color: transparent; - padding: 10px; - font-family: Roboto, sans-serif; - font-size: 15px; - color: var(--chat-bubble-msg-color); - box-sizing: border-box; - } - - .name-input::selection { - background-color: var(--mdc-theme-primary); - color: white; - } - - .name-input::placeholder { - opacity: 0.9; - color: var(--black); - } - - .search-field { - width: 100%; - position: relative; - } - - .search-icon { - position: absolute; - right: 3px; - color: var(--chat-bubble-msg-color); - transition: hover 0.3s ease-in-out; - background: none; - border-radius: 50%; - padding: 6px 3px; - font-size: 21px; - } - - .search-icon:hover { - cursor: pointer; - background: #d7d7d75c; - } -` diff --git a/core/src/components/friends-view/friends-view.js b/core/src/components/friends-view/friends-view.js index 94e4b128..6d320f39 100644 --- a/core/src/components/friends-view/friends-view.js +++ b/core/src/components/friends-view/friends-view.js @@ -1,22 +1,20 @@ -import {html, LitElement} from 'lit'; -import {connect} from 'pwa-helpers'; - -import '@material/mwc-button'; -import '@material/mwc-dialog'; -import '@polymer/paper-spinner/paper-spinner-lite.js'; -import '@polymer/paper-progress/paper-progress.js'; -import '@material/mwc-icon'; +import { html, LitElement } from 'lit' +import { store } from '../../store' +import { connect } from 'pwa-helpers' +import { parentEpml } from '../show-plugin' +import { translate } from '../../../translate' +import { friendsViewStyles } from '../../styles/core-css' +import './add-friends-modal' +import './ChatSideNavHeads' +import '../../../../plugins/plugins/core/components/ChatSearchResults' +import '@material/mwc-button' +import '@material/mwc-dialog' +import '@material/mwc-icon' +import '@polymer/paper-spinner/paper-spinner-lite.js' +import '@polymer/paper-progress/paper-progress.js' import '@vaadin/icon' import '@vaadin/icons' -import '@vaadin/button'; -import './ChatSideNavHeads'; -import '../../../../plugins/plugins/core/components/ChatSearchResults' -import './add-friends-modal' - -import {translate,} from '../../../translate' -import {store} from '../../store'; -import {friendsViewStyles} from './friends-view-css'; -import {parentEpml} from '../show-plugin'; +import '@vaadin/button' class FriendsView extends connect(store)(LitElement) { static get properties() { @@ -29,94 +27,159 @@ class FriendsView extends connect(store)(LitElement) { setUserName: { attribute: false }, friendList: { type: Array }, userSelected: { type: Object }, - isLoading: {type: Boolean}, - userFoundModalOpen: {type: Boolean}, - userFound: { type: Array}, - isOpenAddFriendsModal: {type: Boolean}, - editContent: {type: Object}, - mySelectedFeeds: {type: Array}, - refreshFeed: {attribute: false}, - closeSidePanel: {attribute: false, type: Object}, - openSidePanel: {attribute:false, type: Object} - }; + isLoading: { type: Boolean }, + userFoundModalOpen: { type: Boolean }, + userFound: { type: Array }, + isOpenAddFriendsModal: { type: Boolean }, + editContent: { type: Object }, + mySelectedFeeds: { type: Array }, + refreshFeed: { attribute: false }, + closeSidePanel: { attribute: false, type: Object }, + openSidePanel: { attribute: false, type: Object } + } } + static get styles() { - return [friendsViewStyles]; + return [friendsViewStyles] } constructor() { - super(); - this.error = false; - this.observerHandler = this.observerHandler.bind(this); - this.viewElement = ''; - this.downObserverElement = ''; - this.myAddress = - window.parent.reduxStore.getState().app.selectedAddress.address; - this.errorMessage = ''; - this.successMessage = ''; - this.friendList = []; - this.userSelected = {}; - this.isLoading = false; + super() + this.error = false + this.observerHandler = this.observerHandler.bind(this) + this.viewElement = '' + this.downObserverElement = '' + this.myAddress = store.getState().app.selectedAddress.address + this.errorMessage = '' + this.successMessage = '' + this.friendList = [] + this.userSelected = {} + this.isLoading = false this.userFoundModalOpen = false - this.userFound = []; - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); + this.userFound = [] + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() this.isOpenAddFriendsModal = false this.editContent = null this.addToFriendList = this.addToFriendList.bind(this) this._updateFriends = this._updateFriends.bind(this) this._updateFeed = this._updateFeed.bind(this) this._addFriend = this._addFriend.bind(this) + } + render() { + return html` +
    +
    +

    My Friends

    +
    + { + if (e.key === 'Enter') { + this.userSearch() + } + }} + > + + +
    +
    + { + this.userSelected = result; + this.isOpenAddFriendsModal = true + this.userFound = []; + this.userFoundModalOpen = false; + }} + .closeFunc=${() => { + this.userFoundModalOpen = false; + this.userFound = []; + }} + .searchResults=${this.userFound} + ?isOpen=${this.userFoundModalOpen} + ?loading=${this.isLoading} + > + +
    + ${this.friendList.map((item) => { + return html` + { }} + .chatInfo=${item} + .openEditFriend=${(val) => this.openEditFriend(val)} + .closeSidePanel=${this.closeSidePanel} + > + + ` + })} +
    +
    +
    + { + this.isOpenAddFriendsModal = val + }} + .userSelected=${this.userSelected} + .onSubmit=${(val, isRemove) => this.addToFriendList(val, isRemove)} + .editContent=${this.editContent} + .onClose=${() => this.onClose()} + .mySelectedFeeds=${this.mySelectedFeeds} + > + + ` + } + + firstUpdated() { + this.viewElement = this.shadowRoot.getElementById('viewElement') + this.downObserverElement = this.shadowRoot.getElementById('downObserver') + this.elementObserver() + this.mySelectedFeeds = JSON.parse(localStorage.getItem('friends-my-selected-feeds') || "[]") + this.friendList = JSON.parse(localStorage.getItem('friends-my-friend-list') || "[]") } getNodeUrl() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] return myNode.protocol + '://' + myNode.domain + ':' + myNode.port } + getMyNode() { - return store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] + return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] } - getMoreFriends() {} - - firstUpdated() { - this.viewElement = this.shadowRoot.getElementById('viewElement'); - this.downObserverElement = - this.shadowRoot.getElementById('downObserver'); - this.elementObserver(); - this.mySelectedFeeds = JSON.parse(localStorage.getItem('friends-my-selected-feeds') || "[]") - this.friendList = JSON.parse(localStorage.getItem('friends-my-friend-list') || "[]") - - - - - } + getMoreFriends() { } _updateFriends(event) { this.friendList = event.detail } + _updateFeed(event) { this.mySelectedFeeds = event.detail this.requestUpdate() } - _addFriend(event){ - const name = event.detail; - const findFriend = this.friendList.find((friend)=> friend.name === name) - if(findFriend){ - this.editContent = {...findFriend, mySelectedFeeds: this.mySelectedFeeds} - this.userSelected = findFriend; + _addFriend(event) { + const name = event.detail; + const findFriend = this.friendList.find((friend) => friend.name === name) + if (findFriend) { + this.editContent = { ...findFriend, mySelectedFeeds: this.mySelectedFeeds } + this.userSelected = findFriend } else { this.userSelected = { name - }; + } } this.isOpenAddFriendsModal = true @@ -134,7 +197,6 @@ class FriendsView extends connect(store)(LitElement) { window.removeEventListener('friends-my-friend-list-event', this._updateFriends) window.removeEventListener('friends-my-selected-feeds-event', this._updateFeed) window.removeEventListener('add-friend', this._addFriend) - super.disconnectedCallback() } @@ -142,18 +204,21 @@ class FriendsView extends connect(store)(LitElement) { const options = { root: this.viewElement, rootMargin: '0px', - threshold: 1, - }; + threshold: 1 + } + // identify an element to observe - const elementToObserve = this.downObserverElement; + const elementToObserve = this.downObserverElement + // passing it a callback function const observer = new IntersectionObserver( this.observerHandler, options - ); + ) + // call `observe()` on that MutationObserver instance, // passing it the element to observe, and the options object - observer.observe(elementToObserve); + observer.observe(elementToObserve) } observerHandler(entries) { @@ -163,112 +228,121 @@ class FriendsView extends connect(store)(LitElement) { if (this.friendList.length < 20) { return; } - this.getMoreFriends(); + + this.getMoreFriends() } } async userSearch() { const nameValue = this.shadowRoot.getElementById('sendTo').value - if(!nameValue) { + + if (!nameValue) { + this.userFound = [] + this.userFoundModalOpen = true + return; + } + + try { + const url = `${this.nodeUrl}/names/${nameValue}` + const res = await fetch(url) + const result = await res.json() + + if (result.error === 401) { this.userFound = [] - this.userFoundModalOpen = true - return; - } - try { - const url = `${this.nodeUrl}/names/${nameValue}` - const res = await fetch(url) - const result = await res.json() - if (result.error === 401) { - this.userFound = [] - } else { - this.userFound = [ - result - ]; - } - this.userFoundModalOpen = true; - } catch (error) { - // let err4string = get("chatpage.cchange35"); - // parentEpml.request('showSnackBar', `${err4string}`) + } else { + this.userFound = [ + result + ] } + + this.userFoundModalOpen = true; + } catch (error) { + // let err4string = get("chatpage.cchange35") + // parentEpml.request('showSnackBar', `${err4string}`) } + } - getApiKey() { - const apiNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return apiNode.apiKey - } + async myFollowName(name) { + let items = [ + name + ] - async myFollowName(name) { - let items = [ - name - ] - let namesJsonString = JSON.stringify({ "items": items }) + let namesJsonString = JSON.stringify({ "items": items }) - return await parentEpml.request('apiCall', { - url: `/lists/followedNames?apiKey=${this.getApiKey()}`, - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: `${namesJsonString}` - }) - } + return await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}`, + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + } - async unFollowName(name) { - let items = [ - name - ] - let namesJsonString = JSON.stringify({ "items": items }) + async unFollowName(name) { + let items = [ + name + ] - return await parentEpml.request('apiCall', { - url: `/lists/followedNames?apiKey=${this.getApiKey()}`, - method: 'DELETE', - headers: { - 'Content-Type': 'application/json' - }, - body: `${namesJsonString}` - }) - } - async addToFriendList(val, isRemove){ - const copyVal = {...val} + let namesJsonString = JSON.stringify({ "items": items }) + + return await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}`, + method: 'DELETE', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + } + + async addToFriendList(val, isRemove) { + const copyVal = { ...val } delete copyVal.mySelectedFeeds - if(isRemove){ - this.friendList = this.friendList.filter((item)=> item.name !== copyVal.name) - }else if(this.editContent){ - const findFriend = this.friendList.findIndex(item=> item.name === copyVal.name) - if(findFriend !== -1){ + + if (isRemove) { + this.friendList = this.friendList.filter((item) => item.name !== copyVal.name) + } else if (this.editContent) { + const findFriend = this.friendList.findIndex(item => item.name === copyVal.name) + if (findFriend !== -1) { const copyList = [...this.friendList] copyList[findFriend] = copyVal this.friendList = copyList } - } else { this.friendList = [...this.friendList, copyVal] } - if(!copyVal.willFollow || isRemove) { + + if (!copyVal.willFollow || isRemove) { await this.unFollowName(copyVal.name) - } else if(copyVal.willFollow){ + } else if (copyVal.willFollow) { await this.myFollowName(copyVal.name) } + this.setMySelectedFeeds(val.mySelectedFeeds) - await new Promise((res)=> { - setTimeout(()=> { + + await new Promise((res) => { + setTimeout(() => { res() - },50) + }, 50) }) - this.userSelected = {}; + + this.userSelected = {} this.shadowRoot.getElementById('sendTo').value = '' - this.isLoading = false; + this.isLoading = false this.isOpenAddFriendsModal = false this.editContent = null this.setMyFriends(this.friendList) - if(!isRemove && this.friendList.length === 1){ + + if (!isRemove && this.friendList.length === 1) { this.refreshFeed() } } - setMyFriends(friendList){ + + setMyFriends(friendList) { localStorage.setItem('friends-my-friend-list', JSON.stringify(friendList)); - const tempSettingsData= JSON.parse(localStorage.getItem('temp-settings-data') || "{}") + const tempSettingsData = JSON.parse(localStorage.getItem('temp-settings-data') || "{}") const newTemp = { ...tempSettingsData, userLists: { @@ -277,18 +351,20 @@ class FriendsView extends connect(store)(LitElement) { } } - localStorage.setItem('temp-settings-data', JSON.stringify(newTemp)); + localStorage.setItem('temp-settings-data', JSON.stringify(newTemp)) + this.dispatchEvent( new CustomEvent('temp-settings-data-event', { - bubbles: true, - composed: true - }), - ); - + bubbles: true, + composed: true + }) + ) } - setMySelectedFeeds(mySelectedFeeds){ + + setMySelectedFeeds(mySelectedFeeds) { this.mySelectedFeeds = mySelectedFeeds - const tempSettingsData= JSON.parse(localStorage.getItem('temp-settings-data') || "{}") + const tempSettingsData = JSON.parse(localStorage.getItem('temp-settings-data') || "{}") + const newTemp = { ...tempSettingsData, friendsFeed: { @@ -297,98 +373,37 @@ class FriendsView extends connect(store)(LitElement) { } } - localStorage.setItem('temp-settings-data', JSON.stringify(newTemp)); - localStorage.setItem('friends-my-selected-feeds', JSON.stringify(mySelectedFeeds)); - } - openEditFriend(val){ - this.isOpenAddFriendsModal = true - this.userSelected = val - this.editContent = {...val, mySelectedFeeds: this.mySelectedFeeds} + localStorage.setItem('temp-settings-data', JSON.stringify(newTemp)) + localStorage.setItem('friends-my-selected-feeds', JSON.stringify(mySelectedFeeds)) } - onClose(){ + openEditFriend(val) { + this.isOpenAddFriendsModal = true + this.userSelected = val + this.editContent = { ...val, mySelectedFeeds: this.mySelectedFeeds } + } + + onClose() { this.isLoading = false; this.isOpenAddFriendsModal = false this.editContent = null this.userSelected = {} } - render() { - return html` -
    -
    -

    My Friends

    -
    - { - if(e.key === 'Enter'){ - this.userSearch() - } - }} - /> + // Standard functions + getApiKey() { + const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + return coreNode.apiKey + } - - + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } -
    -
    - { - this.userSelected = result; - this.isOpenAddFriendsModal = true - - this.userFound = []; - this.userFoundModalOpen = false; - }} - .closeFunc=${() => { - this.userFoundModalOpen = false; - this.userFound = []; - }} - .searchResults=${this.userFound} - ?isOpen=${this.userFoundModalOpen} - ?loading=${this.isLoading}> - -
    - - - ${this.friendList.map((item) => { - return html` { - - }} - .chatInfo=${item} - .openEditFriend=${(val)=> this.openEditFriend(val)} - .closeSidePanel=${this.closeSidePanel} - >`; - })} -
    -
    -
    - { - this.isOpenAddFriendsModal = val - }} - .userSelected=${this.userSelected} - .onSubmit=${(val, isRemove)=> this.addToFriendList(val, isRemove)} - .editContent=${this.editContent} - .onClose=${()=> this.onClose()} - .mySelectedFeeds=${this.mySelectedFeeds} - > - - `; + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } } -customElements.define('friends-view', FriendsView); +window.customElements.define('friends-view', FriendsView) \ No newline at end of file diff --git a/core/src/components/friends-view/profile-modal-update.js b/core/src/components/friends-view/profile-modal-update.js index 8e1418bf..9f84c738 100644 --- a/core/src/components/friends-view/profile-modal-update.js +++ b/core/src/components/friends-view/profile-modal-update.js @@ -1,14 +1,15 @@ -import {css, html, LitElement} from 'lit'; -import {get, translate} from '../../../translate' -import '@material/mwc-button'; -import '@material/mwc-icon'; -import '@vaadin/tooltip'; -import '@material/mwc-dialog'; -import '@material/mwc-checkbox'; -import {connect} from 'pwa-helpers'; -import {store} from '../../store'; -import '@polymer/paper-spinner/paper-spinner-lite.js'; -import {parentEpml} from '../show-plugin'; +import { html, LitElement } from 'lit' +import { connect } from 'pwa-helpers' +import { store } from '../../store' +import { parentEpml } from '../show-plugin' +import { get, translate } from '../../../translate' +import { profileModalUpdateStyles } from '../../styles/core-css' +import '@material/mwc-button' +import '@material/mwc-checkbox' +import '@material/mwc-dialog' +import '@material/mwc-icon' +import '@polymer/paper-spinner/paper-spinner-lite.js' +import '@vaadin/tooltip' class ProfileModalUpdate extends connect(store)(LitElement) { static get properties() { @@ -25,420 +26,57 @@ class ProfileModalUpdate extends connect(store)(LitElement) { hasFetchedArrr: { type: Boolean }, isOpenCustomDataModal: { type: Boolean }, customData: { type: Object }, - newCustomDataField: {type: Object}, - newFieldName: {type: String}, - qortalRequestCustomData: {type: Object}, - newCustomDataKey: {type: String}, - newCustomDataValue: {type: String}, - isSaving: {type: Boolean} - }; + newCustomDataField: { type: Object }, + newFieldName: { type: String }, + qortalRequestCustomData: { type: Object }, + newCustomDataKey: { type: String }, + newCustomDataValue: { type: String }, + isSaving: { type: Boolean } + } + } + + static get styles() { + return [profileModalUpdateStyles] } constructor() { super(); - this.isOpen = false; - this.isLoading = false; - this.nodeUrl = this.getNodeUrl(); - this.myNode = this.getMyNode(); - this.tagline = ''; - this.bio = ''; - this.walletList = ['btc', 'ltc', 'doge', 'dgb', 'rvn', 'arrr']; - let wallets = {}; + this.isOpen = false + this.isLoading = false + this.nodeUrl = this.getNodeUrl() + this.myNode = this.getMyNode() + this.tagline = '' + this.bio = '' + this.walletList = ['btc', 'ltc', 'doge', 'dgb', 'rvn', 'arrr'] + let wallets = {} this.walletList.forEach((item) => { - wallets[item] = ''; - }); - this.wallets = wallets; - this.walletsUi = new Map(); + wallets[item] = '' + }) + this.wallets = wallets + this.walletsUi = new Map() let coinProp = { - wallet: null, - }; - + wallet: null + } this.walletList.forEach((c, i) => { - this.walletsUi.set(c, { ...coinProp }); - }); - this.walletsUi.get('btc').wallet = - window.parent.reduxStore.getState().app.selectedAddress.btcWallet; - this.walletsUi.get('ltc').wallet = - window.parent.reduxStore.getState().app.selectedAddress.ltcWallet; - this.walletsUi.get('doge').wallet = - window.parent.reduxStore.getState().app.selectedAddress.dogeWallet; - this.walletsUi.get('dgb').wallet = - window.parent.reduxStore.getState().app.selectedAddress.dgbWallet; - this.walletsUi.get('rvn').wallet = - window.parent.reduxStore.getState().app.selectedAddress.rvnWallet; - this.hasFetchedArrr = false; - this.isOpenCustomDataModal = false; - this.customData = {}; - this.newCustomDataKey = ""; - this.newCustomDataValue = ""; - this.newCustomDataField = {}; - this.newFieldName = ''; - this.isSaving = false; - this.addPrivate = this.addPrivate.bind(this); - this.checkForPrivate = this.checkForPrivate.bind(this); - } - - static get styles() { - return css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --mdc-theme-surface: var(--white); - --mdc-dialog-content-ink-color: var(--black); - --mdc-dialog-min-width: 400px; - --mdc-dialog-max-width: 1024px; - box-sizing: border-box; - } - .input { - width: 90%; - outline: 0; - border-width: 0 0 2px; - border-color: var(--mdc-theme-primary); - background-color: transparent; - padding: 10px; - font-family: Roboto, sans-serif; - font-size: 15px; - color: var(--chat-bubble-msg-color); - box-sizing: border-box; - } - .input::selection { - background-color: var(--mdc-theme-primary); - color: white; - } - - .input::placeholder { - opacity: 0.6; - color: var(--black); - } - - .modal-button { - font-family: Roboto, sans-serif; - font-size: 16px; - color: var(--mdc-theme-primary); - background-color: transparent; - padding: 8px 10px; - border-radius: 5px; - border: none; - transition: all 0.3s ease-in-out; - } - - .modal-button-red { - font-family: Roboto, sans-serif; - font-size: 16px; - color: #f44336; - background-color: transparent; - padding: 8px 10px; - border-radius: 5px; - border: none; - transition: all 0.3s ease-in-out; - } - - .modal-button-red:hover { - cursor: pointer; - background-color: #f4433663; - } - - .modal-button:hover { - cursor: pointer; - background-color: #03a8f475; - } - .checkbox-row { - position: relative; - display: flex; - align-items: center; - align-content: center; - font-family: Montserrat, sans-serif; - font-weight: 600; - color: var(--black); - } - .modal-overlay { - display: block; - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba( - 0, - 0, - 0, - 0.5 - ); /* Semi-transparent backdrop */ - z-index: 1000; - } - - .modal-content { - position: fixed; - top: 50vh; - left: 50vw; - transform: translate(-50%, -50%); - background-color: var(--mdc-theme-surface); - width: 80vw; - padding: 20px; - box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px; - z-index: 1001; - border-radius: 5px; - display: flex; - flex-direction: column; - } - - .modal-overlay.hidden { - display: none; - } - - .avatar { - width: 36px; - height: 36px; - display: flex; - align-items: center; - } - - .app-name { - display: flex; - gap: 20px; - align-items: center; - width: 100%; - cursor: pointer; - padding: 5px; - border-radius: 5px; - margin-bottom: 10px; - } - .inner-content { - display: flex; - flex-direction: column; - max-height: 75vh; - flex-grow: 1; - overflow: auto; - } - - .inner-content::-webkit-scrollbar-track { - background-color: whitesmoke; - border-radius: 7px; - } - - .inner-content::-webkit-scrollbar { - width: 12px; - border-radius: 7px; - background-color: whitesmoke; - } - - .inner-content::-webkit-scrollbar-thumb { - background-color: rgb(180, 176, 176); - border-radius: 7px; - transition: all 0.3s ease-in-out; - } - - .checkbox-row { - position: relative; - display: flex; - align-items: center; - align-content: center; - font-family: Montserrat, sans-serif; - font-weight: 600; - color: var(--black); - } - `; - } - - async updated(changedProperties) { - if ( - changedProperties && - changedProperties.has('editContent') && - this.editContent - ) { - const {bio, tagline, wallets, customData} = this.editContent - this.bio = bio ?? ''; - this.tagline = tagline ?? ''; - let formWallets = {...this.wallets} - if(wallets && Object.keys(wallets).length){ - Object.keys(formWallets).forEach((key)=> { - if(wallets[key]){ - formWallets[key] = wallets[key] - } - }) - } - this.wallets = formWallets - - this.customData = {...customData} - this.requestUpdate(); - } - if ( - changedProperties && - changedProperties.has('qortalRequestCustomData') && - this.qortalRequestCustomData - ) { - this.isOpenCustomDataModal = true - this.newCustomDataField = {...this.qortalRequestCustomData.payload.customData} - this.newCustomDataKey = this.qortalRequestCustomData.property - this.requestUpdate(); - } - - - } - - async firstUpdated() { - try { - await this.fetchWalletAddress('arrr'); - } catch (error) { - console.log({ error }); - } finally { - } - } - - async fetchWalletAddress(coin) { - switch (coin) { - case 'arrr': - const arrrWalletName = `${coin}Wallet`; - - let res = await parentEpml.request('apiCall', { - url: `/crosschain/${coin}/walletaddress?apiKey=${this.myNode.apiKey}`, - method: 'POST', - body: `${ - window.parent.reduxStore.getState().app.selectedAddress[ - arrrWalletName - ].seed58 - }`, - }); - if (res != null && res.error != 1201 && res.length === 78) { - this.arrrWalletAddress = res; - this.hasFetchedArrr = true; - } - break; - - default: - // Not used for other coins yet - break; - } - } - - async getSelectedWalletAddress(wallet) { - switch (wallet) { - case 'arrr': - if(!this.arrrWalletAddress){ - try { - await this.fetchWalletAddress('arrr'); - } catch (error) { - console.log({error}) - } - } - // Use address returned by core API - return this.arrrWalletAddress; - - default: - // Use locally derived address - return this.walletsUi.get(wallet).wallet.address; - } - } - - getNodeUrl() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - - return myNode.protocol + '://' + myNode.domain + ':' + myNode.port - } - getMyNode() { - return store.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - } - - clearFields() { - this.bio = ''; - this.tagline = ''; - } - - async fillAddress(coin) { - const address = await this.getSelectedWalletAddress(coin); - if (address) { - this.wallets = { - ...this.wallets, - [coin]: address, - }; - } - } - - async saveProfile() { - try { - const data = { - version: 1, - tagline: this.tagline, - bio: this.bio, - wallets: this.wallets, - customData: this.customData - }; - this.isSaving = true - await this.onSubmit(data); - this.setIsOpen(false); - this.clearFields(); - this.onClose('success'); - } catch (error) {} finally { - this.isSaving = false - } - } - - removeField(key){ - const copyObj = {...this.newCustomDataField} - delete copyObj[key] - this.newCustomDataField = copyObj - } - - addField(){ - if (!this.newFieldName || !this.newCustomDataValue) { - let snack5string = get("profile.profile24"); - parentEpml.request('showSnackBar', `${snack5string}`); - return; - } - const copyObj = {...this.newCustomDataField} - copyObj[this.newFieldName] = this.newCustomDataValue - this.newCustomDataField = copyObj - this.newFieldName = "" - this.newCustomDataValue = "" - } - - addCustomData(){ - const copyObj = {...this.customData} - copyObj[this.newCustomDataKey] = this.newCustomDataField - this.customData = copyObj + this.walletsUi.set(c, { ...coinProp }) + }) + this.walletsUi.get('btc').wallet = store.getState().app.selectedAddress.btcWallet + this.walletsUi.get('ltc').wallet = store.getState().app.selectedAddress.ltcWallet + this.walletsUi.get('doge').wallet = store.getState().app.selectedAddress.dogeWallet + this.walletsUi.get('dgb').wallet = store.getState().app.selectedAddress.dgbWallet + this.walletsUi.get('rvn').wallet = store.getState().app.selectedAddress.rvnWallet + this.hasFetchedArrr = false + this.isOpenCustomDataModal = false + this.customData = {} this.newCustomDataKey = "" - this.newCustomDataField = {}; + this.newCustomDataValue = "" + this.newCustomDataField = {} this.newFieldName = '' - this.newCustomDataValue = '' - this.isOpenCustomDataModal = false; + this.isSaving = false + this.addPrivate = this.addPrivate.bind(this) + this.checkForPrivate = this.checkForPrivate.bind(this) } - updateCustomData(key, data){ - this.isOpenCustomDataModal = true - this.newCustomDataField = data - this.newCustomDataKey = key - - } - - removeCustomData(key){ - const copyObj = {...this.customData} - delete copyObj[key] - this.customData = copyObj - } - - checkForPrivate(){ - let isPrivate = false - if(this.newCustomDataKey.includes('-private')) isPrivate = true - return isPrivate - } - - addPrivate(e){ - if (e.target.checked) { - if(this.newCustomDataKey.includes('-private')){ - - } else { - this.newCustomDataKey = this.newCustomDataKey + '-private' - } - } else { - this.newCustomDataKey = this.newCustomDataKey.replace('-private', ''); - } - } - render() { return html` @@ -277,13 +165,14 @@ class Chat extends LitElement { { - this.resetChatEditor() - this.openPrivateMessage = false - this.shadowRoot.getElementById('sendTo').value = "" + this.resetChatEditor(); + this.openPrivateMessage = false; + this.shadowRoot.getElementById('sendTo').value = ''; this.userFoundModalOpen = false; - this.userFound = [] + this.userFound = []; }} - style=${this.openPrivateMessage ? "visibility:visible;z-index:50" : "visibility: hidden;z-index:-100;position: relative"}> + style=${this.openPrivateMessage ? "visibility:visible;z-index:50" : "visibility: hidden;z-index:-100;position: relative"} + >
    @@ -298,32 +187,24 @@ class Chat extends LitElement { ?disabled=${this.isLoading} id="sendTo" placeholder="${translate("chatpage.cchange7")}" - value=${this.userSelected.name ? this.userSelected.name: ''} + value=${this.userSelected.name ? this.userSelected.name : ''} @keypress=${() => { - this.userSelected = {} + this.userSelected = {}; this.requestUpdate() }} /> - ${this.userSelected.name ? ( - html` + ${this.userSelected.name ? + (html`
    -

    ${translate("chatpage.cchange38")}

    +

    ${translate("chatpage.cchange38")}

    - ` - ) : ( - html` - - - ` - )} + `) + : (html` + + `) + }
    - this.updatePlaceholder(editor, value)} + .updatePlaceholder=${(editor, value) => this.updatePlaceholder(editor, value)} > - @@ -365,13 +245,13 @@ class Chat extends LitElement {
    { - this.userSelected = result + this.userSelected = result; this.userFound = []; - this.userFoundModalOpen = false + this.userFoundModalOpen = false; }} .closeFunc=${() => { - this.userFoundModalOpen = false - this.userFound = [] + this.userFoundModalOpen = false; + this.userFound = []; }} .searchResults=${this.userFound} ?isOpen=${this.userFoundModalOpen} @@ -381,7 +261,6 @@ class Chat extends LitElement {
    -
    @@ -392,26 +271,20 @@ class Chat extends LitElement { { if (data.item.name === "No registered name") { - render(html`${translate("chatpage.cchange15")}`, root) + render(html`${translate("chatpage.cchange15")}`, root); } else { - render(html`${data.item.name}`, root) + render(html`${data.item.name}`, root); } }}> { - render(html`${this.renderUnblockButton(data.item)}`, root) + render(html`${this.renderUnblockButton(data.item)}`, root); }}> - ${this.isEmptyArray(this.blockedUserList) ? html` - ${translate("chatpage.cchange14")} - `: ''} - + ${this.isEmptyArray(this.blockedUserList) ? html`${translate("chatpage.cchange14")}`: ''} + ${translate("general.close")} @@ -425,9 +298,12 @@ class Chat extends LitElement { this.getLocalBlockedList() const getBlockedUsers = async () => { - this.blockedUsers = await parentEpml.request('apiCall', { + let blockedUsers = await parentEpml.request('apiCall', { url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}` }) + + this.blockedUsers = blockedUsers + setTimeout(getBlockedUsers, 60000) } @@ -442,14 +318,12 @@ class Chat extends LitElement { this.shadowRoot.getElementById('messageBox').addEventListener('keydown', stopKeyEventPropagation) - const runFunctionsAfterPageLoad = () => { + const runFunctionsAfterPageLoad = async () => { // Functions to exec after render while waiting for page info... - // getDataFromURL() - try { let key = `${window.parent.reduxStore.getState().app.selectedAddress.address.substr(0, 10)}_chat-heads` let localChatHeads = localStorage.getItem(key) - this.setChatHeads(JSON.parse(localChatHeads)) + await this.setChatHeads(JSON.parse(localChatHeads)) } catch (e) { // TODO: Could add error handling in case there's a weird one... (-_-) return @@ -458,6 +332,7 @@ class Chat extends LitElement { // Clear Interval... if (this.selectedAddress.address !== undefined) { clearInterval(runFunctionsAfterPageLoadInterval) + return } } @@ -471,13 +346,17 @@ class Chat extends LitElement { } else { this.theme = 'light' } + document.querySelector('html').setAttribute('theme', this.theme) }) - if (!isElectron()) { /* empty */ } else { + if (!isElectron()) { + // ... + } else { window.addEventListener('contextmenu', (event) => { // Check if the clicked element has the class let target = event.target + while (target !== null) { if (target.classList && target.classList.contains('customContextMenuDiv')) { // Your custom context menu logic @@ -496,7 +375,6 @@ class Chat extends LitElement { let configLoaded = false parentEpml.ready().then(() => { - parentEpml.subscribe('config', c => { if (!configLoaded) { setTimeout(getBlockedUsers, 1) @@ -504,18 +382,20 @@ class Chat extends LitElement { } this.config = JSON.parse(c) }) + parentEpml.subscribe('chat_heads', chatHeads => { chatHeads = JSON.parse(chatHeads) this.getChatHeadFromState(chatHeads) }) + parentEpml.subscribe('side_effect_action', async sideEffectActionParam => { const sideEffectAction = JSON.parse(sideEffectActionParam) - if(sideEffectAction && sideEffectAction.type === 'openPrivateChat') { + if (sideEffectAction && sideEffectAction.type === 'openPrivateChat') { const name = sideEffectAction.data.name const address = sideEffectAction.data.address - if(this.chatHeadsObj.direct && this.chatHeadsObj.direct.find(item=> item.address === address)){ - await this.setActiveChatHeadUrl(`direct/${address}`) + if (this.chatHeadsObj.direct && this.chatHeadsObj.direct.find(item => item.address === address)) { + this.setActiveChatHeadUrl(`direct/${address}`) window.parent.reduxStore.dispatch( window.parent.reduxAction.setSideEffectAction(null)) } else { @@ -526,9 +406,9 @@ class Chat extends LitElement { window.parent.reduxStore.dispatch( window.parent.reduxAction.setSideEffectAction(null)) } - } }) + parentEpml.request('apiCall', { url: `/addresses/balance/${window.parent.reduxStore.getState().app.selectedAddress.address}` }).then(res => { @@ -536,48 +416,174 @@ class Chat extends LitElement { this.requestUpdate() }) }) + parentEpml.imReady() + this.clearConsole() + setInterval(() => { this.clearConsole() }, 60000) } + async setActiveChatHeadUrl(url) { + this.activeChatHeadUrl = url + this.requestUpdate() + } + + resetChatEditor() { + this.editor.commands.setContent('') + } + + async getUpdateCompleteTextEditor() { + await super.getUpdateComplete() + const marginElements = Array.from(this.shadowRoot.querySelectorAll('chat-text-editor')) + await Promise.all(marginElements.map(el => el.updateComplete)) + const marginElements2 = Array.from(this.shadowRoot.querySelectorAll('wrapper-modal')) + await Promise.all(marginElements2.map(el => el.updateComplete)) + return true + } + + async connectedCallback() { + super.connectedCallback() + + await this.getUpdateCompleteTextEditor() + + const elementChatId = this.shadowRoot.getElementById('messageBox').shadowRoot.getElementById('privateMessage') + this.editor = new Editor({ + onUpdate: () => { + this.shadowRoot.getElementById('messageBox').getMessageSize(this.editor.getJSON()) + }, + element: elementChatId, + extensions: [ + StarterKit, + Underline, + Highlight, + Placeholder.configure({ + placeholder: 'Write something …' + }), + Extension.create({ + addKeyboardShortcuts: () => { + return { + 'Enter': () => { + const chatTextEditor = this.shadowRoot.getElementById('messageBox') + chatTextEditor.sendMessageFunc({ }) + return true + } + } + } + }) + ] + }) + + this.unsubscribeStore = window.parent.reduxStore.subscribe(() => { + try { + const currentState = window.parent.reduxStore.getState() + + if (window.parent.location && window.parent.location.search) { + const queryString = window.parent.location.search + const params = new URLSearchParams(queryString) + const chat = params.get("chat") + if (chat && chat !== this.activeChatHeadUrl) { + let url = window.parent.location.href + let newUrl = url.split("?")[0] + window.parent.history.pushState({}, "", newUrl) + this.setActiveChatHeadUrl(chat) + } + } + + if (currentState.app.accountInfo && currentState.app.accountInfo.names && currentState.app.accountInfo.names.length > 0 && this.loggedInUserName !== currentState.app.accountInfo.names[0].name) { + this.loggedInUserName = currentState.app.accountInfo.names[0].name + } + + if (currentState.app.accountInfo && currentState.app.accountInfo.addressInfo && currentState.app.accountInfo.addressInfo.address && this.loggedInUserAddress !== currentState.app.accountInfo.addressInfo.address) { + this.loggedInUserAddress = currentState.app.accountInfo.addressInfo.address + } + } catch (error) { /* empty */ } + }) + } + + disconnectedCallback() { + super.disconnectedCallback() + this.editor.destroy() + this.unsubscribeStore() + } + + updatePlaceholder(editor, text) { + editor.extensionManager.extensions.forEach((extension) => { + if (extension.name === 'placeholder') { + extension.options['placeholder'] = text + editor.commands.focus('end') + } + }) + } + + setOpenDialogGroupsModal(val) { + this.openDialogGroupsModal = val + } + + openTabToGroupManagement() { + window.parent.reduxStore.dispatch( + window.parent.reduxAction.setNewTab({ + url: `group-management`, + id: this.uid.rnd(), + myPlugObj: { + 'url': 'group-management', + 'domain': 'core', + 'page': 'group-management/index.html', + 'title': 'Group Management', + 'icon': 'vaadin:group', + 'mwcicon': 'group', + 'pluginNumber': 'plugin-fJZNpyLGTl', + 'menus': [], + 'parent': false + }, + openExisting: true + }) + ) + } + clearConsole() { - if (!isElectron()) { /* empty */ } else { + if (!isElectron()) { + // ... + } else { console.clear() window.parent.electronAPI.clearCache() } } setOpenPrivateMessage(props) { - this.openPrivateMessage = props.open; - this.shadowRoot.getElementById("sendTo").value = props.name + this.openPrivateMessage = props.open + this.shadowRoot.getElementById('sendTo').value = props.name } async userSearch() { const nameValue = this.shadowRoot.getElementById('sendTo').value - if(!nameValue) { + + if (!nameValue) { this.userFound = [] this.userFoundModalOpen = true return } + try { const result = await parentEpml.request('apiCall', { type: 'api', url: `/names/${nameValue}` }) + if (result.error === 401) { this.userFound = [] } else { this.userFound = [ ...this.userFound, - result, - ]; + result + ] } - this.userFoundModalOpen = true; + + this.userFoundModalOpen = true } catch (error) { - let err4string = get("chatpage.cchange35"); + let err4string = get('chatpage.cchange35') parentEpml.request('showSnackBar', `${err4string}`) } } @@ -587,9 +593,10 @@ class Chat extends LitElement { } async _sendMessage(outSideMsg, msg) { - this.isLoading = true; + this.isLoading = true const trimmedMessage = msg + if (/^\s*$/.test(trimmedMessage)) { this.isLoading = false } else { @@ -600,7 +607,7 @@ class Chat extends LitElement { version: 3 } const stringifyMessageObject = JSON.stringify(messageObject) - await this.sendMessage(stringifyMessageObject) + this.sendMessage(stringifyMessageObject) } } @@ -617,19 +624,22 @@ class Chat extends LitElement { let myNameRes = await parentEpml.request('apiCall', { type: 'api', url: `/names/${receiverName}` - }); + }) + if (myNameRes.error === 401) { - myRes = false; + myRes = false } else { myRes = myNameRes } - return myRes; + + return myRes } catch (error) { - return "" + return '' } } const myNameRes = await validateName(_recipient) + if (!myNameRes) { recipient = _recipient } else { @@ -637,8 +647,8 @@ class Chat extends LitElement { } const getAddressPublicKey = async () => { - let isEncrypted; - let _publicKey; + let isEncrypted + let _publicKey let addressPublicKey = await parentEpml.request('apiCall', { type: 'api', @@ -647,22 +657,26 @@ class Chat extends LitElement { if (addressPublicKey.error === 102) { _publicKey = false - let err4string = get("chatpage.cchange19") + let err4string = get('chatpage.cchange19') parentEpml.request('showSnackBar', `${err4string}`) this.isLoading = false } else if (addressPublicKey !== false) { isEncrypted = 1 _publicKey = addressPublicKey - await sendMessageRequest(isEncrypted, _publicKey) + sendMessageRequest(isEncrypted, _publicKey) } else { - let err4string = get("chatpage.cchange39") + let err4string = get('chatpage.cchange39') parentEpml.request('showSnackBar', `${err4string}`) this.isLoading = false } } + let _reference = new Uint8Array(64) - window.crypto.getRandomValues(_reference); + + window.crypto.getRandomValues(_reference) + let reference = window.parent.Base58.encode(_reference) + const sendMessageRequest = async (isEncrypted, _publicKey) => { let chatResponse = await parentEpml.request('chat', { type: 18, @@ -679,17 +693,20 @@ class Chat extends LitElement { isText: 1 } }) - await _computePow(chatResponse) + + _computePow(chatResponse) } const _computePow = async (chatBytes) => { const difficulty = this.balance < 4 ? 18 : 8 const path = window.parent.location.origin + '/memory-pow/memory-pow.wasm.full' const worker = new WebWorker() + let nonce = null let chatBytesArray = null + await new Promise((res) => { - worker.postMessage({chatBytes, path, difficulty}) + worker.postMessage({ chatBytes, path, difficulty }) worker.onmessage = e => { worker.terminate() chatBytesArray = e.data.chatBytesArray @@ -703,26 +720,27 @@ class Chat extends LitElement { chatBytesArray: chatBytesArray, chatNonce: nonce }) + getSendChatResponse(_response) } const getSendChatResponse = (response) => { if (response === true) { this.setActiveChatHeadUrl(`direct/${recipient}`) - this.shadowRoot.getElementById('sendTo').value = "" + this.shadowRoot.getElementById('sendTo').value = '' this.openPrivateMessage = false - this.resetChatEditor(); + this.resetChatEditor() } else if (response.error) { parentEpml.request('showSnackBar', response.message) } else { - let err2string = get("chatpage.cchange21") + let err2string = get('chatpage.cchange21') parentEpml.request('showSnackBar', `${err2string}`) } this.isLoading = false } - // Exec.. - await getAddressPublicKey() + + getAddressPublicKey() } insertImage(file) { @@ -730,7 +748,8 @@ class Chat extends LitElement { this.imageFile = file return } - parentEpml.request('showSnackBar', get("chatpage.cchange28")) + + parentEpml.request('showSnackBar', get('chatpage.cchange28')) } renderLoadingText() { @@ -738,12 +757,12 @@ class Chat extends LitElement { } renderSendText() { - return html`${translate("chatpage.cchange9")}` + return html`${translate('chatpage.cchange9')}` } relMessages() { setTimeout(() => { - window.location.href = window.location.href.split( '#' )[0] + window.location.href = window.location.href.split('#')[0] }, 500) } @@ -752,7 +771,7 @@ class Chat extends LitElement { const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port const blockedAddressesUrl = `${nodeUrl}/lists/blockedAddresses?apiKey=${this.getApiKey()}` - localStorage.removeItem("MessageBlockedAddresses") + localStorage.removeItem('MessageBlockedAddresses') var hidelist = [] @@ -762,7 +781,8 @@ class Chat extends LitElement { data.map(item => { hidelist.push(item) }) - localStorage.setItem("MessageBlockedAddresses", JSON.stringify(hidelist)) + + localStorage.setItem('MessageBlockedAddresses', JSON.stringify(hidelist)) this.blockedUserList = hidelist }) @@ -774,7 +794,7 @@ class Chat extends LitElement { const blockedAddressesUrl = `${nodeUrl}/lists/blockedAddresses?apiKey=${this.getApiKey()}` const err1string = 'No registered name' - localStorage.removeItem("ChatBlockedAddresses") + localStorage.removeItem('ChatBlockedAddresses') var obj = [] @@ -786,18 +806,21 @@ class Chat extends LitElement { name: err1string, owner: item } + fetch(`${nodeUrl}/names/address/${item}?limit=0&reverse=true`).then(res => { return res.json() }).then(jsonRes => { - if(jsonRes.length) { - jsonRes.map (item => { + if (jsonRes.length) { + jsonRes.map(item => { obj.push(item) }) } else { obj.push(noName) } - localStorage.setItem("ChatBlockedAddresses", JSON.stringify(obj)) - this.blockedUserList = JSON.parse(localStorage.getItem("ChatBlockedAddresses") || "[]") + + localStorage.setItem('ChatBlockedAddresses', JSON.stringify(obj)) + + this.blockedUserList = JSON.parse(localStorage.getItem('ChatBlockedAddresses') || '[]') }) }) }) @@ -805,12 +828,14 @@ class Chat extends LitElement { async getPendingGroupInvites() { const myAddress = window.parent.reduxStore.getState().app.selectedAddress.address + try { - this.groupInvites = await parentEpml.request('apiCall', { + let pendingGroupInvites = await parentEpml.request('apiCall', { url: `/groups/invites/${myAddress}` - }); + }) + this.groupInvites = pendingGroupInvites } catch (error) { - let err4string = get("chatpage.cchange61"); + let err4string = get('chatpage.cchange61') parentEpml.request('showSnackBar', `${err4string}`) } } @@ -822,7 +847,7 @@ class Chat extends LitElement { owner ] - let ownersJsonString = JSON.stringify({ "items": items }) + let ownersJsonString = JSON.stringify({ 'items': items }) let ret = await parentEpml.request('apiCall', { url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}`, @@ -836,26 +861,26 @@ class Chat extends LitElement { if (ret === true) { this.blockedUsers = this.blockedUsers.filter(item => item != owner) this.getChatBlockedList() - this.blockedUserList = JSON.parse(localStorage.getItem("ChatBlockedAddresses") || "[]") - let err2string = get("chatpage.cchange16") + this.blockedUserList = JSON.parse(localStorage.getItem('ChatBlockedAddresses') || '[]') + let err2string = get('chatpage.cchange16') snackbar.add({ labelText: `${err2string}`, dismiss: true }) this.relMessages() - } - else { - let err3string = get("chatpage.cchange17") + } else { + let err3string = get('chatpage.cchange17') snackbar.add({ labelText: `${err3string}`, dismiss: true }) } + return ret } renderUnblockButton(websiteObj) { - return html`` + return html`` } changeTheme() { @@ -874,20 +899,21 @@ class Chat extends LitElement { myAddress=${JSON.stringify(this.selectedAddress)} .setOpenPrivateMessage=${(val) => this.setOpenPrivateMessage(val)} > - ` + + ` } renderChatHead(chatHeadArr) { return chatHeadArr.map(eachChatHead => { - return html` this.setActiveChatHeadUrl(val)} chatInfo=${JSON.stringify(eachChatHead)}>` + return html` this.setActiveChatHeadUrl(val)} chatInfo=${JSON.stringify(eachChatHead)}>` }) } renderChatPage() { // Check for the chat ID from and render chat messages // Else render Welcome to Q-CHat - // TODO: DONE: Do the above in the ChatPage + return html` this.setOpenPrivateMessage(val)} - .setActiveChatHeadUrl=${(val)=> this.setActiveChatHeadUrl(val)} + .setActiveChatHeadUrl=${(val) => this.setActiveChatHeadUrl(val)} balance=${this.balance} loggedInUserName=${this.loggedInUserName} loggedInUserAddress=${this.loggedInUserAddress} @@ -905,16 +931,48 @@ class Chat extends LitElement { ` } - setChatHeads(chatObj) { - const chatObjGroups = Array.isArray(chatObj.groups) ? chatObj.groups : [] + async getOwnerName(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() + + const res = await fetch(`${nodeUrl}/names/address/${data.owner}?limit=0&reverse=true`) + const jsonRes = await res.json() + + let goName = 'undefined' + + if (jsonRes.length) { + jsonRes.forEach(item => { + goName = item.name + }) + } + + return goName + } catch (error) { + console.error('Error fetching name', error) + throw error + } + } + + async setChatHeads(chatObj) { + const chatObjGroups = Array.isArray(chatObj.groups) ? chatObj.groups : [] const chatObjDirect = Array.isArray(chatObj.direct) ? chatObj.direct : [] - let groupList = chatObjGroups.map(group => group.groupId === 0 ? { - groupId: group.groupId, url: `group/${group.groupId}`, - groupName: "Qortal General Chat", + let groupList = await Promise.all(chatObjGroups.map(async group => group.groupId === 0 ? { + groupId: group.groupId, + url: `group/${group.groupId}`, + groupName: 'Qortal General Chat', timestamp: group.timestamp === undefined ? 2 : group.timestamp, - sender: group.sender } : { ...group, timestamp: group.timestamp === undefined ? 1 : group.timestamp, url: `group/${group.groupId}` - }) + sender: group.sender + } : { + ...group, + timestamp: group.timestamp === undefined ? 1 : group.timestamp, + url: `group/${group.groupId}`, + ownerName: group.ownerName === undefined ? await this.getOwnerName(group.groupId) : 'undefined' + })) let directList = chatObjDirect.map(dc => { return { ...dc, url: `direct/${dc.address}` } @@ -925,6 +983,7 @@ class Chat extends LitElement { } groupList.sort(compareNames) + let chatHeadMasterList = [...groupList, ...directList] const compareArgs = (a, b) => { @@ -934,12 +993,12 @@ class Chat extends LitElement { this.chatHeads = chatHeadMasterList.sort(compareArgs) } - getChatHeadFromState(chatObj) { + async getChatHeadFromState(chatObj) { if (chatObj === undefined) { - + return } else { this.chatHeadsObj = chatObj - this.setChatHeads(chatObj) + await this.setChatHeads(chatObj) } } @@ -951,23 +1010,13 @@ class Chat extends LitElement { parentEpml.request('setPageUrl', pageUrl) } - isEmptyArray(arr) { - if (!arr) { return true } - return arr.length === 0 - } - - getApiKey() { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return myNode.apiKey - } - scrollToBottom() { const viewElement = this.shadowRoot.querySelector('chat-page').shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById('viewElement') - const chatScrollerElement = this.shadowRoot.querySelector('chat-page').shadowRoot.querySelector('chat-scroller') + if (chatScrollerElement && chatScrollerElement.disableAddingNewMessages) { const chatPageElement = this.shadowRoot.querySelector('chat-page') - if(chatPageElement && chatPageElement.getLastestMessages) + if (chatPageElement && chatPageElement.getLastestMessages) chatPageElement.getLastestMessages() } else { viewElement.scroll({ top: viewElement.scrollHeight, left: 0, behavior: 'smooth' }) @@ -981,6 +1030,21 @@ class Chat extends LitElement { hideNewMessageBar() { this.shadowRoot.getElementById('newMessageBar').classList.add('hide-new-message-bar') } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -window.customElements.define('q-chat', Chat) +window.customElements.define('q-chat', Chat) \ No newline at end of file diff --git a/plugins/plugins/core/qdn/index.html b/plugins/plugins/core/q-website/index.html similarity index 94% rename from plugins/plugins/core/qdn/index.html rename to plugins/plugins/core/q-website/index.html index da9c4777..e1ef8b98 100644 --- a/plugins/plugins/core/qdn/index.html +++ b/plugins/plugins/core/q-website/index.html @@ -48,8 +48,8 @@ - - + + diff --git a/plugins/plugins/core/q-website/q-websites.src.js b/plugins/plugins/core/q-website/q-websites.src.js new file mode 100644 index 00000000..0bb07ed9 --- /dev/null +++ b/plugins/plugins/core/q-website/q-websites.src.js @@ -0,0 +1,976 @@ +import { html, LitElement } from 'lit' +import { render } from 'lit/html.js' +import { Epml } from '../../../epml' +import { qWebsitesStyles } from '../components/plugins-css' +import isElectron from 'is-electron' +import '@material/mwc-dialog' +import '@material/mwc-icon' +import '@material/mwc-button' +import '@material/mwc-tab-bar' +import '@material/mwc-textfield' +import '@vaadin/button' +import '@vaadin/grid' +import '@vaadin/icon' +import '@vaadin/icons' +import '@vaadin/text-field' + +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../core/translate' +registerTranslateConfig({ + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) +}) + +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + +class QWebsites extends LitElement { + static get properties() { + return { + identifier: { type: String }, + loading: { type: Boolean }, + resources: { type: Array }, + pageRes: { type: Array }, + followedNames: { type: Array }, + blockedNames: { type: Array }, + relayMode: { type: Boolean }, + selectedAddress: { type: Object }, + searchName: { type: String }, + searchResources: { type: Array }, + followedResources: { type: Array }, + blockedResources: { type: Array }, + theme: { type: String, reflect: true } + } + } + + static get styles() { + return [qWebsitesStyles] + } + + constructor() { + super() + this.identifier = '' + this.selectedAddress = {} + this.resources = [] + this.pageRes = [] + this.followedNames = [] + this.blockedNames = [] + this.relayMode = false + this.isLoading = false + this.searchName = '' + this.searchResources = [] + this.followedResources = [] + this.blockedResources = [] + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + } + + render() { + return html` +
    + + + + + +
    +
    +
    +

    ${translate("websitespage.schange1")}

    +

    ${this.renderSearchButton()}

    +

    ${this.renderPublishButton()}

    +
    +

    ${translate("websitespage.schange9")}

    + + { + render(html`${this.renderAvatar(data.item)}`, root) + }}> + + { + render(html`${this.renderInfo(data.item)}`, root) + }}> + + { + render(html`${this.renderPublishedBy(data.item)}`, root) + }}> + + { + render(html`${this.renderFollowUnfollowButton(data.item)}`, root); + }}> + + { + render(html`${this.renderBlockUnblockButton(data.item)}`, root); + }}> + + +
    + ${this.pageRes == null ? html` + Loading... + ` : ''} + ${this.isEmptyArray(this.pageRes) ? html` + ${translate("websitespage.schange10")} + ` : ''} + ${this.renderRelayModeText()} +
    +
    +
    +

    ${translate("websitespage.schange11")}

    +

    ${this.renderSearchButton()}

    +

    ${this.renderPublishButton()}

    +
    +

    ${translate("websitespage.schange12")}

    + + { + render(html`${this.renderAvatar(data.item)}`, root) + }}> + + { + render(html`${this.renderInfo(data.item)}`, root) + }}> + + { + render(html`${this.renderPublishedBy(data.item)}`, root) + }}> + + { + render(html`${this.renderFollowUnfollowButtonTab(data.item)}`, root); + }}> + + + ${this.followedResources == null ? html` + Loading... + ` : ''} + ${this.isEmptyArray(this.followedResources) ? html` + ${translate("websitespage.schange13")} + ` : ''} + ${this.renderRelayModeText()} +
    +
    +
    +

    ${translate("websitespage.schange14")}

    +

    ${this.renderSearchButton()}

    +

    ${this.renderPublishButton()}

    +
    +

    ${translate("websitespage.schange15")}

    + + { + render(html`${this.renderAvatar(data.item)}`, root) + }}> + + { + render(html`${this.renderInfo(data.item)}`, root) + }}> + + { + render(html`${this.renderPublishedBy(data.item)}`, root) + }}> + + { + render(html`${this.renderBlockUnblockButtonTab(data.item)}`, root); + }}> + + + ${this.blockedResources == null ? html` + Loading... + ` : ''} + ${this.isEmptyArray(this.blockedResources) ? html` + ${translate("websitespage.schange16")} + ` : ''} + ${this.renderRelayModeText()} +
    +
    +
    + +

    ${translate("websitespage.schange4")}

    + +
    + + { + render(html`${this.renderAvatar(data.item)}`, root) + }}> + + { + render(html`${this.renderPublishedBy(data.item)}`, root) + }}> + + { + render(html`${this.renderFollowUnfollowButton(data.item)}`, root); + }}> + + { + render(html`${this.renderBlockUnblockButton(data.item)}`, root); + }}> + + +
    + ` + } + + firstUpdated() { + this.changeTheme() + this.changeLanguage() + this.showWebsites() + + setTimeout(() => { + this.displayTabContent('browse') + }, 0) + + const getFollowedNames = async () => { + this.followedNames = await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}` + }) + setTimeout(getFollowedNames, 60000) + } + + const getBlockedNames = async () => { + this.blockedNames = await parentEpml.request('apiCall', { + url: `/lists/blockedNames?apiKey=${this.getApiKey()}` + }) + setTimeout(getBlockedNames, 60000) + } + + const getRelayMode = async () => { + this.relayMode = await parentEpml.request('apiCall', { + url: `/arbitrary/relaymode?apiKey=${this.getApiKey()}` + }) + setTimeout(getRelayMode, 600000) + } + + window.addEventListener('storage', () => { + 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) + }) + + if (!isElectron()) { + } else { + window.addEventListener('contextmenu', (event) => { + event.preventDefault() + window.parent.electronAPI.showMyMenu() + }) + } + + let configLoaded = false + + parentEpml.ready().then(() => { + parentEpml.subscribe('selected_address', async selectedAddress => { + this.selectedAddress = {} + selectedAddress = JSON.parse(selectedAddress) + if (!selectedAddress || Object.entries(selectedAddress).length === 0) return + this.selectedAddress = selectedAddress + }) + + parentEpml.subscribe('config', c => { + if (!configLoaded) { + setTimeout(getFollowedNames, 1) + setTimeout(getBlockedNames, 1) + setTimeout(getRelayMode, 1) + setTimeout(this.getFollowedNamesResource, 1) + setTimeout(this.getBlockedNamesResource, 1) + setInterval(this.getArbitraryResources, 900000) + configLoaded = true + } + + this.config = JSON.parse(c) + }) + }) + + parentEpml.imReady() + + this.clearConsole() + + setInterval(() => { + this.clearConsole() + }, 60000) + } + + clearConsole() { + if (!isElectron()) { + } else { + console.clear() + window.parent.electronAPI.clearCache() + } + } + + changeTheme() { + const checkTheme = localStorage.getItem('qortalTheme') + + if (checkTheme === 'dark') { + this.theme = 'dark' + } else { + this.theme = 'light' + } + document.querySelector('html').setAttribute('theme', this.theme) + } + + changeLanguage() { + const checkLanguage = localStorage.getItem('qortalLanguage') + + if (checkLanguage === null || checkLanguage.length === 0) { + localStorage.setItem('qortalLanguage', 'us') + use('us') + } else { + use(checkLanguage) + } + } + + renderCatText() { + return html`${translate('websitespage.schange26')}` + } + + async displayTabContent(tab) { + const tabBrowseContent = this.shadowRoot.getElementById('tab-browse-content') + const tabFollowedContent = this.shadowRoot.getElementById('tab-followed-content') + const tabBlockedContent = this.shadowRoot.getElementById('tab-blocked-content') + + if (tab === 'browse') { + tabBrowseContent.style.display = 'block' + tabFollowedContent.style.display = 'none' + tabBlockedContent.style.display = 'none' + await this.refreshWebsites() + } else if (tab === 'followed') { + tabBrowseContent.style.display = 'none' + tabFollowedContent.style.display = 'block' + tabBlockedContent.style.display = 'none' + await this.getFollowedNamesRefresh() + await this.getFollowedNamesResource() + } else if (tab === 'blocked') { + tabBrowseContent.style.display = 'none' + tabFollowedContent.style.display = 'none' + tabBlockedContent.style.display = 'block' + await this.getBlockedNamesRefresh() + await this.getBlockedNamesResource() + } + } + + searchListener(e) { + if (e.key === 'Enter') { + this.doSearch(e) + } + } + + async getResourcesGrid() { + this.resourcesGrid = this.shadowRoot.querySelector('#resourcesGrid') + this.pagesControl = this.shadowRoot.querySelector('#pages') + this.pages = undefined + } + + async getArbitraryResources() { + this.resources = await parentEpml.request('apiCall', { + url: `/arbitrary/resources?service=WEBSITE&default=true&limit=0&reverse=false&includestatus=false&includemetadata=false&excludeblocked=true` + }) + } + + async getFollowedNamesResource() { + this.followedResources = await parentEpml.request('apiCall', { + url: `/arbitrary/resources?service=WEBSITE&default=true&limit=0&reverse=false&includestatus=true&includemetadata=true&namefilter=followedNames` + }) + } + + async getFollowedNamesRefresh() { + this.followedNames = await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}` + }) + } + + async getBlockedNamesResource() { + this.blockedResources = await parentEpml.request('apiCall', { + url: `/arbitrary/resources?service=WEBSITE&default=true&limit=0&reverse=false&includestatus=true&includemetadata=true&namefilter=blockedNames` + }) + } + + async getBlockedNamesRefresh() { + this.blockedNames = await parentEpml.request('apiCall', { + url: `/lists/blockedNames?apiKey=${this.getApiKey()}` + }) + } + + async getData(offset) { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port + + let jsonOffsetUrl = `${nodeUrl}/arbitrary/resources?service=WEBSITE&default=true&limit=20&offset=${offset}&reverse=false&includestatus=true&includemetadata=true&excludeblocked=true` + + const jsonOffsetRes = await fetch(jsonOffsetUrl) + + this.pageRes = await jsonOffsetRes.json() + } + + async updateItemsFromPage(page) { + if (page === undefined) { + return + } + + if (!this.pages) { + this.pages = Array.apply(null, { length: Math.ceil(this.resources.length / 20) }).map((item, index) => { + return index + 1 + }) + + let offset = 0 + + const prevBtn = document.createElement('button') + prevBtn.textContent = '<' + prevBtn.addEventListener('click', () => { + if (parseInt(this.pagesControl.querySelector('[selected]').textContent) > 1) { + offset = (parseInt(this.pagesControl.querySelector('[selected]').textContent) - 2) * 20 + } else { + offset = 0 + } + this.getData(offset) + const selectedPage = parseInt(this.pagesControl.querySelector('[selected]').textContent) + this.updateItemsFromPage(selectedPage - 1) + }) + this.pagesControl.appendChild(prevBtn) + + this.pages.forEach((pageNumber) => { + const pageBtn = document.createElement('button') + pageBtn.textContent = pageNumber + let offset = 0 + pageBtn.addEventListener('click', (e) => { + if (parseInt(e.target.textContent) > 1) { + offset = (parseInt(e.target.textContent) - 1) * 20 + } else { + offset = 0 + } + this.getData(offset) + this.updateItemsFromPage(parseInt(e.target.textContent)) + }) + if (pageNumber === page) { + pageBtn.setAttribute('selected', true) + } + this.pagesControl.appendChild(pageBtn) + }) + + const nextBtn = window.document.createElement('button') + nextBtn.textContent = '>' + nextBtn.addEventListener('click', () => { + if (parseInt(this.pagesControl.querySelector('[selected]').textContent) >= 1) { + offset = ((parseInt(this.pagesControl.querySelector('[selected]').textContent) + 1) * 20) - 20 + } else { + offset = 0 + } + + this.getData(offset) + const selectedPage = parseInt(this.pagesControl.querySelector('[selected]').textContent) + this.updateItemsFromPage(selectedPage + 1) + }) + + this.pagesControl.appendChild(nextBtn) + } + + const buttons = Array.from(this.pagesControl.children) + buttons.forEach((btn, index) => { + if (parseInt(btn.textContent) === page) { + btn.setAttribute('selected', true) + } else { + btn.removeAttribute('selected') + } + + if (index === 0) { + if (page === 1) { + btn.setAttribute('disabled', '') + } else { + btn.removeAttribute('disabled') + } + } + + if (index === buttons.length - 1) { + if (page === this.pages.length) { + btn.setAttribute('disabled', '') + } else { + btn.removeAttribute('disabled') + } + } + }) + } + + async showWebsites() { + await this.getData(0) + await this.getArbitraryResources() + await this.getResourcesGrid() + await this.updateItemsFromPage(1, true) + } + + async refreshWebsites() { + await this.getData(0) + await this.getArbitraryResources() + await this.updateItemsFromPage(1, true) + } + + doSearch(e) { + this.searchResult() + } + + async searchResult() { + let searchName = this.shadowRoot.getElementById('searchName').value + + if (searchName.length === 0) { + let err1string = get('websitespage.schange34') + parentEpml.request('showSnackBar', `${err1string}`) + } else { + let searchResources = await parentEpml.request('apiCall', { + url: `/arbitrary/resources/search?service=WEBSITE&query=${searchName}&default=true&limit=5&reverse=false&includestatus=true&includemetadata=true` + }) + if (this.isEmptyArray(searchResources)) { + let err2string = get('websitespage.schange17') + parentEpml.request('showSnackBar', `${err2string}`) + } else { + this.searchResources = searchResources + } + } + } + + renderAvatar(websiteObj) { + let name = websiteObj.name + 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/THUMBNAIL/${name}/qortal_avatar?async=true}` + return html`` + } + + renderRelayModeText() { + if (this.relayMode === true) { + return html`
    ${translate('websitespage.schange18')} "relayModeEnabled": false ${translate('websitespage.schange19')} settings.json
    ` + } else if (this.relayMode === false) { + return html`
    ${translate('websitespage.schange20')} "relayModeEnabled": true ${translate('websitespage.schange19')} settings.json
    ` + } else { + return html`` + } + } + + renderPublishButton() { + // Only show the publish button if we have admin permissions on this node + // We can check the followed names array to achieve this + if (this.followedNames == null || !Array.isArray(this.followedNames)) { + return html`` + } else { + return html` this.publishWebsite()}>add${translate('websitespage.schange21')}` + } + } + + renderSearchButton() { + return html` this.openSearchDialog()}>search${translate('websitespage.schange4')}` + } + + openSearchDialog() { + this.searchResources = [] + this.shadowRoot.getElementById('searchName').value = '' + this.shadowRoot.getElementById('searchWebsiteDialog').show() + } + + publishWebsite() { + window.location.href = `../qdn/publish/index.html?service=WEBSITE&identifier=${this.identifier}&uploadType=zip&category=Website&showName=true&showService=false&showIdentifier=false&showMetadata=true` + } + + async followName(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}`, + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully followed - add to local list + // Remove it first by filtering the list - doing it this way ensures the UI updates + // immediately, as apposed to only adding if it doesn't already exist + this.followedNames = this.followedNames.filter(item => item != name) + this.followedNames.push(name) + } else { + let err3string = get('websitespage.schange22') + parentEpml.request('showSnackBar', `${err3string}`) + } + + return ret + } + + async followNameTab(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}`, + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully followed - add to local list + // Remove it first by filtering the list - doing it this way ensures the UI updates + // immediately, as apposed to only adding if it doesn't already exist + this.followedNames = this.followedNames.filter(item => item != name) + this.followedNames.push(name) + await this.getFollowedNamesRefresh() + await this.getFollowedNamesResource() + } else { + let err3string = get('websitespage.schange22') + parentEpml.request('showSnackBar', `${err3string}`) + } + + return ret + } + + async unfollowName(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}`, + method: 'DELETE', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully unfollowed - remove from local list + this.followedNames = this.followedNames.filter(item => item != name) + } else { + let err4string = get('websitespage.schange23') + parentEpml.request('showSnackBar', `${err4string}`) + } + + return ret + } + + async unfollowNameTab(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/followedNames?apiKey=${this.getApiKey()}`, + method: 'DELETE', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully unfollowed - remove from local list + this.followedNames = this.followedNames.filter(item => item != name) + await this.getFollowedNamesRefresh() + await this.getFollowedNamesResource() + } else { + let err4string = get('websitespage.schange23') + parentEpml.request('showSnackBar', `${err4string}`) + } + + return ret + } + + async blockName(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/blockedNames?apiKey=${this.getApiKey()}`, + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully blocked - add to local list + // Remove it first by filtering the list - doing it this way ensures the UI updates + // immediately, as apposed to only adding if it doesn't already exist + this.blockedNames = this.blockedNames.filter(item => item != name) + this.blockedNames.push(name) + } else { + let err5string = get('websitespage.schange24') + parentEpml.request('showSnackBar', `${err5string}`) + } + + return ret + } + + async blockNameTab(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/blockedNames?apiKey=${this.getApiKey()}`, + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully blocked - add to local list + // Remove it first by filtering the list - doing it this way ensures the UI updates + // immediately, as apposed to only adding if it doesn't already exist + this.blockedNames = this.blockedNames.filter(item => item != name) + this.blockedNames.push(name) + await this.getBlockedNamesRefresh() + await this.getBlockedNamesResource() + } else { + let err5string = get('websitespage.schange24') + parentEpml.request('showSnackBar', `${err5string}`) + } + + return ret + } + + async unblockName(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/blockedNames?apiKey=${this.getApiKey()}`, + method: 'DELETE', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully unblocked - remove from local list + this.blockedNames = this.blockedNames.filter(item => item != name) + } else { + let err6string = get('websitespage.schange25') + parentEpml.request('showSnackBar', `${err6string}`) + } + + return ret + } + + async unblockNameTab(websiteObj) { + let name = websiteObj.name + + let items = [ + name + ] + + let namesJsonString = JSON.stringify({ 'items': items }) + + let ret = await parentEpml.request('apiCall', { + url: `/lists/blockedNames?apiKey=${this.getApiKey()}`, + method: 'DELETE', + headers: { + 'Content-Type': 'application/json' + }, + body: `${namesJsonString}` + }) + + if (ret === true) { + // Successfully unblocked - remove from local list + this.blockedNames = this.blockedNames.filter(item => item != name) + await this.getBlockedNamesRefresh() + await this.getBlockedNamesResource() + } else { + let err6string = get('websitespage.schange25') + parentEpml.request('showSnackBar', `${err6string}`) + } + + return ret + } + + renderInfo(websiteObj) { + let name = websiteObj.name + let title = name + let description = '' + let categoryName = this.renderCatText() + let tags = '' + let sizeReadable = '' + + if (websiteObj.metadata != null) { + title = websiteObj.metadata.title + description = websiteObj.metadata.description + categoryName = websiteObj.metadata.categoryName + if (websiteObj.metadata.tags != null && websiteObj.metadata.tags.length > 0) { + tags = 'Tags: ' + websiteObj.metadata.tags.join(', ') + } + } + + if (websiteObj.size != null) { + sizeReadable = this.bytesToSize(websiteObj.size) + } + + return html` +
    + ${title} +
    +
    ${description}
    +
    + ${categoryName}  + ${tags.length > 0 ? " | " : ""}  + ${tags}  + ${sizeReadable.length > 0 ? " | " : ""}  + ${translate("websitespage.schange27")}: ${sizeReadable} +
    + ` + } + + renderPublishedBy(websiteObj) { + return html` +
    ${websiteObj.name}
    +
    + ${translate('websitespage.schange28')}: ${websiteObj.status.title} +
    + ` + } + + renderSize(websiteObj) { + if (websiteObj.size === null) { + return html`` + } + + let sizeReadable = this.bytesToSize(websiteObj.size) + + return html`${sizeReadable}` + } + + renderFollowUnfollowButton(websiteObj) { + let name = websiteObj.name + + // Only show the follow/unfollow button if we have permission to modify the list on this node + if (this.followedNames == null || !Array.isArray(this.followedNames)) { + return html`` + } + + if (this.followedNames.indexOf(name) === -1) { + // render follow button + return html` this.followName(websiteObj)}>add_to_queue ${translate('websitespage.schange29')}` + } else { + // render unfollow button + return html` this.unfollowName(websiteObj)}>remove_from_queue ${translate('websitespage.schange30')}` + } + } + + renderFollowUnfollowButtonTab(websiteObj) { + let name = websiteObj.name + + // Only show the follow/unfollow button if we have permission to modify the list on this node + if (this.followedNames == null || !Array.isArray(this.followedNames)) { + return html`` + } + + if (this.followedNames.indexOf(name) === -1) { + // render follow button + return html` this.followNameTab(websiteObj)}>add_to_queue ${translate('websitespage.schange29')}` + } else { + // render unfollow button + return html` this.unfollowNameTab(websiteObj)}>remove_from_queue ${translate('websitespage.schange30')}` + } + } + + renderBlockUnblockButton(websiteObj) { + let name = websiteObj.name + + // Only show the block/unblock button if we have permission to modify the list on this node + if (this.blockedNames == null || !Array.isArray(this.blockedNames)) { + return html`` + } + + if (this.blockedNames.indexOf(name) === -1) { + // render block button + return html` this.blockName(websiteObj)}>block ${translate('websitespage.schange31')}` + } else { + // render unblock button + return html` this.unblockName(websiteObj)}>radio_button_unchecked ${translate('websitespage.schange32')}` + } + } + + renderBlockUnblockButtonTab(websiteObj) { + let name = websiteObj.name + + // Only show the block/unblock button if we have permission to modify the list on this node + if (this.blockedNames == null || !Array.isArray(this.blockedNames)) { + return html`` + } + + if (this.blockedNames.indexOf(name) === -1) { + // render block button + return html` this.blockNameTab(websiteObj)}>block ${translate('websitespage.schange31')}` + } else { + // render unblock button + return html` this.unblockNameTab(websiteObj)}>radio_button_unchecked ${translate('websitespage.schange32')}` + } + } + + bytesToSize(bytes) { + var sizes = ['bytes', 'KB', 'MB', 'GB', 'TB'] + if (bytes == 0) return '0 bytes' + var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))) + return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i] + } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } +} + +window.customElements.define('q-websites', QWebsites) \ No newline at end of file diff --git a/plugins/plugins/core/qdn/browser/browser.src.js b/plugins/plugins/core/qdn/browser/browser.src.js index 8d0c5ad5..60fb6e53 100644 --- a/plugins/plugins/core/qdn/browser/browser.src.js +++ b/plugins/plugins/core/qdn/browser/browser.src.js @@ -1,19 +1,8 @@ -import {css, html, LitElement} from 'lit' -import {Epml} from '../../../../epml' -import isElectron from 'is-electron' -import {get, registerTranslateConfig, translate, use} from '../../../../../core/translate' -import ShortUniqueId from 'short-unique-id'; -import FileSaver from 'file-saver' -import * as actions from '../../components/qdn-action-types' -import '@material/mwc-button' -import '@material/mwc-icon' -import '@material/mwc-checkbox' -import WebWorker from 'web-worker:./computePowWorkerFile.src.js' -import WebWorkerChat from 'web-worker:./computePowWorker.src.js' -import {publishData} from '../../../utils/publish-image.js' -import {Loader} from '../../../utils/loader.js'; -import {QORT_DECIMALS} from '../../../../../crypto/api/constants' -import {mimeToExtensionMap} from '../../components/qdn-action-constants'; +import { html, LitElement } from 'lit' +import { Epml } from '../../../../epml' +import { Loader, publishData } from '../../../utils/classes' +import { QORT_DECIMALS } from '../../../../../crypto/api/constants' +import { mimeToExtensionMap } from '../../components/qdn-action-constants' import { base64ToUint8Array, decryptDeprecatedSingle, @@ -22,13 +11,25 @@ import { fileToBase64, uint8ArrayStartsWith, uint8ArrayToBase64 -} from '../../components/qdn-action-encryption'; +} from '../../components/qdn-action-encryption' +import { webBrowserStyles, webBrowserModalStyles } from '../../components/plugins-css' +import * as actions from '../../components/qdn-action-types' +import isElectron from 'is-electron' +import ShortUniqueId from 'short-unique-id' +import FileSaver from 'file-saver' +import WebWorker from 'web-worker:./computePowWorkerFile.js' +import WebWorkerChat from 'web-worker:./computePowWorker.js' +import '@material/mwc-button' +import '@material/mwc-icon' +import '@material/mwc-checkbox' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../../core/translate' registerTranslateConfig({ - loader: (lang) => fetch(`/language/${lang}.json`).then((res) => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }); +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) class WebBrowser extends LitElement { static get properties() { @@ -60,77 +61,7 @@ class WebBrowser extends LitElement { } static get styles() { - return css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --paper-input-container-focus-color: var(--mdc-theme-primary); - --mdc-checkbox-unchecked-color: var(--black); - --mdc-theme-on-surface: var(--black); - --mdc-checkbox-disabled-color: var(--black); - --mdc-checkbox-ink-color: var(--black); - } - - #websitesWrapper paper-button { - float: right; - } - - #websitesWrapper .buttons { - width: auto !important; - } - - .address-bar { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 100px; - background-color: var(--white); - height: 36px; - } - - .address-bar-button mwc-icon { - width: 20px; - } - - .iframe-container { - position: absolute; - top: 36px; - left: 0; - right: 0; - bottom: 0; - border-top: 1px solid var(--black); - } - - .iframe-container iframe { - display: block; - width: 100%; - height: 100%; - border: none; - background-color: var(--white); - } - - input[type='text'] { - margin: 0; - padding: 2px 0 0 20px; - border: 0; - height: 34px; - font-size: 16px; - background-color: var(--white); - } - input { - outline: none - } - - - paper-progress { - --paper-progress-active-color: var(--mdc-theme-primary); - } - - .float-right { - float: right; - } - `; + return [webBrowserStyles] } constructor() { @@ -142,15 +73,8 @@ class WebBrowser extends LitElement { const urlParams = new URLSearchParams(window.location.search) this.name = urlParams.get('name') this.service = urlParams.get('service') - this.identifier = - urlParams.get('identifier') != null - ? urlParams.get('identifier') - : null - this.path = - urlParams.get('path') != null - ? (urlParams.get('path').startsWith('/') ? '' : '/') + - urlParams.get('path') - : '' + this.identifier = urlParams.get('identifier') != null ? urlParams.get('identifier') : null + this.path = urlParams.get('path') != null ? (urlParams.get('path').startsWith('/') ? '' : '/') + urlParams.get('path') : '' this.preview = urlParams.get('preview') this.link = urlParams.get('link') this.dev = urlParams.get('dev') @@ -166,9 +90,11 @@ class WebBrowser extends LitElement { displayUrl = 'qortal://app/development' } else { displayUrl = 'qortal://' + this.service + '/' + this.name + if (this.identifier && this.identifier != 'null' && this.identifier != 'default') { displayUrl = displayUrl.concat('/' + this.identifier) } + if (this.path != null && this.path != '/') { displayUrl = displayUrl.concat(this.path) } @@ -178,8 +104,9 @@ class WebBrowser extends LitElement { const getFollowedNames = async () => { this.followedNames = await parentEpml.request('apiCall', { - url: `/lists/followedNames?apiKey=${this.getApiKey()}`, + url: `/lists/followedNames?apiKey=${this.getApiKey()}` }) + setTimeout( getFollowedNames, this.config.user.nodeSettings.pingInterval @@ -188,8 +115,9 @@ class WebBrowser extends LitElement { const getBlockedNames = async () => { this.blockedNames = await parentEpml.request('apiCall', { - url: `/lists/blockedNames?apiKey=${this.getApiKey()}`, + url: `/lists/blockedNames?apiKey=${this.getApiKey()}` }) + setTimeout( getBlockedNames, this.config.user.nodeSettings.pingInterval @@ -197,12 +125,8 @@ class WebBrowser extends LitElement { } const render = () => { - 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 myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port if (this.preview != null && this.preview.length > 0) { // In preview mode we access the preview URL path directly @@ -211,10 +135,7 @@ class WebBrowser extends LitElement { this.url = `${this.link}` } else { // Normal mode - - this.url = `${nodeUrl}/render/${this.service}/${this.name}${this.path != null ? this.path : '' - }?theme=${this.theme}&identifier=${(this.identifier != null && this.identifier != 'null') ? this.identifier : '' - }` + this.url = `${nodeUrl}/render/${this.service}/${this.name}${this.path != null ? this.path : ''}?theme=${this.theme}&identifier=${(this.identifier != null && this.identifier != 'null') ? this.identifier : ''}` } } @@ -231,7 +152,10 @@ class WebBrowser extends LitElement { parentEpml.ready().then(() => { parentEpml.subscribe('selected_address', async (selectedAddress) => { selectedAddress = JSON.parse(selectedAddress) - if (!selectedAddress || Object.entries(selectedAddress).length === 0) return + + if (!selectedAddress || Object.entries(selectedAddress).length === 0) { + return + } this.selectedAddress = selectedAddress this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet @@ -241,6 +165,7 @@ class WebBrowser extends LitElement { this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet }) + parentEpml.subscribe('config', (c) => { this.config = JSON.parse(c) if (!configLoaded) { @@ -253,119 +178,28 @@ class WebBrowser extends LitElement { }) } - async extractComponents(url) { - if (!url.startsWith("qortal://")) { - return null - } - - url = url.replace(/^(qortal\:\/\/)/, "") - if (url.includes("/")) { - let parts = url.split("/") - const service = parts[0].toUpperCase() - parts.shift() - const name = parts[0] - parts.shift() - let identifier - if (parts.length > 0) { - identifier = parts[0] // Do not shift yet - // Check if a resource exists with this service, name and identifier combination - let responseObj = await parentEpml.request('apiCall', { - url: `/arbitrary/resource/status/${service}/${name}/${identifier}?apiKey=${this.getApiKey()}` - }) - - if (responseObj.totalChunkCount > 0) { - // Identifier exists, so don't include it in the path - parts.shift() - } - else { - identifier = null - } - } - const path = parts.join("/") - const components = {} - components["service"] = service - components["name"] = name - components["identifier"] = identifier - components["path"] = path - return components - } - - return null - } - - async _handleKeyDown(e) { - if (e.key === 'Enter') { - let newQuery = e.target.value - if (newQuery.endsWith('/')) { - newQuery = newQuery.slice(0, -1) - } - const res = await this.extractComponents(newQuery) - if (!res) return - const { service, name, identifier, path } = res - let query = `?service=${service}` - if (name) { - query = query + `&name=${name}` - } - if (identifier) { - query = query + `&identifier=${identifier}` - } - if (path) { - query = query + `&path=${path}` - } - window.location = window.location.origin + window.location.pathname + query - } - } - - async linkOpenNewTab(link) { - - let newQuery = link - if (newQuery.endsWith('/')) { - newQuery = newQuery.slice(0, -1) - } - const res = await this.extractComponents(newQuery) - if (!res) return - const { service, name, identifier, path } = res - let query = `?service=${service}` - if (name) { - query = query + `&name=${name}` - } - if (identifier) { - query = query + `&identifier=${identifier}` - } - if (path) { - query = query + `&path=${path}` - } - - window.parent.reduxStore.dispatch(window.parent.reduxAction.setNewTab({ - url: `qdn/browser/index.html${query}`, - id: this.uid.rnd(), - myPlugObj: { - "url": service === 'WEBSITE' ? "websites" : "qapps", - "domain": "core", - "page": `qdn/browser/index.html${query}`, - "title": name, - "icon": service === 'WEBSITE' ? 'vaadin:desktop' : 'vaadin:external-browser', - "mwcicon": service === 'WEBSITE' ? 'desktop_mac' : 'open_in_browser', - "menus": [], - "parent": false - } - })) - - } - render() { - return html`
    - this.goBack()} title="${translate('general.back')}" class="address-bar-button">arrow_back_ios - this.goForward()} title="${translate('browserpage.bchange1')}" class="address-bar-button">arrow_forward_ios - this.refresh()} title="${translate('browserpage.bchange2')}" class="address-bar-button">refresh - this.goBackToList()} title="${translate('browserpage.bchange3')}" class="address-bar-button">home + this.goBack()} title="${translate('general.back')}" class="address-bar-button"> + arrow_back_ios + + this.goForward()} title="${translate('browserpage.bchange1')}" class="address-bar-button"> + arrow_forward_ios + + this.refresh()} title="${translate('browserpage.bchange2')}" class="address-bar-button"> + refresh + + this.goBackToList()} title="${translate('browserpage.bchange3')}" class="address-bar-button"> + home + ${this.renderFullScreen()} - this.delete()} title="${translate('browserpage.bchange4')} ${this.service} ${this.name} ${translate('browserpage.bchange5')}" class="address-bar-button float-right">delete + this.delete()} title="${translate('browserpage.bchange4')} ${this.service} ${this.name} ${translate('browserpage.bchange5')}" class="address-bar-button float-right"> + delete + ${this.renderBlockUnblockButton()} ${this.renderFollowUnfollowButton()}
    @@ -376,358 +210,7 @@ class WebBrowser extends LitElement {
    - `; - } - - renderFullScreen() { - if (window.innerHeight == screen.height) { - return html` - this.exitFullScreen()} - title="${translate('browserpage.bchange38')}" - class="address-bar-button float-right" - > - fullscreen_exit - - ` - } else { - return html` - this.goFullScreen()} - title="${translate('browserpage.bchange37')}" - class="address-bar-button float-right" - > - fullscreen - - ` - } - } - - goFullScreen() { - var elem = this.shadowRoot.getElementById('websitesWrapper') - - if (elem.requestFullscreen) { - elem.requestFullscreen() - } else if (elem.mozRequestFullScreen) { - elem.mozRequestFullScreen() - } else if (elem.webkitRequestFullscreen) { - elem.webkitRequestFullscreen() - } else if (elem.msRequestFullscreen) { - elem.msRequestFullscreen() - } - - this.renderFullScreen() - } - - exitFullScreen() { - if (document.exitFullscreen) { - document.exitFullscreen() - } else if (document.mozCancelFullScreen) { - document.mozCancelFullScreen() - } else if (document.webkitExitFullscreen) { - document.webkitExitFullscreen() - } else if (document.msExitFullscreen) { - document.msExitFullscreen() - } - - this.renderFullScreen() - } - - async unitJoinFee() { - 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/unitfee?txType=JOIN_GROUP` - const response = await fetch(url) - if (!response.ok) { - throw new Error('Error when fetching join fee') - } - - const data = await response.json() - return (Number(data) / 1e8).toFixed(8) - } - - async deployAtFee() { - 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/unitfee?txType=DEPLOY_AT` - const response = await fetch(url) - if (!response.ok) { - throw new Error('Error when fetching join fee') - } - - const data = await response.json() - return (Number(data) / 1e8).toFixed(8) - } - - async getArbitraryFee() { - const timestamp = Date.now() - 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/unitfee?txType=ARBITRARY×tamp=${timestamp}` - const response = await fetch(url) - if (!response.ok) { - throw new Error('Error when fetching arbitrary fee') - } - const data = await response.json() - const arbitraryFee = (Number(data) / 1e8).toFixed(8) - return { - timestamp, - fee: Number(data), - feeToShow: arbitraryFee - } - } - async sendQortFee() { - 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/unitfee?txType=PAYMENT` - const response = await fetch(url) - if (!response.ok) { - throw new Error('Error when fetching join fee') - } - - const data = await response.json() - return (Number(data) / 1e8).toFixed(8) - } - - async unitVoteFee() { - 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/unitfee?txType=VOTE_ON_POLL` - const response = await fetch(url) - if (!response.ok) { - throw new Error('Error when fetching vote fee') - } - - const data = await response.json() - return (Number(data) / 1e8).toFixed(8) - } - - async unitCreatePollFee() { - 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/unitfee?txType=CREATE_POLL` - const response = await fetch(url) - if (!response.ok) { - throw new Error('Error when fetching vote fee') - } - - const data = await response.json() - return (Number(data) / 1e8).toFixed(8) - } - - async _joinGroup(groupId, groupName) { - const joinFeeInput = await this.unitJoinFee() - const getLastRef = async () => { - return await parentEpml.request('apiCall', { - type: 'api', - url: `/addresses/lastreference/${this.selectedAddress.address}` - }) - } - - const validateReceiver = async () => { - let lastRef = await getLastRef() - let myTransaction = await makeTransactionRequest(lastRef) - return getTxnRequestResponse(myTransaction) - } - - const makeTransactionRequest = async (lastRef) => { - let groupdialog1 = get("transactions.groupdialog1") - let groupdialog2 = get("transactions.groupdialog2") - return await parentEpml.request('transaction', { - type: 31, - nonce: this.selectedAddress.nonce, - params: { - fee: joinFeeInput, - registrantAddress: this.selectedAddress.address, - rGroupName: groupName, - rGroupId: groupId, - lastReference: lastRef, - groupdialog1: groupdialog1, - groupdialog2: groupdialog2 - }, - apiVersion: 2 - }) - } - - const getTxnRequestResponse = (txnResponse) => { - if (txnResponse.success === false && txnResponse.message) { - throw new Error(txnResponse.message) - } else if (txnResponse.success === true && !txnResponse.data.error) { - return txnResponse.data - } else if (txnResponse.data && txnResponse.data.message) { - throw new Error(txnResponse.data.message) - } else { - throw new Error('Server error. Could not perform action.') - } - } - return await validateReceiver() - - } - - async _deployAt(name, description, tags, creationBytes, amount, assetId, atType) { - const deployAtFee = await this.deployAtFee() - const getLastRef = async () => { - return await parentEpml.request('apiCall', { - type: 'api', - url: `/addresses/lastreference/${this.selectedAddress.address}` - }) - } - - const validateReceiver = async () => { - let lastRef = await getLastRef() - let myTransaction = await makeTransactionRequest(lastRef) - return getTxnRequestResponse(myTransaction) - } - - const makeTransactionRequest = async (lastRef) => { - let deployAtdialog1 = get("transactions.deployAtdialog1") - let deployAtdialog2 = get("transactions.deployAtdialog2") - let deployAtdialog3 = get("transactions.deployAtdialog3") - let deployAtdialog4 = get("walletpage.wchange12") - return await parentEpml.request('transaction', { - type: 16, - nonce: this.selectedAddress.nonce, - params: { - fee: deployAtFee, - rName: name, - rDescription: description, - rTags: tags, - rAmount: amount, - rAssetId: assetId, - rCreationBytes: creationBytes, - atType: atType, - lastReference: lastRef, - atDeployDialog1: deployAtdialog1, - atDeployDialog2: deployAtdialog2, - atDeployDialog3: deployAtdialog3, - atDeployDialog4: deployAtdialog4 - }, - apiVersion: 2 - }) - } - - const getTxnRequestResponse = (txnResponse) => { - if (txnResponse.success === false && txnResponse.message) { - throw new Error(txnResponse.message) - } else if (txnResponse.success === true && !txnResponse.data.error) { - return txnResponse.data - } else if (txnResponse.data && txnResponse.data.message) { - throw new Error(txnResponse.data.message) - } else { - throw new Error('Server error. Could not perform action.') - } - } - return await validateReceiver() - - } - - async _voteOnPoll(pollName, optionIndex) { - const voteFeeInput = await this.unitVoteFee() - const getLastRef = async () => { - return await parentEpml.request('apiCall', { - type: 'api', - url: `/addresses/lastreference/${this.selectedAddress.address}` - }) - } - - const validateReceiver = async () => { - let lastRef = await getLastRef() - let myTransaction = await makeTransactionRequest(lastRef) - return getTxnRequestResponse(myTransaction) - } - - const makeTransactionRequest = async (lastRef) => { - let votedialog1 = get("transactions.votedialog1") - let votedialog2 = get("transactions.votedialog2") - let feeDialog = get("walletpage.wchange12") - - return await parentEpml.request('transaction', { - type: 9, - nonce: this.selectedAddress.nonce, - params: { - fee: voteFeeInput, - voterAddress: this.selectedAddress.address, - rPollName: pollName, - rOptionIndex: optionIndex, - lastReference: lastRef, - votedialog1: votedialog1, - votedialog2: votedialog2, - feeDialog - }, - apiVersion: 2 - }) - } - - const getTxnRequestResponse = (txnResponse) => { - if (txnResponse.success === false && txnResponse.message) { - throw new Error(txnResponse.message) - } else if (txnResponse.success === true && !txnResponse.data.error) { - return txnResponse.data - } else if (txnResponse.data && txnResponse.data.message) { - throw new Error(txnResponse.data.message) - } else { - throw new Error('Server error. Could not perform action.') - } - } - return await validateReceiver() - - } - - async _createPoll(pollName, pollDescription, options, pollOwnerAddress) { - const voteFeeInput = await this.unitCreatePollFee() - const getLastRef = async () => { - return await parentEpml.request('apiCall', { - type: 'api', - url: `/addresses/lastreference/${this.selectedAddress.address}` - }) - } - - const validateReceiver = async () => { - let lastRef = await getLastRef() - let myTransaction = await makeTransactionRequest(lastRef) - return getTxnRequestResponse(myTransaction) - } - - const makeTransactionRequest = async (lastRef) => { - let votedialog3 = get("transactions.votedialog3") - let votedialog4 = get("transactions.votedialog4") - let votedialog5 = get("transactions.votedialog5") - let votedialog6 = get("transactions.votedialog6") - let feeDialog = get("walletpage.wchange12") - - return await parentEpml.request('transaction', { - type: 8, - nonce: this.selectedAddress.nonce, - params: { - fee: voteFeeInput, - ownerAddress: pollOwnerAddress, - rPollName: pollName, - rPollDesc: pollDescription, - rOptions: options, - lastReference: lastRef, - votedialog3: votedialog3, - votedialog4: votedialog4, - votedialog5: votedialog5, - votedialog6: votedialog6, - feeDialog - }, - apiVersion: 2 - }) - } - - const getTxnRequestResponse = (txnResponse) => { - if (txnResponse.success === false && txnResponse.message) { - throw new Error(txnResponse.message) - } else if (txnResponse.success === true && !txnResponse.data.error) { - return txnResponse.data - } else if (txnResponse.data && txnResponse.data.message) { - throw new Error(txnResponse.data.message) - } else { - throw new Error('Server error. Could not perform action.') - } - } - return await validateReceiver() - + ` } firstUpdated() { @@ -752,6 +235,7 @@ class WebBrowser extends LitElement { } else { this.theme = 'light' } + document.querySelector('html').setAttribute('theme', this.theme) }) @@ -764,12 +248,7 @@ class WebBrowser extends LitElement { } window.addEventListener('message', async (event) => { - if ( - event == null || - event.data == null || - event.data.length == 0 || - event.data.action == null - ) { + if (event == null || event.data == null || event.data.length == 0 || event.data.action == null) { return } @@ -778,7 +257,6 @@ class WebBrowser extends LitElement { switch (data.action) { case actions.GET_USER_ACCOUNT: { - let skip = false if (window.parent.reduxStore.getState().app.qAPPAutoAuth) { skip = true @@ -829,16 +307,14 @@ class WebBrowser extends LitElement { if (encryptDataResponse) { data64 = encryptDataResponse response = JSON.stringify(encryptDataResponse) - break; + break } else { dataSentBack['error'] = "Unable to encrypt" response = JSON.stringify(dataSentBack) break } - } catch (error) { - const data = {} data['error'] = error.message || "Error in encrypting data" response = JSON.stringify(data) @@ -847,9 +323,7 @@ class WebBrowser extends LitElement { } case actions.DECRYPT_DATA: { - const { encryptedData, publicKey } = data - try { let data = {} if (!encryptedData) { @@ -861,19 +335,14 @@ class WebBrowser extends LitElement { const uint8Array = base64ToUint8Array(encryptedData) const startsWithQortalEncryptedData = uint8ArrayStartsWith(uint8Array, "qortalEncryptedData") if (startsWithQortalEncryptedData) { - if (!publicKey) { data['error'] = `Missing fields: publicKey` response = JSON.stringify(data) break } - - const decryptedDataToBase64 = decryptDeprecatedSingle(uint8Array, publicKey) response = JSON.stringify(decryptedDataToBase64) break - - } const startsWithQortalGroupEncryptedData = uint8ArrayStartsWith(uint8Array, "qortalGroupEncryptedData") if (startsWithQortalGroupEncryptedData) { @@ -884,12 +353,10 @@ class WebBrowser extends LitElement { break } - data['error'] = "Unable to decrypt" response = JSON.stringify(data) break } catch (error) { - const data = {} data['error'] = error.message || "Error in decrypting data" response = JSON.stringify(data) @@ -900,13 +367,11 @@ class WebBrowser extends LitElement { case actions.GET_LIST_ITEMS: { const requiredFields = ['list_name'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -928,14 +393,11 @@ class WebBrowser extends LitElement { } ) } - - if (res1 && res1.action === 'accept' || skip) { - try { const list = await parentEpml.request('apiCall', { type: 'api', - url: `/lists/${data.list_name}?apiKey=${this.getApiKey()}`, + url: `/lists/${data.list_name}?apiKey=${this.getApiKey()}` }) response = JSON.stringify(list) @@ -946,7 +408,6 @@ class WebBrowser extends LitElement { } finally { break } - } else { const data = {} data['error'] = "User declined to share list" @@ -958,13 +419,11 @@ class WebBrowser extends LitElement { case actions.ADD_LIST_ITEMS: { const requiredFields = ['list_name', 'items'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -982,14 +441,11 @@ class WebBrowser extends LitElement { items: items } ) - if (res && res.action === 'accept') { - try { const body = { items: items, } - const bodyToString = JSON.stringify(body) response = await parentEpml.request('apiCall', { type: 'api', @@ -997,8 +453,8 @@ class WebBrowser extends LitElement { url: `/lists/${list_name}?apiKey=${this.getApiKey()}`, body: bodyToString, headers: { - 'Content-Type': 'application/json', - }, + 'Content-Type': 'application/json' + } }) } catch (error) { const data = {} @@ -1007,7 +463,6 @@ class WebBrowser extends LitElement { } finally { break } - } else { const data = {} data['error'] = "User declined add to list" @@ -1019,13 +474,11 @@ class WebBrowser extends LitElement { case actions.DELETE_LIST_ITEM: { const requiredFields = ['list_name', 'item'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1043,24 +496,20 @@ class WebBrowser extends LitElement { item: item } ) - if (res && res.action === 'accept') { - try { const body = { - items: [item], + items: [item] } - const bodyToString = JSON.stringify(body) - response = await parentEpml.request('apiCall', { type: 'api', method: 'DELETE', url: `/lists/${list_name}?apiKey=${this.getApiKey()}`, body: bodyToString, headers: { - 'Content-Type': 'application/json', - }, + 'Content-Type': 'application/json' + } }) } catch (error) { const data = {} @@ -1069,7 +518,6 @@ class WebBrowser extends LitElement { } finally { break } - } else { const data = {} data['error'] = "User declined add to list" @@ -1089,13 +537,9 @@ class WebBrowser extends LitElement { actions.GET_FRIENDS_LIST ) } - - if (res1 && res1.action === 'accept' || skip) { - try { let list = JSON.parse(localStorage.getItem('friends-my-friend-list') || "[]") - list = list.map((friend) => friend.name || "") response = JSON.stringify(list) } catch (error) { @@ -1103,9 +547,7 @@ class WebBrowser extends LitElement { data['error'] = "Error in retrieving friends list" response = JSON.stringify(data) } - break - } else { const data = {} data['error'] = "User declined to share friends list" @@ -1122,39 +564,30 @@ class WebBrowser extends LitElement { this.displayUrl = translate("appspage.schange40") return } - let url = 'qortal://' + data.service + '/' + data.name - this.path = - data.path != null - ? (data.path.startsWith('/') ? '' : '/') + data.path - : null - if ( - data.identifier != null && - data.identifier != '' && - data.identifier != 'default' - ) + this.path = data.path != null ? (data.path.startsWith('/') ? '' : '/') + data.path : null + if (data.identifier != null && data.identifier != '' && data.identifier != 'default') { url = url.concat('/' + data.identifier) - if (this.path != null && this.path != '/') + } + if (this.path != null && this.path != '/') { url = url.concat(this.path) + } this.name = data.name this.service = data.service this.identifier = data.identifier this.displayUrl = url - const frame = window.frameElement - let tabId = "" + let tabId = '' if (frame && frame.dataset.id) { tabId = frame.dataset.id } - if (data.name === 'Q-Mail') { localStorage.setItem("Q-Mail-last-visited", Date.now()) - } window.parent.reduxStore.dispatch(window.parent.reduxAction.addTabInfo({ name: data.name, service: data.service, - id: tabId ? tabId : "" + id: tabId ? tabId : '' })) return @@ -1168,27 +601,23 @@ class WebBrowser extends LitElement { response['error'] = 'missing count' break } - window.parent.reduxStore.dispatch(window.parent.reduxAction.setTabNotifications({ name: this.name, count: count })) response = true break - } case actions.PUBLISH_QDN_RESOURCE: { // optional fields: encrypt:boolean recipientPublicKey:string const requiredFields = ['service', 'name'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1221,7 +650,6 @@ class WebBrowser extends LitElement { if (data.identifier == null) { identifier = 'default' } - if (data.encrypt && (!data.publicKeys || (Array.isArray(data.publicKeys) && data.publicKeys.length === 0))) { let data = {} data['error'] = "Encrypting data requires public keys" @@ -1239,7 +667,6 @@ class WebBrowser extends LitElement { } const getArbitraryFee = await this.getArbitraryFee() feeAmount = getArbitraryFee.fee - if (data.encrypt) { try { const encryptDataResponse = encryptDataGroup({ @@ -1248,7 +675,6 @@ class WebBrowser extends LitElement { if (encryptDataResponse) { data64 = encryptDataResponse } - } catch (error) { const obj = {} obj['error'] = error.message || 'Upload failed due to failed encryption' @@ -1257,7 +683,6 @@ class WebBrowser extends LitElement { } } - const res2 = await showModalAndWait( actions.PUBLISH_QDN_RESOURCE, { @@ -1298,7 +723,6 @@ class WebBrowser extends LitElement { withFee: res2.userData.isWithFee === true, feeAmount: feeAmount }) - response = JSON.stringify(resPublish) worker.terminate() } catch (error) { @@ -1330,7 +754,6 @@ class WebBrowser extends LitElement { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1368,7 +791,6 @@ class WebBrowser extends LitElement { feeAmount: getArbitraryFee.feeToShow } ) - if (res2.action === 'reject') { response = '{"error": "User declined request"}' break @@ -1380,13 +802,11 @@ class WebBrowser extends LitElement { try { const requiredFields = ['service', 'name'] const missingFields = [] - requiredFields.forEach((field) => { if (!resource[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1396,7 +816,6 @@ class WebBrowser extends LitElement { }) continue } - if (!resource.file && !resource.data64) { const errorMsg = 'No data or file was submitted' failedPublishesIdentifiers.push({ @@ -1405,7 +824,6 @@ class WebBrowser extends LitElement { }) continue } - const service = resource.service const name = resource.name let identifier = resource.identifier @@ -1422,7 +840,6 @@ class WebBrowser extends LitElement { if (resource.identifier == null) { identifier = 'default' } - if (!data.encrypt && service.endsWith("_PRIVATE")) { const errorMsg = "Only encrypted data can go into private services" failedPublishesIdentifiers.push({ @@ -1434,18 +851,14 @@ class WebBrowser extends LitElement { if (data.file) { data64 = await fileToBase64(data.file) } - - if (data.encrypt) { try { - const encryptDataResponse = encryptDataGroup({ data64, publicKeys: data.publicKeys }) if (encryptDataResponse) { data64 = encryptDataResponse } - } catch (error) { const errorMsg = error.message || 'Upload failed due to failed encryption' failedPublishesIdentifiers.push({ @@ -1454,15 +867,12 @@ class WebBrowser extends LitElement { }) continue } - } if (resource.file && !data.encrypt) { data64 = await fileToBase64(resource.file) } - const worker = new WebWorker() try { - await publishData({ registeredName: encodeURIComponent(name), file: data64, @@ -1486,12 +896,11 @@ class WebBrowser extends LitElement { withFee: res2.userData.isWithFee === true, feeAmount: feeAmount }) - worker.terminate() await new Promise((res) => { setTimeout(() => { res() - }, 1000); + }, 1000) }) } catch (error) { worker.terminate() @@ -1501,16 +910,12 @@ class WebBrowser extends LitElement { identifier: resource.identifier }) } - } catch (error) { failedPublishesIdentifiers.push({ reason: "Unknown error", identifier: resource.identifier }) } - - - } this.loader.hide() if (failedPublishesIdentifiers.length > 0) { @@ -1523,23 +928,18 @@ class WebBrowser extends LitElement { this.loader.hide() break } - response = true break - - } case actions.VOTE_ON_POLL: { const requiredFields = ['pollName', 'optionIndex'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field] && data[field] !== 0) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1548,15 +948,13 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - const pollName = data.pollName const optionIndex = data.optionIndex - let pollInfo = null try { pollInfo = await parentEpml.request("apiCall", { type: "api", - url: `/polls/${encodeURIComponent(pollName)}`, + url: `/polls/${encodeURIComponent(pollName)}` }) } catch (error) { const errorMsg = (error && error.message) || 'Poll not found' @@ -1565,7 +963,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - if (!pollInfo || pollInfo.error) { const errorMsg = (pollInfo && pollInfo.message) || 'Poll not found' let obj = {} @@ -1573,7 +970,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - try { this.loader.show() const resVoteOnPoll = await this._voteOnPoll(pollName, optionIndex) @@ -1585,20 +981,17 @@ class WebBrowser extends LitElement { } finally { this.loader.hide() } - break } case actions.CREATE_POLL: { const requiredFields = ['pollName', 'pollDescription', 'pollOptions', 'pollOwnerAddress'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1607,12 +1000,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - const pollName = data.pollName const pollDescription = data.pollDescription const pollOptions = data.pollOptions const pollOwnerAddress = data.pollOwnerAddress - try { this.loader.show() const resCreatePoll = await this._createPoll(pollName, pollDescription, pollOptions, pollOwnerAddress) @@ -1624,7 +1015,6 @@ class WebBrowser extends LitElement { } finally { this.loader.hide() } - break } @@ -1635,7 +1025,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - try { await this.linkOpenNewTab(data.qortalLink) response = true @@ -1647,12 +1036,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - } case actions.NOTIFICATIONS_PERMISSION: { try { - const res = await showModalAndWait( actions.NOTIFICATIONS_PERMISSION, { @@ -1667,11 +1054,9 @@ class WebBrowser extends LitElement { response = false break } - } catch (error) { break } - } case actions.SEND_LOCAL_NOTIFICATION: { @@ -1685,7 +1070,6 @@ class WebBrowser extends LitElement { const interval = appInfo.interval if (lastNotification && interval) { const timeDifference = Date.now() - lastNotification - if (timeDifference > interval) { parentEpml.request('showNotification', { title, type: "qapp-local-notification", sound: '', url, options: { body: message, icon, badge: icon } @@ -1706,29 +1090,25 @@ class WebBrowser extends LitElement { } else { throw new Error(`invalid data`) } - } catch (error) { const obj = {} obj['error'] = error.message || "error in pushing notification" response = JSON.stringify(obj) break - } - } + case actions.SEND_CHAT_MESSAGE: { const message = data.message const recipient = data.destinationAddress const groupId = data.groupId const isRecipient = !groupId const sendMessage = async (messageText, chatReference) => { - let _reference = new Uint8Array(64) window.crypto.getRandomValues(_reference) let reference = window.parent.Base58.encode(_reference) const sendMessageRequest = async () => { let chatResponse - if (isRecipient) { chatResponse = await parentEpml.request('chat', { type: 18, @@ -1746,10 +1126,7 @@ class WebBrowser extends LitElement { isText: 1 } }) - - } - if (!isRecipient) { chatResponse = await parentEpml.request('chat', { type: 181, @@ -1767,20 +1144,15 @@ class WebBrowser extends LitElement { isText: 1 } }) - - } - return await _computePow(chatResponse) } - const _computePow = async (chatBytes) => { const difficulty = 8 const path = window.parent.location.origin + '/memory-pow/memory-pow.wasm.full' const worker = new WebWorkerChat() let nonce = null let chatBytesArray = null - await new Promise((res) => { worker.postMessage({ chatBytes, path, difficulty }) worker.onmessage = e => { @@ -1789,17 +1161,14 @@ class WebBrowser extends LitElement { res() } }) - let _response = await parentEpml.request('sign_chat', { nonce: this.selectedAddress.nonce, chatBytesArray: chatBytesArray, chatNonce: nonce, apiVersion: 2 }) - return getSendChatResponse(_response) } - const getSendChatResponse = (res) => { if (res.signature) { return res @@ -1809,22 +1178,18 @@ class WebBrowser extends LitElement { throw new Error('ERROR: Could not send message') } } - return await sendMessageRequest() } - const result = await showModalAndWait( actions.SEND_CHAT_MESSAGE ) if (result.action === "accept") { let hasPublicKey = true - if (isRecipient) { const res = await parentEpml.request('apiCall', { type: 'api', url: `/addresses/publickey/${recipient}` }) - if (res.error === 102) { this._publicKey.key = '' this._publicKey.hasPubKey = false @@ -1838,46 +1203,27 @@ class WebBrowser extends LitElement { hasPublicKey = false } } - - if (!hasPublicKey && isRecipient) { response = '{"error": "Cannot send an encrypted message to this user since they do not have their publickey on chain."}' break } - - - const tiptapJson = { type: 'doc', - content: [ - { - type: 'paragraph', - content: [ - { - type: 'text', - text: message, - }, - - ], - }, - ], + content: [{ + type: 'paragraph', + content: [{ + type: 'text', + text: message + }] + }] } - const messageObject = { messageText: tiptapJson, images: [''], repliedTo: '', version: 3 } - const stringifyMessageObject = JSON.stringify(messageObject) - // if (this.balance < 4) { - // this.myTrimmedMeassage = '' - // this.myTrimmedMeassage = stringifyMessageObject - // this.shadowRoot.getElementById('confirmDialog').open() - // } else { - // this.sendMessage(stringifyMessageObject, typeMessage) - // } try { this.loader.show() response = await sendMessage(stringifyMessageObject) @@ -1892,9 +1238,7 @@ class WebBrowser extends LitElement { response = '{"error": "Request could not be fulfilled"}' } finally { this.loader.hide() - } - } else { response = '{"error": "User declined request"}' } @@ -1909,13 +1253,11 @@ class WebBrowser extends LitElement { case actions.JOIN_GROUP: { const requiredFields = ['groupId'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1925,13 +1267,11 @@ class WebBrowser extends LitElement { break } const groupId = data.groupId - - let groupInfo = null try { groupInfo = await parentEpml.request("apiCall", { type: "api", - url: `/groups/${groupId}`, + url: `/groups/${groupId}` }) } catch (error) { const errorMsg = (error && error.message) || 'Group not found' @@ -1940,7 +1280,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - if (!groupInfo || groupInfo.error) { const errorMsg = (groupInfo && groupInfo.message) || 'Group not found' let obj = {} @@ -1948,7 +1287,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - try { this.loader.show() const resJoinGroup = await this._joinGroup(groupId, groupInfo.groupName) @@ -1960,7 +1298,6 @@ class WebBrowser extends LitElement { } finally { this.loader.hide() } - // Params: data.groupId // TODO: prompt user to join group. If they confirm, sign+process a JOIN_GROUP transaction // then set the response string from the core to the `response` variable (defined above) @@ -1970,16 +1307,13 @@ class WebBrowser extends LitElement { case actions.SAVE_FILE: { try { - const requiredFields = ['filename', 'blob'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -1988,25 +1322,18 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - - - const filename = data.filename const blob = data.blob - const res = await showModalAndWait( actions.SAVE_FILE, { filename } ) - if (res.action === 'reject') { response = '{"error": "User declined request"}' break - } - const mimeType = blob.type || data.mimeType let backupExention = filename.split('.').pop() if (backupExention) { @@ -2033,7 +1360,6 @@ class WebBrowser extends LitElement { } } } - try { const fileHandle = await self.showSaveFilePicker({ suggestedName: filename, @@ -2041,10 +1367,8 @@ class WebBrowser extends LitElement { { description: mimeType, ...fileHandleOptions - }, + } ] - - }) const writeFile = async (fileHandle, contents) => { const writable = await fileHandle.createWritable() @@ -2061,7 +1385,6 @@ class WebBrowser extends LitElement { } FileSaver.saveAs(blob, filename) } - response = JSON.stringify(true) } catch (error) { const obj = {} @@ -2071,16 +1394,14 @@ class WebBrowser extends LitElement { break } - case 'DEPLOY_AT': { + case actions.DEPLOY_AT: { const requiredFields = ['name', 'description', 'tags', 'creationBytes', 'amount', 'assetId', 'type'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field] && data[field] !== 0) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -2089,11 +1410,8 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - - try { this.loader.show() - const resDeployAt = await this._deployAt(data.name, data.description, data.tags, data.creationBytes, data.amount, data.assetId, data.type) response = JSON.stringify(resDeployAt) } catch (error) { @@ -2106,27 +1424,23 @@ class WebBrowser extends LitElement { break } - case 'GET_PROFILE_DATA': { + case actions.GET_PROFILE_DATA: { const defaultProperties = ['tagline', 'bio', 'wallets'] - const requiredFields = ['property']; - const missingFields = []; - + const requiredFields = ['property'] + const missingFields = [] requiredFields.forEach((field) => { if (!data[field] && data[field] !== 0) { - missingFields.push(field); + missingFields.push(field) } - }); - + }) if (missingFields.length > 0) { - const missingFieldsString = missingFields.join(', '); + const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` - let data = {}; - data['error'] = errorMsg; - response = JSON.stringify(data); + let data = {} + data['error'] = errorMsg + response = JSON.stringify(data) break } - - try { const profileData = window.parent.reduxStore.getState().app.profileData if (!profileData) { @@ -2137,25 +1451,22 @@ class WebBrowser extends LitElement { if (propertyIndex !== -1) { const requestedData = profileData[property] if (requestedData) { - response = JSON.stringify(requestedData); + response = JSON.stringify(requestedData) break } else { throw new Error('Cannot find requested data') } } - if (property.includes('-private')) { const resPrivateProperty = await showModalAndWait( actions.GET_PROFILE_DATA, { - property - } - ); - + property + } + ) if (resPrivateProperty.action === 'accept') { - const requestedData = profileData.customData[property] if (requestedData) { - response = JSON.stringify(requestedData); + response = JSON.stringify(requestedData) break } else { throw new Error('Cannot find requested data') @@ -2166,42 +1477,38 @@ class WebBrowser extends LitElement { } else { const requestedData = profileData.customData[property] if (requestedData) { - response = JSON.stringify(requestedData); + response = JSON.stringify(requestedData) break } else { throw new Error('Cannot find requested data') } } - } catch (error) { - const obj = {}; - obj['error'] = error.message || 'Failed to join the group.'; - response = JSON.stringify(obj); + const obj = {} + obj['error'] = error.message || 'Failed to join the group.' + response = JSON.stringify(obj) } finally { - this.loader.hide(); + this.loader.hide() } - break; + break } - case 'SET_PROFILE_DATA': { - const requiredFields = ['property', 'data']; - const missingFields = []; + case actions.SET_PROFILE_DATA: { + const requiredFields = ['property', 'data'] + const missingFields = [] requiredFields.forEach((field) => { if (!data[field] && data[field] !== 0) { - missingFields.push(field); + missingFields.push(field) } - }); - + }) if (missingFields.length > 0) { - const missingFieldsString = missingFields.join(', '); + const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` - let data = {}; - data['error'] = errorMsg; - response = JSON.stringify(data); + let data = {} + data['error'] = errorMsg + response = JSON.stringify(data) break } - - try { const property = data.property const payload = data.data @@ -2209,16 +1516,12 @@ class WebBrowser extends LitElement { const fee = await this.getArbitraryFee() const resSetPrivateProperty = await showModalAndWait( actions.SET_PROFILE_DATA, { - property, - fee: fee.feeToShow - } - ); - - + property, + fee: fee.feeToShow + } + ) if (resSetPrivateProperty.action !== 'accept') throw new Error('User declined permission') - //dispatch event and wait until I get a response to continue - // Create and dispatch custom event const customEvent = new CustomEvent('qortal-request-set-profile-data', { detail: { @@ -2226,102 +1529,91 @@ class WebBrowser extends LitElement { payload, uniqueId } - }); - window.parent.dispatchEvent(customEvent); - + }) + window.parent.dispatchEvent(customEvent) // Wait for response event const res = await new Promise((resolve, reject) => { function handleResponseEvent(event) { // Handle the data from the event, if any - const responseData = event.detail; + const responseData = event.detail if (responseData && responseData.uniqueId !== uniqueId) return // Clean up by removing the event listener once we've received the response - window.removeEventListener('qortal-request-set-profile-data-response', handleResponseEvent); + window.removeEventListener('qortal-request-set-profile-data-response', handleResponseEvent) if (responseData.response === 'saved') { - resolve(responseData); + resolve(responseData) } else { - reject(new Error('not saved')); + reject(new Error('not saved')) } } - // Set up an event listener to wait for the response - window.addEventListener('qortal-request-set-profile-data-response', handleResponseEvent); - }); + window.addEventListener('qortal-request-set-profile-data-response', handleResponseEvent) + }) if (!res.response) throw new Error('Failed to set property') - response = JSON.stringify(res.response); - + response = JSON.stringify(res.response) } catch (error) { - const obj = {}; - obj['error'] = error.message || 'Failed to set property.'; - response = JSON.stringify(obj); + const obj = {} + obj['error'] = error.message || 'Failed to set property.' + response = JSON.stringify(obj) } finally { - this.loader.hide(); + this.loader.hide() } - break; + break } - case 'OPEN_PROFILE': { - const requiredFields = ['name']; - const missingFields = []; - + case actions.OPEN_PROFILE: { + const requiredFields = ['name'] + const missingFields = [] requiredFields.forEach((field) => { if (!data[field] && data[field] !== 0) { - missingFields.push(field); + missingFields.push(field) } - }); - + }) if (missingFields.length > 0) { - const missingFieldsString = missingFields.join(', '); + const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` - let data = {}; - data['error'] = errorMsg; - response = JSON.stringify(data); + let data = {} + data['error'] = errorMsg + response = JSON.stringify(data) break } - - try { const customEvent = new CustomEvent('open-visiting-profile', { detail: data.name - }); - window.parent.dispatchEvent(customEvent); - response = JSON.stringify(true); + }) + window.parent.dispatchEvent(customEvent) + response = JSON.stringify(true) } catch (error) { - const obj = {}; - obj['error'] = error.message || 'Failed to open profile'; - response = JSON.stringify(obj); + const obj = {} + obj['error'] = error.message || 'Failed to open profile' + response = JSON.stringify(obj) } - break; + break } - case actions.GET_USER_WALLET: { - const requiredFields = ['coin']; - const missingFields = []; - + const requiredFields = ['coin'] + const missingFields = [] requiredFields.forEach((field) => { if (!data[field]) { - missingFields.push(field); + missingFields.push(field) } - }); - + }) if (missingFields.length > 0) { - const missingFieldsString = missingFields.join(', '); + const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` - let data = {}; - data['error'] = errorMsg; - response = JSON.stringify(data); + let data = {} + data['error'] = errorMsg + response = JSON.stringify(data) break } const res3 = await showModalAndWait( actions.GET_USER_WALLET - ); - + ) if (res3.action === 'accept') { - let coin = data.coin; - let userWallet = {}; - let arrrAddress = ""; + let coin = data.coin + let userWallet = {} + let arrrAddress = "" if (coin === "ARRR") { arrrAddress = await parentEpml.request('apiCall', { url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`, @@ -2360,24 +1652,22 @@ class WebBrowser extends LitElement { default: break } - response = JSON.stringify(userWallet); - break; + response = JSON.stringify(userWallet) + break } else if (res3.action === 'reject') { - response = '{"error": "User declined request"}'; + response = '{"error": "User declined request"}' } - break; + break } case actions.GET_WALLET_BALANCE: { const requiredFields = ['coin'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -2393,7 +1683,6 @@ class WebBrowser extends LitElement { const res3 = await showModalAndWait( actions.GET_WALLET_BALANCE ) - if (res3.action === 'accept') { let coin = data.coin if (coin === "QORT") { @@ -2401,7 +1690,7 @@ class WebBrowser extends LitElement { try { this.loader.show() response = await parentEpml.request('apiCall', { - url: `/addresses/balance/${qortAddress}?apiKey=${this.getApiKey()}`, + url: `/addresses/balance/${qortAddress}?apiKey=${this.getApiKey()}` }) @@ -2417,7 +1706,6 @@ class WebBrowser extends LitElement { } else { let _url = `` let _body = null - switch (coin) { case 'BTC': _url = `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}` @@ -2451,7 +1739,7 @@ class WebBrowser extends LitElement { const res = await parentEpml.request('apiCall', { url: _url, method: 'POST', - body: _body, + body: _body }) if (isNaN(Number(res))) { const data = {} @@ -2474,19 +1762,17 @@ class WebBrowser extends LitElement { } else if (res3.action === 'reject') { response = '{"error": "User declined request"}' } - break } + case actions.GET_USER_WALLET_INFO: { const requiredFields = ['coin'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -2495,23 +1781,17 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - const userWallet = await showModalAndWait( actions.GET_USER_WALLET ) - if (userWallet.action === 'accept') { - let coin = data.coin; - let walletKeys = this.getUserWallet(coin); - + let coin = data.coin + let walletKeys = this.getUserWallet(coin) let _url = `/crosschain/` + data.coin.toLowerCase() + `/addressinfos?apiKey=${this.getApiKey()}` - let _body = { - xpub58: walletKeys['publickey'] - } - + let _body = { xpub58: walletKeys['publickey'] } try { this.loader.show() - const bodyToString = JSON.stringify(_body); + const bodyToString = JSON.stringify(_body) const res = await parentEpml.request('apiCall', { url: _url, method: 'POST', @@ -2519,9 +1799,9 @@ class WebBrowser extends LitElement { 'Accept': '*/*', 'Content-Type': 'application/json' }, - body: bodyToString, + body: bodyToString }) - response = JSON.stringify(res); + response = JSON.stringify(res) } catch (error) { console.error(error) const data = {} @@ -2534,20 +1814,16 @@ class WebBrowser extends LitElement { } else if (userWallet.action === 'reject') { response = '{"error": "User declined request"}' } - break } - case actions.GET_CROSSCHAIN_SERVER_INFO: { const requiredFields = ['coin'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -2556,7 +1832,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - let _url = `/crosschain/` + data.coin.toLowerCase() + `/serverinfos` try { this.loader.show() @@ -2567,30 +1842,27 @@ class WebBrowser extends LitElement { 'Accept': '*/*' } }) - response = JSON.stringify(res.servers); + response = JSON.stringify(res.servers) } catch (error) { - console.error(error) - const data = {} + console.error(error) + const data = {} data['error'] = error.message || 'Error in retrieving server info' - response = JSON.stringify(data) - return - } finally { - this.loader.hide() - } - + response = JSON.stringify(data) + return + } finally { + this.loader.hide() + } break } case actions.GET_TX_ACTIVITY_SUMMARY: { const requiredFields = ['coin'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -2599,9 +1871,8 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - try { - let coin = data.coin; + let coin = data.coin response = await parentEpml.request('apiCall', { type: 'api', method: 'POST', @@ -2609,7 +1880,7 @@ class WebBrowser extends LitElement { headers: { 'Accept': '*/*', 'Content-Type': 'application/json' - }, + } }) } catch (error) { const data = {} @@ -2620,11 +1891,87 @@ class WebBrowser extends LitElement { } } + case actions.GET_FOREIGN_FEE: { + const requiredFields = ['coin','type'] + const missingFields = [] + requiredFields.forEach((field) => { + if (!data[field]) { + missingFields.push(field) + } + }) + if (missingFields.length > 0) { + const missingFieldsString = missingFields.join(', ') + const errorMsg = `Missing fields: ${missingFieldsString}` + let data = {} + data['error'] = errorMsg + response = JSON.stringify(data) + break + } + try { + let coin = data.coin; + let type = data.type; + response = await parentEpml.request('apiCall', { + type: 'api', + method: 'GET', + url: `/crosschain/${coin}/${type}?apiKey=${this.getApiKey()}`, + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json' + }, + }) + } catch (error) { + const data = {} + data['error'] = "Error in get foreign fee" + response = JSON.stringify(data) + } finally { + break + } + } + + case actions.UPDATE_FOREIGN_FEE: { + const requiredFields = ['coin','type'] + const missingFields = [] + requiredFields.forEach((field) => { + if (!data[field]) { + missingFields.push(field) + } + }) + if (missingFields.length > 0) { + const missingFieldsString = missingFields.join(', ') + const errorMsg = `Missing fields: ${missingFieldsString}` + let data = {} + data['error'] = errorMsg + response = JSON.stringify(data) + break + } + try { + let coin = data.coin; + let type = data.type; + let value = data.value; + response = await parentEpml.request('apiCall', { + type: 'api', + method: 'POST', + url: `/crosschain/${coin}/update${type}?apiKey=${this.getApiKey()}`, + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json' + }, + body: `${value}` + }) + } catch (error) { + const data = {} + data['error'] = "Error in update foreign fee" + response = JSON.stringify(data) + } finally { + break + } + } + case actions.GET_DAY_SUMMARY: { try { response = await parentEpml.request('apiCall', { type: 'api', - url: `/admin/summary?apiKey=${this.getApiKey()}`, + url: `/admin/summary?apiKey=${this.getApiKey()}` }) } catch (error) { const data = {} @@ -2638,13 +1985,11 @@ class WebBrowser extends LitElement { case actions.SEND_COIN: { const requiredFields = ['coin', 'destinationAddress', 'amount'] const missingFields = [] - requiredFields.forEach((field) => { if (!data[field]) { missingFields.push(field) } }) - if (missingFields.length > 0) { const missingFieldsString = missingFields.join(', ') const errorMsg = `Missing fields: ${missingFieldsString}` @@ -2654,9 +1999,7 @@ class WebBrowser extends LitElement { response = JSON.stringify(data) break } - let checkCoin = data.coin - if (checkCoin === "QORT") { // Params: data.coin, data.destinationAddress, data.amount, data.fee // TODO: prompt user to send. If they confirm, call `POST /crosschain/:coin/send`, or for QORT, broadcast a PAYMENT transaction @@ -2665,11 +2008,9 @@ class WebBrowser extends LitElement { const amount = Number(data.amount) const recipient = data.destinationAddress const coin = data.coin - const walletBalance = await parentEpml.request('apiCall', { - url: `/addresses/balance/${this.myAddress.address}`, + url: `/addresses/balance/${this.myAddress.address}` }) - if (isNaN(Number(walletBalance))) { let errorMsg = "Failed to Fetch QORT Balance. Try again!" let failedMsg = get("walletpage.wchange33") + " QORT " + get("general.balance") @@ -2680,18 +2021,15 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const myRef = await parentEpml.request("apiCall", { type: "api", - url: `/addresses/lastreference/${this.myAddress.address}`, + url: `/addresses/lastreference/${this.myAddress.address}` }) - const transformDecimals = (Number(walletBalance) * QORT_DECIMALS).toFixed(0) const walletBalanceDecimals = Number(transformDecimals) const amountDecimals = Number(amount) * QORT_DECIMALS const balance = (Number(transformDecimals) / 1e8).toFixed(8) const fee = await this.sendQortFee() - if (amountDecimals + (fee * QORT_DECIMALS) > walletBalanceDecimals) { let errorMsg = "Insufficient Funds!" let failedMsg = get("walletpage.wchange26") @@ -2702,7 +2040,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - if (amount <= 0) { let errorMsg = "Invalid Amount!" await showErrorAndWait("INVALID_AMOUNT", errorMsg) @@ -2711,7 +2048,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - if (recipient.length === 0) { let errorMsg = "Receiver cannot be empty!" await showErrorAndWait("NO_RECEIVER", errorMsg) @@ -2720,7 +2056,6 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const processPayment = await showModalAndWait( actions.SEND_COIN, { @@ -2731,7 +2066,6 @@ class WebBrowser extends LitElement { fee } ) - if (processPayment.action === 'reject') { let errorMsg = "User declined request" let myMsg1 = get("transactions.declined") @@ -2740,14 +2074,12 @@ class WebBrowser extends LitElement { response = '{"error": "User declined request"}' break } - const validateName = async (receiverName) => { let myRes let myNameRes = await parentEpml.request('apiCall', { type: 'api', - url: `/names/${receiverName}`, + url: `/names/${receiverName}` }) - if (myNameRes.error === 401) { myRes = false } else { @@ -2755,21 +2087,17 @@ class WebBrowser extends LitElement { } return myRes } - const validateAddress = async (receiverAddress) => { return await window.parent.validateAddress(receiverAddress) } - const validateReceiver = async (recipient) => { let lastRef = myRef let isAddress - try { isAddress = await validateAddress(recipient) } catch (err) { isAddress = false } - if (isAddress) { let myTransaction = await makeTransactionRequest(recipient, lastRef) return getTxnRequestResponse(myTransaction) @@ -2787,26 +2115,22 @@ class WebBrowser extends LitElement { } } } - const getName = async (recipient) => { try { const getNames = await parentEpml.request("apiCall", { type: "api", url: `/names/address/${recipient}` }) - if (getNames.length > 0) { return getNames[0].name } else { return '' } } catch (error) { - return "" + return '' } } - this.loader.show() - const makeTransactionRequest = async (receiver, lastRef) => { let myReceiver = receiver let mylastRef = lastRef @@ -2832,7 +2156,6 @@ class WebBrowser extends LitElement { apiVersion: 2 }) } - const getTxnRequestResponse = (txnResponse) => { if (txnResponse.success === false && txnResponse.message) { this.loader.hide() @@ -2844,9 +2167,7 @@ class WebBrowser extends LitElement { this.loader.hide() throw new Error('Error: could not send coin') } - } - try { response = await validateReceiver(recipient) } catch (error) { @@ -2863,13 +2184,11 @@ class WebBrowser extends LitElement { const coin = data.coin const xprv58 = this.btcWallet.derivedMasterPrivateKey const feePerByte = data.fee ? data.fee : this.btcFeePerByte - const btcWalletBalance = await parentEpml.request('apiCall', { url: `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}`, method: 'POST', body: `${this.btcWallet.derivedMasterPublicKey}` }) - if (isNaN(Number(btcWalletBalance))) { this.loader.hide() let errorMsg = "Failed to Fetch BTC Balance. Try again!" @@ -2881,12 +2200,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const btcWalletBalanceDecimals = Number(btcWalletBalance) const btcAmountDecimals = Number(amount) * QORT_DECIMALS const balance = (Number(btcWalletBalance) / 1e8).toFixed(8) const fee = feePerByte * 500 // default 0.00050000 - if (btcAmountDecimals + (fee * QORT_DECIMALS) > btcWalletBalanceDecimals) { this.loader.hide() let errorMsg = "Insufficient Funds!" @@ -2898,9 +2215,7 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - this.loader.hide() - const processPayment = await showModalAndWait( actions.SEND_COIN, { @@ -2911,7 +2226,6 @@ class WebBrowser extends LitElement { fee } ) - if (processPayment.action === 'reject') { let errorMsg = "User declined request" let myMsg1 = get("transactions.declined") @@ -2920,9 +2234,7 @@ class WebBrowser extends LitElement { response = '{"error": "User declined request"}' break } - this.loader.show() - const makeRequest = async () => { const opts = { xprv58: xprv58, @@ -2932,7 +2244,6 @@ class WebBrowser extends LitElement { } return await parentEpml.request('sendBtc', opts) } - const manageResponse = (response) => { if (response.length === 64) { this.loader.hide() @@ -2953,7 +2264,6 @@ class WebBrowser extends LitElement { throw new Error(response) } } - try { const res = await makeRequest() manageResponse(res) @@ -2972,13 +2282,11 @@ class WebBrowser extends LitElement { const coin = data.coin const xprv58 = this.ltcWallet.derivedMasterPrivateKey const feePerByte = data.fee ? data.fee : this.ltcFeePerByte - const ltcWalletBalance = await parentEpml.request('apiCall', { url: `/crosschain/ltc/walletbalance?apiKey=${this.getApiKey()}`, method: 'POST', body: `${this.ltcWallet.derivedMasterPublicKey}` }) - if (isNaN(Number(ltcWalletBalance))) { this.loader.hide() let errorMsg = "Failed to Fetch LTC Balance. Try again!" @@ -2990,12 +2298,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const ltcWalletBalanceDecimals = Number(ltcWalletBalance) const ltcAmountDecimals = Number(amount) * QORT_DECIMALS const balance = (Number(ltcWalletBalance) / 1e8).toFixed(8) const fee = feePerByte * 1000 // default 0.00030000 - if (ltcAmountDecimals + (fee * QORT_DECIMALS) > ltcWalletBalanceDecimals) { this.loader.hide() let errorMsg = "Insufficient Funds!" @@ -3007,9 +2313,7 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - this.loader.hide() - const processPayment = await showModalAndWait( actions.SEND_COIN, { @@ -3020,7 +2324,6 @@ class WebBrowser extends LitElement { fee } ) - if (processPayment.action === 'reject') { let errorMsg = "User declined request" let myMsg1 = get("transactions.declined") @@ -3029,9 +2332,7 @@ class WebBrowser extends LitElement { response = '{"error": "User declined request"}' break } - this.loader.show() - const makeRequest = async () => { const opts = { xprv58: xprv58, @@ -3041,7 +2342,6 @@ class WebBrowser extends LitElement { } return await parentEpml.request('sendLtc', opts) } - const manageResponse = (response) => { if (response.length === 64) { this.loader.hide() @@ -3062,7 +2362,6 @@ class WebBrowser extends LitElement { throw new Error(response) } } - try { const res = await makeRequest() manageResponse(res) @@ -3081,13 +2380,11 @@ class WebBrowser extends LitElement { const coin = data.coin const xprv58 = this.dogeWallet.derivedMasterPrivateKey const feePerByte = data.fee ? data.fee : this.dogeFeePerByte - const dogeWalletBalance = await parentEpml.request('apiCall', { url: `/crosschain/doge/walletbalance?apiKey=${this.getApiKey()}`, method: 'POST', body: `${this.dogeWallet.derivedMasterPublicKey}` }) - if (isNaN(Number(dogeWalletBalance))) { this.loader.hide() let errorMsg = "Failed to Fetch DOGE Balance. Try again!" @@ -3099,12 +2396,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const dogeWalletBalanceDecimals = Number(dogeWalletBalance) const dogeAmountDecimals = Number(amount) * QORT_DECIMALS const balance = (Number(dogeWalletBalance) / 1e8).toFixed(8) const fee = feePerByte * 5000 // default 0.05000000 - if (dogeAmountDecimals + (fee * QORT_DECIMALS) > dogeWalletBalanceDecimals) { this.loader.hide() let errorMsg = "Insufficient Funds!" @@ -3116,9 +2411,7 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - this.loader.hide() - const processPayment = await showModalAndWait( actions.SEND_COIN, { @@ -3129,7 +2422,6 @@ class WebBrowser extends LitElement { fee } ) - if (processPayment.action === 'reject') { let errorMsg = "User declined request" let myMsg1 = get("transactions.declined") @@ -3138,9 +2430,7 @@ class WebBrowser extends LitElement { response = '{"error": "User declined request"}' break } - this.loader.show() - const makeRequest = async () => { const opts = { xprv58: xprv58, @@ -3150,7 +2440,6 @@ class WebBrowser extends LitElement { } return await parentEpml.request('sendDoge', opts) } - const manageResponse = (response) => { if (response.length === 64) { this.loader.hide() @@ -3171,7 +2460,6 @@ class WebBrowser extends LitElement { throw new Error(response) } } - try { const res = await makeRequest() manageResponse(res) @@ -3190,13 +2478,11 @@ class WebBrowser extends LitElement { const coin = data.coin const xprv58 = this.dgbWallet.derivedMasterPrivateKey const feePerByte = data.fee ? data.fee : this.dgbFeePerByte - const dgbWalletBalance = await parentEpml.request('apiCall', { url: `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}`, method: 'POST', body: `${this.dgbWallet.derivedMasterPublicKey}` }) - if (isNaN(Number(dgbWalletBalance))) { this.loader.hide() let errorMsg = "Failed to Fetch DGB Balance. Try again!" @@ -3208,12 +2494,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const dgbWalletBalanceDecimals = Number(dgbWalletBalance) const dgbAmountDecimals = Number(amount) * QORT_DECIMALS const balance = (Number(dgbWalletBalance) / 1e8).toFixed(8) const fee = feePerByte * 500 // default 0.00005000 - if (dgbAmountDecimals + (fee * QORT_DECIMALS) > dgbWalletBalanceDecimals) { this.loader.hide() let errorMsg = "Insufficient Funds!" @@ -3225,9 +2509,7 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - this.loader.hide() - const processPayment = await showModalAndWait( actions.SEND_COIN, { @@ -3238,7 +2520,6 @@ class WebBrowser extends LitElement { fee } ) - if (processPayment.action === 'reject') { let errorMsg = "User declined request" let myMsg1 = get("transactions.declined") @@ -3247,9 +2528,7 @@ class WebBrowser extends LitElement { response = '{"error": "User declined request"}' break } - this.loader.show() - const makeRequest = async () => { const opts = { xprv58: xprv58, @@ -3259,7 +2538,6 @@ class WebBrowser extends LitElement { } return await parentEpml.request('sendDgb', opts) } - const manageResponse = (response) => { if (response.length === 64) { this.loader.hide() @@ -3280,7 +2558,6 @@ class WebBrowser extends LitElement { throw new Error(response) } } - try { const res = await makeRequest() manageResponse(res) @@ -3299,13 +2576,11 @@ class WebBrowser extends LitElement { const coin = data.coin const xprv58 = this.rvnWallet.derivedMasterPrivateKey const feePerByte = data.fee ? data.fee : this.rvnFeePerByte - const rvnWalletBalance = await parentEpml.request('apiCall', { url: `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}`, method: 'POST', body: `${this.rvnWallet.derivedMasterPublicKey}` }) - if (isNaN(Number(rvnWalletBalance))) { this.loader.hide() let errorMsg = "Failed to Fetch RVN Balance. Try again!" @@ -3317,12 +2592,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const rvnWalletBalanceDecimals = Number(rvnWalletBalance) const rvnAmountDecimals = Number(amount) * QORT_DECIMALS const balance = (Number(rvnWalletBalance) / 1e8).toFixed(8) const fee = feePerByte * 500 // default 0.00562500 - if (rvnAmountDecimals + (fee * QORT_DECIMALS) > rvnWalletBalanceDecimals) { this.loader.hide() let errorMsg = "Insufficient Funds!" @@ -3334,9 +2607,7 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - this.loader.hide() - const processPayment = await showModalAndWait( actions.SEND_COIN, { @@ -3347,7 +2618,6 @@ class WebBrowser extends LitElement { fee } ) - if (processPayment.action === 'reject') { let errorMsg = "User declined request" let myMsg1 = get("transactions.declined") @@ -3356,9 +2626,7 @@ class WebBrowser extends LitElement { response = '{"error": "User declined request"}' break } - this.loader.show() - const makeRequest = async () => { const opts = { xprv58: xprv58, @@ -3368,7 +2636,6 @@ class WebBrowser extends LitElement { } return await parentEpml.request('sendRvn', opts) } - const manageResponse = (response) => { if (response.length === 64) { this.loader.hide() @@ -3389,7 +2656,6 @@ class WebBrowser extends LitElement { throw new Error(response) } } - try { const res = await makeRequest() manageResponse(res) @@ -3408,13 +2674,11 @@ class WebBrowser extends LitElement { const coin = data.coin const memo = data.memo const seed58 = this.arrrWallet.seed58 - const arrrWalletBalance = await parentEpml.request('apiCall', { url: `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}`, method: 'POST', body: `${this.arrrWallet.seed58}` }) - if (isNaN(Number(arrrWalletBalance))) { this.loader.hide() let errorMsg = "Failed to Fetch ARRR Balance. Try again!" @@ -3426,12 +2690,10 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - const arrrWalletBalanceDecimals = Number(arrrWalletBalance) const arrrAmountDecimals = Number(amount) * QORT_DECIMALS const balance = (Number(arrrWalletBalance) / 1e8).toFixed(8) const fee = 0.00010000 - if (arrrAmountDecimals + (fee * QORT_DECIMALS) > arrrWalletBalanceDecimals) { this.loader.hide() let errorMsg = "Insufficient Funds!" @@ -3443,9 +2705,7 @@ class WebBrowser extends LitElement { response = JSON.stringify(obj) break } - this.loader.hide() - const processPayment = await showModalAndWait( actions.SEND_COIN, { @@ -3456,7 +2716,6 @@ class WebBrowser extends LitElement { fee } ) - if (processPayment.action === 'reject') { let errorMsg = "User declined request" let myMsg1 = get("transactions.declined") @@ -3465,9 +2724,7 @@ class WebBrowser extends LitElement { response = '{"error": "User declined request"}' break } - this.loader.show() - const makeRequest = async () => { const opts = { entropy58: seed58, @@ -3477,7 +2734,6 @@ class WebBrowser extends LitElement { } return await parentEpml.request('sendArrr', opts) } - const manageResponse = (response) => { if (response.length === 64) { this.loader.hide() @@ -3498,7 +2754,6 @@ class WebBrowser extends LitElement { throw new Error(response) } } - try { const res = await makeRequest() manageResponse(res) @@ -3513,7 +2768,7 @@ class WebBrowser extends LitElement { break } } - break; + break default: console.log('Unhandled message: ' + JSON.stringify(data)) return @@ -3531,24 +2786,446 @@ class WebBrowser extends LitElement { if (responseObj.error != null) { event.ports[0].postMessage({ result: null, - error: responseObj, + error: responseObj }) } else { event.ports[0].postMessage({ result: responseObj, - error: null, + error: null }) } }) + this.clearConsole() + setInterval(() => { this.clearConsole() }, 60000) } - getUserWallet(coin) { - let userWallet = {}; + renderFullScreen() { + if (window.innerHeight == screen.height) { + return html` + this.exitFullScreen()} + title="${translate('browserpage.bchange38')}" + class="address-bar-button float-right" + > + fullscreen_exit + + ` + } else { + return html` + this.goFullScreen()} + title="${translate('browserpage.bchange37')}" + class="address-bar-button float-right" + > + fullscreen + + ` + } + } + goFullScreen() { + var elem = this.shadowRoot.getElementById('websitesWrapper') + if (elem.requestFullscreen) { + elem.requestFullscreen() + } else if (elem.mozRequestFullScreen) { + elem.mozRequestFullScreen() + } else if (elem.webkitRequestFullscreen) { + elem.webkitRequestFullscreen() + } else if (elem.msRequestFullscreen) { + elem.msRequestFullscreen() + } + this.renderFullScreen() + } + + exitFullScreen() { + if (document.exitFullscreen) { + document.exitFullscreen() + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen() + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen() + } else if (document.msExitFullscreen) { + document.msExitFullscreen() + } + this.renderFullScreen() + } + + async unitJoinFee() { + 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/unitfee?txType=JOIN_GROUP` + const response = await fetch(url) + if (!response.ok) { + throw new Error('Error when fetching join fee') + } + const data = await response.json() + return (Number(data) / 1e8).toFixed(8) + } + + async deployAtFee() { + 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/unitfee?txType=DEPLOY_AT` + const response = await fetch(url) + if (!response.ok) { + throw new Error('Error when fetching join fee') + } + const data = await response.json() + return (Number(data) / 1e8).toFixed(8) + } + + async getArbitraryFee() { + const timestamp = Date.now() + 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/unitfee?txType=ARBITRARY×tamp=${timestamp}` + const response = await fetch(url) + if (!response.ok) { + throw new Error('Error when fetching arbitrary fee') + } + const data = await response.json() + const arbitraryFee = (Number(data) / 1e8).toFixed(8) + return { + timestamp, + fee: Number(data), + feeToShow: arbitraryFee + } + } + async sendQortFee() { + 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/unitfee?txType=PAYMENT` + const response = await fetch(url) + if (!response.ok) { + throw new Error('Error when fetching join fee') + } + const data = await response.json() + return (Number(data) / 1e8).toFixed(8) + } + + async unitVoteFee() { + 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/unitfee?txType=VOTE_ON_POLL` + const response = await fetch(url) + if (!response.ok) { + throw new Error('Error when fetching vote fee') + } + const data = await response.json() + return (Number(data) / 1e8).toFixed(8) + } + + async unitCreatePollFee() { + 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/unitfee?txType=CREATE_POLL` + const response = await fetch(url) + if (!response.ok) { + throw new Error('Error when fetching vote fee') + } + const data = await response.json() + return (Number(data) / 1e8).toFixed(8) + } + + async _joinGroup(groupId, groupName) { + const joinFeeInput = await this.unitJoinFee() + const getLastRef = async () => { + return await parentEpml.request('apiCall', { + type: 'api', + url: `/addresses/lastreference/${this.selectedAddress.address}` + }) + } + const validateReceiver = async () => { + let lastRef = await getLastRef() + let myTransaction = await makeTransactionRequest(lastRef) + return getTxnRequestResponse(myTransaction) + } + const makeTransactionRequest = async (lastRef) => { + let groupdialog1 = get("transactions.groupdialog1") + let groupdialog2 = get("transactions.groupdialog2") + return await parentEpml.request('transaction', { + type: 31, + nonce: this.selectedAddress.nonce, + params: { + fee: joinFeeInput, + registrantAddress: this.selectedAddress.address, + rGroupName: groupName, + rGroupId: groupId, + lastReference: lastRef, + groupdialog1: groupdialog1, + groupdialog2: groupdialog2 + }, + apiVersion: 2 + }) + } + const getTxnRequestResponse = (txnResponse) => { + if (txnResponse.success === false && txnResponse.message) { + throw new Error(txnResponse.message) + } else if (txnResponse.success === true && !txnResponse.data.error) { + return txnResponse.data + } else if (txnResponse.data && txnResponse.data.message) { + throw new Error(txnResponse.data.message) + } else { + throw new Error('Server error. Could not perform action.') + } + } + return await validateReceiver() + } + + async _deployAt(name, description, tags, creationBytes, amount, assetId, atType) { + const deployAtFee = await this.deployAtFee() + const getLastRef = async () => { + return await parentEpml.request('apiCall', { + type: 'api', + url: `/addresses/lastreference/${this.selectedAddress.address}` + }) + } + const validateReceiver = async () => { + let lastRef = await getLastRef() + let myTransaction = await makeTransactionRequest(lastRef) + return getTxnRequestResponse(myTransaction) + } + const makeTransactionRequest = async (lastRef) => { + let deployAtdialog1 = get("transactions.deployAtdialog1") + let deployAtdialog2 = get("transactions.deployAtdialog2") + let deployAtdialog3 = get("transactions.deployAtdialog3") + let deployAtdialog4 = get("walletpage.wchange12") + return await parentEpml.request('transaction', { + type: 16, + nonce: this.selectedAddress.nonce, + params: { + fee: deployAtFee, + rName: name, + rDescription: description, + rTags: tags, + rAmount: amount, + rAssetId: assetId, + rCreationBytes: creationBytes, + atType: atType, + lastReference: lastRef, + atDeployDialog1: deployAtdialog1, + atDeployDialog2: deployAtdialog2, + atDeployDialog3: deployAtdialog3, + atDeployDialog4: deployAtdialog4 + }, + apiVersion: 2 + }) + } + const getTxnRequestResponse = (txnResponse) => { + if (txnResponse.success === false && txnResponse.message) { + throw new Error(txnResponse.message) + } else if (txnResponse.success === true && !txnResponse.data.error) { + return txnResponse.data + } else if (txnResponse.data && txnResponse.data.message) { + throw new Error(txnResponse.data.message) + } else { + throw new Error('Server error. Could not perform action.') + } + } + return await validateReceiver() + } + + async _voteOnPoll(pollName, optionIndex) { + const voteFeeInput = await this.unitVoteFee() + const getLastRef = async () => { + return await parentEpml.request('apiCall', { + type: 'api', + url: `/addresses/lastreference/${this.selectedAddress.address}` + }) + } + const validateReceiver = async () => { + let lastRef = await getLastRef() + let myTransaction = await makeTransactionRequest(lastRef) + return getTxnRequestResponse(myTransaction) + } + const makeTransactionRequest = async (lastRef) => { + let votedialog1 = get("transactions.votedialog1") + let votedialog2 = get("transactions.votedialog2") + let feeDialog = get("walletpage.wchange12") + + return await parentEpml.request('transaction', { + type: 9, + nonce: this.selectedAddress.nonce, + params: { + fee: voteFeeInput, + voterAddress: this.selectedAddress.address, + rPollName: pollName, + rOptionIndex: optionIndex, + lastReference: lastRef, + votedialog1: votedialog1, + votedialog2: votedialog2, + feeDialog + }, + apiVersion: 2 + }) + } + const getTxnRequestResponse = (txnResponse) => { + if (txnResponse.success === false && txnResponse.message) { + throw new Error(txnResponse.message) + } else if (txnResponse.success === true && !txnResponse.data.error) { + return txnResponse.data + } else if (txnResponse.data && txnResponse.data.message) { + throw new Error(txnResponse.data.message) + } else { + throw new Error('Server error. Could not perform action.') + } + } + return await validateReceiver() + } + + async _createPoll(pollName, pollDescription, options, pollOwnerAddress) { + const voteFeeInput = await this.unitCreatePollFee() + const getLastRef = async () => { + return await parentEpml.request('apiCall', { + type: 'api', + url: `/addresses/lastreference/${this.selectedAddress.address}` + }) + } + const validateReceiver = async () => { + let lastRef = await getLastRef() + let myTransaction = await makeTransactionRequest(lastRef) + return getTxnRequestResponse(myTransaction) + } + const makeTransactionRequest = async (lastRef) => { + let votedialog3 = get("transactions.votedialog3") + let votedialog4 = get("transactions.votedialog4") + let votedialog5 = get("transactions.votedialog5") + let votedialog6 = get("transactions.votedialog6") + let feeDialog = get("walletpage.wchange12") + return await parentEpml.request('transaction', { + type: 8, + nonce: this.selectedAddress.nonce, + params: { + fee: voteFeeInput, + ownerAddress: pollOwnerAddress, + rPollName: pollName, + rPollDesc: pollDescription, + rOptions: options, + lastReference: lastRef, + votedialog3: votedialog3, + votedialog4: votedialog4, + votedialog5: votedialog5, + votedialog6: votedialog6, + feeDialog + }, + apiVersion: 2 + }) + } + const getTxnRequestResponse = (txnResponse) => { + if (txnResponse.success === false && txnResponse.message) { + throw new Error(txnResponse.message) + } else if (txnResponse.success === true && !txnResponse.data.error) { + return txnResponse.data + } else if (txnResponse.data && txnResponse.data.message) { + throw new Error(txnResponse.data.message) + } else { + throw new Error('Server error. Could not perform action.') + } + } + return await validateReceiver() + } + + async extractComponents(url) { + if (!url.startsWith("qortal://")) { + return null + } + url = url.replace(/^(qortal\:\/\/)/, "") + if (url.includes("/")) { + let parts = url.split("/") + const service = parts[0].toUpperCase() + parts.shift() + const name = parts[0] + parts.shift() + let identifier + if (parts.length > 0) { + identifier = parts[0] // Do not shift yet + // Check if a resource exists with this service, name and identifier combination + let responseObj = await parentEpml.request('apiCall', { + url: `/arbitrary/resource/status/${service}/${name}/${identifier}?apiKey=${this.getApiKey()}` + }) + + if (responseObj.totalChunkCount > 0) { + // Identifier exists, so don't include it in the path + parts.shift() + } + else { + identifier = null + } + } + const path = parts.join("/") + const components = {} + components["service"] = service + components["name"] = name + components["identifier"] = identifier + components["path"] = path + return components + } + return null + } + + async _handleKeyDown(e) { + if (e.key === 'Enter') { + let newQuery = e.target.value + if (newQuery.endsWith('/')) { + newQuery = newQuery.slice(0, -1) + } + const res = await this.extractComponents(newQuery) + if (!res) return + const { service, name, identifier, path } = res + let query = `?service=${service}` + if (name) { + query = query + `&name=${name}` + } + if (identifier) { + query = query + `&identifier=${identifier}` + } + if (path) { + query = query + `&path=${path}` + } + window.location = window.location.origin + window.location.pathname + query + } + } + + async linkOpenNewTab(link) { + let newQuery = link + if (newQuery.endsWith('/')) { + newQuery = newQuery.slice(0, -1) + } + const res = await this.extractComponents(newQuery) + if (!res) return + const { service, name, identifier, path } = res + let query = `?service=${service}` + if (name) { + query = query + `&name=${name}` + } + if (identifier) { + query = query + `&identifier=${identifier}` + } + if (path) { + query = query + `&path=${path}` + } + window.parent.reduxStore.dispatch(window.parent.reduxAction.setNewTab({ + url: `qdn/browser/index.html${query}`, + id: this.uid.rnd(), + myPlugObj: { + "url": service === 'WEBSITE' ? "websites" : "qapps", + "domain": "core", + "page": `qdn/browser/index.html${query}`, + "title": name, + "icon": service === 'WEBSITE' ? 'vaadin:desktop' : 'vaadin:external-browser', + "mwcicon": service === 'WEBSITE' ? 'desktop_mac' : 'open_in_browser', + "menus": [], + "parent": false + } + })) + } + + getUserWallet(coin) { + let userWallet = {} switch (coin) { case 'QORT': userWallet['address'] = window.parent.reduxStore.getState().app.selectedAddress.address @@ -3579,7 +3256,7 @@ class WebBrowser extends LitElement { default: break } - return userWallet; + return userWallet } clearConsole() { @@ -3602,7 +3279,6 @@ class WebBrowser extends LitElement { changeLanguage() { const checkLanguage = localStorage.getItem('qortalLanguage') - if (checkLanguage === null || checkLanguage.length === 0) { localStorage.setItem('qortalLanguage', 'us') use('us') @@ -3615,20 +3291,19 @@ class WebBrowser extends LitElement { if (!appName) throw new Error('unknown app name') const id = `appNotificationList-${this.selectedAddress.address}` const checkData = localStorage.getItem(id) ? JSON.parse(localStorage.getItem(id)) : null - if (!checkData) { const newData = { [appName]: { interval: 900000, // 15mins in milliseconds - lastNotification: null, - }, + lastNotification: null + } } localStorage.setItem(id, JSON.stringify(newData)) } else { const copyData = { ...checkData } copyData[appName] = { interval: 900000, // 15mins in milliseconds - lastNotification: null, + lastNotification: null } localStorage.setItem(id, JSON.stringify(copyData)) } @@ -3636,7 +3311,6 @@ class WebBrowser extends LitElement { updateLastNotification(id, appName) { const checkData = localStorage.getItem(id) ? JSON.parse(localStorage.getItem(id)) : null - if (checkData) { const copyData = { ...checkData } if (copyData[appName]) { @@ -3644,7 +3318,7 @@ class WebBrowser extends LitElement { } else { copyData[appName] = { interval: 900000, // 15mins in milliseconds - lastNotification: Date.now(), + lastNotification: Date.now() } } localStorage.setItem(id, JSON.stringify(copyData)) @@ -3657,23 +3331,28 @@ class WebBrowser extends LitElement { if (this.followedNames == null || !Array.isArray(this.followedNames)) { return html`` } - if (this.followedNames.indexOf(this.name) === -1) { // render follow button - return html` this.follow()} - title="${translate('browserpage.bchange7')} ${this.name}" - class="address-bar-button float-right" - >add_to_queue` + return html` + this.follow()} + title="${translate('browserpage.bchange7')} ${this.name}" + class="address-bar-button float-right" + > + add_to_queue + + ` } else { // render unfollow button - return html` this.unfollow()} - title="${translate('browserpage.bchange8')} ${this.name}" - class="address-bar-button float-right" - >remove_from_queue` + return html` + this.unfollow()} + title="${translate('browserpage.bchange8')} ${this.name}" + class="address-bar-button float-right" + > + remove_from_queue + + ` } } @@ -3682,28 +3361,32 @@ class WebBrowser extends LitElement { if (this.blockedNames == null || !Array.isArray(this.blockedNames)) { return html`` } - if (this.blockedNames.indexOf(this.name) === -1) { // render block button - return html` this.block()} - title="${translate('browserpage.bchange9')} ${this.name}" - class="address-bar-button float-right" - >block` + return html` + this.block()} + title="${translate('browserpage.bchange9')} ${this.name}" + class="address-bar-button float-right" + > + block + + ` } else { // render unblock button - return html` this.unblock()} - title="${translate('browserpage.bchange10')} ${this.name}" - class="address-bar-button float-right" - >radio_button_unchecked` + return html` + this.unblock()} + title="${translate('browserpage.bchange10')} ${this.name}" + class="address-bar-button float-right" + > + radio_button_unchecked + + ` } } // Navigation - goBack() { window.history.back() } @@ -3718,9 +3401,7 @@ class WebBrowser extends LitElement { if (this.dev === 'FRAMEWORK') { this.url = `${this.link}?time=${new Date().getMilliseconds()}` } else { - this.url = `${nodeUrl}/render/${this.service}/${this.name}${this.path != null ? this.path : '' - }?theme=${this.theme}&identifier=${this.identifier != null ? this.identifier : '' - }&time=${new Date().getMilliseconds()}` + this.url = `${nodeUrl}/render/${this.service}/${this.name}${this.path != null ? this.path : ''}?theme=${this.theme}&identifier=${this.identifier != null ? this.identifier : ''}&time=${new Date().getMilliseconds()}` } } @@ -3731,7 +3412,7 @@ class WebBrowser extends LitElement { } else { // Default to websites list this.exitFullScreen() - window.location = '../index.html' + window.location = '../../q-website/index.html' } } @@ -3758,16 +3439,14 @@ class WebBrowser extends LitElement { async followName(name) { let items = [name] let namesJsonString = JSON.stringify({ items: items }) - let ret = await parentEpml.request('apiCall', { url: `/lists/followedNames?apiKey=${this.getApiKey()}`, method: 'POST', headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'application/json' }, - body: `${namesJsonString}`, + body: `${namesJsonString}` }) - if (ret === true) { // Successfully followed - add to local list // Remove it first by filtering the list - doing it this way ensures the UI updates @@ -3780,23 +3459,20 @@ class WebBrowser extends LitElement { let err1string = get('browserpage.bchange11') parentEpml.request('showSnackBar', `${err1string}`) } - return ret } async unfollowName(name) { let items = [name] let namesJsonString = JSON.stringify({ items: items }) - let ret = await parentEpml.request('apiCall', { url: `/lists/followedNames?apiKey=${this.getApiKey()}`, method: 'DELETE', headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'application/json' }, - body: `${namesJsonString}`, + body: `${namesJsonString}` }) - if (ret === true) { // Successfully unfollowed - remove from local list this.followedNames = this.followedNames.filter( @@ -3806,23 +3482,20 @@ class WebBrowser extends LitElement { let err2string = get('browserpage.bchange12') parentEpml.request('showSnackBar', `${err2string}`) } - return ret } async blockName(name) { let items = [name] let namesJsonString = JSON.stringify({ items: items }) - let ret = await parentEpml.request('apiCall', { url: `/lists/blockedNames?apiKey=${this.getApiKey()}`, method: 'POST', headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'application/json' }, - body: `${namesJsonString}`, + body: `${namesJsonString}` }) - if (ret === true) { // Successfully blocked - add to local list // Remove it first by filtering the list - doing it this way ensures the UI updates @@ -3835,33 +3508,27 @@ class WebBrowser extends LitElement { let err3string = get('browserpage.bchange13') parentEpml.request('showSnackBar', `${err3string}`) } - return ret } async unblockName(name) { let items = [name] let namesJsonString = JSON.stringify({ items: items }) - let ret = await parentEpml.request('apiCall', { url: `/lists/blockedNames?apiKey=${this.getApiKey()}`, method: 'DELETE', headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'application/json' }, - body: `${namesJsonString}`, + body: `${namesJsonString}` }) - if (ret === true) { // Successfully unblocked - remove from local list - this.blockedNames = this.blockedNames.filter( - (item) => item != name - ) + this.blockedNames = this.blockedNames.filter((item) => item != name) } else { let err4string = get('browserpage.bchange14') parentEpml.request('showSnackBar', `${err4string}`) } - return ret } @@ -3872,32 +3539,34 @@ class WebBrowser extends LitElement { parentEpml.request('showSnackBar', `${err5string}`) return } - let identifier = (this.identifier == null || this.identifier.length == 0) ? 'default' : this.identifier - let ret = await parentEpml.request('apiCall', { - url: `/arbitrary/resource/${this.service}/${this.name - }/${identifier}?apiKey=${this.getApiKey()}`, - method: 'DELETE', + url: `/arbitrary/resource/${this.service}/${this.name}/${identifier}?apiKey=${this.getApiKey()}`, + method: 'DELETE' }) - if (ret === true) { this.goBackToList() } else { let err6string = get('browserpage.bchange16') parentEpml.request('showSnackBar', `${err6string}`) } - return ret } + // Standard functions 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] return myNode.apiKey } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } window.customElements.define('web-browser', WebBrowser) @@ -3913,7 +3582,6 @@ async function showModalAndWait(type, data) {
    -

    ${translate('sponsorshipspage.schange6')}

    @@ -236,10 +235,9 @@ class SponsorshipList extends LitElement { dialogAction='cancel' class='red' > - ${translate('general.close')} + ${translate('general.close')} -
    @@ -303,7 +301,7 @@ class SponsorshipList extends LitElement { `}
    { this.openDialogRewardShare = false this.errorMessage = '' @@ -311,12 +309,11 @@ class SponsorshipList extends LitElement { this.privateRewardShareKey = '' this.atMount() }} - class='red' - > - ${translate('general.close')} + class='red' + > + ${translate('general.close')} -

    ${translate('sponsorshipspage.schange10')}

    @@ -345,13 +342,13 @@ class SponsorshipList extends LitElement { this.lookUpPublicAddressFunc() }}' > - ${translate('sponsorshipspage.schange10')} + ${translate('sponsorshipspage.schange10')}
    ${this.lookupPublicAddressValue ? html`
    ${this.lookupPublicAddressValue} -
    +
    - ${translate('general.close')} + ${translate('general.close')}
    @@ -409,11 +406,12 @@ class SponsorshipList extends LitElement { }) } + this.clearConsole() + setInterval(() => { this.atMount() }, 180000) - this.clearConsole() setInterval(() => { this.clearConsole() }, 60000) @@ -480,11 +478,6 @@ class SponsorshipList extends LitElement { this.saveToClipboard(this.privateRewardShareKey, `${copystring1}`) } - getApiKey() { - const apiNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return apiNode.apiKey - } - async atMount() { this.addressInfo = window.parent.reduxStore.getState().app.accountInfo.addressInfo this.isPageLoading = true @@ -505,7 +498,9 @@ class SponsorshipList extends LitElement { type: 'api', url: `/names/address/${rs.recipient}` }) + let url = '' + if(getNames.length > 0 ) { const avatarNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] const avatarUrl = avatarNode.protocol + '://' + avatarNode.domain + ':' + avatarNode.port @@ -519,7 +514,7 @@ class SponsorshipList extends LitElement { ...rs, name: getNames.length > 0 ? getNames[0].name : '', url, - blocksRemaining: blocksRemaining, + blocksRemaining: blocksRemaining } }) @@ -562,7 +557,6 @@ class SponsorshipList extends LitElement { } async removeRewardShare(rewardShareObject) { - const selectedAddress = window.parent.reduxStore.getState().app.selectedAddress const myPercentageShare = -1 @@ -601,8 +595,8 @@ class SponsorshipList extends LitElement { percentageShare: myPercentageShare, lastReference: mylastRef, rewarddialog5: rewarddialog5, - rewarddialog6: rewarddialog6, - }, + rewarddialog6: rewarddialog6 + } }) } @@ -611,10 +605,7 @@ class SponsorshipList extends LitElement { this.removeRewardShareLoading = false parentEpml.request('showSnackBar', txnResponse.message) throw new Error(txnResponse) - } else if ( - txnResponse.success === true && - !txnResponse.data.error - ) { + } else if (txnResponse.success === true && !txnResponse.data.error) { let err7tring = get('rewardsharepage.rchange22') this.removeRewardShareLoading = false parentEpml.request('showSnackBar', `${err7tring}`) @@ -625,6 +616,7 @@ class SponsorshipList extends LitElement { throw new Error(txnResponse) } } + await removeReceiver() } @@ -704,38 +696,37 @@ class SponsorshipList extends LitElement { rewarddialog1: rewarddialog1, rewarddialog2: rewarddialog2, rewarddialog3: rewarddialog3, - rewarddialog4: rewarddialog4, + rewarddialog4: rewarddialog4 }, disableModal: true }) } const getTxnRequestResponse = (txnResponse) => { + const extraData = txnResponse && txnResponse.extraData + const data = txnResponse && txnResponse.data + const dataMessage = data && data.message + const extraDataPrivateKey = extraData && extraData.rewardSharePrivateKey + const txnSuccess = txnResponse && txnResponse.success - const extraData = txnResponse && txnResponse.extraData; - const data = txnResponse && txnResponse.data; - const dataMessage = data && data.message; - const extraDataPrivateKey = extraData && extraData.rewardSharePrivateKey; - const txnSuccess = txnResponse && txnResponse.success; - - if (extraDataPrivateKey && typeof dataMessage === 'string' && - (dataMessage.includes('multiple') || dataMessage.includes('SELF_SHARE_EXISTS'))) { - this.privateRewardShareKey = extraDataPrivateKey; - this.confirmRelationship(publicKeyValue, isCopy); + if (extraDataPrivateKey && typeof dataMessage === 'string' && (dataMessage.includes('multiple') || dataMessage.includes('SELF_SHARE_EXISTS'))) { + this.privateRewardShareKey = extraDataPrivateKey + this.confirmRelationship(publicKeyValue, isCopy) } else if (txnSuccess === false && txnResponse.message) { - this.errorMessage = txnResponse.message; - this.isLoadingCreateSponsorship = false; - throw new Error(txnResponse.message); + this.errorMessage = txnResponse.message + this.isLoadingCreateSponsorship = false + throw new Error(txnResponse.message) } else if (txnSuccess === true && !(data && data.error)) { - this.privateRewardShareKey = extraDataPrivateKey; - this.confirmRelationship(publicKeyValue, isCopy); + this.privateRewardShareKey = extraDataPrivateKey + this.confirmRelationship(publicKeyValue, isCopy) } else { - const defaultErrorMessage = 'An unknown error occurred.'; - this.errorMessage = dataMessage || txnResponse.message || defaultErrorMessage; - this.isLoadingCreateSponsorship = false; - throw new Error(dataMessage || txnResponse.message || defaultErrorMessage); + const defaultErrorMessage = 'An unknown error occurred.' + this.errorMessage = dataMessage || txnResponse.message || defaultErrorMessage + this.isLoadingCreateSponsorship = false + throw new Error(dataMessage || txnResponse.message || defaultErrorMessage) } } + await validateReceiver() } @@ -745,13 +736,13 @@ class SponsorshipList extends LitElement { let stop = false const getAnswer = async () => { - if (!stop) { stop= true try { const recipientAddress = window.parent.base58PublicKeyToAddress(recipientPublicKey) const minterAddress = window.parent.reduxStore.getState().app.selectedAddress.address + const myRewardShareArray = await parentEpml.request('apiCall', { type: 'api', url: `/addresses/rewardshares?minters=${minterAddress}&recipients=${recipientAddress}` @@ -767,16 +758,19 @@ class SponsorshipList extends LitElement { stop = false } } + interval = setInterval(getAnswer, 5000) } async lookUpPublicAddressFunc() { this.errorLookup = '' + try { const response = await parentEpml.request('apiCall', { type: 'api', url: `/addresses/publickey/${this.lookupAddressValue}` }) + if(response.error) { throw(response.message) } @@ -785,6 +779,21 @@ class SponsorshipList extends LitElement { this.errorLookup = error } } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -window.customElements.define('sponsorship-list', SponsorshipList) +window.customElements.define('sponsorship-list', SponsorshipList) \ No newline at end of file diff --git a/plugins/plugins/core/streams/AddressWatcher.js b/plugins/plugins/core/streams/AddressWatcher.js index c2411aa6..771b5f5b 100644 --- a/plugins/plugins/core/streams/AddressWatcher.js +++ b/plugins/plugins/core/streams/AddressWatcher.js @@ -1,4 +1,4 @@ -import {parentEpml} from '../connect.js' +import { parentEpml } from '../connect' // Tests to see if a block or transaction should trigger an address reload...but we're not doing that yet, because of no time for good testing const transactionTests = [] @@ -7,73 +7,73 @@ const blockTests = [] const DEFAULT_ADDRESS_INFO = {} transactionTests.push((tx, addr) => { - return tx.recipient === addr || tx.sender === addr + return tx.recipient === addr || tx.sender === addr }) blockTests.push((block, addr) => { - return block.generator === addr + return block.generator === addr }) export class AddressWatcher { - constructor(addresses) { - addresses = addresses || [] - this.reset() + constructor(addresses) { + addresses = addresses || [] + this.reset() - addresses.forEach(addr => this.addAddress(addr)) - } + addresses.forEach(addr => this.addAddress(addr)) + } - reset() { - this._addresses = {} - this._addressStreams = {} - } + reset() { + this._addresses = {} + this._addressStreams = {} + } - // Adds an address to watch - addAddress(address) { - const addr = address.address - this._addresses[addr] = address + // Adds an address to watch + addAddress(address) { + const addr = address.address + this._addresses[addr] = address - this._addressStreams[addr] = new EpmlStream(`address/${addr}`, () => this._addresses[addr]) + this._addressStreams[addr] = new EpmlStream(`address/${addr}`, () => this._addresses[addr]) - this.updateAddress(addr) - } + this.updateAddress(addr) + } - async testBlock(block) { - const pendingUpdateAddresses = [] - const transactions = await parentEpml.request('apiCall', { url: `/transactions/block/${block.signature}` }) - transactions.forEach(transaction => { - // Guess the block needs transactions - for (const addr of Object.keys(this._addresses)) { - const addrChanged = true // Just update it every block...for now - if (!addrChanged) return + async testBlock(block) { + const pendingUpdateAddresses = [] + const transactions = await parentEpml.request('apiCall', { url: `/transactions/block/${block.signature}` }) + transactions.forEach(transaction => { + // Guess the block needs transactions + for (const addr of Object.keys(this._addresses)) { + const addrChanged = true // Just update it every block...for now + if (!addrChanged) return - if (!(addr in pendingUpdateAddresses)) pendingUpdateAddresses.push(addr) - /** - * In the future transactions are potentially stored from here...and address is updated excluding transactions...and also somehow manage tx pages... - * Probably will just make wallet etc. listen for address change and then do the api call itself. If tx. page is on, say, page 3...and there's a new transaction... - * it will refresh, changing the "page" to have 1 extra transaction at the top and losing 1 at the bottom (pushed to next page) - */ - } - }) - pendingUpdateAddresses.forEach(addr => this.updateAddress(addr)) - } + if (!(addr in pendingUpdateAddresses)) pendingUpdateAddresses.push(addr) + /** + * In the future transactions are potentially stored from here...and address is updated excluding transactions...and also somehow manage tx pages... + * Probably will just make wallet etc. listen for address change and then do the api call itself. If tx. page is on, say, page 3...and there's a new transaction... + * it will refresh, changing the "page" to have 1 extra transaction at the top and losing 1 at the bottom (pushed to next page) + */ + } + }) + pendingUpdateAddresses.forEach(addr => this.updateAddress(addr)) + } - async updateAddress(addr) { - let addressRequest = await parentEpml.request('apiCall', { - type: 'explorer', - data: { - addr: addr, - txOnPage: 10 - } - }) - const addressInfo = addressRequest.success ? addressRequest.data : DEFAULT_ADDRESS_INFO - addressInfo.transactions = [] + async updateAddress(addr) { + let addressRequest = await parentEpml.request('apiCall', { + type: 'explorer', + data: { + addr: addr, + txOnPage: 10 + } + }) + const addressInfo = addressRequest.success ? addressRequest.data : DEFAULT_ADDRESS_INFO + addressInfo.transactions = [] - for (let i = addressInfo.start; i >= addressInfo.end; i--) { - addressInfo.transactions.push(addressInfo[i]) - delete addressInfo[i] - } - if (!(addr in this._addresses)) return - this._addresses[addr] = addressInfo - this._addressStreams[addr].emit(addressInfo) - } -} + for (let i = addressInfo.start; i >= addressInfo.end; i--) { + addressInfo.transactions.push(addressInfo[i]) + delete addressInfo[i] + } + if (!(addr in this._addresses)) return + this._addresses[addr] = addressInfo + this._addressStreams[addr].emit(addressInfo) + } +} \ No newline at end of file diff --git a/plugins/plugins/core/streams/UnconfirmedTransactionWatcher.js b/plugins/plugins/core/streams/UnconfirmedTransactionWatcher.js index 528ada42..59181c2e 100644 --- a/plugins/plugins/core/streams/UnconfirmedTransactionWatcher.js +++ b/plugins/plugins/core/streams/UnconfirmedTransactionWatcher.js @@ -1,46 +1,46 @@ -import {parentEpml} from '../connect.js' +import { parentEpml } from '../connect' export class UnconfirmedTransactionWatcher { - constructor() { - this._unconfirmedTransactionStreams = {} - this.reset() // Sets defaults + constructor() { + this._unconfirmedTransactionStreams = {} + this.reset() // Sets defaults - setInterval(() => { - Object.entries(this._addresses).forEach((addr) => this._addressTransactionCheck(addr[0])) - }, 10 * 1000) - } + setInterval(() => { + Object.entries(this._addresses).forEach((addr) => this._addressTransactionCheck(addr[0])) + }, 10 * 1000) + } - reset() { - this._addresses = {} - this._addressesUnconfirmedTransactions = {} - } + reset() { + this._addresses = {} + this._addressesUnconfirmedTransactions = {} + } - // Adds an address to watch - addAddress(address) { - const addr = address.address - this._addresses[addr] = address - this._addressesUnconfirmedTransactions[addr] = [] - if (this._unconfirmedTransactionStreams[addr]) return - this._unconfirmedTransactionStreams[addr] = new EpmlStream(`unconfirmedOfAddress/${addr}`, () => this._addressesUnconfirmedTransactions[addr]) - } + // Adds an address to watch + addAddress(address) { + const addr = address.address + this._addresses[addr] = address + this._addressesUnconfirmedTransactions[addr] = [] + if (this._unconfirmedTransactionStreams[addr]) return + this._unconfirmedTransactionStreams[addr] = new EpmlStream(`unconfirmedOfAddress/${addr}`, () => this._addressesUnconfirmedTransactions[addr]) + } - check() { - const c = this._addressTransactionCheck() - .then(() => setTimeout(() => this.check(), 5000)) - .catch(() => setTimeout(() => this.check(), 5000)) - } + check() { + const c = this._addressTransactionCheck() + .then(() => setTimeout(() => this.check(), 5000)) + .catch(() => setTimeout(() => this.check(), 5000)) + } - async _addressTransactionCheck() { - return Promise.all(Object.keys(this._addresses).map(addr => { - return parentEpml.request('apiCall', { - type: 'api', - url: `/transactions/unconfirmed` - }).then(unconfirmedTransactions => { - unconfirmedTransactions.filter(tx => { - tx.creatorAddress === addr || tx.recipient === addr - }) - this._unconfirmedTransactionStreams[addr].emit(unconfirmedTransactions) - }) - })) - } -} + async _addressTransactionCheck() { + return Promise.all(Object.keys(this._addresses).map(addr => { + return parentEpml.request('apiCall', { + type: 'api', + url: `/transactions/unconfirmed` + }).then(unconfirmedTransactions => { + unconfirmedTransactions.filter(tx => { + tx.creatorAddress === addr || tx.recipient === addr + }) + this._unconfirmedTransactionStreams[addr].emit(unconfirmedTransactions) + }) + })) + } +} \ No newline at end of file diff --git a/plugins/plugins/core/streams/onNewBlock.js b/plugins/plugins/core/streams/onNewBlock.js index 70b4068d..dda6e70f 100644 --- a/plugins/plugins/core/streams/onNewBlock.js +++ b/plugins/plugins/core/streams/onNewBlock.js @@ -1,6 +1,7 @@ -import {parentEpml} from '../connect.js' -const MIN_RECONNECT_INTERVAL = 1000; // 1 second -const MAX_RECONNECT_INTERVAL = 60000; // 1 minute +import { parentEpml } from '../connect' + +const MIN_RECONNECT_INTERVAL = 1000 // 1 second +const MAX_RECONNECT_INTERVAL = 60000 // 1 minute let socketObject let activeBlockSocketTimeout @@ -15,227 +16,242 @@ let nodeStatusRetryOnClose = false let nodeStateCall = false let isLoggedIn = false let oldAccountInfo -let blockSocketReconnectInterval = MIN_RECONNECT_INTERVAL; -let nodeStatusSocketReconnectInterval = MIN_RECONNECT_INTERVAL; +let blockSocketReconnectInterval = MIN_RECONNECT_INTERVAL +let nodeStatusSocketReconnectInterval = MIN_RECONNECT_INTERVAL parentEpml.subscribe('logged_in', loggedIn => { - isLoggedIn = loggedIn === 'true'; + isLoggedIn = loggedIn === 'true' }) - const setAccountInfo = async (addr) => { - const names = await parentEpml.request('apiCall', { - url: `/names/address/${addr}` - }) - const addressInfo = await parentEpml.request('apiCall', { - url: `/addresses/${addr}` - }) - let accountInfo = { - names: names, - addressInfo: addressInfo - } - if (window.parent._.isEqual(oldAccountInfo, accountInfo) === true) { + const names = await parentEpml.request('apiCall', { + url: `/names/address/${addr}` + }) - } else { - parentEpml.request('setAccountInfo', accountInfo) - oldAccountInfo = accountInfo - } + const addressInfo = await parentEpml.request('apiCall', { + url: `/addresses/${addr}` + }) + + let accountInfo = { + names: names, + addressInfo: addressInfo + } + + if (window.parent._.isEqual(oldAccountInfo, accountInfo) === true) { + } else { + parentEpml.request('setAccountInfo', accountInfo) + oldAccountInfo = accountInfo + } } const doNodeInfo = async () => { - const nodeInfo = await parentEpml.request('apiCall', { - url: '/admin/info' - }) - parentEpml.request('updateNodeInfo', nodeInfo) + const nodeInfo = await parentEpml.request('apiCall', { + url: '/admin/info' + }) + + parentEpml.request('updateNodeInfo', nodeInfo) } let initStateCount = 0 let oldState const closeSockets = () => { - socketObject.close() - closeGracefully = true - nodeStatusSocketObject.close() - nodeStatusSocketcloseGracefully = true + socketObject.close() + closeGracefully = true + nodeStatusSocketObject.close() + nodeStatusSocketcloseGracefully = true } export const startConfigWatcher = () => { - parentEpml.ready().then(() => { - parentEpml.subscribe('node_config', c => { - if (initStateCount === 0) { - let _oldState = JSON.parse(c) - oldState = { node: _oldState.node, knownNodes: _oldState.knownNodes } - initStateCount = initStateCount + 1 - nodeStateCall = true - isCalled = true - socketObject !== undefined ? closeSockets() : undefined - nodeStatusSocketObject !== undefined ? closeSockets() : undefined - initNodeStatusCall(oldState) - pingactiveBlockSocket() - // Call doNodeInfo - doNodeInfo() - } - let _newState = JSON.parse(c) - let newState = { node: _newState.node, knownNodes: _newState.knownNodes } - if (window.parent._.isEqual(oldState, newState) === true) { + parentEpml.ready().then(() => { + parentEpml.subscribe('node_config', c => { + if (initStateCount === 0) { + let _oldState = JSON.parse(c) + oldState = { node: _oldState.node, knownNodes: _oldState.knownNodes } + initStateCount = initStateCount + 1 + nodeStateCall = true + isCalled = true + socketObject !== undefined ? closeSockets() : undefined + nodeStatusSocketObject !== undefined ? closeSockets() : undefined + initNodeStatusCall(oldState) + pingactiveBlockSocket() + // Call doNodeInfo + doNodeInfo() + } - } else { - oldState = newState - nodeStateCall = true - isCalled = true - socketObject !== undefined ? closeSockets() : undefined - nodeStatusSocketObject !== undefined ? closeSockets() : undefined - initNodeStatusCall(newState) - pingactiveBlockSocket() - // Call doNodeInfo - doNodeInfo() - } - }) - }) - parentEpml.imReady() + let _newState = JSON.parse(c) + let newState = { node: _newState.node, knownNodes: _newState.knownNodes } + + if (window.parent._.isEqual(oldState, newState) === true) { + } else { + oldState = newState + nodeStateCall = true + isCalled = true + socketObject !== undefined ? closeSockets() : undefined + nodeStatusSocketObject !== undefined ? closeSockets() : undefined + initNodeStatusCall(newState) + pingactiveBlockSocket() + // Call doNodeInfo + doNodeInfo() + } + }) + }) + + parentEpml.imReady() } const processBlock = (blockObject) => { - parentEpml.request('updateBlockInfo', blockObject) + parentEpml.request('updateBlockInfo', blockObject) } const doNodeStatus = async (nodeStatusObject) => { - parentEpml.request('updateNodeStatus', nodeStatusObject) + parentEpml.request('updateNodeStatus', nodeStatusObject) } const initNodeStatusCall = (nodeConfig) => { - if (nodeConfig.node >= 0) { - pingNodeStatusSocket() - } else if (nodeStatusSocketObject !== undefined) { - nodeStatusSocketObject.close() - nodeStatusSocketcloseGracefully = true - } else { - // ... - } + if (nodeConfig.node >= 0) { + pingNodeStatusSocket() + } else if (nodeStatusSocketObject !== undefined) { + nodeStatusSocketObject.close() + nodeStatusSocketcloseGracefully = true + } else { + // ... + } } function attemptReconnectBlockSocket() { - setTimeout(() => { - initBlockSocket(); - blockSocketReconnectInterval = Math.min(blockSocketReconnectInterval * 2, MAX_RECONNECT_INTERVAL); - }, blockSocketReconnectInterval); + setTimeout(() => { + initBlockSocket() + blockSocketReconnectInterval = Math.min(blockSocketReconnectInterval * 2, MAX_RECONNECT_INTERVAL) + }, blockSocketReconnectInterval) } function attemptReconnectNodeStatusSocket() { - setTimeout(() => { - initNodeStatusSocket(); - nodeStatusSocketReconnectInterval = Math.min(nodeStatusSocketReconnectInterval * 2, MAX_RECONNECT_INTERVAL); - }, nodeStatusSocketReconnectInterval); + setTimeout(() => { + initNodeStatusSocket() + nodeStatusSocketReconnectInterval = Math.min(nodeStatusSocketReconnectInterval * 2, MAX_RECONNECT_INTERVAL) + }, nodeStatusSocketReconnectInterval) } - const initBlockSocket = () => { - let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - let nodeUrl = myNode.domain + ":" + myNode.port - let activeBlockSocketLink - if (window.parent.location.protocol === "https:") { - activeBlockSocketLink = `wss://${nodeUrl}/websockets/blocks` - } else { - activeBlockSocketLink = `ws://${nodeUrl}/websockets/blocks` - } - const activeBlockSocket = new WebSocket(activeBlockSocketLink) - // Open Connection - activeBlockSocket.onopen = (e) => { - blockSocketReconnectInterval = MIN_RECONNECT_INTERVAL; - closeGracefully = false - socketObject = activeBlockSocket - } - // Message Event - activeBlockSocket.onmessage = (e) => { - processBlock(JSON.parse(e.data)) - if (isLoggedIn) { - // Call Set Account Info... - setAccountInfo(window.parent.reduxStore.getState().app.selectedAddress.address) - } - } - // Closed Event - activeBlockSocket.onclose = () => { - processBlock({}); - blockFirstCall = true; - attemptReconnectBlockSocket(); - }; - // Error Event - activeBlockSocket.onerror = (e) => { - blockFirstCall = true - processBlock({}) - } - if (blockFirstCall) { - parentEpml.request('apiCall', { - url: '/blocks/last' - }).then(res => { - processBlock(res) - blockFirstCall = false - }) - } + let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + let nodeUrl = myNode.domain + ":" + myNode.port + let activeBlockSocketLink + + if (window.parent.location.protocol === "https:") { + activeBlockSocketLink = `wss://${nodeUrl}/websockets/blocks` + } else { + activeBlockSocketLink = `ws://${nodeUrl}/websockets/blocks` + } + + const activeBlockSocket = new WebSocket(activeBlockSocketLink) + + // Open Connection + activeBlockSocket.onopen = (e) => { + blockSocketReconnectInterval = MIN_RECONNECT_INTERVAL + closeGracefully = false + socketObject = activeBlockSocket + } + + // Message Event + activeBlockSocket.onmessage = (e) => { + processBlock(JSON.parse(e.data)) + if (isLoggedIn) { + // Call Set Account Info... + setAccountInfo(window.parent.reduxStore.getState().app.selectedAddress.address) + } + } + + // Closed Event + activeBlockSocket.onclose = () => { + processBlock({}) + blockFirstCall = true + attemptReconnectBlockSocket() + } + + // Error Event + activeBlockSocket.onerror = (e) => { + blockFirstCall = true + processBlock({}) + } + + if (blockFirstCall) { + parentEpml.request('apiCall', { + url: '/blocks/last' + }).then(res => { + processBlock(res) + blockFirstCall = false + }) + } } const pingactiveBlockSocket = () => { - if (isCalled) { - isCalled = false - initBlockSocket() - activeBlockSocketTimeout = setTimeout(pingactiveBlockSocket, 295000) - } else if (retryOnClose) { - retryOnClose = false - clearTimeout(activeBlockSocketTimeout) - initBlockSocket() - isCalled = true - activeBlockSocketTimeout = setTimeout(pingactiveBlockSocket, 295000) - } else { - socketObject.send("non-integer ping") - activeBlockSocketTimeout = setTimeout(pingactiveBlockSocket, 295000) - } + if (isCalled) { + isCalled = false + initBlockSocket() + activeBlockSocketTimeout = setTimeout(pingactiveBlockSocket, 295000) + } else if (retryOnClose) { + retryOnClose = false + clearTimeout(activeBlockSocketTimeout) + initBlockSocket() + isCalled = true + activeBlockSocketTimeout = setTimeout(pingactiveBlockSocket, 295000) + } else { + socketObject.send("non-integer ping") + activeBlockSocketTimeout = setTimeout(pingactiveBlockSocket, 295000) + } } const initNodeStatusSocket = () => { - let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - let nodeUrl = myNode.domain + ":" + myNode.port - let activeNodeStatusSocketLink - if (window.parent.location.protocol === "https:") { - activeNodeStatusSocketLink = `wss://${nodeUrl}/websockets/admin/status` - } else { - activeNodeStatusSocketLink = `ws://${nodeUrl}/websockets/admin/status` - } - const activeNodeStatusSocket = new WebSocket(activeNodeStatusSocketLink) - // Open Connection - activeNodeStatusSocket.onopen = (e) => { - nodeStatusSocketReconnectInterval = MIN_RECONNECT_INTERVAL; + let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + let nodeUrl = myNode.domain + ":" + myNode.port + let activeNodeStatusSocketLink - nodeStatusSocketcloseGracefully = false - nodeStatusSocketObject = activeNodeStatusSocket - } - // Message Event - activeNodeStatusSocket.onmessage = (e) => { - doNodeStatus(JSON.parse(e.data)) - } - // Closed Event - activeNodeStatusSocket.onclose = () => { - doNodeStatus({}); - attemptReconnectNodeStatusSocket(); - }; - // Error Event - activeNodeStatusSocket.onerror = (e) => { - doNodeStatus({}) - } + if (window.parent.location.protocol === "https:") { + activeNodeStatusSocketLink = `wss://${nodeUrl}/websockets/admin/status` + } else { + activeNodeStatusSocketLink = `ws://${nodeUrl}/websockets/admin/status` + } + + const activeNodeStatusSocket = new WebSocket(activeNodeStatusSocketLink) + + // Open Connection + activeNodeStatusSocket.onopen = (e) => { + nodeStatusSocketReconnectInterval = MIN_RECONNECT_INTERVAL + nodeStatusSocketcloseGracefully = false + nodeStatusSocketObject = activeNodeStatusSocket + } + + // Message Event + activeNodeStatusSocket.onmessage = (e) => { + doNodeStatus(JSON.parse(e.data)) + } + + // Closed Event + activeNodeStatusSocket.onclose = () => { + doNodeStatus({}) + attemptReconnectNodeStatusSocket() + } + + // Error Event + activeNodeStatusSocket.onerror = (e) => { + doNodeStatus({}) + } } const pingNodeStatusSocket = () => { - if (nodeStateCall) { - clearTimeout(nodeStatusSocketTimeout) - initNodeStatusSocket() - nodeStateCall = false - nodeStatusSocketTimeout = setTimeout(pingNodeStatusSocket, 295000) - } else if (nodeStatusRetryOnClose) { - nodeStatusRetryOnClose = false - clearTimeout(nodeStatusSocketTimeout) - initNodeStatusSocket() - nodeStatusSocketTimeout = setTimeout(pingNodeStatusSocket, 295000) - } else { - nodeStatusSocketObject.send("non-integer ping") - nodeStatusSocketTimeout = setTimeout(pingNodeStatusSocket, 295000) - } -} + if (nodeStateCall) { + clearTimeout(nodeStatusSocketTimeout) + initNodeStatusSocket() + nodeStateCall = false + nodeStatusSocketTimeout = setTimeout(pingNodeStatusSocket, 295000) + } else if (nodeStatusRetryOnClose) { + nodeStatusRetryOnClose = false + clearTimeout(nodeStatusSocketTimeout) + initNodeStatusSocket() + nodeStatusSocketTimeout = setTimeout(pingNodeStatusSocket, 295000) + } else { + nodeStatusSocketObject.send("non-integer ping") + nodeStatusSocketTimeout = setTimeout(pingNodeStatusSocket, 295000) + } +} \ No newline at end of file diff --git a/plugins/plugins/core/streams/streams.js b/plugins/plugins/core/streams/streams.js index 7b382a63..30a5ea3f 100644 --- a/plugins/plugins/core/streams/streams.js +++ b/plugins/plugins/core/streams/streams.js @@ -1,107 +1,102 @@ -import {parentEpml} from '../connect.js' +import { parentEpml } from '../connect' -import {startConfigWatcher} from './onNewBlock.js' +import { startConfigWatcher } from './onNewBlock' const setAccountInfo = async (addr) => { + const names = await parentEpml.request('apiCall', { + url: `/names/address/${addr}` + }) - const names = await parentEpml.request('apiCall', { - url: `/names/address/${addr}` - }) - const addressInfo = await parentEpml.request('apiCall', { - url: `/addresses/${addr}` - }) + const addressInfo = await parentEpml.request('apiCall', { + url: `/addresses/${addr}` + }) - let accountInfo = { - names: names, - addressInfo: addressInfo - } + let accountInfo = { + names: names, + addressInfo: addressInfo + } - parentEpml.request('setAccountInfo', accountInfo) + parentEpml.request('setAccountInfo', accountInfo) } - const objectToArray = (object) => { + let groupList = object.groups.map(group => group.groupId === 0 ? { + groupId: group.groupId, + url: `group/${group.groupId}`, + groupName: "Qortal General Chat", + sender: group.sender, + senderName: group.senderName, + timestamp: group.timestamp === undefined ? 2 : group.timestamp + } : { + ...group, url: `group/${group.groupId}` + }) + + let directList = object.direct.map(dc => { + return { ...dc, url: `direct/${dc.address}` } + }) - let groupList = object.groups.map(group => group.groupId === 0 ? { groupId: group.groupId, url: `group/${group.groupId}`, groupName: "Qortal General Chat", sender: group.sender, senderName: group.senderName, timestamp: group.timestamp === undefined ? 1 : group.timestamp } : { ...group, url: `group/${group.groupId}` }) - let directList = object.direct.map(dc => { - return { ...dc, url: `direct/${dc.address}` } - }) return [...groupList, ...directList] } const sortActiveChat = (activeChatObject, localChatHeads) => { + let oldChatHeads = JSON.parse(localChatHeads) - let oldChatHeads = JSON.parse(localChatHeads) + if (window.parent._.isEqual(oldChatHeads, activeChatObject) === true) { + } else { + let oldActiveChats = objectToArray(oldChatHeads) + let newActiveChats = objectToArray(activeChatObject) - if (window.parent._.isEqual(oldChatHeads, activeChatObject) === true) { - - } else { - - let oldActiveChats = objectToArray(oldChatHeads) - let newActiveChats = objectToArray(activeChatObject) - - let results = newActiveChats.filter(newChat => { - let value = oldActiveChats.some(oldChat => newChat.timestamp === oldChat.timestamp) - return !value - }) - - results.forEach(chat => { - - if (chat.sender !== window.parent.reduxStore.getState().app.selectedAddress.address) { - - if (chat.sender !== undefined) parentEpml.request('showNotification', chat) - } else { - // ... - } - }) - - } + let results = newActiveChats.filter(newChat => { + let value = oldActiveChats.some(oldChat => newChat.timestamp === oldChat.timestamp) + return !value + }) + results.forEach(chat => { + if (chat.sender !== window.parent.reduxStore.getState().app.selectedAddress.address) { + if (chat.sender !== undefined) parentEpml.request('showNotification', chat) + } else { + // ... + } + }) + } } - let initialChatWatch = 0 const chatHeadWatcher = (activeChats) => { + let addr = window.parent.reduxStore.getState().app.selectedAddress.address + let key = `${addr.substr(0, 10)}_chat-heads` - let addr = window.parent.reduxStore.getState().app.selectedAddress.address + try { + let localChatHeads = localStorage.getItem(key) - let key = `${addr.substr(0, 10)}_chat-heads` + if (localChatHeads === null) { + parentEpml.request('setLocalStorage', { + key: key, + dataObj: activeChats + }).then(ms => { + parentEpml.request('setChatHeads', activeChats).then(ret => { + // ... + }) + }) + } else { + parentEpml.request('setLocalStorage', { + key: key, + dataObj: activeChats + }).then(ms => { + parentEpml.request('setChatHeads', activeChats).then(ret => { + // ... + }) + }) - try { - let localChatHeads = localStorage.getItem(key) - - if (localChatHeads === null) { - parentEpml.request('setLocalStorage', { - key: key, - dataObj: activeChats - }).then(ms => { - parentEpml.request('setChatHeads', activeChats).then(ret => { - // ... - }) - }) - } else { - - parentEpml.request('setLocalStorage', { - key: key, - dataObj: activeChats - }).then(ms => { - parentEpml.request('setChatHeads', activeChats).then(ret => { - // ... - }) - }) - - if (initialChatWatch >= 1) { - - sortActiveChat(activeChats, localChatHeads) - } else { - - initialChatWatch = initialChatWatch + 1 - } - } - - } catch (e) { - } + if (initialChatWatch >= 1) { + sortActiveChat(activeChats, localChatHeads) + } else { + initialChatWatch = initialChatWatch + 1 + } + } + } catch (e) { + } } let socketObject @@ -114,120 +109,102 @@ let canPing = false let timeoutId parentEpml.subscribe('logged_in', async isLoggedIn => { + const initChatHeadSocket = () => { + let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + let nodeUrl = myNode.domain + ":" + myNode.port + let activeChatSocketLink - const initChatHeadSocket = () => { + if (window.parent.location.protocol === "https:") { + activeChatSocketLink = `wss://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64` + } else { + activeChatSocketLink = `ws://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64` + } - let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - let nodeUrl = myNode.domain + ":" + myNode.port + const activeChatSocket = new WebSocket(activeChatSocketLink) - let activeChatSocketLink + // Open Connection + activeChatSocket.onopen = () => { + socketObject = activeChatSocket + initial = initial + 1 + canPing = true + } - if (window.parent.location.protocol === "https:") { + // Message Event + activeChatSocket.onmessage = (e) => { + if (e.data === 'pong') { + clearTimeout(timeoutId) + activeChatSocketTimeout = setTimeout(pingActiveChatSocket, 45000) + return + } - activeChatSocketLink = `wss://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64` - } else { + try { + chatHeadWatcher(JSON.parse(e.data)) + } catch (error) { + } + } - activeChatSocketLink = `ws://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64` - } + // Closed Event + activeChatSocket.onclose = () => { + clearInterval(activeChatSocketTimeout) - const activeChatSocket = new WebSocket(activeChatSocketLink) + if (closeGracefully === false) { + retryOnClose = true + setTimeout(pingActiveChatSocket, 10000) + } + } - // Open Connection - activeChatSocket.onopen = () => { - socketObject = activeChatSocket + // Error Event + activeChatSocket.onerror = (e) => { + } + } - initial = initial + 1 - canPing = true - } + const pingActiveChatSocket = () => { + if (window.parent.reduxStore.getState().app.loggedIn === true) { + if (!onceLoggedIn) { + initChatHeadSocket() + onceLoggedIn = true + activeChatSocketTimeout = setTimeout(pingActiveChatSocket, 45000) + } else if (retryOnClose) { + retryOnClose = false + clearTimeout(activeChatSocketTimeout) + initChatHeadSocket() + onceLoggedIn = true + activeChatSocketTimeout = setTimeout(pingActiveChatSocket, 45000) + } else if (canPing) { + socketObject.send('ping') + timeoutId = setTimeout(() => { + socketObject.close() + clearTimeout(activeChatSocketTimeout) + }, 5000) + } + } else { + if (onceLoggedIn && !closeGracefully) { + closeGracefully = true + socketObject.close() + clearTimeout(activeChatSocketTimeout) + onceLoggedIn = false + canPing = false + } + } + } - // Message Event - activeChatSocket.onmessage = (e) => { - if (e.data === 'pong') { - clearTimeout(timeoutId) - activeChatSocketTimeout = setTimeout(pingActiveChatSocket, 45000) - return - } - try { - chatHeadWatcher(JSON.parse(e.data)) - } catch (error) { - } - } + if (isLoggedIn === 'true') { + // Call Set Account Info... + await setAccountInfo(window.parent.reduxStore.getState().app.selectedAddress.address) - // Closed Event - activeChatSocket.onclose = () => { - clearInterval(activeChatSocketTimeout) + // Start Chat Watcher Socket + pingActiveChatSocket() + } else { + if (onceLoggedIn) { + closeGracefully = true + socketObject.close() + clearTimeout(activeChatSocketTimeout) + onceLoggedIn = false + canPing = false + } - if (closeGracefully === false) { - retryOnClose = true - setTimeout(pingActiveChatSocket, 10000) - } - } - - // Error Event - activeChatSocket.onerror = (e) => { - } - } - - - const pingActiveChatSocket = () => { - - if (window.parent.reduxStore.getState().app.loggedIn === true) { - - if (!onceLoggedIn) { - - initChatHeadSocket() - onceLoggedIn = true - activeChatSocketTimeout = setTimeout(pingActiveChatSocket, 45000) - } else if (retryOnClose) { - - retryOnClose = false - clearTimeout(activeChatSocketTimeout) - initChatHeadSocket() - onceLoggedIn = true - activeChatSocketTimeout = setTimeout(pingActiveChatSocket, 45000) - } else if (canPing) { - - socketObject.send('ping') - timeoutId = setTimeout(() => { - socketObject.close() - clearTimeout(activeChatSocketTimeout) - }, 5000) - } - - } else { - - if (onceLoggedIn && !closeGracefully) { - - closeGracefully = true - socketObject.close() - clearTimeout(activeChatSocketTimeout) - onceLoggedIn = false - canPing = false - } - } - } - - - if (isLoggedIn === 'true') { - - // Call Set Account Info... - await setAccountInfo(window.parent.reduxStore.getState().app.selectedAddress.address) - - // Start Chat Watcher Socket - pingActiveChatSocket() - } else { - - if (onceLoggedIn) { - - closeGracefully = true - socketObject.close() - clearTimeout(activeChatSocketTimeout) - onceLoggedIn = false - canPing = false - } - - initialChatWatch = 0 - } + initialChatWatch = 0 + } }) -startConfigWatcher() +startConfigWatcher() \ No newline at end of file diff --git a/plugins/plugins/core/trade-bot/trade-bot-portal-css.js b/plugins/plugins/core/trade-bot/trade-bot-portal-css.js deleted file mode 100644 index d769c8fb..00000000 --- a/plugins/plugins/core/trade-bot/trade-bot-portal-css.js +++ /dev/null @@ -1,679 +0,0 @@ -import {css} from 'lit' - -export const tradebotStyles = css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --mdc-theme-error: rgb(255, 89, 89); - --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder); - --mdc-text-field-outlined-hover-border-color: var(--txtfieldhoverborder); - --mdc-text-field-label-ink-color: var(--black); - --mdc-text-field-ink-color: var(--black); - --mdc-select-outlined-idle-border-color: var(--txtfieldborder); - --mdc-select-outlined-hover-border-color: var(--txtfieldhoverborder); - --mdc-select-label-ink-color: var(--black); - --mdc-select-ink-color: var(--black); - --mdc-theme-surface: var(--white); - --mdc-dialog-content-ink-color: var(--black); - --mdc-dialog-shape-radius: 25px; - --paper-input-container-focus-color: var(--mdc-theme-primary); - --lumo-primary-text-color: rgb(0, 167, 245); - --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); - --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1); - --lumo-primary-color: hsl(199, 100%, 48%); - --lumo-base-color: var(--white); - --lumo-body-text-color: var(--black); - --lumo-secondary-text-color: var(--sectxt); - --lumo-contrast-60pct: var(--vdicon); - --_lumo-grid-border-color: var(--border); - --_lumo-grid-secondary-border-color: var(--border2); - } - - paper-spinner-lite { - height: 30px; - width: 30px; - --paper-spinner-color: var(--mdc-theme-primary); - --paper-spinner-stroke-width: 3px; - } - - mwc-tab-bar { - --mdc-text-transform: none; - --mdc-tab-color-default: var(--black); - --mdc-tab-text-label-color-default: var(--black); - } - - #tabs-1 { - --mdc-tab-height: 42px; - border-left: 1px solid var(--tradeborder); - border-top: 1px solid var(--tradeborder); - border-right: 1px solid var(--tradeborder); - color: var(--black); - } - - #tab-buy[active] { - --mdc-theme-primary: rgba(55, 160, 51, 0.9); - } - - #tabs-1-content { - height: 100%; - padding-bottom: 10px; - } - - #tabs-1-content>div { - height: 100%; - border: 1px solid var(--tradeborder); - } - - #tabs-1-content .card { - border: none; - } - - #tabs-1-content .btn-clear { - --mdc-icon-button-size: 32px; - color: var(--black); - } - - .btn-clear-bot { - --mdc-icon-button-size: 32px; - color: var(--black); - float: right; - } - - .btn-info { - color: #03a9f4; - --mdc-icon-size: 16px; - padding-top: 3px; - } - - #tab-sell[active] { - --mdc-theme-primary: rgb(255, 89, 89); - } - - #trade-portal-page { - background: var(--white); - padding: 12px 24px; - } - - .divCard { - border: 1px solid var(--black); - padding: 1em; - box-shadow: 0 0.3px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 1px -1px rgba(0, 0, 0, 0.12), 0 1px 2px 0 rgba(0, 0, 0, 0.2); - } - - h2 { - margin: 10px 0; - } - - h4 { - margin: 5px 0; - } - - p { - font-size: 14px; - line-height: 21px; - } - - .card-body { - background-color: var(--white); - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - min-height: 100vh; - margin: 0; - } - - .card-container { - background-color: var(--white); - border-radius: 5px; - color: var(--black); - padding-top: 30px; - position: relative; - width: 350px; - max-width: 100%; - text-align: center; - } - - .card-container .level { - color: #ffffff; - background-color: #03a9f4; - border-radius: 3px; - font-size: 14px; - font-weight: bold; - padding: 3px 7px; - position: absolute; - top: 30px; - left: 30px; - } - - .card-container .founder { - color: #ffffff; - background-color: #03a9f4; - border-radius: 3px; - font-size: 14px; - font-weight: bold; - padding: 3px 7px; - position: absolute; - top: 30px; - right: 30px; - } - - .card-container .round { - width: 96px; - height: 96px; - border: 1px solid #03a9f4; - border-radius: 50%; - padding: 2px; - } - - .card-container .badge { - width: 200px; - height: 135px; - border: 1px solid transparent; - border-radius: 10%; - padding: 2px; - } - - .userdata { - background-color: #1F1A36; - text-align: left; - padding: 15px; - margin-top: 30px; - } - - .userdata ul { - list-style-type: none; - margin: 0; - padding: 0; - } - - .userdata ul li { - border: 1px solid #2D2747; - border-radius: 2px; - display: inline-block; - font-size: 12px; - margin: 0 7px 7px 0; - padding: 7px; - } - - h2, - h3, - h4, - h5 { - color: var(--black); - font-weight: 400; - } - - header { - display: flex; - flex: 0 1 auto; - align-items: center; - justify-content: center; - padding: 0px 10px; - font-size: 16px; - color: var(--white); - background-color: var(--tradehead); - border-left: 1px solid var(--tradeborder); - border-top: 1px solid var(--tradeborder); - border-right: 1px solid var(--tradeborder); - min-height: 40px; - } - - p { - margin-bottom: 12px; - } - - #trade-portal { - max-width: 100vw; - margin-left: auto; - margin-right: auto; - } - - .box { - margin: 0; - padding: 0; - display: flex; - flex-flow: column; - height: 100%; - } - - .box-bot { - margin: 0; - padding: 0; - display: flex; - flex-flow: column; - height: 150px; - } - - #first-trade-section { - margin-bottom: 10px; - } - - #first-trade-section>div {} - - #second-trade-section { - margin-bottom: 10px; - } - - #second-trade-section>div {} - - #third-trade-section { - margin-bottom: 10px; - } - - #third-trade-section>div {} - - .trade-chart { - background-color: var(--white); - border: 2px #ddd solid; - text-align: center; - } - - .open-trades { - text-align: center; - } - - .open-market-container { - text-align: center; - } - - .trade-bot-container { - text-align: center; - } - - .no-last-seen { - background: rgb(255, 89, 89); - padding: 9px 1.3px; - border-radius: 50%; - width: 1rem; - margin: 0 auto; - } - - .card { - padding: 1em; - border: 1px var(--tradeborder) solid; - flex: 1 1 auto; - display: flex; - flex-flow: column; - justify-content: space-evenly; - min-height: inherit; - } - - .card-bot { - padding: 1em; - flex: 1 1 auto; - display: flex; - flex-flow: column; - justify-content: space-evenly; - width: 350px; - min-height: inherit; - } - - .cancel { - --mdc-theme-primary: rgb(255, 89, 89); - } - - .border-wrapper { - border: 1px var(--tradeborder) solid; - overflow: hidden; - } - - .amt-text { - color: var(--tradehave); - font-size: 15px; - margin-top: 5px; - margin-bottom: 12px; - } - - .exchange { - color: var(--black); - font-size: 18px; - font-weight: bold; - margin-top: 5px; - margin-bottom: 10px; - } - - .clear-button { - display: inline; - float: right; - margin-bottom: 5px; - } - - .exhcnage-text { - display: inline; - float: left; - margin-bottom: 5px; - } - - .balance-text { - display: inline; - float: right; - margin-bottom: 5px; - } - - .fee-text { - display: inline; - float: left; - margin-bottom: 5px; - } - - .tab-text { - color: var(--tradehave); - font-size: 12px; - text-align: left; - margin-top: 2px; - margin-bottom: -12px; - } - - .historic-trades { - text-align: center; - } - - .my-open-orders { - text-align: center; - } - - .my-historic-trades { - text-align: center; - } - - .buttons { - width: auto !important; - } - - .buy-button { - --mdc-theme-primary: rgba(55, 160, 51, 0.9); - } - - .sell-button { - --mdc-theme-primary: rgb(255, 89, 89); - } - - .trade-bot-button { - margin-top: 20px; - margin-bottom: 20px; - --mdc-theme-primary: rgba(55, 160, 51, 0.9); - } - - .full-width { - background-color: var(--white); - border: 2px var(--black); - height: 200px; - text-align: center; - } - - vaading-grid { - font-size: .8em; - } - - vaadin-grid-column { - flex-grow: 1; - } - - .loadingContainer { - height: 100%; - width: 100%; - } - - .loading, - .loading:after { - border-radius: 50%; - width: 5em; - height: 5em; - } - - .loading { - margin: 10px auto; - border-width: .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; - } - - mwc-select#coinSelectionMenu { - font-size: 24px; - width: 220px; - } - - mwc-select#coinSelectionMenu mwc-list-item { - line-height: 30px; - } - - .coinName::before { - content: ""; - display: inline-block; - height: 26px; - width: 45px; - position: absolute; - background-repeat: no-repeat; - background-size: cover; - left: 10px; - top: 10px; - } - - .btc.coinName:before { - background-image: url('/img/qortbtc.png'); - } - - .ltc.coinName:before { - background-image: url('/img/qortltc.png'); - } - - .doge.coinName:before { - background-image: url('/img/qortdoge.png'); - } - - .dgb.coinName:before { - background-image: url('/img/qortdgb.png'); - } - - .rvn.coinName:before { - background-image: url('/img/qortrvn.png'); - } - - .arrr.coinName:before { - background-image: url('/img/qortarrr.png'); - } - - .coinName { - display: inline-block; - height: 26px; - padding-left: 45px; - } - - .warning-text { - animation: blinker 1.5s linear infinite; - display: inline; - float: left; - margin-bottom: 5px; - color: rgb(255, 89, 89); - } - - .warning-bot-text { - animation: blinker 1.5s linear infinite; - display: inline; - text-align: center; - color: rgb(255, 89, 89); - } - - .red { - --mdc-theme-primary: #F44336; - } - - @-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); - } - } - - @keyframes blinker { - 50% { - opacity: 0; - } - } - - paper-dialog.info { - width: 75%; - max-width: 75vw; - height: 50%; - max-height: 50vh; - background-color: var(--white); - color: var(--black); - border: 1px solid var(--black); - border-radius: 15px; - line-height: 1.6; - overflow-y: auto; - } - - .actions { - display: flex; - justify-content: space-between; - padding: 0 1em; - margin: 12px 0 -6px 0; - } - - .close-icon { - font-size: 36px; - } - - .close-icon:hover { - cursor: pointer; - opacity: .6; - } - - .setpass-wrapper { - width: 100%; - min-width: 400px; - max-width: 450px; - text-align: center; - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - padding: 10px 10px 0px; - box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); - } - - .lock-wrapper { - width: 100%; - height: 100%; - min-width: 600px; - max-width: 600px; - min-height: 400px; - max-height: 400px; - text-align: center; - background: url("/img/qortal-lock.jpg"); - border: 1px solid var(--black); - border-radius: 25px; - padding: 10px 10px 0px; - } - - .text-wrapper { - width: 100%; - height: 100%; - min-width: 280px; - max-width: 280px; - min-height: 64px; - max-height: 64px; - text-align: center; - margin-left: 35px; - margin-top: 125px; - overflow: hidden; - } - - .lock-title-white { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #ffffff; - } - - .lock-title-red { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #df3636; - } - - @media (min-width: 701px) { - * {} - - #trade-bot-portal { - display: grid; - grid-template-columns: 2fr 4fr 2fr; - grid-auto-rows: max(80px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 20px; - } - - #first-trade-section { - display: grid; - grid-template-columns: 1fr 4fr 1fr; - grid-auto-rows: max(250px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - - #second-trade-section { - display: grid; - grid-template-columns: 1fr 4fr 1fr; - grid-auto-rows: max(250px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - - #third-trade-section { - display: grid; - grid-template-columns: 1fr 4fr 1fr; - grid-auto-rows: max(150px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - - #fourth-trade-section { - display: grid; - grid-template-columns: 1fr 4fr 1fr; - grid-auto-rows: max(150px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - } -` \ No newline at end of file diff --git a/plugins/plugins/core/trade-bot/trade-bot-portal.src.js b/plugins/plugins/core/trade-bot/trade-bot-portal.src.js index d8296e49..909a40e5 100644 --- a/plugins/plugins/core/trade-bot/trade-bot-portal.src.js +++ b/plugins/plugins/core/trade-bot/trade-bot-portal.src.js @@ -1,11 +1,10 @@ -import {html, LitElement} from 'lit' -import {render} from 'lit/html.js' -import {Epml} from '../../../epml.js' +import { html, LitElement } from 'lit' +import { render } from 'lit/html.js' +import { Epml } from '../../../epml' +import { decryptData, encryptData } from '../../../../core/src/lockScreen' +import { tradeBotStyles } from '../components/plugins-css' import isElectron from 'is-electron' -import {get, registerTranslateConfig, translate, use} from '../../../../core/translate' -import Base58 from '../../../../crypto/api/deps/Base58.js' -import {decryptData, encryptData} from '../../../../core/src/lockScreen.js' -import {tradebotStyles} from './trade-bot-portal-css.js' +import Base58 from '../../../../crypto/api/deps/Base58' import '@material/mwc-button' import '@material/mwc-textfield' import '@material/mwc-icon' @@ -24,8 +23,10 @@ import '@vaadin/grid' import '@vaadin/grid/vaadin-grid-sorter' import '@vaadin/password-field' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -33,3283 +34,3331 @@ const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) let workers = new Map() class TradeBotPortal extends LitElement { - static get properties() { - return { - selectedAddress: { type: Object }, - config: { type: Object }, - listedCoins: { type: Map }, - blockedTradesList: { type: Array }, - tradesPresenceCleaned: { type: Array }, - sellBtnDisable: { type: Boolean }, - isSellLoading: { type: Boolean }, - isBuyLoading: { type: Boolean }, - buyBtnDisable: { type: Boolean }, - autoBuyWarning: { type: Boolean }, - autoBuyBtnDisable: { type: Boolean }, - autoBuyBotDisable: { type: Boolean }, - initialAmount: { type: Number }, - cancelBtnDisable: { type: Boolean }, - cancelStuckOfferBtnDisable: { type: Boolean }, - selectedCoin: { type: String }, - isLoadingHistoricTrades: { type: Boolean }, - isLoadingOpenTrades: { type: Boolean }, - isLoadingMyOpenOrders: { type: Boolean }, - showGetWalletBance: { type: Boolean }, - showAddAutoBuy: { type: Boolean }, - theme: { type: String, reflect: true }, - btcWallet: { type: String }, - ltcWallet: { type: String }, - dogeWallet: { type: String }, - dgbWallet: { type: String }, - rvnWallet: { type: String }, - arrrWallet: { type: String }, - arrrWalletAddress: { type: String }, - qortbtc: { type: Number }, - qortltc: { type: Number }, - qortdoge: { type: Number }, - qortdgb: { type: Number }, - qortrvn: { type: Number }, - qortarrr: { type: Number }, - btcqort: { type: Number }, - ltcqort: { type: Number }, - dogeqort: { type: Number }, - dgbqort: { type: Number }, - rvnqort: { type: Number }, - arrrqort: { type: Number }, - tradeBotBtcBook: { type: Array }, - tradeBotLtcBook: { type: Array }, - tradeBotDogeBook: { type: Array }, - tradeBotDgbBook: { type: Array }, - tradeBotRvnBook: { type: Array }, - tradeBotArrrBook: { type: Array }, - autoSalt: { type: String }, - autoStorageData: { type: String }, - autoLockScreenPass: { type: String }, - autoLockScreenSet: { type: String }, - autoLockPass: { type: String }, - autoLockSet: { type: String }, - myAutoLockScreenPass: { type: String }, - myAutoLockScreenSet: { type: String }, - autoHelperMessage: { type: String } - } - } + static get properties() { + return { + selectedAddress: { type: Object }, + config: { type: Object }, + listedCoins: { type: Map }, + blockedTradesList: { type: Array }, + tradesPresenceCleaned: { type: Array }, + sellBtnDisable: { type: Boolean }, + isSellLoading: { type: Boolean }, + isBuyLoading: { type: Boolean }, + buyBtnDisable: { type: Boolean }, + autoBuyWarning: { type: Boolean }, + autoBuyBtnDisable: { type: Boolean }, + autoBuyBotDisable: { type: Boolean }, + initialAmount: { type: Number }, + cancelBtnDisable: { type: Boolean }, + cancelStuckOfferBtnDisable: { type: Boolean }, + selectedCoin: { type: String }, + isLoadingHistoricTrades: { type: Boolean }, + isLoadingOpenTrades: { type: Boolean }, + isLoadingMyOpenOrders: { type: Boolean }, + showGetWalletBance: { type: Boolean }, + showAddAutoBuy: { type: Boolean }, + theme: { type: String, reflect: true }, + btcWallet: { type: String }, + ltcWallet: { type: String }, + dogeWallet: { type: String }, + dgbWallet: { type: String }, + rvnWallet: { type: String }, + arrrWallet: { type: String }, + arrrWalletAddress: { type: String }, + qortbtc: { type: Number }, + qortltc: { type: Number }, + qortdoge: { type: Number }, + qortdgb: { type: Number }, + qortrvn: { type: Number }, + qortarrr: { type: Number }, + btcqort: { type: Number }, + ltcqort: { type: Number }, + dogeqort: { type: Number }, + dgbqort: { type: Number }, + rvnqort: { type: Number }, + arrrqort: { type: Number }, + tradeBotBtcBook: { type: Array }, + tradeBotLtcBook: { type: Array }, + tradeBotDogeBook: { type: Array }, + tradeBotDgbBook: { type: Array }, + tradeBotRvnBook: { type: Array }, + tradeBotArrrBook: { type: Array }, + autoSalt: { type: String }, + autoStorageData: { type: String }, + autoLockScreenPass: { type: String }, + autoLockScreenSet: { type: String }, + autoLockPass: { type: String }, + autoLockSet: { type: String }, + myAutoLockScreenPass: { type: String }, + myAutoLockScreenSet: { type: String }, + autoHelperMessage: { type: String } + } + } - static get styles() { - return [tradebotStyles] - } + static get styles() { + return [tradeBotStyles] + } - constructor() { - super() - let qortal = { - name: "QORTAL", - balance: "0", - coinCode: "QORT", - coinAmount: this.amountString, - tradeFee: "0.002" - } + constructor() { + super() + let qortal = { + name: "QORTAL", + balance: "0", + coinCode: "QORT", + coinAmount: this.amountString, + tradeFee: "0.002" + } - let bitcoin = { - name: "BITCOIN", - balance: "0", - coinCode: "BTC", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - myGridBoughtItems: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.0001" - } + let bitcoin = { + name: "BITCOIN", + balance: "0", + coinCode: "BTC", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + myGridBoughtItems: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.0001" + } - let litecoin = { - name: "LITECOIN", - balance: "0", - coinCode: "LTC", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - myGridBoughtItems: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.00005" - } + let litecoin = { + name: "LITECOIN", + balance: "0", + coinCode: "LTC", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + myGridBoughtItems: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.00005" + } - let dogecoin = { - name: "DOGECOIN", - balance: "0", - coinCode: "DOGE", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - myGridBoughtItems: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.005" - } + let dogecoin = { + name: "DOGECOIN", + balance: "0", + coinCode: "DOGE", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + myGridBoughtItems: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.005" + } - let digibyte = { - name: "DIGIBYTE", - balance: "0", - coinCode: "DGB", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - myGridBoughtItems: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.0005" - } + let digibyte = { + name: "DIGIBYTE", + balance: "0", + coinCode: "DGB", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + myGridBoughtItems: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.0005" + } - let ravencoin = { - name: "RAVENCOIN", - balance: "0", - coinCode: "RVN", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - myGridBoughtItems: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.006" - } + let ravencoin = { + name: "RAVENCOIN", + balance: "0", + coinCode: "RVN", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + myGridBoughtItems: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.006" + } - let piratechain = { - name: "PIRATECHAIN", - balance: "0", - coinCode: "ARRR", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - myGridBoughtItems: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.0002" - } + let piratechain = { + name: "PIRATECHAIN", + balance: "0", + coinCode: "ARRR", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + myGridBoughtItems: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.0002" + } - this.listedCoins = new Map() - this.listedCoins.set("QORTAL", qortal) - this.listedCoins.set("BITCOIN", bitcoin) - this.listedCoins.set("LITECOIN", litecoin) - this.listedCoins.set("DOGECOIN", dogecoin) - this.listedCoins.set("DIGIBYTE", digibyte) - this.listedCoins.set("RAVENCOIN", ravencoin) - this.listedCoins.set("PIRATECHAIN", piratechain) + this.listedCoins = new Map() + this.listedCoins.set("QORTAL", qortal) + this.listedCoins.set("BITCOIN", bitcoin) + this.listedCoins.set("LITECOIN", litecoin) + this.listedCoins.set("DOGECOIN", dogecoin) + this.listedCoins.set("DIGIBYTE", digibyte) + this.listedCoins.set("RAVENCOIN", ravencoin) + this.listedCoins.set("PIRATECHAIN", piratechain) - workers.set("QORTAL", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("QORTAL", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("BITCOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("BITCOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("LITECOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("LITECOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("DOGECOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("DOGECOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("DIGIBYTE", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("DIGIBYTE", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("RAVENCOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("RAVENCOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("PIRATECHAIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("PIRATECHAIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - this.selectedCoin = "LITECOIN" - this.selectedAddress = {} - this.config = {} - this.blockedTradesList = [] - this.tradesPresenceCleaned = [] - this.sellBtnDisable = false - this.isSellLoading = false - this.buyBtnDisable = true - this.autoBuyWarning = false - this.autoBuyBtnDisable = true - this.autoBuyBotDisable = false - this.isBuyLoading = false - this.initialAmount = 0 - this.cancelBtnDisable = false - this.cancelStuckOfferBtnDisable = false - this.isLoadingHistoricTrades = true - this.isLoadingOpenTrades = true - this.isLoadingMyOpenOrders = false - this.showGetWalletBance = true - this.showAddAutoBuy = false - this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' - this.btcWallet = '' - this.ltcWallet = '' - this.dogeWallet = '' - this.dgbWallet = '' - this.rvnWallet = '' - this.arrrWallet = '' - this.arrrWalletAddress = '' - this.qortbtc = 0 - this.qortltc = 0 - this.qortdoge = 0 - this.qortdgb = 0 - this.qortrvn = 0 - this.qortarrr = 0 - this.btcqort = 0 - this.ltcqort = 0 - this.dogeqort = 0 - this.dgbqort = 0 - this.rvnqort = 0 - this.arrrqort = 0 - this.tradeBotBtcBook = [] - this.tradeBotLtcBook = [] - this.tradeBotDogeBook = [] - this.tradeBotDgbBook = [] - this.tradeBotRvnBook = [] - this.tradeBotArrrBook = [] - this.autoSalt = '' - this.autoStorageData = '' - this.autoLockScreenPass = '' - this.autoLockScreenSet = '' - this.autoLockPass = '' - this.autoLockSet = '' - this.myAutoLockScreenPass = '' - this.myAutoLockScreenSet = '' - this.autoHelperMessage = '' - } + this.selectedCoin = "LITECOIN" + this.selectedAddress = {} + this.config = {} + this.blockedTradesList = [] + this.tradesPresenceCleaned = [] + this.sellBtnDisable = false + this.isSellLoading = false + this.buyBtnDisable = true + this.autoBuyWarning = false + this.autoBuyBtnDisable = true + this.autoBuyBotDisable = false + this.isBuyLoading = false + this.initialAmount = 0 + this.cancelBtnDisable = false + this.cancelStuckOfferBtnDisable = false + this.isLoadingHistoricTrades = true + this.isLoadingOpenTrades = true + this.isLoadingMyOpenOrders = false + this.showGetWalletBance = true + this.showAddAutoBuy = false + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + this.btcWallet = '' + this.ltcWallet = '' + this.dogeWallet = '' + this.dgbWallet = '' + this.rvnWallet = '' + this.arrrWallet = '' + this.arrrWalletAddress = '' + this.qortbtc = 0 + this.qortltc = 0 + this.qortdoge = 0 + this.qortdgb = 0 + this.qortrvn = 0 + this.qortarrr = 0 + this.btcqort = 0 + this.ltcqort = 0 + this.dogeqort = 0 + this.dgbqort = 0 + this.rvnqort = 0 + this.arrrqort = 0 + this.tradeBotBtcBook = [] + this.tradeBotLtcBook = [] + this.tradeBotDogeBook = [] + this.tradeBotDgbBook = [] + this.tradeBotRvnBook = [] + this.tradeBotArrrBook = [] + this.autoSalt = '' + this.autoStorageData = '' + this.autoLockScreenPass = '' + this.autoLockScreenSet = '' + this.autoLockPass = '' + this.autoLockSet = '' + this.myAutoLockScreenPass = '' + this.myAutoLockScreenSet = '' + this.autoHelperMessage = '' + } - openTradesTemplate() { - return html` -
    -
    -
    ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange42")}
    -
    -
    ${translate("login.loading")}
    - - { - render(html`${this.round(data.item.qortAmount)}`, root) - }} - > - - { - render(html`${this.round(data.item.price)}`, root) - }} - > - - { - render(html`${data.item.foreignAmount}`, root) - }} - > - - { - render(html`${data.item.qortalCreator}`, root) - }} - > - - + render() { + return html` +
    +
    +
    +
    +

    ${translate("info.inf13")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode} -  

    + + BTC / QORT + LTC / QORT + DOGE / QORT + DGB / QORT + RVN / QORT + ARRR / QORT + +
    + this.shadowRoot.getElementById('buyInfoDialog').open()}> +
    +
    + ${this.renderAutoLockButton()} +
    +
    +
    +
    +
    +
    +
    + ${this.openTradesTemplate()} +
    +
    +
    +
    + ${this.myDoneTradesTemplate()} +
    +
    +
    +
    + ${this.myOpenOrdersTemplate()} +
    +
    +
    +
    + ${this.showAutoBuyGrid()} +
    +
    +
    +

    ${translate("tradepage.tchange33")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange40")}

    +

    1 QORT = ${this.exchangeRateQort()} ${this.listedCoins.get(this.selectedCoin).coinCode}

    +
    -
    - ` - } + +
    +

    + ${this.renderFetchText()} + +

    +
    +
    +
    +

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    +
    +
    +
    +
    ${this.renderWarning()}
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + +
    +
    + + ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} + +
    +
    +
    + ${translate("general.close")} +
    + +
    +

    + ${this.renderFetchText()} + +

    +
    +
    +
    +

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    +
    +
    +
    +
    ${this.renderWarning()}
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + +
    +
    + + ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} + +
    +
    +
    + ${translate("general.close")} +
    + +
    +

    + ${this.renderFetchText()} + +

    +
    +
    +
    +

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    +
    +
    +
    +
    ${this.renderWarning()}
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + +
    +
    + + ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} + +
    +
    +
    + ${translate("general.close")} +
    + +
    +

    + ${this.renderFetchText()} + +

    +
    +
    +
    +

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    +
    +
    +
    +
    ${this.renderWarning()}
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + +
    +
    + + ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} + +
    +
    +
    + ${translate("general.close")} +
    + +
    +

    + ${this.renderFetchText()} + +

    +
    +
    +
    +

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    +
    +
    +
    +
    ${this.renderWarning()}
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + +
    +
    + + ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} + +
    +
    +
    + ${translate("general.close")} +
    + +
    +

    + ${this.renderFetchText()} + +

    +
    +
    +
    +

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    +
    +
    +
    +
    ${this.renderWarning()}
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + +
    +
    + + ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} + +
    +
    +
    + ${translate("general.close")} +
    + +
    +

    + this.shadowRoot.getElementById('buyInfoDialog').close()} title="${translate("info.inf8")}">highlight_off +
    +
    +

    ${translate("info.inf7")}

    +

    ${translate("info.inf9")}

    +

    ${translate("info.inf10")}

    +

    ${translate("info.inf11")}

    +

    ${translate("info.inf12")}

    +
    +
    + +
    +

    Qortal ${translate("tabmenu.tm6")} ${translate("login.lp1")}

    +
    +
    +
    +

    ${translate("login.lp2")}

    +

    ${translate("login.lp3")}

    +
    +
    + password + +
    +
    + password + +
    +
    + ${translate("login.lp4")} + ${translate("login.lp5")} +
    +
    + +
    +

    Qortal ${translate("tabmenu.tm6")} ${translate("login.lp1")}

    +
    +
    +
    +

    ${translate("login.lessthen8")}

    +
    +
    + ${translate("login.lp4")} + ${translate("login.lp5")} +
    +
    + +
    + ${translate("tradepage.tchange46")}
    + ${translate("login.lp9")} + ${translate("login.lp10")} +
    +
    + password + +
    + ${this.autoHelperMessage} +
    +
    +
    +
    + +
    +
    + ` + } - myOpenOrdersTemplate() { - return html` -
    -
    -
    ${translate("info.inf15")}
    -
    -
    ${translate("login.loading")}
    - - { - const dateString = new Date(data.item.timestamp).toLocaleString() - render(html`${dateString}`, root) - }} - > - - { - render(html` ${data.item._tradeState} `, root) - }} - > - - { - const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) - render(html`${price}`, root) - }} - > - - - - - - + async firstUpdated() { + let _this = this + + this.changeTheme() + this.changeLanguage() + + await this.tradeFee() + await this.getNewBlockedTrades() + + this.autoHelperMessage = this.renderAutoHelperPass() + + this.autoSalt = '' + this.autoSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) + + this.autoStorageData = '' + this.autoStorageData = window.parent.reduxStore.getState().app.selectedAddress.address + + this.autoLockScreenPass = '' + this.autoLockScreenPass = 'autoLockScreenPass-' + this.autoStorageData + + this.autoLockScreenSet = '' + this.autoLockScreenSet = 'autoLockScreenSet-' + this.autoStorageData + + this.autoLockPass = '' + this.autoLockPass = encryptData(false, this.autoSalt) + + this.autoLockSet = '' + this.autoLockSet = encryptData(false, this.autoSalt) + + if (localStorage.getItem(this.autoLockScreenPass) === null && localStorage.getItem(this.autoLockScreenSet) === null) { + localStorage.setItem(this.autoLockScreenPass, this.autoLockPass) + localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) + this.myAutoLockScreenPass = '' + this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + } else { + this.myAutoLockScreenPass = '' + this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + } + + if (this.myAutoLockScreenSet === true) { + this.shadowRoot.getElementById('autoLockScreenActive').open() + } + + await this.updateWalletBalance() + await this.fetchWalletAddress(this.selectedCoin) + + this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid') + + this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { + const priceString = get("tradepage.tchange9") + root.innerHTML = '' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' + } + + this._openOrdersGrid.querySelector('#qortAmountColumn').headerRenderer = function (root) { + const amountString = get("tradepage.tchange8") + root.innerHTML = '' + amountString + ' (QORT)' + } + + this._myOrdersGrid = this.shadowRoot.getElementById('myOrdersGrid') + + const getQortBtcPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/BITCOIN?inverse=true` }).then((res) => { + setTimeout(() => { this.qortbtc = (Number(res) / 1e8).toFixed(8) }, 1) + }) + setTimeout(getQortBtcPrice, 300000) + } + + const getQortLtcPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/LITECOIN?inverse=true` }).then((res) => { + setTimeout(() => { this.qortltc = (Number(res) / 1e8).toFixed(8) }, 1) + }) + setTimeout(getQortLtcPrice, 300000) + } + + const getQortDogePrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/DOGECOIN?inverse=true` }).then((res) => { + setTimeout(() => { this.qortdoge = (Number(res) / 1e8).toFixed(8) }, 1) + }) + setTimeout(getQortDogePrice, 300000) + } + + const getQortDgbPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/DIGIBYTE?inverse=true` }).then((res) => { + setTimeout(() => { this.qortdgb = (Number(res) / 1e8).toFixed(8) }, 1) + }) + setTimeout(getQortDgbPrice, 300000) + } + + const getQortRvnPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/RAVENCOIN?inverse=true` }).then((res) => { + setTimeout(() => { this.qortrvn = (Number(res) / 1e8).toFixed(8) }, 1) + }) + setTimeout(getQortRvnPrice, 300000) + } + + const getQortArrrPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/PIRATECHAIN?inverse=true` }).then((res) => { + setTimeout(() => { this.qortarrr = (Number(res) / 1e8).toFixed(8) }, 1) + }) + setTimeout(getQortArrrPrice, 300000) + } + + window.addEventListener('storage', () => { + this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") + const checkLanguage = localStorage.getItem('qortalLanguage') + const checkTheme = localStorage.getItem('qortalTheme') + + use(checkLanguage) + + this.theme = (checkTheme === 'dark') ? 'dark' : 'light' + document.querySelector('html').setAttribute('theme', this.theme) + }) + + if (!isElectron()) { + } else { + window.addEventListener('contextmenu', (event) => { + event.preventDefault() + window.parent.electronAPI.showMyMenu() + }) + } + + this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address + this.ltcWallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address + this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address + this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address + this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address + this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address + + let configLoaded = false + + parentEpml.ready().then(() => { + parentEpml.subscribe('selected_address', async (selectedAddress) => { + this.selectedAddress = {} + selectedAddress = JSON.parse(selectedAddress) + if (!selectedAddress || Object.entries(selectedAddress).length === 0) return + this.selectedAddress = selectedAddress + + this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address + this.ltcWwallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address + this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address + this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address + this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address + this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address + + this.updateAccountBalance() + }) + + parentEpml.subscribe('config', (c) => { + if (!configLoaded) { + setTimeout(getQortBtcPrice, 1) + setTimeout(getQortLtcPrice, 1) + setTimeout(getQortDogePrice, 1) + setTimeout(getQortDgbPrice, 1) + setTimeout(getQortRvnPrice, 1) + setTimeout(getQortArrrPrice, 1) + configLoaded = true + } + this.config = JSON.parse(c) + }) + + let coinSelectionMenu = this.shadowRoot.getElementById("coinSelectionMenu") + + coinSelectionMenu.addEventListener('change', function () { + _this.setForeignCoin(coinSelectionMenu.value, false) + }) + + _this.setForeignCoin(coinSelectionMenu.value, true) + }) + parentEpml.imReady() + + this.btcTradebook() + this.ltcTradebook() + this.dogeTradebook() + this.dgbTradebook() + this.rvnTradebook() + this.arrrTradebook() + + this.clearConsole() + + setInterval(() => { + this.clearConsole() + }, 60000) + + setInterval(() => { + this.getNewBlockedTrades() + }, 300000) + } + + openTradesTemplate() { + return html` +
    +
    +
    ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange42")}
    +
    +
    +
    + ${translate("login.loading")} +
    + + { + render(html`${this.round(data.item.qortAmount)}`, root) + }} + > + + { + render(html`${this.round(data.item.price)}`, root) + }} + > + + { + render(html`${data.item.foreignAmount}`, root) + }} + > + + { + render(html`${data.item.qortalCreator}`, root) + }} + > + + +
    -
    - ` - } + ` + } - myDoneTradesTemplate() { - return html` -
    -
    -
    ${translate("tradepage.tchange43")} (${this.listedCoins.get(this.selectedCoin).coinCode})
    -
    -
    ${translate("login.loading")}
    - - { - const dateString = new Date(data.item.timestamp).toLocaleString() - render(html`${dateString}`, root) - }} - > - - { - return render(html` ${translate("tradepage.tchange32")} `, root) - }} - > - - { - const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) - render(html`${price}`, root) - }} - > - - - - { + myOpenOrdersTemplate() { + return html` +
    +
    +
    ${translate("info.inf15")}
    +
    +
    +
    + ${translate("login.loading")} +
    + + { + const dateString = new Date(data.item.timestamp).toLocaleString() + render(html`${dateString}`, root) + }} + > + + { + render(html` ${data.item._tradeState} `, root) + }} + > + + { + const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) + render(html`${price}`, root) + }} + > + + + + + + +
    +
    +
    + ` + } + + myDoneTradesTemplate() { + return html` +
    +
    +
    ${translate("tradepage.tchange43")} (${this.listedCoins.get(this.selectedCoin).coinCode})
    +
    +
    +
    + ${translate("login.loading")} +
    + + { + const dateString = new Date(data.item.timestamp).toLocaleString() + render(html`${dateString}`, root) + }} + > + + { + return render(html` ${translate("tradepage.tchange32")} `, root) + }} + > + + { + const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) + render(html`${price}`, root) + }} + > + + + + { + render(html` ${data.item.foreignAmount} `, root) + }} + > + + +
    +
    +
    + ` + } + + myHistoricTradesTemplate() { + return html` +
    +
    +
    ${translate("tradepage.tchange4")}
    +
    + + { + const dateString = new Date(data.item.timestamp).toLocaleString() + render(html`${dateString}`, root) + }} + > + + { + if (data.item.mode === 'SOLD') return render(html` ${translate("tradepage.tchange31")} `, root) + if (data.item.mode === 'BOUGHT') return render(html` ${translate("tradepage.tchange32")} `, root) + return render(html` ${data.item.mode} `, root) + }} + > + + { + const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) + render(html`${price}`, root) + }} + > + + + + { render(html` ${data.item.foreignAmount} `, root) - }} - > - - -
    -
    -
    - ` - } - - myHistoricTradesTemplate() { - return html` -
    -
    -
    ${translate("tradepage.tchange4")}
    -
    - - { - const dateString = new Date(data.item.timestamp).toLocaleString() - render(html`${dateString}`, root) - }} - > - - { - if (data.item.mode === 'SOLD') return render(html` ${translate("tradepage.tchange31")} `, root) - if (data.item.mode === 'BOUGHT') return render(html` ${translate("tradepage.tchange32")} `, root) - return render(html` ${data.item.mode} `, root) - }} - > - - { - const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) - render(html`${price}`, root) - }} - > - - - - { - render(html` ${data.item.foreignAmount} `, root) - }} - > - - -
    -
    -
    - ` - } - - tradeBotBTCTemplate() { - return html` -
    -
    -
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    -
    - - { - render(html`${data.item.botBtcQortAmount}`, root) - }} - > - - { - render(html`${data.item.botBtcPrice}`, root) - }} - > - - { - const totalCoins = this.round(parseFloat(data.item.botBtcQortAmount) * parseFloat(data.item.botBtcPrice)) - const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myBotFunds) > Number(totalCoins)) { - this.autoBuyBotDisable = false - render(html`${totalCoins}`, root) - } else { - this.autoBuyBotDisable = true - render(html`${totalCoins}`, root) - } - }} - > - - { - render(html` this.removeBTCTradebook()}>delete ${translate("nodepage.nchange12")}`, root) - }} - > - - - ${this.isEmptyArray(this.tradeBotBtcBook) ? html` - - ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} - - `: ''} -
    - ${this.autoBuyBotDisable ? html` -
    ${this.renderBotWarning()}
    - `: ''} -
    -
    - ` - } - - tradeBotLTCTemplate() { - return html` -
    -
    -
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    -
    - - { - render(html`${data.item.botLtcQortAmount}`, root) - }} - > - - { - render(html`${data.item.botLtcPrice}`, root) - }} - > - - { - const totalCoins = this.round(parseFloat(data.item.botLtcQortAmount) * parseFloat(data.item.botLtcPrice)) - const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myBotFunds) > Number(totalCoins)) { - this.autoBuyBotDisable = false - render(html`${totalCoins}`, root) - } else { - this.autoBuyBotDisable = true - render(html`${totalCoins}`, root) - } - }} - > - - { - render(html` this.removeLTCTradebook()}>delete ${translate("nodepage.nchange12")}`, root) - }} - > - - - ${this.isEmptyArray(this.tradeBotLtcBook) ? html` - - ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} - - `: ''} -
    - ${this.autoBuyBotDisable ? html` -
    ${this.renderBotWarning()}
    - `: ''} -
    -
    - ` - } - - tradeBotDOGETemplate() { - return html` -
    -
    -
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    -
    - - { - render(html`${data.item.botDogeQortAmount}`, root) - }} - > - - { - render(html`${data.item.botDogePrice}`, root) - }} - > - - { - const totalCoins = this.round(parseFloat(data.item.botDogeQortAmount) * parseFloat(data.item.botDogePrice)) - const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myBotFunds) > Number(totalCoins)) { - this.autoBuyBotDisable = false - render(html`${totalCoins}`, root) - } else { - this.autoBuyBotDisable = true - render(html`${totalCoins}`, root) - } - }} - > - - { - render(html` this.removeDOGETradebook()}>delete ${translate("nodepage.nchange12")}`, root) - }} - > - - - ${this.isEmptyArray(this.tradeBotDogeBook) ? html` - - ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} - - `: ''} -
    - ${this.autoBuyBotDisable ? html` -
    ${this.renderBotWarning()}
    - `: ''} -
    -
    - ` - } - - tradeBotDGBTemplate() { - return html` -
    -
    -
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    -
    - - { - render(html`${data.item.botDgbQortAmount}`, root) - }} - > - - { - render(html`${data.item.botDgbPrice}`, root) - }} - > - - { - const totalCoins = this.round(parseFloat(data.item.botDgbQortAmount) * parseFloat(data.item.botDgbPrice)) - const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myBotFunds) > Number(totalCoins)) { - this.autoBuyBotDisable = false - render(html`${totalCoins}`, root) - } else { - this.autoBuyBotDisable = true - render(html`${totalCoins}`, root) - } - }} - > - - { - render(html` this.removeDGBTradebook()}>delete ${translate("nodepage.nchange12")}`, root) - }} - > - - - ${this.isEmptyArray(this.tradeBotDgbBook) ? html` - - ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} - - `: ''} -
    - ${this.autoBuyBotDisable ? html` -
    ${this.renderBotWarning()}
    - `: ''} -
    -
    - ` - } - - tradeBotRVNTemplate() { - return html` -
    -
    -
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    -
    - - { - render(html`${data.item.botRvnQortAmount}`, root) - }} - > - - { - render(html`${data.item.botRvnPrice}`, root) - }} - > - - { - const totalCoins = this.round(parseFloat(data.item.botRvnQortAmount) * parseFloat(data.item.botRvnPrice)) - const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myBotFunds) > Number(totalCoins)) { - this.autoBuyBotDisable = false - render(html`${totalCoins}`, root) - } else { - this.autoBuyBotDisable = true - render(html`${totalCoins}`, root) - } - }} - > - - { - render(html` this.removeRVNTradebook()}>delete ${translate("nodepage.nchange12")}`, root) - }} - > - - - ${this.isEmptyArray(this.tradeBotRvnBook) ? html` - - ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} - - `: ''} -
    - ${this.autoBuyBotDisable ? html` -
    ${this.renderBotWarning()}
    - `: ''} -
    -
    - ` - } - - tradeBotARRRTemplate() { - return html` -
    -
    -
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    -
    - - { - render(html`${data.item.botArrrQortAmount}`, root) - }} - > - - { - render(html`${data.item.botArrrPrice}`, root) - }} - > - - { - const totalCoins = this.round(parseFloat(data.item.botArrrQortAmount) * parseFloat(data.item.botArrrPrice)) - const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myBotFunds) > Number(totalCoins)) { - this.autoBuyBotDisable = false - render(html`${totalCoins}`, root) - } else { - this.autoBuyBotDisable = true - render(html`${totalCoins}`, root) - } - }} - > - - { - render(html` this.removeARRRTradebook()}>delete ${translate("nodepage.nchange12")}`, root) - }} - > - - - ${this.isEmptyArray(this.tradeBotArrrBook) ? html` - - ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} - - `: ''} -
    - ${this.autoBuyBotDisable ? html` -
    ${this.renderBotWarning()}
    - `: ''} -
    -
    - ` - } - - render() { - return html` -
    -
    -
    -
    -

    ${translate("info.inf13")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode} -  

    - - BTC / QORT - LTC / QORT - DOGE / QORT - DGB / QORT - RVN / QORT - ARRR / QORT - -
    - this.shadowRoot.getElementById('buyInfoDialog').open()}> -
    -
    - ${this.renderAutoLockButton()} -
    -
    -
    -
    -
    -
    -
    - ${this.openTradesTemplate()} -
    -
    -
    -
    - ${this.myDoneTradesTemplate()} -
    -
    -
    -
    - ${this.myOpenOrdersTemplate()} -
    -
    -
    -
    - ${this.showAutoBuyGrid()} -
    -
    -
    -

    ${translate("tradepage.tchange33")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange40")}

    -

    1 QORT = ${this.exchangeRateQort()} ${this.listedCoins.get(this.selectedCoin).coinCode}

    -
    -
    -
    - - -
    -

    ${this.renderFetchText()}

    -
    -
    -
    -

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    -
    -
    -
    -
    ${this.renderWarning()}
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} - -
    -
    - - ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} - + }} + > + +
    - ${translate("general.close")} -
    + ` + } - -
    -

    ${this.renderFetchText()}

    -
    -
    -
    -

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    -
    -
    -
    -
    ${this.renderWarning()}
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} - -
    -
    - - ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} - + tradeBotBTCTemplate() { + return html` +
    +
    +
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    +
    + + { + render(html`${data.item.botBtcQortAmount}`, root) + }} + > + + { + render(html`${data.item.botBtcPrice}`, root) + }} + > + + { + const totalCoins = this.round(parseFloat(data.item.botBtcQortAmount) * parseFloat(data.item.botBtcPrice)) + const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myBotFunds) > Number(totalCoins)) { + this.autoBuyBotDisable = false + render(html`${totalCoins}`, root) + } else { + this.autoBuyBotDisable = true + render(html`${totalCoins}`, root) + } + }} + > + + { + render(html` + this.removeBTCTradebook()}> + delete ${translate("nodepage.nchange12")} + + `, root) + }} + > + + + ${this.isEmptyArray(this.tradeBotBtcBook) ? html` + + ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} + + `: ''}
    + ${this.autoBuyBotDisable ? html` +
    ${this.renderBotWarning()}
    + `: ''}
    - ${translate("general.close")} - + ` + } - -
    -

    ${this.renderFetchText()}

    -
    -
    -
    -

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    -
    -
    -
    -
    ${this.renderWarning()}
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} - -
    -
    - - ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} - + tradeBotLTCTemplate() { + return html` +
    +
    +
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    +
    + + { + render(html`${data.item.botLtcQortAmount}`, root) + }} + > + + { + render(html`${data.item.botLtcPrice}`, root) + }} + > + + { + const totalCoins = this.round(parseFloat(data.item.botLtcQortAmount) * parseFloat(data.item.botLtcPrice)) + const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myBotFunds) > Number(totalCoins)) { + this.autoBuyBotDisable = false + render(html`${totalCoins}`, root) + } else { + this.autoBuyBotDisable = true + render(html`${totalCoins}`, root) + } + }} + > + + { + render(html` + this.removeLTCTradebook()}> + delete ${translate("nodepage.nchange12")} + + `, root) + }} + > + + + ${this.isEmptyArray(this.tradeBotLtcBook) ? html` + + ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} + + `: ''}
    + ${this.autoBuyBotDisable ? html` +
    ${this.renderBotWarning()}
    + `: ''}
    - ${translate("general.close")} - + ` + } - -
    -

    ${this.renderFetchText()}

    -
    -
    -
    -

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    -
    -
    -
    -
    ${this.renderWarning()}
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} - -
    -
    - - ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} - + tradeBotDOGETemplate() { + return html` +
    +
    +
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    +
    + + { + render(html`${data.item.botDogeQortAmount}`, root) + }} + > + + { + render(html`${data.item.botDogePrice}`, root) + }} + > + + { + const totalCoins = this.round(parseFloat(data.item.botDogeQortAmount) * parseFloat(data.item.botDogePrice)) + const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myBotFunds) > Number(totalCoins)) { + this.autoBuyBotDisable = false + render(html`${totalCoins}`, root) + } else { + this.autoBuyBotDisable = true + render(html`${totalCoins}`, root) + } + }} + > + + { + render(html` + this.removeDOGETradebook()}> + delete ${translate("nodepage.nchange12")} + + `, root) + }} + > + + + ${this.isEmptyArray(this.tradeBotDogeBook) ? html` + + ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} + + `: ''}
    + ${this.autoBuyBotDisable ? html` +
    ${this.renderBotWarning()}
    + `: ''}
    - ${translate("general.close")} - + ` + } - -
    -

    ${this.renderFetchText()}

    -
    -
    -
    -

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    -
    -
    -
    -
    ${this.renderWarning()}
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} - -
    -
    - - ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} - + tradeBotDGBTemplate() { + return html` +
    +
    +
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    +
    + + { + render(html`${data.item.botDgbQortAmount}`, root) + }} + > + + { + render(html`${data.item.botDgbPrice}`, root) + }} + > + + { + const totalCoins = this.round(parseFloat(data.item.botDgbQortAmount) * parseFloat(data.item.botDgbPrice)) + const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myBotFunds) > Number(totalCoins)) { + this.autoBuyBotDisable = false + render(html`${totalCoins}`, root) + } else { + this.autoBuyBotDisable = true + render(html`${totalCoins}`, root) + } + }} + > + + { + render(html` + this.removeDGBTradebook()}> + delete ${translate("nodepage.nchange12")} + + `, root) + }} + > + + + ${this.isEmptyArray(this.tradeBotDgbBook) ? html` + + ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} + + `: ''}
    + ${this.autoBuyBotDisable ? html` +
    ${this.renderBotWarning()}
    + `: ''}
    - ${translate("general.close")} - + ` + } - -
    -

    ${this.renderFetchText()}

    -
    -
    -
    -

    ${this.listedCoins.get(this.selectedCoin).coinCode} ==> QORT

    -
    -
    -
    -
    ${this.renderWarning()}
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} - -
    -
    - - ${translate("tradepage.tchange38")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange39")} - + tradeBotRVNTemplate() { + return html` +
    +
    +
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    +
    + + { + render(html`${data.item.botRvnQortAmount}`, root) + }} + > + + { + render(html`${data.item.botRvnPrice}`, root) + }} + > + + { + const totalCoins = this.round(parseFloat(data.item.botRvnQortAmount) * parseFloat(data.item.botRvnPrice)) + const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myBotFunds) > Number(totalCoins)) { + this.autoBuyBotDisable = false + render(html`${totalCoins}`, root) + } else { + this.autoBuyBotDisable = true + render(html`${totalCoins}`, root) + } + }} + > + + { + render(html` + this.removeRVNTradebook()}> + delete ${translate("nodepage.nchange12")} + + `, root) + }} + > + + + ${this.isEmptyArray(this.tradeBotRvnBook) ? html` + + ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} + + `: ''}
    + ${this.autoBuyBotDisable ? html` +
    ${this.renderBotWarning()}
    + `: ''}
    - ${translate("general.close")} - - - -
    -

    - this.shadowRoot.getElementById('buyInfoDialog').close()} title="${translate("info.inf8")}">highlight_off -
    -
    -

    ${translate("info.inf7")}

    -

    ${translate("info.inf9")}

    -

    ${translate("info.inf10")}

    -

    ${translate("info.inf11")}

    -

    ${translate("info.inf12")}

    -
    -
    - -
    -

    Qortal ${translate("tabmenu.tm6")} ${translate("login.lp1")}

    -
    -
    -
    -

    ${translate("login.lp2")}

    -

    ${translate("login.lp3")}

    -
    -
    - password - -
    -
    - password - -
    -
    - ${translate("login.lp4")} - ${translate("login.lp5")} -
    -
    - -
    -

    Qortal ${translate("tabmenu.tm6")} ${translate("login.lp1")}

    -
    -
    -
    -

    ${translate("login.lessthen8")}

    -
    -
    - ${translate("login.lp4")} - ${translate("login.lp5")} -
    -
    - -
    - ${translate("tradepage.tchange46")}
    - ${translate("login.lp9")} - ${translate("login.lp10")} -
    -
    - password - -
    - ${this.autoHelperMessage} -
    -
    -
    -
    - -
    -
    - ` - } - - async firstUpdated() { - let _this = this - - this.changeTheme() - this.changeLanguage() - await this.tradeFee() - await this.getNewBlockedTrades() - - this.autoHelperMessage = this.renderAutoHelperPass() - - this.autoSalt = '' - this.autoSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) - - this.autoStorageData = '' - this.autoStorageData = window.parent.reduxStore.getState().app.selectedAddress.address - - this.autoLockScreenPass = '' - this.autoLockScreenPass = 'autoLockScreenPass-' + this.autoStorageData - - this.autoLockScreenSet = '' - this.autoLockScreenSet = 'autoLockScreenSet-' + this.autoStorageData - - this.autoLockPass = '' - this.autoLockPass = encryptData(false, this.autoSalt) - - this.autoLockSet = '' - this.autoLockSet = encryptData(false, this.autoSalt) - - if (localStorage.getItem(this.autoLockScreenPass) === null && localStorage.getItem(this.autoLockScreenSet) === null) { - localStorage.setItem(this.autoLockScreenPass, this.autoLockPass) - localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) - this.myAutoLockScreenPass = '' - this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) - this.myAutoLockScreenSet = '' - this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) - } else { - this.myAutoLockScreenPass = '' - this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) - this.myAutoLockScreenSet = '' - this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) - } - - if (this.myAutoLockScreenSet === true) { - this.shadowRoot.getElementById('autoLockScreenActive').open() - } - - await this.updateWalletBalance() - await this.fetchWalletAddress(this.selectedCoin) - this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') - this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid') - - this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { - const priceString = get("tradepage.tchange9") - root.innerHTML = '' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' - } - - this._openOrdersGrid.querySelector('#qortAmountColumn').headerRenderer = function (root) { - const amountString = get("tradepage.tchange8") - root.innerHTML = '' + amountString + ' (QORT)' - } - - this._myOrdersGrid = this.shadowRoot.getElementById('myOrdersGrid') - - const getQortBtcPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/BITCOIN?inverse=true` }).then((res) => { - setTimeout(() => { this.qortbtc = (Number(res) / 1e8).toFixed(8) }, 1) - }) - setTimeout(getQortBtcPrice, 300000) - } - - const getQortLtcPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/LITECOIN?inverse=true` }).then((res) => { - setTimeout(() => { this.qortltc = (Number(res) / 1e8).toFixed(8) }, 1) - }) - setTimeout(getQortLtcPrice, 300000) - } - - const getQortDogePrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/DOGECOIN?inverse=true` }).then((res) => { - setTimeout(() => { this.qortdoge = (Number(res) / 1e8).toFixed(8) }, 1) - }) - setTimeout(getQortDogePrice, 300000) - } - - const getQortDgbPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/DIGIBYTE?inverse=true` }).then((res) => { - setTimeout(() => { this.qortdgb = (Number(res) / 1e8).toFixed(8) }, 1) - }) - setTimeout(getQortDgbPrice, 300000) - } - - const getQortRvnPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/RAVENCOIN?inverse=true` }).then((res) => { - setTimeout(() => { this.qortrvn = (Number(res) / 1e8).toFixed(8) }, 1) - }) - setTimeout(getQortRvnPrice, 300000) - } - - const getQortArrrPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/PIRATECHAIN?inverse=true` }).then((res) => { - setTimeout(() => { this.qortarrr = (Number(res) / 1e8).toFixed(8) }, 1) - }) - setTimeout(getQortArrrPrice, 300000) - } - - window.addEventListener('storage', () => { - this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") - const checkLanguage = localStorage.getItem('qortalLanguage') - const checkTheme = localStorage.getItem('qortalTheme') - - use(checkLanguage) - - this.theme = (checkTheme === 'dark') ? 'dark' : 'light' - document.querySelector('html').setAttribute('theme', this.theme) - }) - - if (!isElectron()) { - } else { - window.addEventListener('contextmenu', (event) => { - event.preventDefault() - window.parent.electronAPI.showMyMenu() - }) - } - - this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address - this.ltcWallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address - this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address - this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address - this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address - this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address - - let configLoaded = false - - parentEpml.ready().then(() => { - parentEpml.subscribe('selected_address', async (selectedAddress) => { - this.selectedAddress = {} - selectedAddress = JSON.parse(selectedAddress) - if (!selectedAddress || Object.entries(selectedAddress).length === 0) return - this.selectedAddress = selectedAddress - - this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address - this.ltcWwallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address - this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address - this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address - this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address - this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address - - this.updateAccountBalance() - }) - - parentEpml.subscribe('config', (c) => { - if (!configLoaded) { - setTimeout(getQortBtcPrice, 1) - setTimeout(getQortLtcPrice, 1) - setTimeout(getQortDogePrice, 1) - setTimeout(getQortDgbPrice, 1) - setTimeout(getQortRvnPrice, 1) - setTimeout(getQortArrrPrice, 1) - configLoaded = true - } - this.config = JSON.parse(c) - }) - - let coinSelectionMenu = this.shadowRoot.getElementById("coinSelectionMenu") - - coinSelectionMenu.addEventListener('change', function () { - _this.setForeignCoin(coinSelectionMenu.value,false) - }) - - _this.setForeignCoin(coinSelectionMenu.value,true) - }) - parentEpml.imReady() - this.btcTradebook() - this.ltcTradebook() - this.dogeTradebook() - this.dgbTradebook() - this.rvnTradebook() - this.arrrTradebook() - this.clearConsole() - setInterval(() => { - this.clearConsole() - }, 60000) - setInterval(() => { - this.getNewBlockedTrades() - }, 300000) - } - - clearConsole() { - if (!isElectron()) { - } else { - console.clear() - window.parent.electronAPI.clearCache() - } - } - - renderAutoLockButton() { - if (this.myAutoLockScreenPass === false && this.myAutoLockScreenSet === false) { - return html` -
    - this.openAutoSetScreenLockPass()} title="${translate("login.lp11")}"> -
    - ` - } else if (this.myAutoLockScreenSet === false) { - return html` -
    - this.setAutoLockQortal()} title="${translate("login.lp11")}"> -
    - ` - } else if (this.myAutoLockScreenSet === true) { - return html` -
    - -
    - ` - } - } - - openAutoSetScreenLockPass() { - this.shadowRoot.getElementById('autoLockPassword').value = '' - this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' - this.shadowRoot.getElementById('setAutoLockScreenPass').open() - } - - closewAutoSetScreenLockPass() { - this.shadowRoot.getElementById('setAutoLockScreenPass').close() - } - - autoCheckPass() { - const autoPassword = this.shadowRoot.getElementById('autoLockPassword').value - const autoRePassword = this.shadowRoot.getElementById('autoLockPasswordConfirm').value - - if (autoPassword === '') { - let snackbar1string = get("login.pleaseenter") - parentEpml.request('showSnackBar', `${snackbar1string}`) - return - } - - if (autoPassword != autoRePassword) { - let snackbar2string = get("login.notmatch") - parentEpml.request('showSnackBar', `${snackbar2string}`) - return - } - - if (autoPassword.length < 8) { - let snackbar3string = get("login.lessthen8") - parentEpml.request('showSnackBar', `${snackbar3string}`) - this.autoExtraConfirm() - } - - if (autoPassword.length >= 8) { - this.setAutoNewScreenPass() - let snackbar4string = get("login.lp6") - parentEpml.request('showSnackBar', `${snackbar4string}`) - } - } - - autoExtraConfirm() { - this.shadowRoot.getElementById('setAutoLockScreenPass').close() - this.shadowRoot.getElementById('autoExtraConfirmPass').open() - } - - closAutoExtraConfirmPass() { - this.shadowRoot.getElementById('autoExtraConfirmPass').close() - this.shadowRoot.getElementById('autoLockPassword').value = '' - this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' - } - - setAutoNewScreenPass() { - const autoRawPassword = this.shadowRoot.getElementById('autoLockPassword').value - const autoCryptPassword = encryptData(autoRawPassword, this.autoSalt) - localStorage.setItem(this.autoLockScreenPass, autoCryptPassword) - this.myAutoLockScreenPass = '' - this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) - this.shadowRoot.getElementById('setAutoLockScreenPass').close() - this.shadowRoot.getElementById('autoExtraConfirmPass').close() - this.shadowRoot.getElementById('autoLockPassword').value = '' - this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' - } - - setAutoLockQortal() { - this.autoHelperMessage = this.renderAutoHelperPass() - this.autoLockSet = '' - this.autoLockSet = encryptData(true, this.autoSalt) - localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) - this.myAutoLockScreenSet = '' - this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) - this.shadowRoot.getElementById('autoLockScreenActive').open() - } - - autoPassKeyListener(e) { - if (e.key === 'Enter') { - this.closeAutoLockScreenActive() - } - } - - async closeAutoLockScreenActive() { - const myAutoPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) - const autoCheckPass = this.shadowRoot.getElementById('autoUnlockPassword').value - const errDelay = ms => new Promise(res => setTimeout(res, ms)) - - if (autoCheckPass === myAutoPass) { - this.autoLockSet = '' - this.autoLockSet = encryptData(false, this.autoSalt) - localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) - this.myAutoLockScreenSet = '' - this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) - this.shadowRoot.getElementById('autoLockScreenActive').close() - this.shadowRoot.getElementById('autoUnlockPassword').value = '' - this.autoHelperMessage = this.renderAutoHelperPass() - } else { - this.shadowRoot.getElementById('autoUnlockPassword').value = '' - this.autoHelperMessage = this.renderAutoHelperErr() - await errDelay(3000) - this.autoHelperMessage = this.renderAutoHelperPass() - - } - } - - renderAutoHelperPass() { - return html`${translate("login.pleaseenter")}` - } - - renderAutoHelperErr() { - return html`${translate("login.lp8")}` - } - - changeTheme() { - const checkTheme = localStorage.getItem('qortalTheme') - this.theme = (checkTheme === 'dark') ? 'dark' : 'light' - document.querySelector('html').setAttribute('theme', this.theme); - } - - changeLanguage() { - const checkLanguage = localStorage.getItem('qortalLanguage') - - if (checkLanguage === null || checkLanguage.length === 0) { - localStorage.setItem('qortalLanguage', 'us') - use('us') - } else { - use(checkLanguage) - } - } - - renderFetchText() { - return html`${translate("walletpage.wchange1")}` - } - - renderWarning() { - return html`${translate("tradepage.tchange48")} ${this.listedCoins.get(this.selectedCoin).coinCode}` - } - - renderBotWarning() { - return html`${translate("walletpage.wchange1")}` - } - - showAutoBuyGrid() { - switch(this.listedCoins.get(this.selectedCoin).coinCode) { - case "BTC": - return html`${this.tradeBotBTCTemplate()}` - break - case "LTC": - return html`${this.tradeBotLTCTemplate()}` - break - case "DOGE": - return html`${this.tradeBotDOGETemplate()}` - break - case "DGB": - return html`${this.tradeBotDGBTemplate()}` - break - case "RVN": - return html`${this.tradeBotRVNTemplate()}` - break - case "ARRR": - return html`${this.tradeBotARRRTemplate()}` - break - default: - break - } - } - - exchangeRateQort() { - switch(this.listedCoins.get(this.selectedCoin).coinCode) { - case "BTC": - this.qortRatio = this.qortbtc - break - case "LTC": - this.qortRatio = this.qortltc - break - case "DOGE": - this.qortRatio = this.qortdoge - break - case "DGB": - this.qortRatio = this.qortdgb - break - case "RVN": - this.qortRatio = this.qortrvn - break - case "ARRR": - this.qortRatio = this.qortarrr - break - default: - break - } - return html`${this.qortRatio}` - } - - exchangeRateForeign() { - if (this.listedCoins.get(this.selectedCoin).coinCode === "BTC") { - parentEpml.request('apiCall', { - url: `/crosschain/price/BITCOIN?inverse=false` - }).then((res) => { - this.btcqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.btcqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "LTC") { - parentEpml.request('apiCall', { - url: `/crosschain/price/LITECOIN?inverse=false` - }).then((res) => { - this.ltcqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.ltcqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DOGE") { - parentEpml.request('apiCall', { - url: `/crosschain/price/DOGECOIN?inverse=false` - }).then((res) => { - this.dogeqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.dogeqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DGB") { - parentEpml.request('apiCall', { - url: `/crosschain/price/DIGIBYTE?inverse=false` - }).then((res) => { - this.dgbqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.dgbqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "RVN") { - parentEpml.request('apiCall', { - url: `/crosschain/price/RAVENCOIN?inverse=false` - }).then((res) => { - this.rvnqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.rvnqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "ARRR") { - parentEpml.request('apiCall', { - url: `/crosschain/price/PIRATECHAIN?inverse=false` - }).then((res) => { - this.arrrqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.arrrqort}` - } - } - - async updateWalletBalance() { - let _url = `` - let _body = null - - switch (this.selectedCoin) { - case 'BITCOIN': - _url = `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey - break - case 'LITECOIN': - _url = `/crosschain/ltc/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey - break - case 'DOGECOIN': - _url = `/crosschain/doge/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey - break - case 'DIGIBYTE': - _url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey - break - case 'RAVENCOIN': - _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey - break - case 'PIRATECHAIN': - _url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58 - break - default: - break - } - - this.showGetWalletBance = true - this.showAddAutoBuy = false - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.listedCoins.get(this.selectedCoin).balance = (Number(res) / 1e8).toFixed(8) - } - }) - - this.showGetWalletBance = false - this.showAddAutoBuy = true - } - - async fetchWalletAddress(coin) { - switch (coin) { - case 'PIRATECHAIN': - let res = await parentEpml.request('apiCall', { - url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58}`, - }) - if (res != null && res.error != 1201) { - this.arrrWalletAddress = res - } - break - - default: - // Not used for other coins yet - break - } - } - - async getDoneTrades() { - let tradesUrl = `` - clearTimeout(this.updateDoneTradesTimeout) - 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 myAddress = window.parent.reduxStore.getState().app.selectedAddress.address - - switch (this.selectedCoin) { - case 'BITCOIN': - tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=BITCOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` - break - case 'LITECOIN': - tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=LITECOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` - break - case 'DOGECOIN': - tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=DOGECOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` - break - case 'DIGIBYTE': - tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=DIGIBYTE&minimumTimestamp=1597310000000&limit=0&reverse=true` - break - case 'RAVENCOIN': - tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=RAVENCOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` - break - case 'PIRATECHAIN': - tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=PIRATECHAIN&minimumTimestamp=1597310000000&limit=0&reverse=true` - break - default: - break - } - - this.isLoadingDoneTrades = true - - const doneTradesAll = await fetch(tradesUrl).then(response => { - return response.json() - }) - - this.listedCoins.get(this.selectedCoin).myGridBoughtItems = doneTradesAll.map(item => { - const searchAddress = item.buyerReceivingAddress - if (searchAddress == myAddress) { - return { - timestamp: item.tradeTimestamp, - foreignAmount: item.foreignAmount, - qortAmount: item.qortAmount - } - } - }).filter(item => !!item) - - this.isLoadingDoneTrades = false - this.updateDoneTradesTimeout = setTimeout(() => this.getDoneTrades(), 300000) - } - - btcTradebook() { - if (localStorage.getItem(this.btcWallet) === null) { - localStorage.setItem(this.btcWallet, "") - } else { - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") - } - } - - addToBTCTradebook() { - const addBotBtcQortAmount = this.shadowRoot.getElementById('autoBuyBTCQortAmountInput').value - const addBotBtcPrice = this.shadowRoot.getElementById('autoBuyBTCPriceInput').value - const addBtcQortAmount = this.round(parseFloat(addBotBtcQortAmount)) - const addBtcPrice = this.round(parseFloat(addBotBtcPrice)) - - var oldBtcTradebook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") - - const newBtcTradebookItem = { - botBtcQortAmount: addBtcQortAmount, - botBtcPrice: addBtcPrice - } - - oldBtcTradebook.push(newBtcTradebookItem) - - localStorage.setItem(this.btcWallet, JSON.stringify(oldBtcTradebook)) - - let btctradebookstring = get("tradepage.tchange44") - parentEpml.request('showSnackBar', `${btctradebookstring}`) - - this.closeBTCTradebookDialog() - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") - } - - closeBTCTradebookDialog() { - this.shadowRoot.querySelector('#tradeBotBTCAddDialog').close() - this.clearTradeBotForm() - } - - removeBTCTradebook() { - localStorage.removeItem(this.btcWallet) - localStorage.setItem(this.btcWallet, "") - this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") - - this.autoBuyBotDisable = false - - let btcstring = get("tradepage.tchange41") - parentEpml.request('showSnackBar', `${btcstring}`) - } - - ltcTradebook() { - if (localStorage.getItem(this.ltcWallet) === null) { - localStorage.setItem(this.ltcWallet, "") - } else { - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") - } - } - - addToLTCTradebook() { - const addBotLtcQortAmount = this.shadowRoot.getElementById('autoBuyLTCQortAmountInput').value - const addBotLtcPrice = this.shadowRoot.getElementById('autoBuyLTCPriceInput').value - const addLtcQortAmount = this.round(parseFloat(addBotLtcQortAmount)) - const addLtcPrice = this.round(parseFloat(addBotLtcPrice)) - - var oldLtcTradebook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") - - const newLtcTradebookItem = { - botLtcQortAmount: addLtcQortAmount, - botLtcPrice: addLtcPrice - } - - oldLtcTradebook.push(newLtcTradebookItem) - - localStorage.setItem(this.ltcWallet, JSON.stringify(oldLtcTradebook)) - - let ltctradebookstring = get("tradepage.tchange44") - parentEpml.request('showSnackBar', `${ltctradebookstring}`) - - this.closeLTCTradebookDialog() - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") - } - - closeLTCTradebookDialog() { - this.shadowRoot.querySelector('#tradeBotLTCAddDialog').close() - this.clearTradeBotForm() - } - - removeLTCTradebook() { - localStorage.removeItem(this.ltcWallet) - localStorage.setItem(this.ltcWallet, "") - this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") - - this.autoBuyBotDisable = false + ` + } + + tradeBotARRRTemplate() { + return html` +
    +
    +
    ${translate("info.inf16")} QORT ${translate("info.inf14")} ${this.listedCoins.get(this.selectedCoin).coinCode}
    +
    + + { + render(html`${data.item.botArrrQortAmount}`, root) + }} + > + + { + render(html`${data.item.botArrrPrice}`, root) + }} + > + + { + const totalCoins = this.round(parseFloat(data.item.botArrrQortAmount) * parseFloat(data.item.botArrrPrice)) + const myBotFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myBotFunds) > Number(totalCoins)) { + this.autoBuyBotDisable = false + render(html`${totalCoins}`, root) + } else { + this.autoBuyBotDisable = true + render(html`${totalCoins}`, root) + } + }} + > + + { + render(html` + this.removeARRRTradebook()}> + delete  ${translate("nodepage.nchange12")} + + `, root) + }} + > + + + ${this.isEmptyArray(this.tradeBotArrrBook) ? html` + + ${translate("tradepage.tchange38")} ${translate("tradepage.tchange39")} + + `: ''} +
    + ${this.autoBuyBotDisable ? html` +
    ${this.renderBotWarning()}
    + `: ''} +
    +
    + ` + } + + clearConsole() { + if (!isElectron()) { + } else { + console.clear() + window.parent.electronAPI.clearCache() + } + } + + renderAutoLockButton() { + if (this.myAutoLockScreenPass === false && this.myAutoLockScreenSet === false) { + return html` +
    + this.openAutoSetScreenLockPass()} title="${translate("login.lp11")}"> +
    + ` + } else if (this.myAutoLockScreenSet === false) { + return html` +
    + this.setAutoLockQortal()} title="${translate("login.lp11")}"> +
    + ` + } else if (this.myAutoLockScreenSet === true) { + return html` +
    + +
    + ` + } + } + + openAutoSetScreenLockPass() { + this.shadowRoot.getElementById('autoLockPassword').value = '' + this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setAutoLockScreenPass').open() + } + + closewAutoSetScreenLockPass() { + this.shadowRoot.getElementById('setAutoLockScreenPass').close() + } + + autoCheckPass() { + const autoPassword = this.shadowRoot.getElementById('autoLockPassword').value + const autoRePassword = this.shadowRoot.getElementById('autoLockPasswordConfirm').value + + if (autoPassword === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (autoPassword != autoRePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (autoPassword.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.autoExtraConfirm() + } + + if (autoPassword.length >= 8) { + this.setAutoNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + autoExtraConfirm() { + this.shadowRoot.getElementById('setAutoLockScreenPass').close() + this.shadowRoot.getElementById('autoExtraConfirmPass').open() + } + + closAutoExtraConfirmPass() { + this.shadowRoot.getElementById('autoExtraConfirmPass').close() + this.shadowRoot.getElementById('autoLockPassword').value = '' + this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' + } + + setAutoNewScreenPass() { + const autoRawPassword = this.shadowRoot.getElementById('autoLockPassword').value + const autoCryptPassword = encryptData(autoRawPassword, this.autoSalt) + localStorage.setItem(this.autoLockScreenPass, autoCryptPassword) + this.myAutoLockScreenPass = '' + this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + this.shadowRoot.getElementById('setAutoLockScreenPass').close() + this.shadowRoot.getElementById('autoExtraConfirmPass').close() + this.shadowRoot.getElementById('autoLockPassword').value = '' + this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' + } + + setAutoLockQortal() { + this.autoHelperMessage = this.renderAutoHelperPass() + this.autoLockSet = '' + this.autoLockSet = encryptData(true, this.autoSalt) + localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + this.shadowRoot.getElementById('autoLockScreenActive').open() + } + + autoPassKeyListener(e) { + if (e.key === 'Enter') { + this.closeAutoLockScreenActive() + } + } + + async closeAutoLockScreenActive() { + const myAutoPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + const autoCheckPass = this.shadowRoot.getElementById('autoUnlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (autoCheckPass === myAutoPass) { + this.autoLockSet = '' + this.autoLockSet = encryptData(false, this.autoSalt) + localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + this.shadowRoot.getElementById('autoLockScreenActive').close() + this.shadowRoot.getElementById('autoUnlockPassword').value = '' + this.autoHelperMessage = this.renderAutoHelperPass() + } else { + this.shadowRoot.getElementById('autoUnlockPassword').value = '' + this.autoHelperMessage = this.renderAutoHelperErr() + await errDelay(3000) + this.autoHelperMessage = this.renderAutoHelperPass() + + } + } + + renderAutoHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderAutoHelperErr() { + return html`${translate("login.lp8")}` + } + + changeTheme() { + const checkTheme = localStorage.getItem('qortalTheme') + this.theme = (checkTheme === 'dark') ? 'dark' : 'light' + document.querySelector('html').setAttribute('theme', this.theme); + } + + changeLanguage() { + const checkLanguage = localStorage.getItem('qortalLanguage') + if (checkLanguage === null || checkLanguage.length === 0) { + localStorage.setItem('qortalLanguage', 'us') + use('us') + } else { + use(checkLanguage) + } + } + + renderFetchText() { + return html`${translate("walletpage.wchange1")}` + } + + renderWarning() { + return html`${translate("tradepage.tchange48")} ${this.listedCoins.get(this.selectedCoin).coinCode}` + } + + renderBotWarning() { + return html`${translate("walletpage.wchange1")}` + } + + showAutoBuyGrid() { + switch (this.listedCoins.get(this.selectedCoin).coinCode) { + case "BTC": + return html`${this.tradeBotBTCTemplate()}` + break + case "LTC": + return html`${this.tradeBotLTCTemplate()}` + break + case "DOGE": + return html`${this.tradeBotDOGETemplate()}` + break + case "DGB": + return html`${this.tradeBotDGBTemplate()}` + break + case "RVN": + return html`${this.tradeBotRVNTemplate()}` + break + case "ARRR": + return html`${this.tradeBotARRRTemplate()}` + break + default: + break + } + } + + exchangeRateQort() { + switch (this.listedCoins.get(this.selectedCoin).coinCode) { + case "BTC": + this.qortRatio = this.qortbtc + break + case "LTC": + this.qortRatio = this.qortltc + break + case "DOGE": + this.qortRatio = this.qortdoge + break + case "DGB": + this.qortRatio = this.qortdgb + break + case "RVN": + this.qortRatio = this.qortrvn + break + case "ARRR": + this.qortRatio = this.qortarrr + break + default: + break + } + return html`${this.qortRatio}` + } + + exchangeRateForeign() { + if (this.listedCoins.get(this.selectedCoin).coinCode === "BTC") { + parentEpml.request('apiCall', { + url: `/crosschain/price/BITCOIN?inverse=false` + }).then((res) => { + this.btcqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.btcqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "LTC") { + parentEpml.request('apiCall', { + url: `/crosschain/price/LITECOIN?inverse=false` + }).then((res) => { + this.ltcqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.ltcqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DOGE") { + parentEpml.request('apiCall', { + url: `/crosschain/price/DOGECOIN?inverse=false` + }).then((res) => { + this.dogeqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.dogeqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DGB") { + parentEpml.request('apiCall', { + url: `/crosschain/price/DIGIBYTE?inverse=false` + }).then((res) => { + this.dgbqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.dgbqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "RVN") { + parentEpml.request('apiCall', { + url: `/crosschain/price/RAVENCOIN?inverse=false` + }).then((res) => { + this.rvnqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.rvnqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "ARRR") { + parentEpml.request('apiCall', { + url: `/crosschain/price/PIRATECHAIN?inverse=false` + }).then((res) => { + this.arrrqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.arrrqort}` + } + } + + async updateWalletBalance() { + let _url = `` + let _body = null + + switch (this.selectedCoin) { + case 'BITCOIN': + _url = `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey + break + case 'LITECOIN': + _url = `/crosschain/ltc/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey + break + case 'DOGECOIN': + _url = `/crosschain/doge/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey + break + case 'DIGIBYTE': + _url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey + break + case 'RAVENCOIN': + _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey + break + case 'PIRATECHAIN': + _url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58 + break + default: + break + } + + this.showGetWalletBance = true + this.showAddAutoBuy = false + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.listedCoins.get(this.selectedCoin).balance = (Number(res) / 1e8).toFixed(8) + } + }) + + this.showGetWalletBance = false + this.showAddAutoBuy = true + } + + async fetchWalletAddress(coin) { + switch (coin) { + case 'PIRATECHAIN': + let res = await parentEpml.request('apiCall', { + url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58}` + }) + if (res != null && res.error != 1201) { + this.arrrWalletAddress = res + } + break + + default: + // Not used for other coins yet + break + } + } + + async getDoneTrades() { + let tradesUrl = `` + clearTimeout(this.updateDoneTradesTimeout) + 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 myAddress = window.parent.reduxStore.getState().app.selectedAddress.address + + switch (this.selectedCoin) { + case 'BITCOIN': + tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=BITCOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` + break + case 'LITECOIN': + tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=LITECOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` + break + case 'DOGECOIN': + tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=DOGECOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` + break + case 'DIGIBYTE': + tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=DIGIBYTE&minimumTimestamp=1597310000000&limit=0&reverse=true` + break + case 'RAVENCOIN': + tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=RAVENCOIN&minimumTimestamp=1597310000000&limit=0&reverse=true` + break + case 'PIRATECHAIN': + tradesUrl = `${nodeUrl}/crosschain/trades?foreignBlockchain=PIRATECHAIN&minimumTimestamp=1597310000000&limit=0&reverse=true` + break + default: + break + } + + this.isLoadingDoneTrades = true + + const doneTradesAll = await fetch(tradesUrl).then(response => { + return response.json() + }) + + this.listedCoins.get(this.selectedCoin).myGridBoughtItems = doneTradesAll.map(item => { + const searchAddress = item.buyerReceivingAddress + if (searchAddress == myAddress) { + return { + timestamp: item.tradeTimestamp, + foreignAmount: item.foreignAmount, + qortAmount: item.qortAmount + } + } + }).filter(item => !!item) + + this.isLoadingDoneTrades = false + this.updateDoneTradesTimeout = setTimeout(() => this.getDoneTrades(), 300000) + } + + btcTradebook() { + if (localStorage.getItem(this.btcWallet) === null) { + localStorage.setItem(this.btcWallet, "") + } else { + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") + } + } + + addToBTCTradebook() { + const addBotBtcQortAmount = this.shadowRoot.getElementById('autoBuyBTCQortAmountInput').value + const addBotBtcPrice = this.shadowRoot.getElementById('autoBuyBTCPriceInput').value + const addBtcQortAmount = this.round(parseFloat(addBotBtcQortAmount)) + const addBtcPrice = this.round(parseFloat(addBotBtcPrice)) + + var oldBtcTradebook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") + + const newBtcTradebookItem = { + botBtcQortAmount: addBtcQortAmount, + botBtcPrice: addBtcPrice + } + + oldBtcTradebook.push(newBtcTradebookItem) + + localStorage.setItem(this.btcWallet, JSON.stringify(oldBtcTradebook)) + + let btctradebookstring = get("tradepage.tchange44") + parentEpml.request('showSnackBar', `${btctradebookstring}`) + + this.closeBTCTradebookDialog() + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") + } + + closeBTCTradebookDialog() { + this.shadowRoot.querySelector('#tradeBotBTCAddDialog').close() + this.clearTradeBotForm() + } + + removeBTCTradebook() { + localStorage.removeItem(this.btcWallet) + localStorage.setItem(this.btcWallet, "") + this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.btcWallet) || "[]") + + this.autoBuyBotDisable = false + + let btcstring = get("tradepage.tchange41") + parentEpml.request('showSnackBar', `${btcstring}`) + } + + ltcTradebook() { + if (localStorage.getItem(this.ltcWallet) === null) { + localStorage.setItem(this.ltcWallet, "") + } else { + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") + } + } + + addToLTCTradebook() { + const addBotLtcQortAmount = this.shadowRoot.getElementById('autoBuyLTCQortAmountInput').value + const addBotLtcPrice = this.shadowRoot.getElementById('autoBuyLTCPriceInput').value + const addLtcQortAmount = this.round(parseFloat(addBotLtcQortAmount)) + const addLtcPrice = this.round(parseFloat(addBotLtcPrice)) + + var oldLtcTradebook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") + + const newLtcTradebookItem = { + botLtcQortAmount: addLtcQortAmount, + botLtcPrice: addLtcPrice + } + + oldLtcTradebook.push(newLtcTradebookItem) + + localStorage.setItem(this.ltcWallet, JSON.stringify(oldLtcTradebook)) + + let ltctradebookstring = get("tradepage.tchange44") + parentEpml.request('showSnackBar', `${ltctradebookstring}`) + + this.closeLTCTradebookDialog() + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") + } + + closeLTCTradebookDialog() { + this.shadowRoot.querySelector('#tradeBotLTCAddDialog').close() + this.clearTradeBotForm() + } + + removeLTCTradebook() { + localStorage.removeItem(this.ltcWallet) + localStorage.setItem(this.ltcWallet, "") + this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.ltcWallet) || "[]") + + this.autoBuyBotDisable = false - let ltcstring = get("tradepage.tchange41") - parentEpml.request('showSnackBar', `${ltcstring}`) - } + let ltcstring = get("tradepage.tchange41") + parentEpml.request('showSnackBar', `${ltcstring}`) + } - dogeTradebook() { - if (localStorage.getItem(this.dogeWallet) === null) { - localStorage.setItem(this.dogeWallet, "") - } else { - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") - } - } - - addToDOGETradebook() { - const addBotDogeQortAmount = this.shadowRoot.getElementById('autoBuyDOGEQortAmountInput').value - const addBotDogePrice = this.shadowRoot.getElementById('autoBuyDOGEPriceInput').value - const addDogeQortAmount = this.round(parseFloat(addBotDogeQortAmount)) - const addDogePrice = this.round(parseFloat(addBotDogePrice)) + dogeTradebook() { + if (localStorage.getItem(this.dogeWallet) === null) { + localStorage.setItem(this.dogeWallet, "") + } else { + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") + } + } + + addToDOGETradebook() { + const addBotDogeQortAmount = this.shadowRoot.getElementById('autoBuyDOGEQortAmountInput').value + const addBotDogePrice = this.shadowRoot.getElementById('autoBuyDOGEPriceInput').value + const addDogeQortAmount = this.round(parseFloat(addBotDogeQortAmount)) + const addDogePrice = this.round(parseFloat(addBotDogePrice)) - var oldDogeTradebook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") + var oldDogeTradebook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") - const newDogeTradebookItem = { - botDogeQortAmount: addDogeQortAmount, - botDogePrice: addDogePrice - } + const newDogeTradebookItem = { + botDogeQortAmount: addDogeQortAmount, + botDogePrice: addDogePrice + } - oldDogeTradebook.push(newDogeTradebookItem) + oldDogeTradebook.push(newDogeTradebookItem) - localStorage.setItem(this.dogeWallet, JSON.stringify(oldDogeTradebook)) + localStorage.setItem(this.dogeWallet, JSON.stringify(oldDogeTradebook)) - let dogetradebookstring = get("tradepage.tchange44") - parentEpml.request('showSnackBar', `${dogetradebookstring}`) + let dogetradebookstring = get("tradepage.tchange44") + parentEpml.request('showSnackBar', `${dogetradebookstring}`) - this.closeDOGETradebookDialog() - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") - } + this.closeDOGETradebookDialog() + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") + } - closeDOGETradebookDialog() { - this.shadowRoot.querySelector('#tradeBotDOGEAddDialog').close() - this.clearTradeBotForm() - } - - removeDOGETradebook() { - localStorage.removeItem(this.dogeWallet) - localStorage.setItem(this.dogeWallet, "") - this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") + closeDOGETradebookDialog() { + this.shadowRoot.querySelector('#tradeBotDOGEAddDialog').close() + this.clearTradeBotForm() + } + + removeDOGETradebook() { + localStorage.removeItem(this.dogeWallet) + localStorage.setItem(this.dogeWallet, "") + this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.dogeWallet) || "[]") - this.autoBuyBotDisable = false + this.autoBuyBotDisable = false - let dogestring = get("tradepage.tchange41") - parentEpml.request('showSnackBar', `${dogestring}`) - } + let dogestring = get("tradepage.tchange41") + parentEpml.request('showSnackBar', `${dogestring}`) + } - dgbTradebook() { - if (localStorage.getItem(this.dgbWallet) === null) { - localStorage.setItem(this.dgbWallet, "") - } else { - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") - } - } - - addToDGBTradebook() { - const addBotDgbQortAmount = this.shadowRoot.getElementById('autoBuyDGBQortAmountInput').value - const addBotDgbPrice = this.shadowRoot.getElementById('autoBuyDGBPriceInput').value - const addDgbQortAmount = this.round(parseFloat(addBotDgbQortAmount)) - const addDgbPrice = this.round(parseFloat(addBotDgbPrice)) + dgbTradebook() { + if (localStorage.getItem(this.dgbWallet) === null) { + localStorage.setItem(this.dgbWallet, "") + } else { + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") + } + } + + addToDGBTradebook() { + const addBotDgbQortAmount = this.shadowRoot.getElementById('autoBuyDGBQortAmountInput').value + const addBotDgbPrice = this.shadowRoot.getElementById('autoBuyDGBPriceInput').value + const addDgbQortAmount = this.round(parseFloat(addBotDgbQortAmount)) + const addDgbPrice = this.round(parseFloat(addBotDgbPrice)) - var oldDgbTradebook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") + var oldDgbTradebook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") - const newDgbTradebookItem = { - botDgbQortAmount: addDgbQortAmount, - botDgbPrice: addDgbPrice - } + const newDgbTradebookItem = { + botDgbQortAmount: addDgbQortAmount, + botDgbPrice: addDgbPrice + } - oldDgbTradebook.push(newDgbTradebookItem) + oldDgbTradebook.push(newDgbTradebookItem) - localStorage.setItem(this.dgbWallet, JSON.stringify(oldDgbTradebook)) + localStorage.setItem(this.dgbWallet, JSON.stringify(oldDgbTradebook)) - let dgbtradebookstring = get("tradepage.tchange44") - parentEpml.request('showSnackBar', `${dgbtradebookstring}`) + let dgbtradebookstring = get("tradepage.tchange44") + parentEpml.request('showSnackBar', `${dgbtradebookstring}`) - this.closeDGBTradebookDialog() - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") - } + this.closeDGBTradebookDialog() + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") + } - closeDGBTradebookDialog() { - this.shadowRoot.querySelector('#tradeBotDGBAddDialog').close() - this.clearTradeBotForm() - } - - removeDGBTradebook() { - localStorage.removeItem(this.dgbWallet) - localStorage.setItem(this.dgbWallet, "") - this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") + closeDGBTradebookDialog() { + this.shadowRoot.querySelector('#tradeBotDGBAddDialog').close() + this.clearTradeBotForm() + } + + removeDGBTradebook() { + localStorage.removeItem(this.dgbWallet) + localStorage.setItem(this.dgbWallet, "") + this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.dgbWallet) || "[]") - this.autoBuyBotDisable = false + this.autoBuyBotDisable = false - let dgbstring = get("tradepage.tchange41") - parentEpml.request('showSnackBar', `${dgbstring}`) - } + let dgbstring = get("tradepage.tchange41") + parentEpml.request('showSnackBar', `${dgbstring}`) + } - rvnTradebook() { - if (localStorage.getItem(this.rvnWallet) === null) { - localStorage.setItem(this.rvnWallet, "") - } else { - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") - } - } + rvnTradebook() { + if (localStorage.getItem(this.rvnWallet) === null) { + localStorage.setItem(this.rvnWallet, "") + } else { + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") + } + } - addToRVNTradebook() { - const addBotRvnQortAmount = this.shadowRoot.getElementById('autoBuyRVNQortAmountInput').value - const addBotRvnPrice = this.shadowRoot.getElementById('autoBuyRVNPriceInput').value - const addRvnQortAmount = this.round(parseFloat(addBotRvnQortAmount)) - const addRvnPrice = this.round(parseFloat(addBotRvnPrice)) - - var oldRvnTradebook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") + addToRVNTradebook() { + const addBotRvnQortAmount = this.shadowRoot.getElementById('autoBuyRVNQortAmountInput').value + const addBotRvnPrice = this.shadowRoot.getElementById('autoBuyRVNPriceInput').value + const addRvnQortAmount = this.round(parseFloat(addBotRvnQortAmount)) + const addRvnPrice = this.round(parseFloat(addBotRvnPrice)) + + var oldRvnTradebook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") - const newRvnTradebookItem = { - botRvnQortAmount: addRvnQortAmount, - botRvnPrice: addRvnPrice - } - - oldRvnTradebook.push(newRvnTradebookItem) - - localStorage.setItem(this.rvnWallet, JSON.stringify(oldRvnTradebook)) - - let rvntradebookstring = get("tradepage.tchange44") - parentEpml.request('showSnackBar', `${rvntradebookstring}`) - - this.closeRVNTradebookDialog() - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") - } - - closeRVNTradebookDialog() { - this.shadowRoot.querySelector('#tradeBotRVNAddDialog').close() - this.clearTradeBotForm() - } - - removeRVNTradebook() { - localStorage.removeItem(this.rvnWallet) - localStorage.setItem(this.rvnWallet, "") - this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") - - this.autoBuyBotDisable = false - - let rvnstring = get("tradepage.tchange41") - parentEpml.request('showSnackBar', `${rvnstring}`) - } - - arrrTradebook() { - if (localStorage.getItem(this.arrrWallet) === null) { - localStorage.setItem(this.arrrWallet, "") - } else { - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") - } - } - - addToARRRTradebook() { - const addBotArrrQortAmount = this.shadowRoot.getElementById('autoBuyARRRQortAmountInput').value - const addBotArrrPrice = this.shadowRoot.getElementById('autoBuyARRRPriceInput').value - const addArrrQortAmount = this.round(parseFloat(addBotArrrQortAmount)) - const addArrrPrice = this.round(parseFloat(addBotArrrPrice)) - - var oldArrrTradebook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") - - const newArrrTradebookItem = { - botArrrQortAmount: addArrrQortAmount, - botArrrPrice: addArrrPrice - } - - oldArrrTradebook.push(newArrrTradebookItem) - - localStorage.setItem(this.arrrWallet, JSON.stringify(oldArrrTradebook)) - - let arrrtradebookstring = get("tradepage.tchange44") - parentEpml.request('showSnackBar', `${arrrtradebookstring}`) - - this.closeARRRTradebookDialog() - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") - } - - closeARRRTradebookDialog() { - this.shadowRoot.querySelector('#tradeBotARRRAddDialog').close() - this.clearTradeBotForm() - } - - removeARRRTradebook() { - localStorage.removeItem(this.arrrWallet) - localStorage.setItem(this.arrrWallet, "") - this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") - - this.autoBuyBotDisable = false - - let arrrstring = get("tradepage.tchange41") - parentEpml.request('showSnackBar', `${arrrstring}`) - } - - async setForeignCoin(coin,beingInitialized) { - let _this = this - this.selectedCoin = coin - - let coinSelectionMenu=this.shadowRoot.getElementById("coinSelectionMenu") - - if(beingInitialized){ - coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').setAttribute('style', 'padding-left: 60px;') - let pairIconContainer = document.createElement("span") - let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() - pairIconContainer.setAttribute("class","pairIconContainer") - pairIconContainer.setAttribute('style', 'left: 10px;top: 50%;transform: translate(0, -50%);height: 26px;width: 45px;position: absolute;background-repeat: no-repeat;background-size: cover;background-image: url(/img/qort'+pairicon+'.png);') - coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').appendChild(pairIconContainer) - }else{ - let pairIconContainer = coinSelectionMenu.shadowRoot.querySelector(".mdc-select--outlined .mdc-select__anchor span.pairIconContainer") - let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() - pairIconContainer.style.backgroundImage='url(/img/qort'+pairicon+'.png)' - } - - this.isLoadingOpenTrades = true - this.createConnection() - this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { - const priceString2 = get("tradepage.tchange9") - root.innerHTML = '' + priceString2 + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' - } - this.clearTradeBotForm() - clearTimeout(this.updateDoneTradesTimeout) - await this.getDoneTrades() - this.updateDoneTradesTimeout = setTimeout(() => this.getDoneTrades(), 180000) - await this.updateWalletBalance() - await this.fetchWalletAddress(coin) - - } - - async reRenderOpenFilteredOrders() { - this.requestUpdate() - await this.updateComplete - this.isLoadingOpenTrades = false - } - - async reRenderMyOpenOrders() { - this.requestUpdate() - await this.updateComplete - this.isLoadingMyOpenOrders = false - } - - addAutoBuyAction() { - this.autoBuyWarning = false - this.clearTradeBotForm() - this.shadowRoot.querySelector('#tradeBot' + this.listedCoins.get(this.selectedCoin).coinCode + 'AddDialog').show() - } - - checkTradeBotValues() { - const checkTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value - const checkTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value - const checkTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value - const checkAmount = this.round(parseFloat(checkTradeBotAmountInput)) - const checkPrice = this.round(parseFloat(checkTradeBotPriceInput)) - const checkTotal = this.round(parseFloat(checkTradeBotTotalInput)) - - if (Number(checkAmount) === 0) { - let amountString = get("tradepage.tchange34") - parentEpml.request('showSnackBar', `${amountString}`) - } else if (Number(checkPrice) === 0) { - let priceString = get("tradepage.tchange35") - parentEpml.request('showSnackBar', `${priceString}`) - } else if (Number(checkTotal) === 0) { - let totalString = get("tradepage.tchange35") - parentEpml.request('showSnackBar', `${totalString}`) - } else { - this.showAddToAutoBuyStore() - } - } - - showAddToAutoBuyStore() { - switch(this.listedCoins.get(this.selectedCoin).coinCode) { - case "BTC": - this.addToBTCTradebook() - break - case "LTC": - this.addToLTCTradebook() - break - case "DOGE": - this.addToDOGETradebook() - break - case "DGB": - this.addToDGBTradebook() - break - case "RVN": - this.addToRVNTradebook() - break - case "ARRR": - this.addToARRRTradebook() - break - default: - break - } - } - - processOfferingTrade(offer) { - try { - if(this.listedCoins.get(offer.foreignBlockchain).name!='') { - const offerItem = { - ...offer, - qortAmount: parseFloat(offer.qortAmount), - price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), - } - const addOffer = () => { - this.listedCoins.get(offer.foreignBlockchain).openOrders.unshift(offerItem) - } - const initOffer = () => { - this.listedCoins.get(offer.foreignBlockchain).openOrders.push(offerItem) - } - this.listedCoins.get(offer.foreignBlockchain).openOrders.length === 0 ? initOffer() : addOffer() - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - } catch(e) { - console.log("Error adding offer from "+offer.foreignBlockchain) - } - } - - processRedeemedTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - const offerItem = { - ...offer, - mode: 'SOLD', - } - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - const offerItem = { - ...offer, - mode: 'BOUGHT', - } - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } - const addNewHistoricTrade = () => { - this._historicTradesGrid.items.unshift(offer) - this._historicTradesGrid.clearCache() - } - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null - - } - } catch(e) { - console.log("Error processing redeemed trade offer from "+offer.foreignBlockchain) - } - } - - processTradingTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - }) - this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) - } - } catch(e) { - console.log("Error processing trading trade offer from "+offer.foreignBlockchain) - } - } - - processRefundedTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } - - } - } catch(e) { - console.log("Error processing refunded trade offer from "+offer.foreignBlockchain) - } - } - - processCancelledTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - }) - this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) - this._stuckOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._stuckOrdersGrid.items.splice(index, 1) - this._stuckOrdersGrid.clearCache() - } - }) - } - } catch(e) { - console.log("Error processing cancelled trade offer from "+offer.foreignBlockchain) - } - } - - processTradeOffers(offers) { - offers.forEach((offer) => { - if (offer.mode === 'OFFERING') { - this.processOfferingTrade(offer) - } - }) - } - - processTradeBotStates(tradeStates) { - - const BitcoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - const LitecoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - const DogecoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - const DigibyteACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - const RavencoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - const PirateChainACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - switch (this.selectedCoin) { - case 'BITCOIN': - BitcoinACCTv1(tradeStates) - break - case 'LITECOIN': - LitecoinACCTv1(tradeStates) - break - case 'DOGECOIN': - DogecoinACCTv1(tradeStates) - break - case 'DIGIBYTE': - DigibyteACCTv1(tradeStates) - break - case 'RAVENCOIN': - RavencoinACCTv1(tradeStates) - break - case 'PIRATECHAIN': - PirateChainACCTv1(tradeStates) - break - default: - break - } - } - - changeTradeBotState(state, tradeState) { - this.isLoadingMyOpenOrders = true - const stateItem = { - ...state, - _tradeState: tradeState, - } - const item = this._myOrdersGrid.querySelector(`#${state.atAddress}`) - const addStateItem = () => { - this.reRenderMyOpenOrders() - this._myOrdersGrid.items.unshift(stateItem) - this._myOrdersGrid.clearCache() - } - const updateStateItem = () => { - this._myOrdersGrid.items.forEach((item, index) => { - if (item.atAddress === state.atAddress) { - this.reRenderMyOpenOrders() - this._myOrdersGrid.items.splice(index, 1) - this._myOrdersGrid.items.unshift(stateItem) - this._myOrdersGrid.clearCache() - } - }) - } - item ? updateStateItem() : addStateItem() - } - - handleCompletedState(state) { - this._myOrdersGrid.items.forEach((item, index) => { - if (item.atAddress === state.atAddress) { - this.reRenderMyOpenOrders() - this._myOrdersGrid.items.splice(index, 1) - this._myOrdersGrid.clearCache() - } - }) - } - - initSocket() { - let _relatedCoin = "" - let tradePresenceTxns = null - let offeringTrades = null - - self.addEventListener('message', function (event) { - switch (event.data.type) { - case 'open_orders': - offeringTrades = event.data.content - processOffersWithPresence() - break - case 'set_coin': - _relatedCoin = event.data.content - break - default: - break - } - }) - - const lessThanThirtyMinsAgo = (timestamp) => { - const THIRTYMINS = 1000 * 60 * 30 - const thirtyMinsAgo = Date.now() - THIRTYMINS - return timestamp > thirtyMinsAgo - } - - const filterOffersUsingTradePresence = (offeringTrade) => { - return offeringTrade.tradePresenceExpiry > Date.now(); - } - - const processOffersWithPresence = () => { - if (offeringTrades === null) return - - async function asyncForEach(array, callback) { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index, array) - } - } - - const startOfferPresenceMapping = async () => { - - if (tradePresenceTxns !== null) { - await asyncForEach(tradePresenceTxns, async (tradePresence) => { - let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === tradePresence.tradeAddress) - offerIndex !== -1 ? (offeringTrades[offerIndex].tradePresenceExpiry = tradePresence.timestamp) : null - }) - } - - let filteredOffers = offeringTrades.filter((offeringTrade) => filterOffersUsingTradePresence(offeringTrade)) - self.postMessage({ type: 'PRESENCE', data: { offers: offeringTrades, filteredOffers: filteredOffers, relatedCoin: _relatedCoin } }) - } - - startOfferPresenceMapping() - } - - const initTradeOffersWebSocket = (restarted = false) => { - let tradeOffersSocketCounter = 0 - let socketTimeout - let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true` - const socket = new WebSocket(socketLink) - socket.onopen = () => { - setTimeout(pingSocket, 50) - tradeOffersSocketCounter += 1 - } - socket.onmessage = (e) => { - e.relatedCoin = _relatedCoin - self.postMessage({ - type: 'TRADE_OFFERS', - data: e.data, - counter: tradeOffersSocketCounter, - isRestarted: restarted, - }) - tradeOffersSocketCounter += 1 - restarted = false - } - socket.onclose = () => { - clearTimeout(socketTimeout) - restartTradeOffersWebSocket() - } - socket.onerror = (e) => { - clearTimeout(socketTimeout) - } - const pingSocket = () => { - socket.send('ping') - socketTimeout = setTimeout(pingSocket, 295000) - } - } - - const initTradeBotWebSocket = (restarted = false) => { - let socketTimeout - let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN` - const socket = new WebSocket(socketLink) - socket.onopen = () => { - setTimeout(pingSocket, 50) - } - socket.onmessage = (e) => { - e.relatedCoin = _relatedCoin - self.postMessage({ - type: 'TRADE_BOT', - data: e.data, - isRestarted: restarted, - }) - restarted = false - } - socket.onclose = () => { - clearTimeout(socketTimeout) - restartTradeBotWebSocket() - } - socket.onerror = (e) => { - clearTimeout(socketTimeout) - } - const pingSocket = () => { - socket.send('ping') - socketTimeout = setTimeout(pingSocket, 295000) - } - } - - const initTradePresenceWebSocket = (restarted = false) => { - let socketTimeout - let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence` - const socket = new WebSocket(socketLink) - socket.onopen = () => { - setTimeout(pingSocket, 50) - } - socket.onmessage = (e) => { - tradePresenceTxns = JSON.parse(e.data) - processOffersWithPresence() - restarted = false - } - socket.onclose = () => { - clearTimeout(socketTimeout) - restartTradePresenceWebSocket() - } - socket.onerror = (e) => { - clearTimeout(socketTimeout) - } - const pingSocket = () => { - socket.send('ping') - socketTimeout = setTimeout(pingSocket, 295000) - } - } - - const restartTradePresenceWebSocket = () => { - setTimeout(() => initTradePresenceWebSocket(true), 50) - } - - const restartTradeOffersWebSocket = () => { - setTimeout(() => initTradeOffersWebSocket(true), 50) - } - - const restartTradeBotWebSocket = () => { - setTimeout(() => initTradeBotWebSocket(true), 50) - } - - initTradeOffersWebSocket() - initTradePresenceWebSocket() - initTradeBotWebSocket() - } - - updateAccountBalance() { - clearTimeout(this.updateAccountBalanceTimeout) - parentEpml.request('apiCall', { - url: `/addresses/balance/${this.selectedAddress.address}?apiKey=${this.getApiKey()}`, - }) - .then((res) => { - this.listedCoins.get("QORTAL").balance = res - this.updateAccountBalanceTimeout = setTimeout(() => this.updateAccountBalance(), 10000) - }) - } - - _checkBuyAmount(e) { - const targetAmount = e.target.value - const target = e.target - - if (targetAmount.length === 0) { - this.isValidAmount = false - this.sellBtnDisable = true - e.target.blur() - e.target.focus() - e.target.invalid = true - } else { - this.buyBtnDisable = false - } - - e.target.blur() - e.target.focus() - - e.target.validityTransform = (newValue, nativeValidity) => { - if (newValue.includes('-') === true) { - this.buyBtnDisable = true - return { - valid: false, - } - } else if (!nativeValidity.valid) { - if (newValue.includes('.') === true) { - let myAmount = newValue.split('.') - if (myAmount[1].length > 8) { - this.buyBtnDisable = true - } else { - this.buyBtnDisable = false - return { - valid: true, - } - } - } - } else { - this.buyBtnDisable = false - } - } - } - - checkTradeBotAmount(e) { - const targetAmount = e.target.value - const target = e.target - this.autoBuyWarning = false - - if (targetAmount.length === 0) { - this.isValidAmount = false - this.autoBuyBtnDisable = true - this.autoBuyWarning = false - e.target.blur() - e.target.focus() - e.target.invalid = true - } else { - const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value - const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value - const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value - const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myFunds) > Number(checkFunds)) { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = false - this.autoBuyWarning = false - } else { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = true - this.autoBuyWarning = true - } - } - - e.target.blur() - e.target.focus() - - e.target.validityTransform = (newValue, nativeValidity) => { - if (newValue.includes('-') === true) { - this.autoBuyBtnDisable = true - this.autoBuyWarning = false - return { - valid: false, - } - } else if (!nativeValidity.valid) { - if (newValue.includes('.') === true) { - let myAmount = newValue.split('.') - if (myAmount[1].length > 8) { - this.autoBuyBtnDisable = true - this.autoBuyWarning = false - } else { - const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value - const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value - const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value - const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myFunds) > Number(checkFunds)) { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = false - this.autoBuyWarning = false - } else { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = true - this.autoBuyWarning = true - } - return { - valid: true, - } - } - } - } else { - const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value - const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value - const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value - const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myFunds) > Number(checkFunds)) { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = false - this.autoBuyWarning = false - } else { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = true - this.autoBuyWarning = true - } - } - } - } - - checkTradeBotTotalAmount(e) { - const targetAmount = e.target.value - const target = e.target - this.autoBuyWarning = false - - if (targetAmount.length === 0) { - this.isValidAmount = false - this.autoBuyBtnDisable = true - this.autoBuyWarning = false - e.target.blur() - e.target.focus() - e.target.invalid = true - } else { - const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value - const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value - const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value - const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myFunds) > Number(checkFunds)) { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = false - this.autoBuyWarning = false - } else { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = true - this.autoBuyWarning = true - } - } - - e.target.blur() - e.target.focus() - - e.target.validityTransform = (newValue, nativeValidity) => { - if (newValue.includes('-') === true) { - this.autoBuyBtnDisable = true - this.autoBuyWarning = false - return { - valid: false, - } - } else if (!nativeValidity.valid) { - if (newValue.includes('.') === true) { - let myAmount = newValue.split('.') - if (myAmount[1].length > 8) { - this.autoBuyBtnDisable = true - this.autoBuyWarning = false - } else { - const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value - const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value - const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value - const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myFunds) > Number(checkFunds)) { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = false - this.autoBuyWarning = false - } else { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = true - this.autoBuyWarning = true - } - return { - valid: true, - } - } - } - } else { - const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value - const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value - const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value - const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) - const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(myFunds) > Number(checkFunds)) { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = false - this.autoBuyWarning = false - } else { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) - this.autoBuyBtnDisable = true - this.autoBuyWarning = true - } - } - } - } - - async tradeFee() { - 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/unitfee?txType=DEPLOY_AT` - await fetch(url).then((response) => { - if (response.ok) { - return response.json() - } - return Promise.reject(response) - }).then((json) => { - this.listedCoins.get("QORTAL").tradeFee = (Number(json) + 100000) / 1e8 - }) - } - - getApiKey() { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + const newRvnTradebookItem = { + botRvnQortAmount: addRvnQortAmount, + botRvnPrice: addRvnPrice + } + + oldRvnTradebook.push(newRvnTradebookItem) + + localStorage.setItem(this.rvnWallet, JSON.stringify(oldRvnTradebook)) + + let rvntradebookstring = get("tradepage.tchange44") + parentEpml.request('showSnackBar', `${rvntradebookstring}`) + + this.closeRVNTradebookDialog() + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") + } + + closeRVNTradebookDialog() { + this.shadowRoot.querySelector('#tradeBotRVNAddDialog').close() + this.clearTradeBotForm() + } + + removeRVNTradebook() { + localStorage.removeItem(this.rvnWallet) + localStorage.setItem(this.rvnWallet, "") + this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.rvnWallet) || "[]") + + this.autoBuyBotDisable = false + + let rvnstring = get("tradepage.tchange41") + parentEpml.request('showSnackBar', `${rvnstring}`) + } + + arrrTradebook() { + if (localStorage.getItem(this.arrrWallet) === null) { + localStorage.setItem(this.arrrWallet, "") + } else { + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") + } + } + + addToARRRTradebook() { + const addBotArrrQortAmount = this.shadowRoot.getElementById('autoBuyARRRQortAmountInput').value + const addBotArrrPrice = this.shadowRoot.getElementById('autoBuyARRRPriceInput').value + const addArrrQortAmount = this.round(parseFloat(addBotArrrQortAmount)) + const addArrrPrice = this.round(parseFloat(addBotArrrPrice)) + + var oldArrrTradebook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") + + const newArrrTradebookItem = { + botArrrQortAmount: addArrrQortAmount, + botArrrPrice: addArrrPrice + } + + oldArrrTradebook.push(newArrrTradebookItem) + + localStorage.setItem(this.arrrWallet, JSON.stringify(oldArrrTradebook)) + + let arrrtradebookstring = get("tradepage.tchange44") + parentEpml.request('showSnackBar', `${arrrtradebookstring}`) + + this.closeARRRTradebookDialog() + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") + } + + closeARRRTradebookDialog() { + this.shadowRoot.querySelector('#tradeBotARRRAddDialog').close() + this.clearTradeBotForm() + } + + removeARRRTradebook() { + localStorage.removeItem(this.arrrWallet) + localStorage.setItem(this.arrrWallet, "") + this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.arrrWallet) || "[]") + + this.autoBuyBotDisable = false + + let arrrstring = get("tradepage.tchange41") + parentEpml.request('showSnackBar', `${arrrstring}`) + } + + async setForeignCoin(coin, beingInitialized) { + let _this = this + this.selectedCoin = coin + + let coinSelectionMenu = this.shadowRoot.getElementById("coinSelectionMenu") + + if (beingInitialized) { + coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').setAttribute('style', 'padding-left: 60px;') + let pairIconContainer = document.createElement("span") + let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() + pairIconContainer.setAttribute("class", "pairIconContainer") + pairIconContainer.setAttribute('style', 'left: 10px;top: 50%;transform: translate(0, -50%);height: 26px;width: 45px;position: absolute;background-repeat: no-repeat;background-size: cover;background-image: url(/img/qort' + pairicon + '.png);') + coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').appendChild(pairIconContainer) + } else { + let pairIconContainer = coinSelectionMenu.shadowRoot.querySelector(".mdc-select--outlined .mdc-select__anchor span.pairIconContainer") + let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() + pairIconContainer.style.backgroundImage = 'url(/img/qort' + pairicon + '.png)' + } + + this.isLoadingOpenTrades = true + this.createConnection() + this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { + const priceString2 = get("tradepage.tchange9") + root.innerHTML = '' + priceString2 + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' + } + this.clearTradeBotForm() + clearTimeout(this.updateDoneTradesTimeout) + await this.getDoneTrades() + this.updateDoneTradesTimeout = setTimeout(() => this.getDoneTrades(), 180000) + await this.updateWalletBalance() + await this.fetchWalletAddress(coin) + + } + + async reRenderOpenFilteredOrders() { + this.requestUpdate() + await this.updateComplete + this.isLoadingOpenTrades = false + } + + async reRenderMyOpenOrders() { + this.requestUpdate() + await this.updateComplete + this.isLoadingMyOpenOrders = false + } + + addAutoBuyAction() { + this.autoBuyWarning = false + this.clearTradeBotForm() + this.shadowRoot.querySelector('#tradeBot' + this.listedCoins.get(this.selectedCoin).coinCode + 'AddDialog').show() + } + + checkTradeBotValues() { + const checkTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value + const checkTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value + const checkTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value + const checkAmount = this.round(parseFloat(checkTradeBotAmountInput)) + const checkPrice = this.round(parseFloat(checkTradeBotPriceInput)) + const checkTotal = this.round(parseFloat(checkTradeBotTotalInput)) + + if (Number(checkAmount) === 0) { + let amountString = get("tradepage.tchange34") + parentEpml.request('showSnackBar', `${amountString}`) + } else if (Number(checkPrice) === 0) { + let priceString = get("tradepage.tchange35") + parentEpml.request('showSnackBar', `${priceString}`) + } else if (Number(checkTotal) === 0) { + let totalString = get("tradepage.tchange35") + parentEpml.request('showSnackBar', `${totalString}`) + } else { + this.showAddToAutoBuyStore() + } + } + + showAddToAutoBuyStore() { + switch (this.listedCoins.get(this.selectedCoin).coinCode) { + case "BTC": + this.addToBTCTradebook() + break + case "LTC": + this.addToLTCTradebook() + break + case "DOGE": + this.addToDOGETradebook() + break + case "DGB": + this.addToDGBTradebook() + break + case "RVN": + this.addToRVNTradebook() + break + case "ARRR": + this.addToARRRTradebook() + break + default: + break + } + } + + processOfferingTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + const offerItem = { + ...offer, + qortAmount: parseFloat(offer.qortAmount), + price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), + } + const addOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.unshift(offerItem) + } + const initOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.push(offerItem) + } + this.listedCoins.get(offer.foreignBlockchain).openOrders.length === 0 ? initOffer() : addOffer() + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + } catch (e) { + console.log("Error adding offer from " + offer.foreignBlockchain) + } + } + + processRedeemedTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'SOLD', + } + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'BOUGHT', + } + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + const addNewHistoricTrade = () => { + this._historicTradesGrid.items.unshift(offer) + this._historicTradesGrid.clearCache() + } + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null + + } + } catch (e) { + console.log("Error processing redeemed trade offer from " + offer.foreignBlockchain) + } + } + + processTradingTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + } + } catch (e) { + console.log("Error processing trading trade offer from " + offer.foreignBlockchain) + } + } + + processRefundedTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + + } + } catch (e) { + console.log("Error processing refunded trade offer from " + offer.foreignBlockchain) + } + } + + processCancelledTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + this._stuckOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._stuckOrdersGrid.items.splice(index, 1) + this._stuckOrdersGrid.clearCache() + } + }) + } + } catch (e) { + console.log("Error processing cancelled trade offer from " + offer.foreignBlockchain) + } + } + + processTradeOffers(offers) { + offers.forEach((offer) => { + if (offer.mode === 'OFFERING') { + this.processOfferingTrade(offer) + } + }) + } + + processTradeBotStates(tradeStates) { + + const BitcoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + const LitecoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + const DogecoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + const DigibyteACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + const RavencoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + const PirateChainACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + switch (this.selectedCoin) { + case 'BITCOIN': + BitcoinACCTv1(tradeStates) + break + case 'LITECOIN': + LitecoinACCTv1(tradeStates) + break + case 'DOGECOIN': + DogecoinACCTv1(tradeStates) + break + case 'DIGIBYTE': + DigibyteACCTv1(tradeStates) + break + case 'RAVENCOIN': + RavencoinACCTv1(tradeStates) + break + case 'PIRATECHAIN': + PirateChainACCTv1(tradeStates) + break + default: + break + } + } + + changeTradeBotState(state, tradeState) { + this.isLoadingMyOpenOrders = true + const stateItem = { + ...state, + _tradeState: tradeState, + } + const item = this._myOrdersGrid.querySelector(`#${state.atAddress}`) + const addStateItem = () => { + this.reRenderMyOpenOrders() + this._myOrdersGrid.items.unshift(stateItem) + this._myOrdersGrid.clearCache() + } + const updateStateItem = () => { + this._myOrdersGrid.items.forEach((item, index) => { + if (item.atAddress === state.atAddress) { + this.reRenderMyOpenOrders() + this._myOrdersGrid.items.splice(index, 1) + this._myOrdersGrid.items.unshift(stateItem) + this._myOrdersGrid.clearCache() + } + }) + } + item ? updateStateItem() : addStateItem() + } + + handleCompletedState(state) { + this._myOrdersGrid.items.forEach((item, index) => { + if (item.atAddress === state.atAddress) { + this.reRenderMyOpenOrders() + this._myOrdersGrid.items.splice(index, 1) + this._myOrdersGrid.clearCache() + } + }) + } + + initSocket() { + let _relatedCoin = "" + let tradePresenceTxns = null + let offeringTrades = null + + self.addEventListener('message', function (event) { + switch (event.data.type) { + case 'open_orders': + offeringTrades = event.data.content + processOffersWithPresence() + break + case 'set_coin': + _relatedCoin = event.data.content + break + default: + break + } + }) + + const lessThanThirtyMinsAgo = (timestamp) => { + const THIRTYMINS = 1000 * 60 * 30 + const thirtyMinsAgo = Date.now() - THIRTYMINS + return timestamp > thirtyMinsAgo + } + + const filterOffersUsingTradePresence = (offeringTrade) => { + return offeringTrade.tradePresenceExpiry > Date.now(); + } + + const processOffersWithPresence = () => { + if (offeringTrades === null) return + + async function asyncForEach(array, callback) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array) + } + } + + const startOfferPresenceMapping = async () => { + + if (tradePresenceTxns !== null) { + await asyncForEach(tradePresenceTxns, async (tradePresence) => { + let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === tradePresence.tradeAddress) + offerIndex !== -1 ? (offeringTrades[offerIndex].tradePresenceExpiry = tradePresence.timestamp) : null + }) + } + + let filteredOffers = offeringTrades.filter((offeringTrade) => filterOffersUsingTradePresence(offeringTrade)) + self.postMessage({ type: 'PRESENCE', data: { offers: offeringTrades, filteredOffers: filteredOffers, relatedCoin: _relatedCoin } }) + } + + startOfferPresenceMapping() + } + + const initTradeOffersWebSocket = (restarted = false) => { + let tradeOffersSocketCounter = 0 + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true` + const socket = new WebSocket(socketLink) + socket.onopen = () => { + setTimeout(pingSocket, 50) + tradeOffersSocketCounter += 1 + } + socket.onmessage = (e) => { + e.relatedCoin = _relatedCoin + self.postMessage({ + type: 'TRADE_OFFERS', + data: e.data, + counter: tradeOffersSocketCounter, + isRestarted: restarted, + }) + tradeOffersSocketCounter += 1 + restarted = false + } + socket.onclose = () => { + clearTimeout(socketTimeout) + restartTradeOffersWebSocket() + } + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + const initTradeBotWebSocket = (restarted = false) => { + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN` + const socket = new WebSocket(socketLink) + socket.onopen = () => { + setTimeout(pingSocket, 50) + } + socket.onmessage = (e) => { + e.relatedCoin = _relatedCoin + self.postMessage({ + type: 'TRADE_BOT', + data: e.data, + isRestarted: restarted, + }) + restarted = false + } + socket.onclose = () => { + clearTimeout(socketTimeout) + restartTradeBotWebSocket() + } + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + const initTradePresenceWebSocket = (restarted = false) => { + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence` + const socket = new WebSocket(socketLink) + socket.onopen = () => { + setTimeout(pingSocket, 50) + } + socket.onmessage = (e) => { + tradePresenceTxns = JSON.parse(e.data) + processOffersWithPresence() + restarted = false + } + socket.onclose = () => { + clearTimeout(socketTimeout) + restartTradePresenceWebSocket() + } + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + const restartTradePresenceWebSocket = () => { + setTimeout(() => initTradePresenceWebSocket(true), 50) + } + + const restartTradeOffersWebSocket = () => { + setTimeout(() => initTradeOffersWebSocket(true), 50) + } + + const restartTradeBotWebSocket = () => { + setTimeout(() => initTradeBotWebSocket(true), 50) + } + + initTradeOffersWebSocket() + initTradePresenceWebSocket() + initTradeBotWebSocket() + } + + updateAccountBalance() { + clearTimeout(this.updateAccountBalanceTimeout) + parentEpml.request('apiCall', { + url: `/addresses/balance/${this.selectedAddress.address}?apiKey=${this.getApiKey()}`, + }) + .then((res) => { + this.listedCoins.get("QORTAL").balance = res + this.updateAccountBalanceTimeout = setTimeout(() => this.updateAccountBalance(), 10000) + }) + } + + _checkBuyAmount(e) { + const targetAmount = e.target.value + const target = e.target + + if (targetAmount.length === 0) { + this.isValidAmount = false + this.sellBtnDisable = true + e.target.blur() + e.target.focus() + e.target.invalid = true + } else { + this.buyBtnDisable = false + } + + e.target.blur() + e.target.focus() + + e.target.validityTransform = (newValue, nativeValidity) => { + if (newValue.includes('-') === true) { + this.buyBtnDisable = true + return { + valid: false, + } + } else if (!nativeValidity.valid) { + if (newValue.includes('.') === true) { + let myAmount = newValue.split('.') + if (myAmount[1].length > 8) { + this.buyBtnDisable = true + } else { + this.buyBtnDisable = false + return { + valid: true, + } + } + } + } else { + this.buyBtnDisable = false + } + } + } + + checkTradeBotAmount(e) { + const targetAmount = e.target.value + const target = e.target + this.autoBuyWarning = false + + if (targetAmount.length === 0) { + this.isValidAmount = false + this.autoBuyBtnDisable = true + this.autoBuyWarning = false + e.target.blur() + e.target.focus() + e.target.invalid = true + } else { + const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value + const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value + const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value + const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myFunds) > Number(checkFunds)) { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = false + this.autoBuyWarning = false + } else { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = true + this.autoBuyWarning = true + } + } + + e.target.blur() + e.target.focus() + + e.target.validityTransform = (newValue, nativeValidity) => { + if (newValue.includes('-') === true) { + this.autoBuyBtnDisable = true + this.autoBuyWarning = false + return { + valid: false, + } + } else if (!nativeValidity.valid) { + if (newValue.includes('.') === true) { + let myAmount = newValue.split('.') + if (myAmount[1].length > 8) { + this.autoBuyBtnDisable = true + this.autoBuyWarning = false + } else { + const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value + const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value + const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value + const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myFunds) > Number(checkFunds)) { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = false + this.autoBuyWarning = false + } else { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = true + this.autoBuyWarning = true + } + return { + valid: true, + } + } + } + } else { + const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value + const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value + const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value + const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myFunds) > Number(checkFunds)) { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = false + this.autoBuyWarning = false + } else { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = true + this.autoBuyWarning = true + } + } + } + } + + checkTradeBotTotalAmount(e) { + const targetAmount = e.target.value + const target = e.target + this.autoBuyWarning = false + + if (targetAmount.length === 0) { + this.isValidAmount = false + this.autoBuyBtnDisable = true + this.autoBuyWarning = false + e.target.blur() + e.target.focus() + e.target.invalid = true + } else { + const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value + const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value + const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value + const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myFunds) > Number(checkFunds)) { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = false + this.autoBuyWarning = false + } else { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = true + this.autoBuyWarning = true + } + } + + e.target.blur() + e.target.focus() + + e.target.validityTransform = (newValue, nativeValidity) => { + if (newValue.includes('-') === true) { + this.autoBuyBtnDisable = true + this.autoBuyWarning = false + return { + valid: false, + } + } else if (!nativeValidity.valid) { + if (newValue.includes('.') === true) { + let myAmount = newValue.split('.') + if (myAmount[1].length > 8) { + this.autoBuyBtnDisable = true + this.autoBuyWarning = false + } else { + const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value + const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value + const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value + const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myFunds) > Number(checkFunds)) { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = false + this.autoBuyWarning = false + } else { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = true + this.autoBuyWarning = true + } + return { + valid: true, + } + } + } + } else { + const buyTradeBotAmountInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value + const buyTradeBotPriceInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value + const buyTradeBotTotalInput = this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value + const checkFunds = this.round(parseFloat(buyTradeBotAmountInput) * parseFloat(buyTradeBotPriceInput)) + const myFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(myFunds) > Number(checkFunds)) { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = false + this.autoBuyWarning = false + } else { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.round(parseFloat(buyTradeBotTotalInput) / parseFloat(buyTradeBotPriceInput)) + this.autoBuyBtnDisable = true + this.autoBuyWarning = true + } + } + } + } + + async tradeFee() { + 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/unitfee?txType=DEPLOY_AT` + await fetch(url).then((response) => { + if (response.ok) { + return response.json() + } + return Promise.reject(response) + }).then((json) => { + this.listedCoins.get("QORTAL").tradeFee = (Number(json) + 100000) / 1e8 + }) + } + + clearTradeBotForm() { + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.initialAmount + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value = this.initialAmount + this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.initialAmount + this.autoBuyBtnDisable = true + } + + inlineWorker(passedFunction, modifiers) { + let parsedFunction = `` + + modifiers.forEach((modifier) => { + let regex = new RegExp(modifier.searchValue, 'g') + parsedFunction = parsedFunction.length === 0 ? `(function ${passedFunction.toString().trim().replace(regex, modifier.replaceValue)})()` : parsedFunction.toString().trim().replace(regex, modifier.replaceValue) + }) + + const workerUrl = URL.createObjectURL(new Blob([parsedFunction], { type: 'text/javascript' })) + const worker = new Worker(workerUrl) + URL.revokeObjectURL(workerUrl) + return worker + } + + clearPaneCache() { + this._openOrdersGrid.clearCache() + this._myOrdersGrid.clearCache() + } + + createConnection() { + if (workers.get(this.selectedCoin).tradesConnectedWorker !== null) { + this.isLoadingHistoricTrades = false + this.isLoadingOpenTrades = false + return + } + + const handleMessage = (message) => { + switch (message.type) { + case 'TRADE_OFFERS': + if (!message.isRestarted) { + this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter = message.counter + this.processTradeOffers(JSON.parse(message.data)) + this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter === 1 ? this.clearPaneCache() : null + workers.get(this.selectedCoin).tradesConnectedWorker.postMessage(this.listedCoins.get(this.selectedCoin).openOrders) + workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "open_orders", content: this.listedCoins.get(this.selectedCoin).openOrders }) + } + return null + case 'TRADE_BOT': + if (!message.isRestarted) this.processTradeBotStates(JSON.parse(message.data)) + return null + case 'PRESENCE': + this.tradesPresenceCleaned = [] + this.listedCoins.get(message.data.relatedCoin).openOrders = message.data.offers + this.tradesPresenceCleaned = message.data.filteredOffers + + const filterPresenceList = () => { + this.blockedTradesList.forEach(item => { + const toDelete = item.recipient + this.tradesPresenceCleaned = this.tradesPresenceCleaned.filter(el => { + return el.qortalCreatorTradeAddress !== toDelete + }) + }) + } + + filterPresenceList() + this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned + this.reRenderOpenFilteredOrders() + return null + default: + break + } + } + + let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + let nodeUrl = myNode.domain + ':' + myNode.port + + const modifiers = [ + { searchValue: 'NODEURL', replaceValue: nodeUrl }, + { searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }, + ] + + workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers) + + workers.get(this.selectedCoin).tradesConnectedWorker.addEventListener('message', function (event) { handleMessage(event.data) }, { passive: true }) + + workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "set_coin", content: this.selectedCoin }) + } + + async getNewBlockedTrades() { + const unconfirmedTransactionsList = async () => { + const myNodeInf = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + const myNodeUrl = myNodeInf.protocol + '://' + myNodeInf.domain + ':' + myNodeInf.port + const unconfirmedTransactionslUrl = `${myNodeUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + + var addBlockedTrades = JSON.parse(localStorage.getItem('failedTrades') || '[]') + + await fetch(unconfirmedTransactionslUrl).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiff = Date.now() - item.timestamp + const timeOneHour = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiff) > Number(timeOneHour)) { + const addBlocked = { + timestamp: item.timestamp, + recipient: item.recipient + } + addBlockedTrades.push(addBlocked) + } + }) + localStorage.setItem("failedTrades", JSON.stringify(addBlockedTrades)) + this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } + + await unconfirmedTransactionsList() + + const filterUnconfirmedTransactionsList = async () => { + let cleanBlockedTrades = this.blockedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } + return newArray + }, []) + localStorage.setItem("failedTrades", JSON.stringify(cleanBlockedTrades)) + this.blockedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") + } + + await filterUnconfirmedTransactionsList() + } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] return myNode.apiKey - } + } - clearTradeBotForm() { - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'QortAmountInput').value = this.initialAmount - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'PriceInput').value = this.initialAmount - this.shadowRoot.getElementById('autoBuy' + this.listedCoins.get(this.selectedCoin).coinCode + 'TotalInput').value = this.initialAmount - this.autoBuyBtnDisable = true - } + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } - isEmptyArray(arr) { - if (!arr) { - return true - } - return arr.length === 0 - } - - round(number) { + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) - } - - inlineWorker(passedFunction, modifiers) { - let parsedFunction = `` - - modifiers.forEach((modifier) => { - let regex = new RegExp(modifier.searchValue, 'g') - parsedFunction = parsedFunction.length === 0 ? `(function ${passedFunction.toString().trim().replace(regex, modifier.replaceValue)})()` : parsedFunction.toString().trim().replace(regex, modifier.replaceValue) - }) - - const workerUrl = URL.createObjectURL(new Blob([parsedFunction], { type: 'text/javascript' })) - const worker = new Worker(workerUrl) - URL.revokeObjectURL(workerUrl) - return worker - } - - clearPaneCache() { - this._openOrdersGrid.clearCache() - this._myOrdersGrid.clearCache() - } - - createConnection() { - if (workers.get(this.selectedCoin).tradesConnectedWorker !== null) { - this.isLoadingHistoricTrades = false - this.isLoadingOpenTrades = false - return - } - - const handleMessage = (message) => { - switch (message.type) { - case 'TRADE_OFFERS': - if (!message.isRestarted) { - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter = message.counter - this.processTradeOffers(JSON.parse(message.data)) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter === 1 ? this.clearPaneCache() : null - workers.get(this.selectedCoin).tradesConnectedWorker.postMessage(this.listedCoins.get(this.selectedCoin).openOrders) - workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "open_orders", content: this.listedCoins.get(this.selectedCoin).openOrders }) - } - return null - case 'TRADE_BOT': - if (!message.isRestarted) this.processTradeBotStates(JSON.parse(message.data)) - return null - case 'PRESENCE': - this.tradesPresenceCleaned = [] - this.listedCoins.get(message.data.relatedCoin).openOrders = message.data.offers - this.tradesPresenceCleaned = message.data.filteredOffers - - const filterPresenceList = () => { - this.blockedTradesList.forEach(item => { - const toDelete = item.recipient - this.tradesPresenceCleaned = this.tradesPresenceCleaned.filter(el => { - return el.qortalCreatorTradeAddress !== toDelete - }) - }) - } - - filterPresenceList() - this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned - this.reRenderOpenFilteredOrders() - return null - default: - break - } - } - - let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - let nodeUrl = myNode.domain + ':' + myNode.port - - const modifiers = [ - { searchValue: 'NODEURL', replaceValue: nodeUrl }, - { searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }, - ] - - workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers) - - workers.get(this.selectedCoin).tradesConnectedWorker.addEventListener('message', function (event) { handleMessage(event.data) }, { passive: true }) - - workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "set_coin", content: this.selectedCoin }) - } - - async getNewBlockedTrades() { - const unconfirmedTransactionsList = async () => { - const myNodeInf = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - const myNodeUrl = myNodeInf.protocol + '://' + myNodeInf.domain + ':' + myNodeInf.port - const unconfirmedTransactionslUrl = `${myNodeUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - - var addBlockedTrades = JSON.parse(localStorage.getItem('failedTrades') || '[]') - - await fetch(unconfirmedTransactionslUrl).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiff = Date.now() - item.timestamp - const timeOneHour = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiff) > Number(timeOneHour)) { - const addBlocked = { - timestamp: item.timestamp, - recipient: item.recipient - } - addBlockedTrades.push(addBlocked) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addBlockedTrades)) - this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') - }) - } - - await unconfirmedTransactionsList() - - const filterUnconfirmedTransactionsList = async () => { - let cleanBlockedTrades = this.blockedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanBlockedTrades)) - this.blockedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } - - await filterUnconfirmedTransactionsList() - } + } } -window.customElements.define('trade-bot-portal', TradeBotPortal) +window.customElements.define('trade-bot-portal', TradeBotPortal) \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/charts/arrr-charts.js b/plugins/plugins/core/trade-portal/charts/arrr-charts.js index 68c0e618..20f16fed 100644 --- a/plugins/plugins/core/trade-portal/charts/arrr-charts.js +++ b/plugins/plugins/core/trade-portal/charts/arrr-charts.js @@ -1,7 +1,6 @@ -import {css, html, LitElement} from 'lit' -import {Epml} from '../../../../epml.js' -import {get, registerTranslateConfig, translate, use} from '../../../../../core/translate' -import '@polymer/paper-dialog/paper-dialog.js' +import { html, LitElement } from 'lit' +import { Epml } from '../../../../epml' +import { highChartStyles } from '../../components/plugins-css' import * as Highcharts from 'highcharts' import Exporting from 'highcharts/modules/exporting' import StockChart from 'highcharts/modules/stock' @@ -11,18 +10,21 @@ import 'highcharts/modules/boost.js' import 'highcharts/modules/data.js' import 'highcharts/modules/export-data.js' import 'highcharts/modules/offline-exporting.js' +import '@polymer/paper-dialog/paper-dialog.js' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + Exporting(Highcharts) StockChart(Highcharts) let arrrChartDialog -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) - class ArrrCharts extends LitElement { static get properties() { return { @@ -33,43 +35,7 @@ class ArrrCharts extends LitElement { } static get styles() { - return css` - .loadingContainer { - height: 100%; - width: 100%; - } - - .trades-chart { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 25px; - padding: 15px; - } - - .chart-container { - margin: auto; - color: var(--black); - text-align: center; - padding: 15px; - height: 30vh; - width: 80vw; - } - - .chart-info-wrapper { - background: transparent; - height: 38vh; - width: 83vw; - overflow: auto; - } - - .chart-loading-wrapper { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - } - ` + return [highChartStyles] } constructor() { @@ -199,6 +165,17 @@ class ArrrCharts extends LitElement { } } + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } @@ -208,5 +185,4 @@ window.customElements.define('arrr-charts', ArrrCharts) const chartsarrr = document.createElement('arrr-charts') arrrChartDialog = document.body.appendChild(chartsarrr) - -export default arrrChartDialog +export default arrrChartDialog \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/charts/btc-charts.js b/plugins/plugins/core/trade-portal/charts/btc-charts.js index 1ec4136c..19f2a121 100644 --- a/plugins/plugins/core/trade-portal/charts/btc-charts.js +++ b/plugins/plugins/core/trade-portal/charts/btc-charts.js @@ -1,7 +1,6 @@ -import {css, html, LitElement} from 'lit' -import {Epml} from '../../../../epml.js' -import {get, registerTranslateConfig, translate, use} from '../../../../../core/translate' -import '@polymer/paper-dialog/paper-dialog.js' +import { html, LitElement } from 'lit' +import { Epml } from '../../../../epml' +import { highChartStyles } from '../../components/plugins-css' import * as Highcharts from 'highcharts' import Exporting from 'highcharts/modules/exporting' import StockChart from 'highcharts/modules/stock' @@ -11,18 +10,21 @@ import 'highcharts/modules/boost.js' import 'highcharts/modules/data.js' import 'highcharts/modules/export-data.js' import 'highcharts/modules/offline-exporting.js' +import '@polymer/paper-dialog/paper-dialog.js' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + Exporting(Highcharts) StockChart(Highcharts) let btcChartDialog -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) - class BtcCharts extends LitElement { static get properties() { return { @@ -33,43 +35,7 @@ class BtcCharts extends LitElement { } static get styles() { - return css` - .loadingContainer { - height: 100%; - width: 100%; - } - - .trades-chart { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 25px; - padding: 15px; - } - - .chart-container { - margin: auto; - color: var(--black); - text-align: center; - padding: 15px; - height: 30vh; - width: 80vw; - } - - .chart-info-wrapper { - background: transparent; - height: 38vh; - width: 83vw; - overflow: auto; - } - - .chart-loading-wrapper { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - } - ` + return [highChartStyles] } constructor() { @@ -200,6 +166,17 @@ class BtcCharts extends LitElement { } } + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } @@ -209,5 +186,4 @@ window.customElements.define('btc-charts', BtcCharts) const chartsbtc = document.createElement('btc-charts') btcChartDialog = document.body.appendChild(chartsbtc) - -export default btcChartDialog +export default btcChartDialog \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/charts/dgb-charts.js b/plugins/plugins/core/trade-portal/charts/dgb-charts.js index a78b51fe..eac814de 100644 --- a/plugins/plugins/core/trade-portal/charts/dgb-charts.js +++ b/plugins/plugins/core/trade-portal/charts/dgb-charts.js @@ -1,7 +1,6 @@ -import {css, html, LitElement} from 'lit' -import {Epml} from '../../../../epml.js' -import {get, registerTranslateConfig, translate, use} from '../../../../../core/translate' -import '@polymer/paper-dialog/paper-dialog.js' +import { html, LitElement } from 'lit' +import { Epml } from '../../../../epml' +import { highChartStyles } from '../../components/plugins-css' import * as Highcharts from 'highcharts' import Exporting from 'highcharts/modules/exporting' import StockChart from 'highcharts/modules/stock' @@ -11,18 +10,21 @@ import 'highcharts/modules/boost.js' import 'highcharts/modules/data.js' import 'highcharts/modules/export-data.js' import 'highcharts/modules/offline-exporting.js' +import '@polymer/paper-dialog/paper-dialog.js' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + Exporting(Highcharts) StockChart(Highcharts) let dgbChartDialog -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) - class DgbCharts extends LitElement { static get properties() { return { @@ -33,43 +35,7 @@ class DgbCharts extends LitElement { } static get styles() { - return css` - .loadingContainer { - height: 100%; - width: 100%; - } - - .trades-chart { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 25px; - padding: 15px; - } - - .chart-container { - margin: auto; - color: var(--black); - text-align: center; - padding: 15px; - height: 30vh; - width: 80vw; - } - - .chart-info-wrapper { - background: transparent; - height: 38vh; - width: 83vw; - overflow: auto; - } - - .chart-loading-wrapper { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - } - ` + return [highChartStyles] } constructor() { @@ -199,6 +165,17 @@ class DgbCharts extends LitElement { } } + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } @@ -208,5 +185,4 @@ window.customElements.define('dgb-charts', DgbCharts) const chartsdgb = document.createElement('dgb-charts') dgbChartDialog = document.body.appendChild(chartsdgb) - -export default dgbChartDialog +export default dgbChartDialog \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/charts/doge-charts.js b/plugins/plugins/core/trade-portal/charts/doge-charts.js index 01f1eecb..da008dcd 100644 --- a/plugins/plugins/core/trade-portal/charts/doge-charts.js +++ b/plugins/plugins/core/trade-portal/charts/doge-charts.js @@ -1,7 +1,6 @@ -import {css, html, LitElement} from 'lit' -import {Epml} from '../../../../epml.js' -import {get, registerTranslateConfig, translate, use} from '../../../../../core/translate' -import '@polymer/paper-dialog/paper-dialog.js' +import { html, LitElement } from 'lit' +import { Epml } from '../../../../epml' +import { highChartStyles } from '../../components/plugins-css' import * as Highcharts from 'highcharts' import Exporting from 'highcharts/modules/exporting' import StockChart from 'highcharts/modules/stock' @@ -11,18 +10,21 @@ import 'highcharts/modules/boost.js' import 'highcharts/modules/data.js' import 'highcharts/modules/export-data.js' import 'highcharts/modules/offline-exporting.js' +import '@polymer/paper-dialog/paper-dialog.js' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + Exporting(Highcharts) StockChart(Highcharts) let dogeChartDialog -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) - class DogeCharts extends LitElement { static get properties() { return { @@ -33,43 +35,7 @@ class DogeCharts extends LitElement { } static get styles() { - return css` - .loadingContainer { - height: 100%; - width: 100%; - } - - .trades-chart { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 25px; - padding: 15px; - } - - .chart-container { - margin: auto; - color: var(--black); - text-align: center; - padding: 15px; - height: 30vh; - width: 80vw; - } - - .chart-info-wrapper { - background: transparent; - height: 38vh; - width: 83vw; - overflow: auto; - } - - .chart-loading-wrapper { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - } - ` + return [highChartStyles] } constructor() { @@ -199,6 +165,17 @@ class DogeCharts extends LitElement { } } + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } @@ -208,5 +185,4 @@ window.customElements.define('doge-charts', DogeCharts) const chartsdoge = document.createElement('doge-charts') dogeChartDialog = document.body.appendChild(chartsdoge) - -export default dogeChartDialog +export default dogeChartDialog \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/charts/ltc-charts.js b/plugins/plugins/core/trade-portal/charts/ltc-charts.js index 6c880abc..23186b62 100644 --- a/plugins/plugins/core/trade-portal/charts/ltc-charts.js +++ b/plugins/plugins/core/trade-portal/charts/ltc-charts.js @@ -1,7 +1,6 @@ -import {css, html, LitElement} from 'lit' -import {Epml} from '../../../../epml.js' -import {get, registerTranslateConfig, translate, use} from '../../../../../core/translate' -import '@polymer/paper-dialog/paper-dialog.js' +import { html, LitElement } from 'lit' +import { Epml } from '../../../../epml' +import { highChartStyles } from '../../components/plugins-css' import * as Highcharts from 'highcharts' import Exporting from 'highcharts/modules/exporting' import StockChart from 'highcharts/modules/stock' @@ -11,18 +10,21 @@ import 'highcharts/modules/boost.js' import 'highcharts/modules/data.js' import 'highcharts/modules/export-data.js' import 'highcharts/modules/offline-exporting.js' +import '@polymer/paper-dialog/paper-dialog.js' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + Exporting(Highcharts) StockChart(Highcharts) let ltcChartDialog -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) - class LtcCharts extends LitElement { static get properties() { return { @@ -33,43 +35,7 @@ class LtcCharts extends LitElement { } static get styles() { - return css` - .loadingContainer { - height: 100%; - width: 100%; - } - - .trades-chart { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 25px; - padding: 15px; - } - - .chart-container { - margin: auto; - color: var(--black); - text-align: center; - padding: 15px; - height: 30vh; - width: 80vw; - } - - .chart-info-wrapper { - background: transparent; - height: 38vh; - width: 83vw; - overflow: auto; - } - - .chart-loading-wrapper { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - } - ` + return [highChartStyles] } constructor() { @@ -199,6 +165,17 @@ class LtcCharts extends LitElement { } } + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } @@ -208,5 +185,4 @@ window.customElements.define('ltc-charts', LtcCharts) const chartsltc = document.createElement('ltc-charts') ltcChartDialog = document.body.appendChild(chartsltc) - -export default ltcChartDialog +export default ltcChartDialog \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/charts/rvn-charts.js b/plugins/plugins/core/trade-portal/charts/rvn-charts.js index c878aece..d8dd4144 100644 --- a/plugins/plugins/core/trade-portal/charts/rvn-charts.js +++ b/plugins/plugins/core/trade-portal/charts/rvn-charts.js @@ -1,7 +1,6 @@ -import {css, html, LitElement} from 'lit' -import {Epml} from '../../../../epml.js' -import {get, registerTranslateConfig, translate, use} from '../../../../../core/translate' -import '@polymer/paper-dialog/paper-dialog.js' +import { html, LitElement } from 'lit' +import { Epml } from '../../../../epml' +import { highChartStyles } from '../../components/plugins-css' import * as Highcharts from 'highcharts' import Exporting from 'highcharts/modules/exporting' import StockChart from 'highcharts/modules/stock' @@ -11,18 +10,21 @@ import 'highcharts/modules/boost.js' import 'highcharts/modules/data.js' import 'highcharts/modules/export-data.js' import 'highcharts/modules/offline-exporting.js' +import '@polymer/paper-dialog/paper-dialog.js' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + Exporting(Highcharts) StockChart(Highcharts) let rvnChartDialog -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) - class RvnCharts extends LitElement { static get properties() { return { @@ -33,43 +35,7 @@ class RvnCharts extends LitElement { } static get styles() { - return css` - .loadingContainer { - height: 100%; - width: 100%; - } - - .trades-chart { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 25px; - padding: 15px; - } - - .chart-container { - margin: auto; - color: var(--black); - text-align: center; - padding: 15px; - height: 30vh; - width: 80vw; - } - - .chart-info-wrapper { - background: transparent; - height: 38vh; - width: 83vw; - overflow: auto; - } - - .chart-loading-wrapper { - color: var(--black); - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - } - ` + return [highChartStyles] } constructor() { @@ -199,6 +165,17 @@ class RvnCharts extends LitElement { } } + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + round(number) { return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) } @@ -208,5 +185,4 @@ window.customElements.define('rvn-charts', RvnCharts) const chartsrvn = document.createElement('rvn-charts') rvnChartDialog = document.body.appendChild(chartsrvn) - -export default rvnChartDialog +export default rvnChartDialog \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/trade-portal-css.js b/plugins/plugins/core/trade-portal/trade-portal-css.js deleted file mode 100644 index 31a4f6f8..00000000 --- a/plugins/plugins/core/trade-portal/trade-portal-css.js +++ /dev/null @@ -1,687 +0,0 @@ -import {css} from 'lit' - -export const tradeStyles = css` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --mdc-theme-error: rgb(255, 89, 89); - --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder); - --mdc-text-field-outlined-hover-border-color: var(--txtfieldhoverborder); - --mdc-text-field-label-ink-color: var(--black); - --mdc-text-field-ink-color: var(--black); - --mdc-select-outlined-idle-border-color: var(--txtfieldborder); - --mdc-select-outlined-hover-border-color: var(--txtfieldhoverborder); - --mdc-select-label-ink-color: var(--black); - --mdc-select-ink-color: var(--black); - --mdc-theme-surface: var(--white); - --mdc-dialog-content-ink-color: var(--black); - --mdc-dialog-shape-radius: 25px; - --paper-input-container-focus-color: var(--mdc-theme-primary); - --lumo-primary-text-color: rgb(0, 167, 245); - --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); - --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1); - --lumo-primary-color: hsl(199, 100%, 48%); - --lumo-base-color: var(--white); - --lumo-body-text-color: var(--black); - --lumo-secondary-text-color: var(--sectxt); - --lumo-contrast-60pct: var(--vdicon); - --_lumo-grid-border-color: var(--border); - --_lumo-grid-secondary-border-color: var(--border2); - } - - .myhover vaadin-grid-cell-content { - cursor: pointer; - } - - .myhover vaadin-grid::part(selected-row) { - color: green; - cursor: pointer; - } - - .myhover vaadin-grid::part(focused-selected-row) { - color: green; - cursor: pointer; - } - - .myhover vaadin-grid::part(cell):hover { - cursor: pointer; - } - - .myhover vaadin-grid::part(row):hover { - color: green; - cursor: pointer; - } - - .myhover vaadin-grid::part(selected-row-cell) { - color: green; - cursor: pointer; - } - - paper-spinner-lite { - height: 30px; - width: 30px; - --paper-spinner-color: var(--mdc-theme-primary); - --paper-spinner-stroke-width: 3px; - } - - mwc-tab-bar { - --mdc-text-transform: none; - --mdc-tab-color-default: var(--black); - --mdc-tab-text-label-color-default: var(--black); - } - - #tabs-1 { - --mdc-tab-height: 42px; - border-left: 1px solid var(--tradeborder); - border-top: 1px solid var(--tradeborder); - border-right: 1px solid var(--tradeborder); - color: var(--black); - } - - #tab-buy[active] { - --mdc-theme-primary: rgba(55, 160, 51, 0.9); - } - - #tabs-1-content { - height: 100%; - padding-bottom: 10px; - } - - #tabs-1-content>div { - height: 100%; - border: 1px solid var(--tradeborder); - } - - #tabs-1-content .card { - border: none; - } - - #tabs-1-content .btn-clear { - --mdc-icon-button-size: 32px; - color: var(--black); - } - - .btn-clear-bot { - --mdc-icon-button-size: 32px; - color: var(--black); - float: right; - } - - .btn-info { - color: #03a9f4; - --mdc-icon-size: 16px; - padding-top: 3px; - } - - #tab-sell[active] { - --mdc-theme-primary: rgb(255, 89, 89); - } - - #trade-portal-page { - background: var(--white); - padding: 12px 24px; - } - - .divCard { - border: 1px solid var(--black); - padding: 1em; - box-shadow: 0 0.3px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 1px -1px rgba(0, 0, 0, 0.12), 0 1px 2px 0 rgba(0, 0, 0, 0.2); - } - - h2 { - margin: 10px 0; - } - - h4 { - margin: 5px 0; - } - - p { - font-size: 14px; - line-height: 21px; - } - - .card-body { - background-color: var(--white); - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - min-height: 100vh; - margin: 0; - } - - .card-container { - background-color: var(--white); - border-radius: 5px; - color: var(--black); - padding-top: 30px; - position: relative; - width: 350px; - max-width: 100%; - text-align: center; - } - - .card-container .level { - color: #ffffff; - background-color: #03a9f4; - border-radius: 3px; - font-size: 14px; - font-weight: bold; - padding: 3px 7px; - position: absolute; - top: 30px; - left: 30px; - } - - .card-container .founder { - color: #ffffff; - background-color: #03a9f4; - border-radius: 3px; - font-size: 14px; - font-weight: bold; - padding: 3px 7px; - position: absolute; - top: 30px; - right: 30px; - } - - .card-container .round { - width: 96px; - height: 96px; - border: 1px solid #03a9f4; - border-radius: 50%; - padding: 2px; - } - - .card-container .badge { - width: 200px; - height: 135px; - border: 1px solid transparent; - border-radius: 10%; - padding: 2px; - } - - .userdata { - background-color: #1F1A36; - text-align: left; - padding: 15px; - margin-top: 30px; - } - - .userdata ul { - list-style-type: none; - margin: 0; - padding: 0; - } - - .userdata ul li { - border: 1px solid #2D2747; - border-radius: 2px; - display: inline-block; - font-size: 12px; - margin: 0 7px 7px 0; - padding: 7px; - } - - h2, - h3, - h4, - h5 { - color: var(--black); - font-weight: 400; - } - - header { - display: flex; - flex: 0 1 auto; - align-items: center; - justify-content: center; - padding: 0px 10px; - font-size: 16px; - color: var(--white); - background-color: var(--tradehead); - border-left: 1px solid var(--tradeborder); - border-top: 1px solid var(--tradeborder); - border-right: 1px solid var(--tradeborder); - min-height: 40px; - } - - p { - margin-bottom: 12px; - } - - #trade-portal { - max-width: 100vw; - margin-left: auto; - margin-right: auto; - } - - .box { - margin: 0; - padding: 0; - display: flex; - flex-flow: column; - height: 100%; - } - - .box-bot { - margin: 0; - padding: 0; - display: flex; - flex-flow: column; - height: 150px; - } - - #first-trade-section { - margin-bottom: 10px; - } - - #first-trade-section>div {} - - #second-trade-section { - margin-bottom: 10px; - } - - #second-trade-section>div {} - - #third-trade-section { - margin-bottom: 10px; - } - - #third-trade-section>div {} - - .trade-chart { - background-color: var(--white); - border: 2px #ddd solid; - text-align: center; - } - - .open-trades { - text-align: center; - } - - .open-market-container { - text-align: center; - } - - .trade-bot-container { - text-align: center; - } - - .no-last-seen { - background: rgb(255, 89, 89); - padding: 9px 1.3px; - border-radius: 50%; - width: 1rem; - margin: 0 auto; - } - - .card { - padding: 1em; - border: 1px var(--tradeborder) solid; - flex: 1 1 auto; - display: flex; - flex-flow: column; - justify-content: space-evenly; - min-height: inherit; - } - - .card-bot { - padding: 1em; - flex: 1 1 auto; - display: flex; - flex-flow: column; - justify-content: space-evenly; - width: 350px; - min-height: inherit; - } - - .cancel { - --mdc-theme-primary: rgb(255, 89, 89); - } - - .border-wrapper { - border: 1px var(--tradeborder) solid; - overflow: hidden; - } - - .amt-text { - color: var(--tradehave); - font-size: 15px; - margin-top: 5px; - margin-bottom: 12px; - } - - .exchange { - color: var(--black); - font-size: 18px; - font-weight: bold; - margin-top: 5px; - margin-bottom: 10px; - } - - .clear-button { - display: inline; - float: right; - margin-bottom: 5px; - } - - .exhcnage-text { - display: inline; - float: left; - margin-bottom: 5px; - } - - .balance-text { - display: inline; - float: right; - margin-bottom: 5px; - } - - .fee-text { - display: inline; - float: left; - margin-bottom: 5px; - } - - .tab-text { - color: var(--tradehave); - font-size: 12px; - text-align: left; - margin-top: 2px; - margin-bottom: -12px; - } - - .historic-trades { - text-align: center; - } - - .my-open-orders { - text-align: center; - } - - .my-historic-trades { - text-align: center; - } - - .buttons { - width: auto !important; - } - - .buy-button { - --mdc-theme-primary: rgba(55, 160, 51, 0.9); - } - - .sell-button { - --mdc-theme-primary: rgb(255, 89, 89); - } - - .trade-bot-button { - margin-top: 20px; - margin-bottom: 20px; - --mdc-theme-primary: rgba(55, 160, 51, 0.9); - } - - .full-width { - background-color: var(--white); - border: 2px var(--black); - height: 200px; - text-align: center; - } - - vaading-grid { - font-size: .8em; - } - - vaadin-grid-column { - flex-grow: 1; - } - - .loadingContainer { - height: 100%; - width: 100%; - } - - .loading, - .loading:after { - border-radius: 50%; - width: 5em; - height: 5em; - } - - .loading { - margin: 10px auto; - border-width: .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; - } - - mwc-select#coinSelectionMenu { - font-size: 24px; - width: 220px; - } - - mwc-select#coinSelectionMenu mwc-list-item { - line-height: 30px; - } - - .coinName::before { - content: ""; - display: inline-block; - height: 26px; - width: 45px; - position: absolute; - background-repeat: no-repeat; - background-size: cover; - left: 10px; - top: 10px; - } - - .btc.coinName:before { - background-image: url('/img/qortbtc.png'); - } - - .ltc.coinName:before { - background-image: url('/img/qortltc.png'); - } - - .doge.coinName:before { - background-image: url('/img/qortdoge.png'); - } - - .dgb.coinName:before { - background-image: url('/img/qortdgb.png'); - } - - .rvn.coinName:before { - background-image: url('/img/qortrvn.png'); - } - - .arrr.coinName:before { - background-image: url('/img/qortarrr.png'); - } - - .coinName { - display: inline-block; - height: 26px; - padding-left: 45px; - } - - .warning-text { - animation: blinker 1.5s linear infinite; - display: inline; - float: left; - margin-bottom: 5px; - color: rgb(255, 89, 89); - } - - .warning-bot-text { - animation: blinker 1.5s linear infinite; - display: inline; - text-align: center; - color: rgb(255, 89, 89); - } - - .red { - --mdc-theme-primary: #F44336; - } - - @-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); - } - } - - @keyframes blinker { - 50% { - opacity: 0; - } - } - - paper-dialog.info { - width: 100%; - max-width: 75vw; - height: 100%; - max-height: 50vh; - background-color: var(--white); - color: var(--black); - border: 1px solid var(--black); - border-radius: 15px; - line-height: 1.6; - overflow-y: auto; - } - - .actions { - display: flex; - justify-content: space-between; - padding: 0 1em; - margin: 12px 0 -6px 0; - } - - .close-icon { - font-size: 36px; - } - - .close-icon:hover { - cursor: pointer; - opacity: .6; - } - - .setpass-wrapper { - width: 100%; - min-width: 400px; - max-width: 450px; - text-align: center; - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - padding: 10px 10px 0px; - box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); - } - - .lock-wrapper { - width: 100%; - height: 100%; - min-width: 600px; - max-width: 600px; - min-height: 400px; - max-height: 400px; - text-align: center; - background: url("/img/qortal-lock.jpg"); - border: 1px solid var(--black); - border-radius: 25px; - padding: 10px 10px 0px; - } - - .text-wrapper { - width: 100%; - height: 100%; - min-width: 280px; - max-width: 280px; - min-height: 64px; - max-height: 64px; - text-align: center; - margin-left: 35px; - margin-top: 125px; - overflow: hidden; - } - - .lock-title-white { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #ffffff; - } - - .lock-title-red { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #df3636; - } - - @media (min-width: 701px) { - * {} - - #trade-portal {} - - #first-trade-section { - display: grid; - grid-template-columns: 1fr 1fr 2fr; - grid-auto-rows: max(450px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - - #second-trade-section { - display: grid; - grid-template-columns: 2fr 1fr; - grid-auto-rows: max(450px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - - #third-trade-section { - display: grid; - grid-template-columns: 1fr 2fr 1fr; - grid-auto-rows: max(200px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - } -` \ No newline at end of file diff --git a/plugins/plugins/core/trade-portal/trade-portal.src.js b/plugins/plugins/core/trade-portal/trade-portal.src.js index a8405c55..d122b0df 100644 --- a/plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/plugins/plugins/core/trade-portal/trade-portal.src.js @@ -1,11 +1,18 @@ -import {html, LitElement} from 'lit' -import {render} from 'lit/html.js' -import {Epml} from '../../../epml.js' +import { html, LitElement } from 'lit' +import { render } from 'lit/html.js' +import { Epml } from '../../../epml' +import { decryptData, encryptData } from '../../../../core/src/lockScreen' +import { tradePortalStyles } from '../components/plugins-css' import isElectron from 'is-electron' -import {get, registerTranslateConfig, translate, use} from '../../../../core/translate' -import Base58 from '../../../../crypto/api/deps/Base58.js' -import {decryptData, encryptData} from '../../../../core/src/lockScreen.js' -import {tradeStyles} from './trade-portal-css.js' +import chartsbtc from './charts/btc-charts' +import chartsltc from './charts/ltc-charts' +import chartsdoge from './charts/doge-charts' +import chartsdgb from './charts/dgb-charts' +import chartsrvn from './charts/rvn-charts' +import chartsarrr from './charts/arrr-charts' +import Base58 from '../../../../crypto/api/deps/Base58' +import '../components/TradeInfoView' +import '../components/TraderInfoView' import '@material/mwc-button' import '@material/mwc-textfield' import '@material/mwc-icon' @@ -23,17 +30,11 @@ import '@polymer/paper-spinner/paper-spinner-lite.js' import '@vaadin/grid' import '@vaadin/grid/vaadin-grid-sorter' import '@vaadin/password-field' -import chartsbtc from './charts/btc-charts.js' -import chartsltc from './charts/ltc-charts.js' -import chartsdoge from './charts/doge-charts.js' -import chartsdgb from './charts/dgb-charts.js' -import chartsrvn from './charts/rvn-charts.js' -import chartsarrr from './charts/arrr-charts.js' -import '../components/TraderInfoView.js' -import '../components/TradeInfoView.js' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -41,2205 +42,2221 @@ const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) let workers = new Map() class TradePortal extends LitElement { - static get properties() { - return { - selectedAddress: { type: Object }, - config: { type: Object }, - listedCoins: { type: Map }, - nodeInfo: { type: Array }, - blockedTradesList: { type: Array }, - tradesPresenceCleaned: { type: Array }, - sellBtnDisable: { type: Boolean }, - isSellLoading: { type: Boolean }, - isBuyLoading: { type: Boolean }, - buyBtnDisable: { type: Boolean }, - autoBuyWarning: { type: Boolean }, - autoBuyBtnDisable: { type: Boolean }, - autoBuyBotDisable: { type: Boolean }, - initialAmount: { type: Number }, - cancelBtnDisable: { type: Boolean }, - cancelStuckOfferBtnDisable: { type: Boolean }, - selectedCoin: { type: String }, - isLoadingHistoricTrades: { type: Boolean }, - isLoadingOpenTrades: { type: Boolean }, - isLoadingMyOpenOrders: { type: Boolean }, - showGetWalletBance: { type: Boolean }, - theme: { type: String, reflect: true }, - btcWallet: { type: String }, - ltcWallet: { type: String }, - dogeWallet: { type: String }, - dgbWallet: { type: String }, - rvnWallet: { type: String }, - arrrWallet: { type: String }, - arrrWalletAddress: { type: String }, - qortbtc: { type: Number }, - qortltc: { type: Number }, - qortdoge: { type: Number }, - qortdgb: { type: Number }, - qortrvn: { type: Number }, - qortarrr: { type: Number }, - btcqort: { type: Number }, - ltcqort: { type: Number }, - dogeqort: { type: Number }, - dgbqort: { type: Number }, - rvnqort: { type: Number }, - arrrqort: { type: Number }, - qortRatio: {type: Number}, - tradeSalt: { type: String }, - tradeStorageData: { type: String }, - tradeLockScreenPass: { type: String }, - tradeLockScreenSet: { type: String }, - tradeLockPass: { type: String }, - tradeLockSet: { type: String }, - myTradeLockScreenPass: { type: String }, - myTradeLockScreenSet: { type: String }, - tradeHelperMessage: { type: String } - } - } + static get properties() { + return { + selectedAddress: { type: Object }, + config: { type: Object }, + listedCoins: { type: Map }, + nodeInfo: { type: Array }, + blockedTradesList: { type: Array }, + tradesPresenceCleaned: { type: Array }, + sellBtnDisable: { type: Boolean }, + isSellLoading: { type: Boolean }, + isBuyLoading: { type: Boolean }, + buyBtnDisable: { type: Boolean }, + autoBuyWarning: { type: Boolean }, + autoBuyBtnDisable: { type: Boolean }, + autoBuyBotDisable: { type: Boolean }, + initialAmount: { type: Number }, + cancelBtnDisable: { type: Boolean }, + cancelStuckOfferBtnDisable: { type: Boolean }, + selectedCoin: { type: String }, + isLoadingHistoricTrades: { type: Boolean }, + isLoadingOpenTrades: { type: Boolean }, + isLoadingMyOpenOrders: { type: Boolean }, + showGetWalletBance: { type: Boolean }, + theme: { type: String, reflect: true }, + btcWallet: { type: String }, + ltcWallet: { type: String }, + dogeWallet: { type: String }, + dgbWallet: { type: String }, + rvnWallet: { type: String }, + arrrWallet: { type: String }, + arrrWalletAddress: { type: String }, + qortbtc: { type: Number }, + qortltc: { type: Number }, + qortdoge: { type: Number }, + qortdgb: { type: Number }, + qortrvn: { type: Number }, + qortarrr: { type: Number }, + btcqort: { type: Number }, + ltcqort: { type: Number }, + dogeqort: { type: Number }, + dgbqort: { type: Number }, + rvnqort: { type: Number }, + arrrqort: { type: Number }, + qortRatio: { type: Number }, + tradeSalt: { type: String }, + tradeStorageData: { type: String }, + tradeLockScreenPass: { type: String }, + tradeLockScreenSet: { type: String }, + tradeLockPass: { type: String }, + tradeLockSet: { type: String }, + myTradeLockScreenPass: { type: String }, + myTradeLockScreenSet: { type: String }, + tradeHelperMessage: { type: String } + } + } - static get styles() { - return [tradeStyles] - } + static get styles() { + return [tradePortalStyles] + } - constructor() { - super() - let qortal = { - name: "QORTAL", - balance: "0", - coinCode: "QORT", - coinAmount: this.amountString, - tradeFee: "0.02" - } + constructor() { + super() + let qortal = { + name: "QORTAL", + balance: "0", + coinCode: "QORT", + coinAmount: this.amountString, + tradeFee: "0.02" + } - let bitcoin = { - name: "BITCOIN", - balance: "0", - coinCode: "BTC", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.0001" - } + let bitcoin = { + name: "BITCOIN", + balance: "0", + coinCode: "BTC", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.0001" + } - let litecoin = { - name: "LITECOIN", - balance: "0", - coinCode: "LTC", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.00005" - } + let litecoin = { + name: "LITECOIN", + balance: "0", + coinCode: "LTC", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.00005" + } - let dogecoin = { - name: "DOGECOIN", - balance: "0", - coinCode: "DOGE", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.005" - } + let dogecoin = { + name: "DOGECOIN", + balance: "0", + coinCode: "DOGE", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.005" + } - let digibyte = { - name: "DIGIBYTE", - balance: "0", - coinCode: "DGB", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.0005" - } + let digibyte = { + name: "DIGIBYTE", + balance: "0", + coinCode: "DGB", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.0005" + } - let ravencoin = { - name: "RAVENCOIN", - balance: "0", - coinCode: "RVN", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.006" - } + let ravencoin = { + name: "RAVENCOIN", + balance: "0", + coinCode: "RVN", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.006" + } - let piratechain = { - name: "PIRATECHAIN", - balance: "0", - coinCode: "ARRR", - openOrders: [], - openFilteredOrders: [], - historicTrades: [], - myOrders: [], - myHistoricTrades: [], - myOfferingOrders: [], - openTradeOrders: null, - tradeOffersSocketCounter: 1, - coinAmount: this.amountString, - tradeFee: "~0.0002" - } + let piratechain = { + name: "PIRATECHAIN", + balance: "0", + coinCode: "ARRR", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.0002" + } - this.listedCoins = new Map() - this.listedCoins.set("QORTAL", qortal) - this.listedCoins.set("BITCOIN", bitcoin) - this.listedCoins.set("LITECOIN", litecoin) - this.listedCoins.set("DOGECOIN", dogecoin) - this.listedCoins.set("DIGIBYTE", digibyte) - this.listedCoins.set("RAVENCOIN", ravencoin) - this.listedCoins.set("PIRATECHAIN", piratechain) + this.listedCoins = new Map() + this.listedCoins.set("QORTAL", qortal) + this.listedCoins.set("BITCOIN", bitcoin) + this.listedCoins.set("LITECOIN", litecoin) + this.listedCoins.set("DOGECOIN", dogecoin) + this.listedCoins.set("DIGIBYTE", digibyte) + this.listedCoins.set("RAVENCOIN", ravencoin) + this.listedCoins.set("PIRATECHAIN", piratechain) - workers.set("QORTAL", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("QORTAL", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("BITCOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("BITCOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("LITECOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("LITECOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("DOGECOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("DOGECOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("DIGIBYTE", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("DIGIBYTE", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("RAVENCOIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("RAVENCOIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - workers.set("PIRATECHAIN", { - tradesConnectedWorker: null, - handleStuckTradesConnectedWorker: null - }) + workers.set("PIRATECHAIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) - this.selectedCoin = "LITECOIN" - this.selectedAddress = {} - this.nodeInfo = [] - this.blockedTradesList = [] - this.preparedPresence = [] - this.tradesPresenceCleaned = [] - this.config = {} - this.sellBtnDisable = false - this.isSellLoading = false - this.buyBtnDisable = true - this.autoBuyWarning = false - this.autoBuyBtnDisable = true - this.autoBuyBotDisable = false - this.isBuyLoading = false - this.initialAmount = 0 - this.cancelBtnDisable = false - this.cancelStuckOfferBtnDisable = false - this.isLoadingHistoricTrades = true - this.isLoadingOpenTrades = true - this.isLoadingMyOpenOrders = false - this.showGetWalletBance = true - this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' - this.btcWallet = '' - this.ltcWallet = '' - this.dogeWallet = '' - this.dgbWallet = '' - this.rvnWallet = '' - this.arrrWallet = '' - this.arrrWalletAddress = '' - this.qortbtc = 0 - this.qortltc = 0 - this.qortdoge = 0 - this.qortdgb = 0 - this.qortrvn = 0 - this.qortarrr = 0 - this.btcqort = 0 - this.ltcqort = 0 - this.dogeqort = 0 - this.dgbqort = 0 - this.rvnqort = 0 - this.arrrqort = 0 - this.tradeInfoAccountName = '' - this.tradeImageUrl = '' - this.tradeAddressResult = [] - this.displayTradeAddress = '' - this.displayTradeLevel = '' - this.displayTradeBalance = '' - this.tradeSalt = '' - this.tradeStorageData = '' - this.tradeLockScreenPass = '' - this.tradeLockScreenSet = '' - this.tradeLockPass = '' - this.tradeLockSet = '' - this.myTradeLockScreenPass = '' - this.myTradeLockScreenSet = '' - this.tradeHelperMessage = '' - this.pingCoinBalancesController = this.pingCoinBalancesController.bind(this) - } + this.selectedCoin = "LITECOIN" + this.selectedAddress = {} + this.nodeInfo = [] + this.blockedTradesList = [] + this.preparedPresence = [] + this.tradesPresenceCleaned = [] + this.config = {} + this.sellBtnDisable = false + this.isSellLoading = false + this.buyBtnDisable = true + this.autoBuyWarning = false + this.autoBuyBtnDisable = true + this.autoBuyBotDisable = false + this.isBuyLoading = false + this.initialAmount = 0 + this.cancelBtnDisable = false + this.cancelStuckOfferBtnDisable = false + this.isLoadingHistoricTrades = true + this.isLoadingOpenTrades = true + this.isLoadingMyOpenOrders = false + this.showGetWalletBance = true + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + this.btcWallet = '' + this.ltcWallet = '' + this.dogeWallet = '' + this.dgbWallet = '' + this.rvnWallet = '' + this.arrrWallet = '' + this.arrrWalletAddress = '' + this.qortbtc = 0 + this.qortltc = 0 + this.qortdoge = 0 + this.qortdgb = 0 + this.qortrvn = 0 + this.qortarrr = 0 + this.btcqort = 0 + this.ltcqort = 0 + this.dogeqort = 0 + this.dgbqort = 0 + this.rvnqort = 0 + this.arrrqort = 0 + this.tradeInfoAccountName = '' + this.tradeImageUrl = '' + this.tradeAddressResult = [] + this.displayTradeAddress = '' + this.displayTradeLevel = '' + this.displayTradeBalance = '' + this.tradeSalt = '' + this.tradeStorageData = '' + this.tradeLockScreenPass = '' + this.tradeLockScreenSet = '' + this.tradeLockPass = '' + this.tradeLockSet = '' + this.myTradeLockScreenPass = '' + this.myTradeLockScreenSet = '' + this.tradeHelperMessage = '' + this.pingCoinBalancesController = this.pingCoinBalancesController.bind(this) + } - historicTradesTemplate() { - return html` -
    -
    -
    ${translate("tradepage.tchange3")}
    -
    -
    ${translate("login.loading")}
    - - { - render(html`${data.item.qortAmount}`, root) - }} - > - - { - const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) - render(html`${price}`, root) - }} - > - - { - render(html`${data.item.foreignAmount}`, root) - }} - > - - + render() { + return html` +
    +
    +

    Qortal ${translate("tradepage.tchange1")} -  

    + + QORT / LTC + QORT / BTC + QORT / DOGE + QORT / DGB + QORT / RVN + QORT / ARRR + +
    + this.shadowRoot.getElementById('tradeInfoDialog').open()}> +
    +
    + ${this.chartShowCoin()} +
    +
    + ${this.renderTradeLockButton()} +
    +
    +
    +
    + ${this.historicTradesTemplate()} + ${this.myHistoricTradesTemplate()} + ${this.openTradesTemplate()} +
    +
    + ${this.myOpenOrdersTemplate()} + ${this.openMarketTemplate()} +
    +
    +
    +
    +

    ${translate("tradepage.tchange33")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange40")}

    +

    1 QORT = ${this.exchangeRateQort()} ${this.listedCoins.get(this.selectedCoin).coinCode}

    + this.setDefaultSellPrice()}> +
    +
    +
    -
    - ` - } - - openTradesTemplate() { - return html` -
    -
    -
    ${translate("tradepage.tchange5")}
    -
    -
    ${translate("login.loading")}
    - - { - render(html`${this.round(data.item.qortAmount)}`, root) - }} - > - - { - render(html`${this.round(data.item.price)}`, root) - }} - > - - { - render(html`${data.item.foreignAmount}`, root) - }} - > - - { - render(html`${data.item.qortalCreator}`, root) - }} - > - - { - render(html`info`, root) - }} - > - + + +
    +

    ${translate("tradepage.tchange7")}

    +
    +
    +
    + + + + + { render(html`${this.renderCancelStuckOfferButton(data.item)}`, root) }}>
    -
    -
    - ` - } + ${translate("general.close")} + + +
    +

    + this.shadowRoot.getElementById('tradeInfoDialog').close()} title="${translate("info.inf2")}">highlight_off +
    +
    +

    ${translate("info.inf1")}

    +

    ${translate("info.inf3")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("info.inf4")}

    +

    ${translate("info.inf5")} ${this.listedCoins.get(this.selectedCoin).coinCode}

    +

    ${translate("info.inf6")}

    +
    +
    + +
    +

    Qortal ${translate("tabmenu.tm4")} ${translate("login.lp1")}

    +
    +
    +
    +

    ${translate("login.lp2")}

    +

    ${translate("login.lp3")}

    +
    +
    + password + +
    +
    + password + +
    +
    + ${translate("login.lp4")} + ${translate("login.lp5")} +
    +
    + +
    +

    Qortal ${translate("tabmenu.tm4")} ${translate("login.lp1")}

    +
    +
    +
    +

    ${translate("login.lessthen8")}

    +
    +
    + ${translate("login.lp4")} + ${translate("login.lp5")} +
    +
    + +
    + ${translate("sidemenu.tradeportal")}
    + ${translate("login.lp9")} + ${translate("login.lp10")} +
    +
    + password + +
    + ${this.tradeHelperMessage} +
    +
    +
    +
    + +
    +
    + + + ` + } - openMarketTemplate() { - return html` -
    -
    - - - - - -
    -
    -
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} - ${translate("walletpage.wchange12")}: ${this.listedCoins.get(this.selectedCoin).tradeFee} ${this.listedCoins.get(this.selectedCoin).coinCode} - -
    -
    - - ${this.isBuyLoading === false ? html`${translate("tradepage.tchange18")}` : html``} - + async firstUpdated() { + let _this = this + + this.changeTheme() + this.changeLanguage() + + this.tradeFee() + this.getNewBlockedTrades() + + this.tradeHelperMessage = this.renderTradeHelperPass() + + this.tradeSalt = '' + this.tradeSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) + + this.tradeStorageData = '' + this.tradeStorageData = window.parent.reduxStore.getState().app.selectedAddress.address + + this.tradeLockScreenPass = '' + this.tradeLockScreenPass = 'tradeLockScreenPass-' + this.tradeStorageData + + this.tradeLockScreenSet = '' + this.tradeLockScreenSet = 'tradeLockScreenSet-' + this.tradeStorageData + + this.tradeLockPass = '' + this.tradeLockPass = encryptData(false, this.tradeSalt) + + this.tradeLockSet = '' + this.tradeLockSet = encryptData(false, this.tradeSalt) + + if (localStorage.getItem(this.tradeLockScreenPass) === null && localStorage.getItem(this.tradeLockScreenSet) === null) { + localStorage.setItem(this.tradeLockScreenPass, this.tradeLockPass) + localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) + this.myTradeLockScreenPass = '' + this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + } else { + this.myTradeLockScreenPass = '' + this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + } + + if (this.myTradeLockScreenSet === true) { + this.shadowRoot.getElementById('tradeLockScreenActive').open() + } + + this.updateWalletBalance() + this.fetchWalletAddress(this.selectedCoin) + this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + + setTimeout(() => { + this.displayTabContent('buy') + }, 0) + + this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid') + + this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { + const priceString = get("tradepage.tchange9") + root.innerHTML = '' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' + } + + this._openOrdersGrid.querySelector('#qortAmountColumn').headerRenderer = function (root) { + const amountString = get("tradepage.tchange8") + root.innerHTML = '' + amountString + ' (QORT)' + } + + this._myOrdersGrid = this.shadowRoot.getElementById('myOrdersGrid') + this._historicTradesGrid = this.shadowRoot.getElementById('historicTradesGrid') + this._myHistoricTradesGrid = this.shadowRoot.getElementById('myHistoricTradesGrid') + this._stuckOrdersGrid = this.shadowRoot.getElementById('stuckOrdersGrid') + + const getNodeInfo = () => { + parentEpml.request("apiCall", { url: `/admin/status` }).then((res) => { + this.nodeInfo = res + getSellButtonStatus() + }) + setTimeout(getNodeInfo, 30000) + } + + const getSellButtonStatus = () => { + if (this.nodeInfo.isSynchronizing === true) { + this.sellBtnDisable = true + } else this.sellBtnDisable = this.nodeInfo.isSynchronizing !== false; + } + + const getQortBtcPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/BITCOIN?inverse=true` }).then((res) => { + this.qortbtc = (Number(res) / 1e8).toFixed(8) + }) + setTimeout(getQortBtcPrice, 300000) + } + + const getQortLtcPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/LITECOIN?inverse=true` }).then((res) => { + this.qortltc = (Number(res) / 1e8).toFixed(8) + }) + setTimeout(getQortLtcPrice, 300000) + } + + const getQortDogePrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/DOGECOIN?inverse=true` }).then((res) => { + this.qortdoge = (Number(res) / 1e8).toFixed(8) + }) + setTimeout(getQortDogePrice, 300000) + } + + const getQortDgbPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/DIGIBYTE?inverse=true` }).then((res) => { + this.qortdgb = (Number(res) / 1e8).toFixed(8) + }) + setTimeout(getQortDgbPrice, 300000) + } + + const getQortRvnPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/RAVENCOIN?inverse=true` }).then((res) => { + this.qortrvn = (Number(res) / 1e8).toFixed(8) + }) + setTimeout(getQortRvnPrice, 300000) + } + + const getQortArrrPrice = () => { + parentEpml.request("apiCall", { url: `/crosschain/price/PIRATECHAIN?inverse=true` }).then((res) => { + this.qortarrr = (Number(res) / 1e8).toFixed(8) + }) + setTimeout(getQortArrrPrice, 300000) + } + + window.addEventListener('storage', () => { + this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + const checkLanguage = localStorage.getItem('qortalLanguage') + const checkTheme = localStorage.getItem('qortalTheme') + + use(checkLanguage) + + this.theme = (checkTheme === 'dark') ? 'dark' : 'light' + document.querySelector('html').setAttribute('theme', this.theme) + }) + + if (!isElectron()) { + } else { + window.addEventListener('contextmenu', (event) => { + event.preventDefault() + window.parent.electronAPI.showMyMenu() + }) + } + + this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address + this.ltcWallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address + this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address + this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address + this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address + this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address + + let configLoaded = false + + parentEpml.ready().then(() => { + parentEpml.subscribe('selected_address', async (selectedAddress) => { + this.selectedAddress = {} + selectedAddress = JSON.parse(selectedAddress) + if (!selectedAddress || Object.entries(selectedAddress).length === 0) return + this.selectedAddress = selectedAddress + + this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address + this.ltcWallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address + this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address + this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address + this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address + this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address + this.updateAccountBalance() + }) + + parentEpml.subscribe('config', (c) => { + if (!configLoaded) { + setTimeout(getNodeInfo, 1) + setTimeout(getQortBtcPrice, 1) + setTimeout(getQortLtcPrice, 1) + setTimeout(getQortDogePrice, 1) + setTimeout(getQortDgbPrice, 1) + setTimeout(getQortRvnPrice, 1) + setTimeout(getQortArrrPrice, 1) + configLoaded = true + } + this.config = JSON.parse(c) + }) + + parentEpml.subscribe('coin_balances', async (payload) => { + const coinBalances = JSON.parse(payload) + let coin = '' + switch (this.selectedCoin) { + case 'BITCOIN': + coin = 'btc' + break + case 'LITECOIN': + coin = 'ltc' + break + case 'DOGECOIN': + coin = 'doge' + break + case 'DIGIBYTE': + coin = 'dgb' + break + case 'RAVENCOIN': + coin = 'rvn' + break + case 'PIRATECHAIN': + coin = 'arrr' + break + default: + break + } + if (coinBalances[coin]) { + const res = coinBalances[coin].fullValue + let value = (Number(res) / 1e8).toFixed(8) + if (coin !== 'qort') { + value = (Number(res) / 1e8).toFixed(8) + } + this.listedCoins.get(this.selectedCoin).balance = value + this.requestUpdate() + } + }) + + let coinSelectionMenu = this.shadowRoot.getElementById("coinSelectionMenu") + + coinSelectionMenu.addEventListener('change', function () { + _this.setForeignCoin(coinSelectionMenu.value, false) + }) + + _this.setForeignCoin(coinSelectionMenu.value, true) + }) + + parentEpml.imReady() + + setTimeout(() => this.shadowRoot.querySelector('[slot="vaadin-grid-cell-content-3"]').setAttribute('title', 'Last Seen'), 3000) + + this.clearConsole() + + setInterval(() => { + this.clearConsole() + }, 60000) + + setInterval(() => { + this.getNewBlockedTrades() + }, 150000) + } + + historicTradesTemplate() { + return html` +
    +
    +
    ${translate("tradepage.tchange3")}
    +
    +
    +
    + ${translate("login.loading")} +
    + + { + render(html`${data.item.qortAmount}`, root) + }} + > + + { + const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) + render(html`${price}`, root) + }} + > + + { + render(html`${data.item.foreignAmount}`, root) + }} + > + + +
    +
    +
    + ` + } + + openTradesTemplate() { + return html` +
    +
    +
    ${translate("tradepage.tchange5")}
    +
    +
    +
    + ${translate("login.loading")} +
    + + { + render(html`${this.round(data.item.qortAmount)}`, root) + }} + > + + { + render(html`${this.round(data.item.price)}`, root) + }} + > + + { + render(html`${data.item.foreignAmount}`, root) + }} + > + + { + render(html`${data.item.qortalCreator}`, root) + }} + > + + { + render(html` + + info + + `, root) + }} + > + + +
    +
    +
    + ` + } + + openMarketTemplate() { + return html` +
    +
    + + + + +
    +
    +
    +
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + ${translate("walletpage.wchange12")}: ${this.listedCoins.get(this.selectedCoin).tradeFee} ${this.listedCoins.get(this.selectedCoin).coinCode} + +
    +
    + + ${this.isBuyLoading === false ? html`${translate("tradepage.tchange18")}` : html` + + `} + +
    -
    -
    -
    -
    - -
    - ${translate("tradepage.tchange8")} (QORT)* -

    - - -

    - ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* -

    - - -

    - - ${translate("tradepage.tchange16")}: ${this.listedCoins.get("QORTAL").balance} QORT - ${translate("walletpage.wchange12")}: ${this.listedCoins.get("QORTAL").tradeFee} QORT - -
    -
    - - ${this.isSellLoading === false ? html`${translate("tradepage.tchange19")}` : html``} - +
    +
    +
    + +
    + ${translate("tradepage.tchange8")} (QORT)* +

    + + +

    + ${translate("tradepage.tchange14")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + ${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})* +

    + + +

    + + ${translate("tradepage.tchange16")}: ${this.listedCoins.get("QORTAL").balance} QORT + ${translate("walletpage.wchange12")}: ${this.listedCoins.get("QORTAL").tradeFee} QORT + +
    +
    + + ${this.isSellLoading === false ? html`${translate("tradepage.tchange19")}` : html` + + `} + +
    -
    - ` - } + ` + } - myOpenOrdersTemplate() { - return html` -
    -
    -
    ${translate("tradepage.tchange6")} this.showStuckOrdersDialog()}>
    -
    -
    ${translate("login.loading")}
    - - { - const dateString = new Date(data.item.timestamp).toLocaleString() - render(html`${dateString}`, root) - }} - > - - { - render(html` ${data.item._tradeState} `, root) - }} - > - - { - const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) - render(html`${price}`, root) - }} - > - - - - - - { - render(html`${this.renderCancelButton(data.item)}`, root) - }} - > - - -
    -
    -
    - ` - } - - myHistoricTradesTemplate() { - return html` -
    -
    -
    ${translate("tradepage.tchange4")}
    -
    - - { - const dateString = new Date(data.item.timestamp).toLocaleString() - render(html`${dateString}`, root) - }} - > - - { - if (data.item.mode === 'SOLD') return render(html` ${translate("tradepage.tchange31")} `, root) - if (data.item.mode === 'BOUGHT') return render(html` ${translate("tradepage.tchange32")} `, root) - return render(html` ${data.item.mode} `, root) - }} - > - - { - const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) - render(html`${price}`, root) - }} - > - - - - { - render(html` ${data.item.foreignAmount} `, root) - }} - > - - -
    -
    -
    - ` - } - - render() { - return html` -
    -
    -

    Qortal ${translate("tradepage.tchange1")} -  

    - - QORT / LTC - QORT / BTC - QORT / DOGE - QORT / DGB - QORT / RVN - QORT / ARRR - -
    - this.shadowRoot.getElementById('tradeInfoDialog').open()}> -
    -
    - ${this.chartShowCoin()} -
    -
    - ${this.renderTradeLockButton()} -
    - -
    -
    -
    - ${this.historicTradesTemplate()} - ${this.myHistoricTradesTemplate()} - ${this.openTradesTemplate()} -
    -
    - ${this.myOpenOrdersTemplate()} - ${this.openMarketTemplate()} -
    -
    -
    -
    -

    ${translate("tradepage.tchange33")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("tradepage.tchange40")}

    -

    1 QORT = ${this.exchangeRateQort()} ${this.listedCoins.get(this.selectedCoin).coinCode}

    - this.setDefaultSellPrice()}> + myOpenOrdersTemplate() { + return html` +
    +
    +
    ${translate("tradepage.tchange6")} this.showStuckOrdersDialog()}>
    +
    +
    +
    + ${translate("login.loading")} +
    + + { + const dateString = new Date(data.item.timestamp).toLocaleString() + render(html`${dateString}`, root) + }} + > + + { + render(html` ${data.item._tradeState} `, root) + }} + > + + { + const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) + render(html`${price}`, root) + }} + > + + + + + + { + render(html`${this.renderCancelButton(data.item)}`, root) + }} + > + +
    -
    -
    - - -
    -

    ${translate("tradepage.tchange7")}

    -
    + ` + } + + myHistoricTradesTemplate() { + return html` +
    +
    +
    ${translate("tradepage.tchange4")}
    +
    + + { + const dateString = new Date(data.item.timestamp).toLocaleString() + render(html`${dateString}`, root) + }} + > + + { + if (data.item.mode === 'SOLD') return render(html` ${translate("tradepage.tchange31")} `, root) + if (data.item.mode === 'BOUGHT') return render(html` ${translate("tradepage.tchange32")} `, root) + return render(html` ${data.item.mode} `, root) + }} + > + + { + const price = this.round(parseFloat(data.item.foreignAmount) / parseFloat(data.item.qortAmount)) + render(html`${price}`, root) + }} + > + + + + { + render(html` ${data.item.foreignAmount} `, root) + }} + > + + +
    +
    -
    - - - - - { render(html`${this.renderCancelStuckOfferButton(data.item)}`, root) }}> - -
    - ${translate("general.close")} - - - -
    -

    - this.shadowRoot.getElementById('tradeInfoDialog').close()} title="${translate("info.inf2")}">highlight_off -
    -
    -

    ${translate("info.inf1")}

    -

    ${translate("info.inf3")} ${this.listedCoins.get(this.selectedCoin).coinCode} ${translate("info.inf4")}

    -

    ${translate("info.inf5")} ${this.listedCoins.get(this.selectedCoin).coinCode}

    -

    ${translate("info.inf6")}

    -
    -
    - -
    -

    Qortal ${translate("tabmenu.tm4")} ${translate("login.lp1")}

    -
    -
    -
    -

    ${translate("login.lp2")}

    -

    ${translate("login.lp3")}

    -
    -
    - password - -
    -
    - password - -
    -
    - ${translate("login.lp4")} - ${translate("login.lp5")} -
    -
    - -
    -

    Qortal ${translate("tabmenu.tm4")} ${translate("login.lp1")}

    -
    -
    -
    -

    ${translate("login.lessthen8")}

    -
    -
    - ${translate("login.lp4")} - ${translate("login.lp5")} -
    -
    - -
    - ${translate("sidemenu.tradeportal")}
    - ${translate("login.lp9")} - ${translate("login.lp10")} -
    -
    - password - -
    - ${this.tradeHelperMessage} -
    -
    -
    -
    - -
    -
    - - - ` - } - - pingCoinBalancesController() { - if(!this.selectedCoin) return - let coin = '' - switch (this.selectedCoin) { - case 'BITCOIN': - coin ='btc' - break - case 'LITECOIN': - coin = 'ltc' - break - case 'DOGECOIN': - coin = 'doge' - break - case 'DIGIBYTE': - coin = 'dgb' - break - case 'RAVENCOIN': - coin = 'rvn' - break - case 'PIRATECHAIN': - coin = 'arrr' - break - default: - break - } - const customEvent = new CustomEvent('ping-coin-controller-with-coin', { - detail: coin - }) - window.parent.dispatchEvent(customEvent) - } - - connectedCallback() { - super.connectedCallback() - this.intervalID = setInterval(this.pingCoinBalancesController, 30000) - } - - disconnectedCallback() { - super.disconnectedCallback() - if (this.intervalID) { - clearInterval(this.intervalID) - } - } - - async firstUpdated() { - let _this = this - - this.changeTheme() - this.changeLanguage() - await this.tradeFee() - await this.getNewBlockedTrades() - - this.tradeHelperMessage = this.renderTradeHelperPass() - - this.tradeSalt = '' - this.tradeSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) - - this.tradeStorageData = '' - this.tradeStorageData = window.parent.reduxStore.getState().app.selectedAddress.address - - this.tradeLockScreenPass = '' - this.tradeLockScreenPass = 'tradeLockScreenPass-' + this.tradeStorageData - - this.tradeLockScreenSet = '' - this.tradeLockScreenSet = 'tradeLockScreenSet-' + this.tradeStorageData - - this.tradeLockPass = '' - this.tradeLockPass = encryptData(false, this.tradeSalt) - - this.tradeLockSet = '' - this.tradeLockSet = encryptData(false, this.tradeSalt) - - if (localStorage.getItem(this.tradeLockScreenPass) === null && localStorage.getItem(this.tradeLockScreenSet) === null) { - localStorage.setItem(this.tradeLockScreenPass, this.tradeLockPass) - localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) - this.myTradeLockScreenPass = '' - this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) - this.myTradeLockScreenSet = '' - this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) - } else { - this.myTradeLockScreenPass = '' - this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) - this.myTradeLockScreenSet = '' - this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) - } - - if (this.myTradeLockScreenSet === true) { - this.shadowRoot.getElementById('tradeLockScreenActive').open() - } - - await this.updateWalletBalance() - await this.fetchWalletAddress(this.selectedCoin) - this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') - - setTimeout(() => { - this.displayTabContent('buy') - }, 0) - - this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid') - - this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { - const priceString = get("tradepage.tchange9") - root.innerHTML = '' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' - } - - this._openOrdersGrid.querySelector('#qortAmountColumn').headerRenderer = function (root) { - const amountString = get("tradepage.tchange8") - root.innerHTML = '' + amountString + ' (QORT)' - } - - this._myOrdersGrid = this.shadowRoot.getElementById('myOrdersGrid') - this._historicTradesGrid = this.shadowRoot.getElementById('historicTradesGrid') - this._myHistoricTradesGrid = this.shadowRoot.getElementById('myHistoricTradesGrid') - this._stuckOrdersGrid = this.shadowRoot.getElementById('stuckOrdersGrid') - - const getNodeInfo = () => { - parentEpml.request("apiCall", { url: `/admin/status` }).then((res) => { - this.nodeInfo = res - getSellButtonStatus() - }) - setTimeout(getNodeInfo, 30000) - } - - const getSellButtonStatus = () => { - if (this.nodeInfo.isSynchronizing === true) { - this.sellBtnDisable = true - } else this.sellBtnDisable = this.nodeInfo.isSynchronizing !== false; - } - - const getQortBtcPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/BITCOIN?inverse=true` }).then((res) => { - this.qortbtc = (Number(res) / 1e8).toFixed(8) - }) - setTimeout(getQortBtcPrice, 300000) - } - - const getQortLtcPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/LITECOIN?inverse=true` }).then((res) => { - this.qortltc = (Number(res) / 1e8).toFixed(8) - }) - setTimeout(getQortLtcPrice, 300000) - } - - const getQortDogePrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/DOGECOIN?inverse=true` }).then((res) => { - this.qortdoge = (Number(res) / 1e8).toFixed(8) - }) - setTimeout(getQortDogePrice, 300000) - } - - const getQortDgbPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/DIGIBYTE?inverse=true` }).then((res) => { - this.qortdgb = (Number(res) / 1e8).toFixed(8) - }) - setTimeout(getQortDgbPrice, 300000) - } - - const getQortRvnPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/RAVENCOIN?inverse=true` }).then((res) => { - this.qortrvn = (Number(res) / 1e8).toFixed(8) - }) - setTimeout(getQortRvnPrice, 300000) - } - - const getQortArrrPrice = () => { - parentEpml.request("apiCall", { url: `/crosschain/price/PIRATECHAIN?inverse=true` }).then((res) => { - this.qortarrr = (Number(res) / 1e8).toFixed(8) - }) - setTimeout(getQortArrrPrice, 300000) - } - - window.addEventListener('storage', () => { - this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') - const checkLanguage = localStorage.getItem('qortalLanguage') - const checkTheme = localStorage.getItem('qortalTheme') - - use(checkLanguage) - - this.theme = (checkTheme === 'dark') ? 'dark' : 'light' - document.querySelector('html').setAttribute('theme', this.theme) - }) - - if (!isElectron()) { - } else { - window.addEventListener('contextmenu', (event) => { - event.preventDefault() - window.parent.electronAPI.showMyMenu() - }) - } - - this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address - this.ltcWallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address - this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address - this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address - this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address - this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address - - let configLoaded = false - - parentEpml.ready().then(() => { - parentEpml.subscribe('selected_address', async (selectedAddress) => { - this.selectedAddress = {} - selectedAddress = JSON.parse(selectedAddress) - if (!selectedAddress || Object.entries(selectedAddress).length === 0) return - this.selectedAddress = selectedAddress - - this.btcWallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address - this.ltcWallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address - this.dogeWallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address - this.dgbWallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address - this.rvnWallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address - this.arrrWallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address - this.updateAccountBalance() - }) - - parentEpml.subscribe('config', (c) => { - if (!configLoaded) { - setTimeout(getNodeInfo, 1) - setTimeout(getQortBtcPrice, 1) - setTimeout(getQortLtcPrice, 1) - setTimeout(getQortDogePrice, 1) - setTimeout(getQortDgbPrice, 1) - setTimeout(getQortRvnPrice, 1) - setTimeout(getQortArrrPrice, 1) - configLoaded = true - } - this.config = JSON.parse(c) - }) - parentEpml.subscribe('coin_balances', async (payload) => { - const coinBalances = JSON.parse(payload) - let coin = '' - switch (this.selectedCoin) { - case 'BITCOIN': - coin ='btc' - break - case 'LITECOIN': - coin = 'ltc' - break - case 'DOGECOIN': - coin = 'doge' - break - case 'DIGIBYTE': - coin = 'dgb' - break - case 'RAVENCOIN': - coin = 'rvn' - break - case 'PIRATECHAIN': - coin = 'arrr' - break - default: - break - } - if(coinBalances[coin]){ - const res = coinBalances[coin].fullValue - let value = (Number(res) / 1e8).toFixed(8) - if(coin !== 'qort'){ - value = (Number(res) / 1e8).toFixed(8) - } - this.listedCoins.get(this.selectedCoin).balance = value - this.requestUpdate() - } - }) - - let coinSelectionMenu = this.shadowRoot.getElementById("coinSelectionMenu") - - coinSelectionMenu.addEventListener('change', function () { - _this.setForeignCoin(coinSelectionMenu.value,false) - }) - - _this.setForeignCoin(coinSelectionMenu.value,true) - }) - parentEpml.imReady() - - setTimeout(() => this.shadowRoot.querySelector('[slot="vaadin-grid-cell-content-3"]').setAttribute('title', 'Last Seen'), 3000) - - this.clearConsole() - setInterval(() => { - this.clearConsole() - }, 60000) - - setInterval(() => { - this.getNewBlockedTrades() - }, 150000) - } - - clearConsole() { - if (!isElectron()) { - } else { - console.clear() - window.parent.electronAPI.clearCache() - } - } - - renderTradeLockButton() { - if (this.myTradeLockScreenPass === false && this.myTradeLockScreenSet === false) { - return html` -
    - this.openTradeSetScreenLockPass()} title="${translate("login.lp11")}"> -
    - ` - } else if (this.myTradeLockScreenSet === false) { - return html` -
    - this.setTradeLockQortal()} title="${translate("login.lp11")}"> -
    - ` - } else if (this.myTradeLockScreenSet === true) { - return html` -
    - -
    - ` - } - } - - openTradeSetScreenLockPass() { - this.shadowRoot.getElementById('tradeLockPassword').value = '' - this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' - this.shadowRoot.getElementById('setTradeLockScreenPass').open() - } - - closewTradeSetScreenLockPass() { - this.shadowRoot.getElementById('setTradeLockScreenPass').close() - } - - tradeCheckPass() { - const tradePassword = this.shadowRoot.getElementById('tradeLockPassword').value - const tradeRePassword = this.shadowRoot.getElementById('tradeLockPasswordConfirm').value - - if (tradePassword === '') { - let snackbar1string = get("login.pleaseenter") - parentEpml.request('showSnackBar', `${snackbar1string}`) - return - } - - if (tradePassword != tradeRePassword) { - let snackbar2string = get("login.notmatch") - parentEpml.request('showSnackBar', `${snackbar2string}`) - return - } - - if (tradePassword.length < 8) { - let snackbar3string = get("login.lessthen8") - parentEpml.request('showSnackBar', `${snackbar3string}`) - this.tradeExtraConfirm() - } - - if (tradePassword.length >= 8) { - this.setTradeNewScreenPass() - let snackbar4string = get("login.lp6") - parentEpml.request('showSnackBar', `${snackbar4string}`) - } - } - - tradeExtraConfirm() { - this.shadowRoot.getElementById('setTradeLockScreenPass').close() - this.shadowRoot.getElementById('tradeExtraConfirmPass').open() - } - - closTradeExtraConfirmPass() { - this.shadowRoot.getElementById('tradeExtraConfirmPass').close() - this.shadowRoot.getElementById('tradeLockPassword').value = '' - this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' - } - - setTradeNewScreenPass() { - const tradeRawPassword = this.shadowRoot.getElementById('tradeLockPassword').value - const tradeCryptPassword = encryptData(tradeRawPassword, this.tradeSalt) - localStorage.setItem(this.tradeLockScreenPass, tradeCryptPassword) - this.myTradeLockScreenPass = '' - this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) - this.shadowRoot.getElementById('setTradeLockScreenPass').close() - this.shadowRoot.getElementById('tradeExtraConfirmPass').close() - this.shadowRoot.getElementById('tradeLockPassword').value = '' - this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' - } - - setTradeLockQortal() { - this.tradeHelperMessage = this.renderTradeHelperPass() - this.tradeLockSet = '' - this.tradeLockSet = encryptData(true, this.tradeSalt) - localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) - this.myTradeLockScreenSet = '' - this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) - this.shadowRoot.getElementById('tradeLockScreenActive').open() - } - - tradePassKeyListener(e) { - if (e.key === 'Enter') { - this.closeTradeLockScreenActive() - } - } - - async closeTradeLockScreenActive() { - const myTradePass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) - const tradeCheckPass = this.shadowRoot.getElementById('tradeUnlockPassword').value - const errDelay = ms => new Promise(res => setTimeout(res, ms)) - - if (tradeCheckPass === myTradePass) { - this.tradeLockSet = '' - this.tradeLockSet = encryptData(false, this.tradeSalt) - localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) - this.myTradeLockScreenSet = '' - this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) - this.shadowRoot.getElementById('tradeLockScreenActive').close() - this.shadowRoot.getElementById('tradeUnlockPassword').value = '' - this.tradeHelperMessage = this.renderTradeHelperPass() - } else { - this.shadowRoot.getElementById('tradeUnlockPassword').value = '' - this.tradeHelperMessage = this.renderTradeHelperErr() - await errDelay(3000) - this.tradeHelperMessage = this.renderTradeHelperPass() - - } - } - - renderTradeHelperPass() { - return html`${translate("login.pleaseenter")}` - } - - renderTradeHelperErr() { - return html`${translate("login.lp8")}` - } - - requestTraderInfo(traderAddress) { - let getAddress = traderAddress - const theInfoView = this.shadowRoot.querySelector('trader-info-view') - theInfoView.openTraderInfo(getAddress) - } - - requestTradeInfo(tradeObj) { - let seller = '' - let buyer = '' - let qortAmount = 0 - let foreignAmount = 0 - let ata = '' - let time = 0 - let coin = '' - seller = tradeObj.item.sellerAddress - buyer = tradeObj.item.buyerReceivingAddress - qortAmount = tradeObj.item.qortAmount - foreignAmount = tradeObj.item.foreignAmount - ata = tradeObj.item.atAddress - time = tradeObj.item.tradeTimestamp - coin = this.listedCoins.get(this.selectedCoin).coinCode - const theTradeInfoView = this.shadowRoot.querySelector('trade-info-view') - theTradeInfoView.openTradeInfo(seller, buyer, qortAmount, foreignAmount, ata, time, coin) - } - - changeTheme() { - const checkTheme = localStorage.getItem('qortalTheme') - this.theme = (checkTheme === 'dark') ? 'dark' : 'light' - document.querySelector('html').setAttribute('theme', this.theme); - } - - changeLanguage() { - const checkLanguage = localStorage.getItem('qortalLanguage') - - if (checkLanguage === null || checkLanguage.length === 0) { - localStorage.setItem('qortalLanguage', 'us') - use('us') - } else { - use(checkLanguage) - } - } - - renderFetchText() { - return html`${translate("walletpage.wchange1")}` - } - - renderWarning() { - return html`NOT ENOUGH ${this.listedCoins.get(this.selectedCoin).coinCode}` - } - - chartShowCoin() { - switch(this.listedCoins.get(this.selectedCoin).coinCode) { - case "BTC": - return html` chartsbtc.open()}>` - break - case "LTC": - return html` chartsltc.open()}>` - break - case "DOGE": - return html` chartsdoge.open()}>` - break - case "DGB": - return html` chartsdgb.open()}>` - break - case "RVN": - return html` chartsrvn.open()}>` - break - case "ARRR": - return html` chartsarrr.open()}>` - break - default: - break - } - } - - exchangeRateQort() { - switch(this.listedCoins.get(this.selectedCoin).coinCode) { - case "BTC": - this.qortRatio = this.qortbtc - break - case "LTC": - this.qortRatio = this.qortltc - break - case "DOGE": - this.qortRatio = this.qortdoge - break - case "DGB": - this.qortRatio = this.qortdgb - break - case "RVN": - this.qortRatio = this.qortrvn - break - case "ARRR": - this.qortRatio = this.qortarrr - break - default: - break - } - return html`${this.qortRatio}` - } - - exchangeRateForeign() { - if (this.listedCoins.get(this.selectedCoin).coinCode === "BTC") { - parentEpml.request('apiCall', { - url: `/crosschain/price/BITCOIN?inverse=false` - }).then((res) => { - this.btcqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.btcqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "LTC") { - parentEpml.request('apiCall', { - url: `/crosschain/price/LITECOIN?inverse=false` - }).then((res) => { - this.ltcqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.ltcqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DOGE") { - parentEpml.request('apiCall', { - url: `/crosschain/price/DOGECOIN?inverse=false` - }).then((res) => { - this.dogeqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.dogeqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DGB") { - parentEpml.request('apiCall', { - url: `/crosschain/price/DIGIBYTE?inverse=false` - }).then((res) => { - this.dgbqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.dgbqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "RVN") { - parentEpml.request('apiCall', { - url: `/crosschain/price/RAVENCOIN?inverse=false` - }).then((res) => { - this.rvnqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.rvnqort}` - } else if (this.listedCoins.get(this.selectedCoin).coinCode === "ARRR") { - parentEpml.request('apiCall', { - url: `/crosschain/price/PIRATECHAIN?inverse=false` - }).then((res) => { - this.arrrqort = (Number(res) / 1e8).toFixed(8) - }) - return html`${this.arrrqort}` - } - } - - async updateWalletBalance() { - let _url = `` - let _body = null - - switch (this.selectedCoin) { - case 'BITCOIN': - _url = `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey - break - case 'LITECOIN': - _url = `/crosschain/ltc/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey - break - case 'DOGECOIN': - _url = `/crosschain/doge/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey - break - case 'DIGIBYTE': - _url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey - break - case 'RAVENCOIN': - _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey - break - case 'PIRATECHAIN': - _url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}` - _body = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58 - break - default: - break - } - - this.showGetWalletBance = true - - await parentEpml.request('apiCall', { - url: _url, - method: 'POST', - body: _body, - }).then((res) => { - if (isNaN(Number(res))) { - //... - } else { - this.listedCoins.get(this.selectedCoin).balance = (Number(res) / 1e8).toFixed(8) - } - }) - - this.showGetWalletBance = false - } - - async fetchWalletAddress(coin) { - switch (coin) { - case 'PIRATECHAIN': - let res = await parentEpml.request('apiCall', { - url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58}`, - }) - if (res != null && res.error != 1201) { - this.arrrWalletAddress = res - } - break - - default: - // Not used for other coins yet - break - } - } - - async setForeignCoin(coin,beingInitialized) { - let _this = this - this.selectedCoin = coin - - let coinSelectionMenu=this.shadowRoot.getElementById("coinSelectionMenu") - - if(beingInitialized){ - coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').setAttribute('style', 'padding-left: 60px;') - let pairIconContainer = document.createElement("span") - let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() - pairIconContainer.setAttribute("class","pairIconContainer") - pairIconContainer.setAttribute('style', 'left: 10px;top: 50%;transform: translate(0, -50%);height: 26px;width: 45px;position: absolute;background-repeat: no-repeat;background-size: cover;background-image: url(/img/qort'+pairicon+'.png);') - coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').appendChild(pairIconContainer) - }else{ - let pairIconContainer = coinSelectionMenu.shadowRoot.querySelector(".mdc-select--outlined .mdc-select__anchor span.pairIconContainer") - let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() - pairIconContainer.style.backgroundImage='url(/img/qort'+pairicon+'.png)' - } - - this.isLoadingHistoricTrades = true - this.isLoadingOpenTrades = true - this.createConnection() - this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { - const priceString2 = get("tradepage.tchange9") - root.innerHTML = '' + priceString2 + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' - } - this.clearSellForm() - this.clearBuyForm() - await this.updateWalletBalance() - await this.fetchWalletAddress(coin) - } - - displayTabContent(tab) { - const tabPane = this.shadowRoot.getElementById("tabs-1") - tabPane.setAttribute("activeIndex", (tab === 'buy') ? '0': '1') - - const tabBuyContent = this.shadowRoot.getElementById('tab-buy-content') - tabBuyContent.style.display = (tab === 'buy') ? 'block' : 'none' - - const tabSellContent = this.shadowRoot.getElementById('tab-sell-content') - tabSellContent.style.display = (tab === 'sell') ? 'block' : 'none' - } - - setDefaultSellPrice() { - this.displayTabContent('sell') - const tabSellPrice = this.shadowRoot.getElementById('sellPriceInput') - tabSellPrice.value = this.qortRatio.isNaN ? 0 : this.qortRatio - } - - async reRenderHistoricTrades() { - this.requestUpdate() - await this.updateComplete - this.isLoadingHistoricTrades = false - } - - async reRenderOpenFilteredOrders() { - this.requestUpdate() - await this.updateComplete - this.isLoadingOpenTrades = false - } - - async reRenderMyOpenOrders() { - this.requestUpdate() - await this.updateComplete - this.isLoadingMyOpenOrders = false - } - - fillBuyForm(sellerRequest) { - 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('buyTotalInput').value = parseFloat(sellerRequest.item.foreignAmount) - this.shadowRoot.getElementById('qortalAtAddress').value = sellerRequest.item.qortalAtAddress - const buyFunds = this.round(parseFloat(sellerRequest.item.foreignAmount)) - const haveFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) - if (Number(haveFunds) > Number(buyFunds)) { - this.buyBtnDisable = false - this.autoBuyWarning = false - this.displayTabContent('buy') - } else { - this.buyBtnDisable = true - this.autoBuyWarning = true - this.displayTabContent('buy') - } - - } - - processOfferingTrade(offer) { - try { - if(this.listedCoins.get(offer.foreignBlockchain).name!='') { - const offerItem = { - ...offer, - qortAmount: parseFloat(offer.qortAmount), - price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), - } - const addOffer = () => { - this.listedCoins.get(offer.foreignBlockchain).openOrders.unshift(offerItem) - } - const initOffer = () => { - this.listedCoins.get(offer.foreignBlockchain).openOrders.push(offerItem) - } - this.listedCoins.get(offer.foreignBlockchain).openOrders.length === 0 ? initOffer() : addOffer() - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - } catch(e) { - console.log("Error adding offer from "+offer.foreignBlockchain) - } - } - - processRedeemedTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - const offerItem = { - ...offer, - mode: 'SOLD', - } - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - const offerItem = { - ...offer, - mode: 'BOUGHT', - } - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } - const addNewHistoricTrade = () => { - this._historicTradesGrid.items.unshift(offer) - this._historicTradesGrid.clearCache() - } - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null - - } - } catch(e) { - console.log("Error processing redeemed trade offer from "+offer.foreignBlockchain) - } - } - - processTradingTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - }) - this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) - } - } catch(e) { - console.log("Error processing trading trade offer from "+offer.foreignBlockchain) - } - } - - processRefundedTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } - - } - } catch(e) { - console.log("Error processing refunded trade offer from "+offer.foreignBlockchain) - } - } - - processCancelledTrade(offer) { - try { - if (this.listedCoins.get(offer.foreignBlockchain).name!='') { - - if (offer.qortalCreator === this.selectedAddress.address) { - if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - }) - this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) - this._stuckOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._stuckOrdersGrid.items.splice(index, 1) - this._stuckOrdersGrid.clearCache() - } - }) - } - } catch(e) { - console.log("Error processing cancelled trade offer from "+offer.foreignBlockchain) - } - } - - /** - * TRADE OFFER STATES or MODE - * - OFFERING - * - REDEEMED - * - TRADING - * - REFUNDED - * - CANCELLED - */ - - processTradeOffers(offers) { - offers.forEach((offer) => { - if (offer.mode === 'OFFERING') { - this.processOfferingTrade(offer) - } else if (offer.mode === 'REDEEMED') { - this.processRedeemedTrade(offer) - } else if (offer.mode === 'TRADING') { - this.processTradingTrade(offer) - } else if (offer.mode === 'REFUNDED') { - this.processRefundedTrade(offer) - } else if (offer.mode === 'CANCELLED') { - this.processCancelledTrade(offer) - } - }) - } - - /** - * TradeBot Note by cat - * - * trade-bot entry states: - * - when you do /crosschain/tradebot/create, - * - it returns unsigned DEPLOY_AT for you to sign & broadcast - * - so initial trade-bot state is BOB_WAITING_FOR_AT_CONFIRM, because trade-bot is waiting for UI to sign & broadcast txn and for that txn to be confirmed into a block - * - once that happens & Bob's trade-bot notices that DEPLOY_AT has confirmed (and hence AT created and running), then it switches to BOB_WAITING_FOR_MESSAGE - * - which is Bob's trade-bot waiting for a message from Alice's trade-bot telling it (Bob's trade-bot) that Alice's trade-bot has funded P2SH-A and some other details - * - when that message is sent, Bob's trade-bot processes that message and sends its own message to the AT (which switches it to TRADING mode) - * - but the next state for Bob's trade-bot is to wait for Alice to spot AT is locked to her and for her to fund P2SH-B, hence BOB_WAITING_FOR_P2SH_B - * - at this point, Bob's trade-bot finds P2SH-B on the litecoin blockchain and can send secret-B to P2SH-B - * - when this happens, Alice uses secret-B and secret-A to redeem the QORT from the AT, so until Alice does this, Bob's trade-bot state is BOB_WAITING_FOR_AT_REDEEM - * - after Alice redeems QORT from AT, Bob can extract secret-A and capture the actual LTC funds from P2SH-A to his own litecoin account and hence his trade-bot moves to BOB_DONE - * - if anything goes wrong then refunds occur and Bob's trade-bot ends up at BOB_REFUNDED instead - * - I think you can probably guess the corresponding meaning of states for Alice's point of view, but if not I can go through those too? - * - Alice calls /crosschain/tradebot/respond which funds P2SH-A - * - so her trade-bot waits for that to appear in litecoin blockchain, so until then is ALICE_WAITING_FOR_P2SH_A - * - once the P2SH-A funding confirms, Alice's trade-bot can MESSAGE Bob's trade-bot with the details and changes to ALICE_WAITING_FOR_AT_LOCK - * - Bob's AT should then lock to trading with Alice (via those MESSAGEs above) and Alice's trade-bot notices this, (minimally) funds P2SH-B and waits until Bob 'spends' P2SH-B, hence ALICE_WATCH_P2SH_B - * - if Bob spends P2SH-B, then Alice can send secret-B and secret-A to the AT, claim the QORT and she's ALICE_DONE - * - if something goes wrong then her trade-bot needs to refund P2SH-B (if applicable) first (ALICE_REFUNDING_B) - * - and when that's done refund P2SH-A (ALICE_REFUNDING_A) - * - and when that's done her trade-bot ends up at ALICE_REFUNDED - * - * (PHEW) - */ - - processTradeBotStates(tradeStates) { - - /** - * BitcoinACCTv1 TRADEBOT STATES - * - BOB_WAITING_FOR_AT_CONFIRM - * - BOB_WAITING_FOR_MESSAGE - * - BOB_WAITING_FOR_AT_REDEEM - * - BOB_DONE - * - BOB_REFUNDED - * - ALICE_WAITING_FOR_AT_LOCK - * - ALICE_DONE - * - ALICE_REFUNDING_A - * - ALICE_REFUNDED - * - * @param {[{}]} states - */ - - const BitcoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { - this.changeTradeBotState(state, 'PENDING') - } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { - this.changeTradeBotState(state, 'LISTED') - } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { - this.changeTradeBotState(state, 'TRADING') - } else if (state.tradeState == 'BOB_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'BOB_REFUNDED') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - /** - * LitecoinACCTv1 TRADEBOT STATES - * - BOB_WAITING_FOR_AT_CONFIRM - * - BOB_WAITING_FOR_MESSAGE - * - BOB_WAITING_FOR_AT_REDEEM - * - BOB_DONE - * - BOB_REFUNDED - * - ALICE_WAITING_FOR_AT_LOCK - * - ALICE_DONE - * - ALICE_REFUNDING_A - * - ALICE_REFUNDED - * - * @param {[{}]} states - */ - - const LitecoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { - this.changeTradeBotState(state, 'PENDING') - } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { - this.changeTradeBotState(state, 'LISTED') - } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { - this.changeTradeBotState(state, 'TRADING') - } else if (state.tradeState == 'BOB_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'BOB_REFUNDED') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - /** - * DogecoinACCTv1 TRADEBOT STATES - * - BOB_WAITING_FOR_AT_CONFIRM - * - BOB_WAITING_FOR_MESSAGE - * - BOB_WAITING_FOR_AT_REDEEM - * - BOB_DONE - * - BOB_REFUNDED - * - ALICE_WAITING_FOR_AT_LOCK - * - ALICE_DONE - * - ALICE_REFUNDING_A - * - ALICE_REFUNDED - * - * @param {[{}]} states - */ - - const DogecoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { - this.changeTradeBotState(state, 'PENDING') - } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { - this.changeTradeBotState(state, 'LISTED') - } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { - this.changeTradeBotState(state, 'TRADING') - } else if (state.tradeState == 'BOB_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'BOB_REFUNDED') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - /** - * DigibyteACCTv1 TRADEBOT STATES - * - BOB_WAITING_FOR_AT_CONFIRM - * - BOB_WAITING_FOR_MESSAGE - * - BOB_WAITING_FOR_AT_REDEEM - * - BOB_DONE - * - BOB_REFUNDED - * - ALICE_WAITING_FOR_AT_LOCK - * - ALICE_DONE - * - ALICE_REFUNDING_A - * - ALICE_REFUNDED - * - * @param {[{}]} states - */ - - const DigibyteACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { - this.changeTradeBotState(state, 'PENDING') - } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { - this.changeTradeBotState(state, 'LISTED') - } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { - this.changeTradeBotState(state, 'TRADING') - } else if (state.tradeState == 'BOB_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'BOB_REFUNDED') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - /** - * RavencoinACCTv1 TRADEBOT STATES - * - BOB_WAITING_FOR_AT_CONFIRM - * - BOB_WAITING_FOR_MESSAGE - * - BOB_WAITING_FOR_AT_REDEEM - * - BOB_DONE - * - BOB_REFUNDED - * - ALICE_WAITING_FOR_AT_LOCK - * - ALICE_DONE - * - ALICE_REFUNDING_A - * - ALICE_REFUNDED - * - * @param {[{}]} states - */ - - const RavencoinACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { - this.changeTradeBotState(state, 'PENDING') - } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { - this.changeTradeBotState(state, 'LISTED') - } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { - this.changeTradeBotState(state, 'TRADING') - } else if (state.tradeState == 'BOB_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'BOB_REFUNDED') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - /** - * PirateChainACCTv1 TRADEBOT STATES - * - BOB_WAITING_FOR_AT_CONFIRM - * - BOB_WAITING_FOR_MESSAGE - * - BOB_WAITING_FOR_AT_REDEEM - * - BOB_DONE - * - BOB_REFUNDED - * - ALICE_WAITING_FOR_AT_LOCK - * - ALICE_DONE - * - ALICE_REFUNDING_A - * - ALICE_REFUNDED - * - * @param {[{}]} states - */ - - const PirateChainACCTv1 = (states) => { - states.reverse() - states.forEach((state) => { - if (state.creatorAddress === this.selectedAddress.address) { - if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { - this.changeTradeBotState(state, 'PENDING') - } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { - this.changeTradeBotState(state, 'LISTED') - } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { - this.changeTradeBotState(state, 'TRADING') - } else if (state.tradeState == 'BOB_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'BOB_REFUNDED') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { - this.changeTradeBotState(state, 'BUYING') - } else if (state.tradeState == 'ALICE_DONE') { - this.handleCompletedState(state) - } else if (state.tradeState == 'ALICE_REFUNDING_A') { - this.changeTradeBotState(state, 'REFUNDING') - } else if (state.tradeState == 'ALICE_REFUNDED') { - this.handleCompletedState(state) - } - } - }) - } - - switch (this.selectedCoin) { - case 'BITCOIN': - BitcoinACCTv1(tradeStates) - break - case 'LITECOIN': - LitecoinACCTv1(tradeStates) - break - case 'DOGECOIN': - DogecoinACCTv1(tradeStates) - break - case 'DIGIBYTE': - DigibyteACCTv1(tradeStates) - break - case 'RAVENCOIN': - RavencoinACCTv1(tradeStates) - break - case 'PIRATECHAIN': - PirateChainACCTv1(tradeStates) - break - default: - break - } - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter === 1) { - setTimeout(() => this.filterStuckTrades(tradeStates), 250) - } - } - - changeTradeBotState(state, tradeState) { - this.isLoadingMyOpenOrders = true - const stateItem = { - ...state, - _tradeState: tradeState, - } - const item = this._myOrdersGrid.querySelector(`#${state.atAddress}`) - const addStateItem = () => { - this.reRenderMyOpenOrders() - this._myOrdersGrid.items.unshift(stateItem) - this._myOrdersGrid.clearCache() - } - const updateStateItem = () => { - this._myOrdersGrid.items.forEach((item, index) => { - if (item.atAddress === state.atAddress) { - this.reRenderMyOpenOrders() - this._myOrdersGrid.items.splice(index, 1) - this._myOrdersGrid.items.unshift(stateItem) - this._myOrdersGrid.clearCache() - } - }) - } - item ? updateStateItem() : addStateItem() - } - - handleCompletedState(state) { - this._myOrdersGrid.items.forEach((item, index) => { - if (item.atAddress === state.atAddress) { - this.reRenderMyOpenOrders() - this._myOrdersGrid.items.splice(index, 1) - this._myOrdersGrid.clearCache() - } - }) - } - - initSocket() { - let _relatedCoin = "" - let tradePresenceTxns = null - let offeringTrades = null - - self.addEventListener('message', function (event) { - switch (event.data.type) { - case 'open_orders': - offeringTrades = event.data.content - processOffersWithPresence() - break - case 'set_coin': - _relatedCoin = event.data.content - break - default: - break - } - }) - - const lessThanThirtyMinsAgo = (timestamp) => { - const THIRTYMINS = 1000 * 60 * 30 - const thirtyMinsAgo = Date.now() - THIRTYMINS - return timestamp > thirtyMinsAgo - } - - const filterOffersUsingTradePresence = (offeringTrade) => { - return offeringTrade.tradePresenceExpiry > Date.now(); - } - - const processOffersWithPresence = () => { - if (offeringTrades === null) return - - async function asyncForEach(array, callback) { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index, array) - } - } - - const startOfferPresenceMapping = async () => { - - if (tradePresenceTxns !== null) { - await asyncForEach(tradePresenceTxns, async (tradePresence) => { - let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === tradePresence.tradeAddress) - offerIndex !== -1 ? (offeringTrades[offerIndex].tradePresenceExpiry = tradePresence.timestamp) : null - }) - } - - let filteredOffers = offeringTrades.filter((offeringTrade) => filterOffersUsingTradePresence(offeringTrade)) - self.postMessage({ type: 'PRESENCE', data: { offers: offeringTrades, filteredOffers: filteredOffers, relatedCoin: _relatedCoin } }) - } - - startOfferPresenceMapping() - } - - const initTradeOffersWebSocket = (restarted = false) => { - let tradeOffersSocketCounter = 0 - let socketTimeout - let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true` - const socket = new WebSocket(socketLink) - socket.onopen = () => { - setTimeout(pingSocket, 50) - tradeOffersSocketCounter += 1 - } - socket.onmessage = (e) => { - e.relatedCoin = _relatedCoin - self.postMessage({ - type: 'TRADE_OFFERS', - data: e.data, - counter: tradeOffersSocketCounter, - isRestarted: restarted, - }) - tradeOffersSocketCounter += 1 - restarted = false - } - socket.onclose = () => { - clearTimeout(socketTimeout) - restartTradeOffersWebSocket() - } - socket.onerror = (e) => { - clearTimeout(socketTimeout) - } - const pingSocket = () => { - socket.send('ping') - socketTimeout = setTimeout(pingSocket, 295000) - } - } - - const initTradeBotWebSocket = (restarted = false) => { - let socketTimeout - let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN` - const socket = new WebSocket(socketLink) - socket.onopen = () => { - setTimeout(pingSocket, 50) - } - socket.onmessage = (e) => { - e.relatedCoin = _relatedCoin - self.postMessage({ - type: 'TRADE_BOT', - data: e.data, - isRestarted: restarted, - }) - restarted = false - } - socket.onclose = () => { - clearTimeout(socketTimeout) - restartTradeBotWebSocket() - } - socket.onerror = (e) => { - clearTimeout(socketTimeout) - } - const pingSocket = () => { - socket.send('ping') - socketTimeout = setTimeout(pingSocket, 295000) - } - } - - const initTradePresenceWebSocket = (restarted = false) => { - let socketTimeout - let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence` - const socket = new WebSocket(socketLink) - socket.onopen = () => { - setTimeout(pingSocket, 50) - } - socket.onmessage = (e) => { - tradePresenceTxns = JSON.parse(e.data) - processOffersWithPresence() - restarted = false - } - socket.onclose = () => { - clearTimeout(socketTimeout) - restartTradePresenceWebSocket() - } - socket.onerror = (e) => { - clearTimeout(socketTimeout) - } - const pingSocket = () => { - socket.send('ping') - socketTimeout = setTimeout(pingSocket, 295000) - } - } - - const restartTradePresenceWebSocket = () => { - setTimeout(() => initTradePresenceWebSocket(true), 50) - } - - const restartTradeOffersWebSocket = () => { - setTimeout(() => initTradeOffersWebSocket(true), 50) - } - - const restartTradeBotWebSocket = () => { - setTimeout(() => initTradeBotWebSocket(true), 50) - } - - initTradeOffersWebSocket() - initTradePresenceWebSocket() - initTradeBotWebSocket() - } - - async sellAction() { - this.isSellLoading = true - this.sellBtnDisable = true - await this.tradeFee() - const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value - const sellTotalInput = this.shadowRoot.getElementById('sellTotalInput').value - const fundingQortAmount = this.round(parseFloat(sellAmountInput) + 0.001) - - const makeRequest = async () => { - let _receivingAddress = null - switch (this.selectedCoin) { - case 'BITCOIN': - _receivingAddress = this.selectedAddress.btcWallet.address - break - case 'LITECOIN': - _receivingAddress = this.selectedAddress.ltcWallet.address - break - case 'DOGECOIN': - _receivingAddress = this.selectedAddress.dogeWallet.address - break - case 'DIGIBYTE': - _receivingAddress = this.selectedAddress.dgbWallet.address - break - case 'RAVENCOIN': - _receivingAddress = this.selectedAddress.rvnWallet.address - break - case 'PIRATECHAIN': - _receivingAddress = this.arrrWalletAddress - break - default: - break - } + ` + } + + pingCoinBalancesController() { + if (!this.selectedCoin) return + let coin = '' + switch (this.selectedCoin) { + case 'BITCOIN': + coin = 'btc' + break + case 'LITECOIN': + coin = 'ltc' + break + case 'DOGECOIN': + coin = 'doge' + break + case 'DIGIBYTE': + coin = 'dgb' + break + case 'RAVENCOIN': + coin = 'rvn' + break + case 'PIRATECHAIN': + coin = 'arrr' + break + default: + break + } + const customEvent = new CustomEvent('ping-coin-controller-with-coin', { detail: coin }) + window.parent.dispatchEvent(customEvent) + } + + connectedCallback() { + super.connectedCallback() + this.intervalID = setInterval(this.pingCoinBalancesController, 30000) + } + + disconnectedCallback() { + super.disconnectedCallback() + if (this.intervalID) { + clearInterval(this.intervalID) + } + } + + clearConsole() { + if (!isElectron()) { + } else { + console.clear() + window.parent.electronAPI.clearCache() + } + } + + renderTradeLockButton() { + if (this.myTradeLockScreenPass === false && this.myTradeLockScreenSet === false) { + return html` +
    + this.openTradeSetScreenLockPass()} title="${translate("login.lp11")}"> +
    + ` + } else if (this.myTradeLockScreenSet === false) { + return html` +
    + this.setTradeLockQortal()} title="${translate("login.lp11")}"> +
    + ` + } else if (this.myTradeLockScreenSet === true) { + return html` +
    + +
    + ` + } + } + + openTradeSetScreenLockPass() { + this.shadowRoot.getElementById('tradeLockPassword').value = '' + this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setTradeLockScreenPass').open() + } + + closewTradeSetScreenLockPass() { + this.shadowRoot.getElementById('setTradeLockScreenPass').close() + } + + tradeCheckPass() { + const tradePassword = this.shadowRoot.getElementById('tradeLockPassword').value + const tradeRePassword = this.shadowRoot.getElementById('tradeLockPasswordConfirm').value + + if (tradePassword === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (tradePassword != tradeRePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (tradePassword.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.tradeExtraConfirm() + } + + if (tradePassword.length >= 8) { + this.setTradeNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + tradeExtraConfirm() { + this.shadowRoot.getElementById('setTradeLockScreenPass').close() + this.shadowRoot.getElementById('tradeExtraConfirmPass').open() + } + + closTradeExtraConfirmPass() { + this.shadowRoot.getElementById('tradeExtraConfirmPass').close() + this.shadowRoot.getElementById('tradeLockPassword').value = '' + this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' + } + + setTradeNewScreenPass() { + const tradeRawPassword = this.shadowRoot.getElementById('tradeLockPassword').value + const tradeCryptPassword = encryptData(tradeRawPassword, this.tradeSalt) + localStorage.setItem(this.tradeLockScreenPass, tradeCryptPassword) + this.myTradeLockScreenPass = '' + this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + this.shadowRoot.getElementById('setTradeLockScreenPass').close() + this.shadowRoot.getElementById('tradeExtraConfirmPass').close() + this.shadowRoot.getElementById('tradeLockPassword').value = '' + this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' + } + + setTradeLockQortal() { + this.tradeHelperMessage = this.renderTradeHelperPass() + this.tradeLockSet = '' + this.tradeLockSet = encryptData(true, this.tradeSalt) + localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + this.shadowRoot.getElementById('tradeLockScreenActive').open() + } + + tradePassKeyListener(e) { + if (e.key === 'Enter') { + this.closeTradeLockScreenActive() + } + } + + async closeTradeLockScreenActive() { + const myTradePass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + const tradeCheckPass = this.shadowRoot.getElementById('tradeUnlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (tradeCheckPass === myTradePass) { + this.tradeLockSet = '' + this.tradeLockSet = encryptData(false, this.tradeSalt) + localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + this.shadowRoot.getElementById('tradeLockScreenActive').close() + this.shadowRoot.getElementById('tradeUnlockPassword').value = '' + this.tradeHelperMessage = this.renderTradeHelperPass() + } else { + this.shadowRoot.getElementById('tradeUnlockPassword').value = '' + this.tradeHelperMessage = this.renderTradeHelperErr() + await errDelay(3000) + this.tradeHelperMessage = this.renderTradeHelperPass() + + } + } + + renderTradeHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderTradeHelperErr() { + return html`${translate("login.lp8")}` + } + + requestTraderInfo(traderAddress) { + let getAddress = traderAddress + const theInfoView = this.shadowRoot.querySelector('trader-info-view') + theInfoView.openTraderInfo(getAddress) + } + + requestTradeInfo(tradeObj) { + let seller = '' + let buyer = '' + let qortAmount = 0 + let foreignAmount = 0 + let ata = '' + let time = 0 + let coin = '' + seller = tradeObj.item.sellerAddress + buyer = tradeObj.item.buyerReceivingAddress + qortAmount = tradeObj.item.qortAmount + foreignAmount = tradeObj.item.foreignAmount + ata = tradeObj.item.atAddress + time = tradeObj.item.tradeTimestamp + coin = this.listedCoins.get(this.selectedCoin).coinCode + const theTradeInfoView = this.shadowRoot.querySelector('trade-info-view') + theTradeInfoView.openTradeInfo(seller, buyer, qortAmount, foreignAmount, ata, time, coin) + } + + changeTheme() { + const checkTheme = localStorage.getItem('qortalTheme') + this.theme = (checkTheme === 'dark') ? 'dark' : 'light' + document.querySelector('html').setAttribute('theme', this.theme); + } + + changeLanguage() { + const checkLanguage = localStorage.getItem('qortalLanguage') + if (checkLanguage === null || checkLanguage.length === 0) { + localStorage.setItem('qortalLanguage', 'us') + use('us') + } else { + use(checkLanguage) + } + } + + renderFetchText() { + return html`${translate("walletpage.wchange1")}` + } + + renderWarning() { + return html`NOT ENOUGH ${this.listedCoins.get(this.selectedCoin).coinCode}` + } + + chartShowCoin() { + switch (this.listedCoins.get(this.selectedCoin).coinCode) { + case "BTC": + return html` chartsbtc.open()}>` + break + case "LTC": + return html` chartsltc.open()}>` + break + case "DOGE": + return html` chartsdoge.open()}>` + break + case "DGB": + return html` chartsdgb.open()}>` + break + case "RVN": + return html` chartsrvn.open()}>` + break + case "ARRR": + return html` chartsarrr.open()}>` + break + default: + break + } + } + + exchangeRateQort() { + switch (this.listedCoins.get(this.selectedCoin).coinCode) { + case "BTC": + this.qortRatio = this.qortbtc + break + case "LTC": + this.qortRatio = this.qortltc + break + case "DOGE": + this.qortRatio = this.qortdoge + break + case "DGB": + this.qortRatio = this.qortdgb + break + case "RVN": + this.qortRatio = this.qortrvn + break + case "ARRR": + this.qortRatio = this.qortarrr + break + default: + break + } + return html`${this.qortRatio}` + } + + exchangeRateForeign() { + if (this.listedCoins.get(this.selectedCoin).coinCode === "BTC") { + parentEpml.request('apiCall', { + url: `/crosschain/price/BITCOIN?inverse=false` + }).then((res) => { + this.btcqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.btcqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "LTC") { + parentEpml.request('apiCall', { + url: `/crosschain/price/LITECOIN?inverse=false` + }).then((res) => { + this.ltcqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.ltcqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DOGE") { + parentEpml.request('apiCall', { + url: `/crosschain/price/DOGECOIN?inverse=false` + }).then((res) => { + this.dogeqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.dogeqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "DGB") { + parentEpml.request('apiCall', { + url: `/crosschain/price/DIGIBYTE?inverse=false` + }).then((res) => { + this.dgbqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.dgbqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "RVN") { + parentEpml.request('apiCall', { + url: `/crosschain/price/RAVENCOIN?inverse=false` + }).then((res) => { + this.rvnqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.rvnqort}` + } else if (this.listedCoins.get(this.selectedCoin).coinCode === "ARRR") { + parentEpml.request('apiCall', { + url: `/crosschain/price/PIRATECHAIN?inverse=false` + }).then((res) => { + this.arrrqort = (Number(res) / 1e8).toFixed(8) + }) + return html`${this.arrrqort}` + } + } + + async updateWalletBalance() { + let _url = `` + let _body = null + + switch (this.selectedCoin) { + case 'BITCOIN': + _url = `/crosschain/btc/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey + break + case 'LITECOIN': + _url = `/crosschain/ltc/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey + break + case 'DOGECOIN': + _url = `/crosschain/doge/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey + break + case 'DIGIBYTE': + _url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey + break + case 'RAVENCOIN': + _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey + break + case 'PIRATECHAIN': + _url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58 + break + default: + break + } + + this.showGetWalletBance = true + + await parentEpml.request('apiCall', { + url: _url, + method: 'POST', + body: _body + }).then((res) => { + if (isNaN(Number(res))) { + //... + } else { + this.listedCoins.get(this.selectedCoin).balance = (Number(res) / 1e8).toFixed(8) + } + }) + + this.showGetWalletBance = false + } + + async fetchWalletAddress(coin) { + switch (coin) { + case 'PIRATECHAIN': + let res = await parentEpml.request('apiCall', { + url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58}` + }) + if (res != null && res.error != 1201) { + this.arrrWalletAddress = res + } + break + + default: + // Not used for other coins yet + break + } + } + + async setForeignCoin(coin, beingInitialized) { + let _this = this + this.selectedCoin = coin + + let coinSelectionMenu = this.shadowRoot.getElementById("coinSelectionMenu") + + if (beingInitialized) { + coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').setAttribute('style', 'padding-left: 60px;') + let pairIconContainer = document.createElement("span") + let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() + pairIconContainer.setAttribute("class", "pairIconContainer") + pairIconContainer.setAttribute('style', 'left: 10px;top: 50%;transform: translate(0, -50%);height: 26px;width: 45px;position: absolute;background-repeat: no-repeat;background-size: cover;background-image: url(/img/qort' + pairicon + '.png);') + coinSelectionMenu.shadowRoot.querySelector('.mdc-select--outlined .mdc-select__anchor').appendChild(pairIconContainer) + } else { + let pairIconContainer = coinSelectionMenu.shadowRoot.querySelector(".mdc-select--outlined .mdc-select__anchor span.pairIconContainer") + let pairicon = (_this.listedCoins.get(_this.selectedCoin).coinCode).toLowerCase() + pairIconContainer.style.backgroundImage = 'url(/img/qort' + pairicon + '.png)' + } + + this.isLoadingHistoricTrades = true + this.isLoadingOpenTrades = true + this.createConnection() + this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) { + const priceString2 = get("tradepage.tchange9") + root.innerHTML = '' + priceString2 + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')' + } + this.clearSellForm() + this.clearBuyForm() + await this.updateWalletBalance() + await this.fetchWalletAddress(coin) + } + + displayTabContent(tab) { + const tabPane = this.shadowRoot.getElementById("tabs-1") + tabPane.setAttribute("activeIndex", (tab === 'buy') ? '0' : '1') + + const tabBuyContent = this.shadowRoot.getElementById('tab-buy-content') + tabBuyContent.style.display = (tab === 'buy') ? 'block' : 'none' + + const tabSellContent = this.shadowRoot.getElementById('tab-sell-content') + tabSellContent.style.display = (tab === 'sell') ? 'block' : 'none' + } + + setDefaultSellPrice() { + this.displayTabContent('sell') + const tabSellPrice = this.shadowRoot.getElementById('sellPriceInput') + tabSellPrice.value = this.qortRatio.isNaN ? 0 : this.qortRatio + } + + async reRenderHistoricTrades() { + this.requestUpdate() + await this.updateComplete + this.isLoadingHistoricTrades = false + } + + async reRenderOpenFilteredOrders() { + this.requestUpdate() + await this.updateComplete + this.isLoadingOpenTrades = false + } + + async reRenderMyOpenOrders() { + this.requestUpdate() + await this.updateComplete + this.isLoadingMyOpenOrders = false + } + + fillBuyForm(sellerRequest) { + 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('buyTotalInput').value = parseFloat(sellerRequest.item.foreignAmount) + this.shadowRoot.getElementById('qortalAtAddress').value = sellerRequest.item.qortalAtAddress + const buyFunds = this.round(parseFloat(sellerRequest.item.foreignAmount)) + const haveFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance)) + if (Number(haveFunds) > Number(buyFunds)) { + this.buyBtnDisable = false + this.autoBuyWarning = false + this.displayTabContent('buy') + } else { + this.buyBtnDisable = true + this.autoBuyWarning = true + this.displayTabContent('buy') + } + + } + + processOfferingTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + const offerItem = { + ...offer, + qortAmount: parseFloat(offer.qortAmount), + price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), + } + const addOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.unshift(offerItem) + } + const initOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.push(offerItem) + } + this.listedCoins.get(offer.foreignBlockchain).openOrders.length === 0 ? initOffer() : addOffer() + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + } catch (e) { + console.log("Error adding offer from " + offer.foreignBlockchain) + } + } + + processRedeemedTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'SOLD' + } + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'BOUGHT' + } + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + const addNewHistoricTrade = () => { + this._historicTradesGrid.items.unshift(offer) + this._historicTradesGrid.clearCache() + } + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null + + } + } catch (e) { + console.log("Error processing redeemed trade offer from " + offer.foreignBlockchain) + } + } + + processTradingTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + } + } catch (e) { + console.log("Error processing trading trade offer from " + offer.foreignBlockchain) + } + } + + processRefundedTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + + } + } catch (e) { + console.log("Error processing refunded trade offer from " + offer.foreignBlockchain) + } + } + + processCancelledTrade(offer) { + try { + if (this.listedCoins.get(offer.foreignBlockchain).name != '') { + + if (offer.qortalCreator === this.selectedAddress.address) { + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + this._stuckOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._stuckOrdersGrid.items.splice(index, 1) + this._stuckOrdersGrid.clearCache() + } + }) + } + } catch (e) { + console.log("Error processing cancelled trade offer from " + offer.foreignBlockchain) + } + } + + /** + * TRADE OFFER STATES or MODE + * - OFFERING + * - REDEEMED + * - TRADING + * - REFUNDED + * - CANCELLED + */ + + processTradeOffers(offers) { + offers.forEach((offer) => { + if (offer.mode === 'OFFERING') { + this.processOfferingTrade(offer) + } else if (offer.mode === 'REDEEMED') { + this.processRedeemedTrade(offer) + } else if (offer.mode === 'TRADING') { + this.processTradingTrade(offer) + } else if (offer.mode === 'REFUNDED') { + this.processRefundedTrade(offer) + } else if (offer.mode === 'CANCELLED') { + this.processCancelledTrade(offer) + } + }) + } + + /** + * TradeBot Note by cat + * + * trade-bot entry states: + * - when you do /crosschain/tradebot/create, + * - it returns unsigned DEPLOY_AT for you to sign & broadcast + * - so initial trade-bot state is BOB_WAITING_FOR_AT_CONFIRM, because trade-bot is waiting for UI to sign & broadcast txn and for that txn to be confirmed into a block + * - once that happens & Bob's trade-bot notices that DEPLOY_AT has confirmed (and hence AT created and running), then it switches to BOB_WAITING_FOR_MESSAGE + * - which is Bob's trade-bot waiting for a message from Alice's trade-bot telling it (Bob's trade-bot) that Alice's trade-bot has funded P2SH-A and some other details + * - when that message is sent, Bob's trade-bot processes that message and sends its own message to the AT (which switches it to TRADING mode) + * - but the next state for Bob's trade-bot is to wait for Alice to spot AT is locked to her and for her to fund P2SH-B, hence BOB_WAITING_FOR_P2SH_B + * - at this point, Bob's trade-bot finds P2SH-B on the litecoin blockchain and can send secret-B to P2SH-B + * - when this happens, Alice uses secret-B and secret-A to redeem the QORT from the AT, so until Alice does this, Bob's trade-bot state is BOB_WAITING_FOR_AT_REDEEM + * - after Alice redeems QORT from AT, Bob can extract secret-A and capture the actual LTC funds from P2SH-A to his own litecoin account and hence his trade-bot moves to BOB_DONE + * - if anything goes wrong then refunds occur and Bob's trade-bot ends up at BOB_REFUNDED instead + * - I think you can probably guess the corresponding meaning of states for Alice's point of view, but if not I can go through those too? + * - Alice calls /crosschain/tradebot/respond which funds P2SH-A + * - so her trade-bot waits for that to appear in litecoin blockchain, so until then is ALICE_WAITING_FOR_P2SH_A + * - once the P2SH-A funding confirms, Alice's trade-bot can MESSAGE Bob's trade-bot with the details and changes to ALICE_WAITING_FOR_AT_LOCK + * - Bob's AT should then lock to trading with Alice (via those MESSAGEs above) and Alice's trade-bot notices this, (minimally) funds P2SH-B and waits until Bob 'spends' P2SH-B, hence ALICE_WATCH_P2SH_B + * - if Bob spends P2SH-B, then Alice can send secret-B and secret-A to the AT, claim the QORT and she's ALICE_DONE + * - if something goes wrong then her trade-bot needs to refund P2SH-B (if applicable) first (ALICE_REFUNDING_B) + * - and when that's done refund P2SH-A (ALICE_REFUNDING_A) + * - and when that's done her trade-bot ends up at ALICE_REFUNDED + * + * (PHEW) + */ + + processTradeBotStates(tradeStates) { + + /** + * BitcoinACCTv1 TRADEBOT STATES + * - BOB_WAITING_FOR_AT_CONFIRM + * - BOB_WAITING_FOR_MESSAGE + * - BOB_WAITING_FOR_AT_REDEEM + * - BOB_DONE + * - BOB_REFUNDED + * - ALICE_WAITING_FOR_AT_LOCK + * - ALICE_DONE + * - ALICE_REFUNDING_A + * - ALICE_REFUNDED + * + * @param {[{}]} states + */ + + const BitcoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { + this.changeTradeBotState(state, 'PENDING') + } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { + this.changeTradeBotState(state, 'LISTED') + } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { + this.changeTradeBotState(state, 'TRADING') + } else if (state.tradeState == 'BOB_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'BOB_REFUNDED') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + /** + * LitecoinACCTv1 TRADEBOT STATES + * - BOB_WAITING_FOR_AT_CONFIRM + * - BOB_WAITING_FOR_MESSAGE + * - BOB_WAITING_FOR_AT_REDEEM + * - BOB_DONE + * - BOB_REFUNDED + * - ALICE_WAITING_FOR_AT_LOCK + * - ALICE_DONE + * - ALICE_REFUNDING_A + * - ALICE_REFUNDED + * + * @param {[{}]} states + */ + + const LitecoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { + this.changeTradeBotState(state, 'PENDING') + } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { + this.changeTradeBotState(state, 'LISTED') + } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { + this.changeTradeBotState(state, 'TRADING') + } else if (state.tradeState == 'BOB_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'BOB_REFUNDED') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + /** + * DogecoinACCTv1 TRADEBOT STATES + * - BOB_WAITING_FOR_AT_CONFIRM + * - BOB_WAITING_FOR_MESSAGE + * - BOB_WAITING_FOR_AT_REDEEM + * - BOB_DONE + * - BOB_REFUNDED + * - ALICE_WAITING_FOR_AT_LOCK + * - ALICE_DONE + * - ALICE_REFUNDING_A + * - ALICE_REFUNDED + * + * @param {[{}]} states + */ + + const DogecoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { + this.changeTradeBotState(state, 'PENDING') + } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { + this.changeTradeBotState(state, 'LISTED') + } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { + this.changeTradeBotState(state, 'TRADING') + } else if (state.tradeState == 'BOB_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'BOB_REFUNDED') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + /** + * DigibyteACCTv1 TRADEBOT STATES + * - BOB_WAITING_FOR_AT_CONFIRM + * - BOB_WAITING_FOR_MESSAGE + * - BOB_WAITING_FOR_AT_REDEEM + * - BOB_DONE + * - BOB_REFUNDED + * - ALICE_WAITING_FOR_AT_LOCK + * - ALICE_DONE + * - ALICE_REFUNDING_A + * - ALICE_REFUNDED + * + * @param {[{}]} states + */ + + const DigibyteACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { + this.changeTradeBotState(state, 'PENDING') + } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { + this.changeTradeBotState(state, 'LISTED') + } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { + this.changeTradeBotState(state, 'TRADING') + } else if (state.tradeState == 'BOB_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'BOB_REFUNDED') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + /** + * RavencoinACCTv1 TRADEBOT STATES + * - BOB_WAITING_FOR_AT_CONFIRM + * - BOB_WAITING_FOR_MESSAGE + * - BOB_WAITING_FOR_AT_REDEEM + * - BOB_DONE + * - BOB_REFUNDED + * - ALICE_WAITING_FOR_AT_LOCK + * - ALICE_DONE + * - ALICE_REFUNDING_A + * - ALICE_REFUNDED + * + * @param {[{}]} states + */ + + const RavencoinACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { + this.changeTradeBotState(state, 'PENDING') + } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { + this.changeTradeBotState(state, 'LISTED') + } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { + this.changeTradeBotState(state, 'TRADING') + } else if (state.tradeState == 'BOB_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'BOB_REFUNDED') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + /** + * PirateChainACCTv1 TRADEBOT STATES + * - BOB_WAITING_FOR_AT_CONFIRM + * - BOB_WAITING_FOR_MESSAGE + * - BOB_WAITING_FOR_AT_REDEEM + * - BOB_DONE + * - BOB_REFUNDED + * - ALICE_WAITING_FOR_AT_LOCK + * - ALICE_DONE + * - ALICE_REFUNDING_A + * - ALICE_REFUNDED + * + * @param {[{}]} states + */ + + const PirateChainACCTv1 = (states) => { + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { + this.changeTradeBotState(state, 'PENDING') + } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { + this.changeTradeBotState(state, 'LISTED') + } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { + this.changeTradeBotState(state, 'TRADING') + } else if (state.tradeState == 'BOB_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'BOB_REFUNDED') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + + switch (this.selectedCoin) { + case 'BITCOIN': + BitcoinACCTv1(tradeStates) + break + case 'LITECOIN': + LitecoinACCTv1(tradeStates) + break + case 'DOGECOIN': + DogecoinACCTv1(tradeStates) + break + case 'DIGIBYTE': + DigibyteACCTv1(tradeStates) + break + case 'RAVENCOIN': + RavencoinACCTv1(tradeStates) + break + case 'PIRATECHAIN': + PirateChainACCTv1(tradeStates) + break + default: + break + } + if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter === 1) { + setTimeout(() => this.filterStuckTrades(tradeStates), 250) + } + } + + changeTradeBotState(state, tradeState) { + this.isLoadingMyOpenOrders = true + const stateItem = { + ...state, + _tradeState: tradeState, + } + const item = this._myOrdersGrid.querySelector(`#${state.atAddress}`) + const addStateItem = () => { + this.reRenderMyOpenOrders() + this._myOrdersGrid.items.unshift(stateItem) + this._myOrdersGrid.clearCache() + } + const updateStateItem = () => { + this._myOrdersGrid.items.forEach((item, index) => { + if (item.atAddress === state.atAddress) { + this.reRenderMyOpenOrders() + this._myOrdersGrid.items.splice(index, 1) + this._myOrdersGrid.items.unshift(stateItem) + this._myOrdersGrid.clearCache() + } + }) + } + item ? updateStateItem() : addStateItem() + } + + handleCompletedState(state) { + this._myOrdersGrid.items.forEach((item, index) => { + if (item.atAddress === state.atAddress) { + this.reRenderMyOpenOrders() + this._myOrdersGrid.items.splice(index, 1) + this._myOrdersGrid.clearCache() + } + }) + } + + initSocket() { + let _relatedCoin = "" + let tradePresenceTxns = null + let offeringTrades = null + + self.addEventListener('message', function (event) { + switch (event.data.type) { + case 'open_orders': + offeringTrades = event.data.content + processOffersWithPresence() + break + case 'set_coin': + _relatedCoin = event.data.content + break + default: + break + } + }) + + const lessThanThirtyMinsAgo = (timestamp) => { + const THIRTYMINS = 1000 * 60 * 30 + const thirtyMinsAgo = Date.now() - THIRTYMINS + return timestamp > thirtyMinsAgo + } + + const filterOffersUsingTradePresence = (offeringTrade) => { + return offeringTrade.tradePresenceExpiry > Date.now(); + } + + const processOffersWithPresence = () => { + if (offeringTrades === null) return + + async function asyncForEach(array, callback) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array) + } + } + + const startOfferPresenceMapping = async () => { + + if (tradePresenceTxns !== null) { + await asyncForEach(tradePresenceTxns, async (tradePresence) => { + let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === tradePresence.tradeAddress) + offerIndex !== -1 ? (offeringTrades[offerIndex].tradePresenceExpiry = tradePresence.timestamp) : null + }) + } + + let filteredOffers = offeringTrades.filter((offeringTrade) => filterOffersUsingTradePresence(offeringTrade)) + self.postMessage({ type: 'PRESENCE', data: { offers: offeringTrades, filteredOffers: filteredOffers, relatedCoin: _relatedCoin } }) + } + + startOfferPresenceMapping() + } + + const initTradeOffersWebSocket = (restarted = false) => { + let tradeOffersSocketCounter = 0 + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true` + const socket = new WebSocket(socketLink) + socket.onopen = () => { + setTimeout(pingSocket, 50) + tradeOffersSocketCounter += 1 + } + socket.onmessage = (e) => { + e.relatedCoin = _relatedCoin + self.postMessage({ + type: 'TRADE_OFFERS', + data: e.data, + counter: tradeOffersSocketCounter, + isRestarted: restarted, + }) + tradeOffersSocketCounter += 1 + restarted = false + } + socket.onclose = () => { + clearTimeout(socketTimeout) + restartTradeOffersWebSocket() + } + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + const initTradeBotWebSocket = (restarted = false) => { + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN` + const socket = new WebSocket(socketLink) + socket.onopen = () => { + setTimeout(pingSocket, 50) + } + socket.onmessage = (e) => { + e.relatedCoin = _relatedCoin + self.postMessage({ + type: 'TRADE_BOT', + data: e.data, + isRestarted: restarted, + }) + restarted = false + } + socket.onclose = () => { + clearTimeout(socketTimeout) + restartTradeBotWebSocket() + } + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + const initTradePresenceWebSocket = (restarted = false) => { + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence` + const socket = new WebSocket(socketLink) + socket.onopen = () => { + setTimeout(pingSocket, 50) + } + socket.onmessage = (e) => { + tradePresenceTxns = JSON.parse(e.data) + processOffersWithPresence() + restarted = false + } + socket.onclose = () => { + clearTimeout(socketTimeout) + restartTradePresenceWebSocket() + } + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + const restartTradePresenceWebSocket = () => { + setTimeout(() => initTradePresenceWebSocket(true), 50) + } + + const restartTradeOffersWebSocket = () => { + setTimeout(() => initTradeOffersWebSocket(true), 50) + } + + const restartTradeBotWebSocket = () => { + setTimeout(() => initTradeBotWebSocket(true), 50) + } + + initTradeOffersWebSocket() + initTradePresenceWebSocket() + initTradeBotWebSocket() + } + + async sellAction() { + this.isSellLoading = true + this.sellBtnDisable = true + await this.tradeFee() + const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value + const sellTotalInput = this.shadowRoot.getElementById('sellTotalInput').value + const fundingQortAmount = this.round(parseFloat(sellAmountInput) + 0.001) + + const makeRequest = async () => { + let _receivingAddress = null + switch (this.selectedCoin) { + case 'BITCOIN': + _receivingAddress = this.selectedAddress.btcWallet.address + break + case 'LITECOIN': + _receivingAddress = this.selectedAddress.ltcWallet.address + break + case 'DOGECOIN': + _receivingAddress = this.selectedAddress.dogeWallet.address + break + case 'DIGIBYTE': + _receivingAddress = this.selectedAddress.dgbWallet.address + break + case 'RAVENCOIN': + _receivingAddress = this.selectedAddress.rvnWallet.address + break + case 'PIRATECHAIN': + _receivingAddress = this.arrrWalletAddress + break + default: + break + } return await parentEpml.request('tradeBotCreateRequest', { creatorPublicKey: this.selectedAddress.base58PublicKey, qortAmount: parseFloat(sellAmountInput), @@ -2247,579 +2264,576 @@ class TradePortal extends LitElement { foreignBlockchain: this.selectedCoin, foreignAmount: parseFloat(sellTotalInput), tradeTimeout: 120, - receivingAddress: _receivingAddress, + receivingAddress: _receivingAddress }) - } + } - const manageResponse = (response) => { - if (response === true) { - this.isSellLoading = false - this.sellBtnDisable = false - this.shadowRoot.getElementById('sellAmountInput').value = this.initialAmount - this.shadowRoot.getElementById('sellPriceInput').value = this.initialAmount - this.shadowRoot.getElementById('sellTotalInput').value = this.initialAmount - } else if (response === false) { - this.isSellLoading = false - this.sellBtnDisable = false - let snack2string = get("tradepage.tchange20") - parentEpml.request('showSnackBar', `${snack2string}`) - } else { - this.isSellLoading = false - this.sellBtnDisable = false - let snack3string = get("tradepage.tchange21") - parentEpml.request('showSnackBar', `${snack3string}: ${response.message}`) - } - } + const manageResponse = (response) => { + if (response === true) { + this.isSellLoading = false + this.sellBtnDisable = false + this.shadowRoot.getElementById('sellAmountInput').value = this.initialAmount + this.shadowRoot.getElementById('sellPriceInput').value = this.initialAmount + this.shadowRoot.getElementById('sellTotalInput').value = this.initialAmount + } else if (response === false) { + this.isSellLoading = false + this.sellBtnDisable = false + let snack2string = get("tradepage.tchange20") + parentEpml.request('showSnackBar', `${snack2string}`) + } else { + this.isSellLoading = false + this.sellBtnDisable = false + let snack3string = get("tradepage.tchange21") + parentEpml.request('showSnackBar', `${snack3string}: ${response.message}`) + } + } - if (this.round(parseFloat(fundingQortAmount) + parseFloat(this.listedCoins.get("QORTAL").tradeFee)) > parseFloat(this.listedCoins.get("QORTAL").balance)) { - this.isSellLoading = false - this.sellBtnDisable = false - let snack4string = get("tradepage.tchange22") - parentEpml.request('showSnackBar', `${snack4string}`) - return false - } else { - const res = await makeRequest() - manageResponse(res) - } - } + if (this.round(parseFloat(fundingQortAmount) + parseFloat(this.listedCoins.get("QORTAL").tradeFee)) > parseFloat(this.listedCoins.get("QORTAL").balance)) { + this.isSellLoading = false + this.sellBtnDisable = false + let snack4string = get("tradepage.tchange22") + parentEpml.request('showSnackBar', `${snack4string}`) + return false + } else { + const res = await makeRequest() + manageResponse(res) + } + } - async buyAction() { - this.isBuyLoading = true - this.buyBtnDisable = true - const qortalAtAddress = this.shadowRoot.getElementById('qortalAtAddress').value - let _foreignKey = "" + async buyAction() { + this.isBuyLoading = true + this.buyBtnDisable = true + const qortalAtAddress = this.shadowRoot.getElementById('qortalAtAddress').value + let _foreignKey = "" - switch (this.selectedCoin) { - case 'BITCOIN': - _foreignKey = this.selectedAddress.btcWallet.derivedMasterPrivateKey - break - case 'LITECOIN': - _foreignKey = this.selectedAddress.ltcWallet.derivedMasterPrivateKey - break - case 'DOGECOIN': - _foreignKey = this.selectedAddress.dogeWallet.derivedMasterPrivateKey - break - case 'DIGIBYTE': - _foreignKey = this.selectedAddress.dgbWallet.derivedMasterPrivateKey - break + switch (this.selectedCoin) { + case 'BITCOIN': + _foreignKey = this.selectedAddress.btcWallet.derivedMasterPrivateKey + break + case 'LITECOIN': + _foreignKey = this.selectedAddress.ltcWallet.derivedMasterPrivateKey + break + case 'DOGECOIN': + _foreignKey = this.selectedAddress.dogeWallet.derivedMasterPrivateKey + break + case 'DIGIBYTE': + _foreignKey = this.selectedAddress.dgbWallet.derivedMasterPrivateKey + break case 'RAVENCOIN': - _foreignKey = this.selectedAddress.rvnWallet.derivedMasterPrivateKey - break - case 'PIRATECHAIN': - _foreignKey = this.selectedAddress.arrrWallet.seed58 - break - default: - break - } + _foreignKey = this.selectedAddress.rvnWallet.derivedMasterPrivateKey + break + case 'PIRATECHAIN': + _foreignKey = this.selectedAddress.arrrWallet.seed58 + break + default: + break + } - const makeRequest = async () => { + const makeRequest = async () => { return await parentEpml.request('tradeBotRespondRequest', { atAddress: qortalAtAddress, foreignKey: _foreignKey, - receivingAddress: this.selectedAddress.address, + receivingAddress: this.selectedAddress.address }) - } + } - const manageResponse = (response) => { - if (response === true) { - this.isBuyLoading = false - this.buyBtnDisable = true - this.shadowRoot.getElementById('buyAmountInput').value = this.initialAmount - this.shadowRoot.getElementById('buyPriceInput').value = this.initialAmount - this.shadowRoot.getElementById('buyTotalInput').value = this.initialAmount - this.shadowRoot.getElementById('qortalAtAddress').value = '' - let snack5string = get("tradepage.tchange23") - parentEpml.request('showSnackBar', `${snack5string}`) - } else if (response === false) { - this.isBuyLoading = false - this.buyBtnDisable = false - let snack6string = get("tradepage.tchange24") - parentEpml.request('showSnackBar', `${snack6string}`) - } else { - this.isBuyLoading = false - this.buyBtnDisable = false - let snack7string = get("tradepage.tchange25") - parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + const manageResponse = (response) => { + if (response === true) { + this.isBuyLoading = false + this.buyBtnDisable = true + this.shadowRoot.getElementById('buyAmountInput').value = this.initialAmount + this.shadowRoot.getElementById('buyPriceInput').value = this.initialAmount + this.shadowRoot.getElementById('buyTotalInput').value = this.initialAmount + this.shadowRoot.getElementById('qortalAtAddress').value = '' + let snack5string = get("tradepage.tchange23") + parentEpml.request('showSnackBar', `${snack5string}`) + } else if (response === false) { + this.isBuyLoading = false + this.buyBtnDisable = false + let snack6string = get("tradepage.tchange24") + parentEpml.request('showSnackBar', `${snack6string}`) + } else { + this.isBuyLoading = false + this.buyBtnDisable = false + let snack7string = get("tradepage.tchange25") + parentEpml.request('showSnackBar', `${snack7string}: ${response.message}`) + } + } + const res = await makeRequest() + manageResponse(res) + } - async cancelAction(state) { - const button = this.shadowRoot.querySelector(`mwc-button#${state.atAddress}`) - button.innerHTML = `` - this.cancelBtnDisable = true + async cancelAction(state) { + const button = this.shadowRoot.querySelector(`mwc-button#${state.atAddress}`) + button.innerHTML = `` + this.cancelBtnDisable = true - const makeRequest = async () => { + const makeRequest = async () => { return await parentEpml.request('deleteTradeOffer', { creatorPublicKey: this.selectedAddress.base58PublicKey, - atAddress: state.atAddress, + atAddress: state.atAddress }) - } + } - const manageResponse = (response) => { - if (response === true) { - button.remove() - this.cancelBtnDisable = false - let snack8string = get("tradepage.tchange26") - parentEpml.request('showSnackBar', `${snack8string}`) - } else if (response === false) { - button.innerHTML = 'CANCEL' - this.cancelBtnDisable = false - let snack9string = get("tradepage.tchange27") - parentEpml.request('showSnackBar', `${snack9string}`) - } else { - button.innerHTML = 'CANCEL' - this.cancelBtnDisable = false - let snack10string = get("tradepage.tchange28") - parentEpml.request('showSnackBar', `${snack10string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + const manageResponse = (response) => { + if (response === true) { + button.remove() + this.cancelBtnDisable = false + let snack8string = get("tradepage.tchange26") + parentEpml.request('showSnackBar', `${snack8string}`) + } else if (response === false) { + button.innerHTML = 'CANCEL' + this.cancelBtnDisable = false + let snack9string = get("tradepage.tchange27") + parentEpml.request('showSnackBar', `${snack9string}`) + } else { + button.innerHTML = 'CANCEL' + this.cancelBtnDisable = false + let snack10string = get("tradepage.tchange28") + parentEpml.request('showSnackBar', `${snack10string}: ${response.message}`) + } + } + const res = await makeRequest() + manageResponse(res) + } - updateAccountBalance() { - clearTimeout(this.updateAccountBalanceTimeout) - parentEpml.request('apiCall', { - url: `/addresses/balance/${this.selectedAddress.address}?apiKey=${this.getApiKey()}`, - }) - .then((res) => { - this.listedCoins.get("QORTAL").balance = res - this.updateAccountBalanceTimeout = setTimeout(() => this.updateAccountBalance(), 10000) - }) - } + updateAccountBalance() { + clearTimeout(this.updateAccountBalanceTimeout) + parentEpml.request('apiCall', { + url: `/addresses/balance/${this.selectedAddress.address}?apiKey=${this.getApiKey()}`, + }).then((res) => { + this.listedCoins.get("QORTAL").balance = res + this.updateAccountBalanceTimeout = setTimeout(() => this.updateAccountBalance(), 10000) + }) + } - renderCancelButton(stateItem) { - if (stateItem.tradeState === 'BOB_WAITING_FOR_MESSAGE') { - return html` this.cancelAction(stateItem)}>${translate("tradepage.tchange29")}` - } else { - return '' - } - } + renderCancelButton(stateItem) { + if (stateItem.tradeState === 'BOB_WAITING_FOR_MESSAGE') { + return html` this.cancelAction(stateItem)}>${translate("tradepage.tchange29")}` + } else { + return '' + } + } - showStuckOrdersDialog() { - this.shadowRoot.querySelector('#manageStuckOrdersDialog').show() - } + showStuckOrdersDialog() { + this.shadowRoot.querySelector('#manageStuckOrdersDialog').show() + } - async cancelStuckOfferAction(offer) { - this.cancelStuckOfferBtnDisable = true + async cancelStuckOfferAction(offer) { + this.cancelStuckOfferBtnDisable = true - const makeRequest = async () => { + const makeRequest = async () => { return await parentEpml.request('deleteTradeOffer', { creatorPublicKey: this.selectedAddress.base58PublicKey, - atAddress: offer.qortalAtAddress, + atAddress: offer.qortalAtAddress }) - } + } - const manageResponse = (response) => { - if (response === true) { - this.cancelStuckOfferBtnDisable = false - let snack11string = get("tradepage.tchange26") - parentEpml.request('showSnackBar', `${snack11string}`) - } else if (response === false) { - this.cancelStuckOfferBtnDisable = false - let snack12string = get("tradepage.tchange27") - parentEpml.request('showSnackBar', `${snack12string}`) - } else { - this.cancelStuckOfferBtnDisable = false - let snack13string = get("tradepage.tchange28") - parentEpml.request('showSnackBar', `${snack13string}: ${response.message}`) - } - } - const res = await makeRequest() - manageResponse(res) - } + const manageResponse = (response) => { + if (response === true) { + this.cancelStuckOfferBtnDisable = false + let snack11string = get("tradepage.tchange26") + parentEpml.request('showSnackBar', `${snack11string}`) + } else if (response === false) { + this.cancelStuckOfferBtnDisable = false + let snack12string = get("tradepage.tchange27") + parentEpml.request('showSnackBar', `${snack12string}`) + } else { + this.cancelStuckOfferBtnDisable = false + let snack13string = get("tradepage.tchange28") + parentEpml.request('showSnackBar', `${snack13string}: ${response.message}`) + } + } + const res = await makeRequest() + manageResponse(res) + } - renderCancelStuckOfferButton(offerItem) { - if (offerItem.mode === 'OFFERING' && offerItem.qortalCreator === this.selectedAddress.address) { - return html` this.cancelStuckOfferAction(offerItem)}>CANCEL` - } else { - return '' - } - } + renderCancelStuckOfferButton(offerItem) { + if (offerItem.mode === 'OFFERING' && offerItem.qortalCreator === this.selectedAddress.address) { + return html` this.cancelStuckOfferAction(offerItem)}>CANCEL` + } else { + return '' + } + } - _checkSellAmount(e) { - const targetAmount = e.target.value - const target = e.target + _checkSellAmount(e) { + const targetAmount = e.target.value + const target = e.target - if (targetAmount.length === 0) { - this.isValidAmount = false - this.sellBtnDisable = true - e.target.blur() - e.target.focus() - e.target.invalid = true - } else { - const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value - const sellPriceInput = this.shadowRoot.getElementById('sellPriceInput').value - this.shadowRoot.getElementById('sellTotalInput').value = this.round(parseFloat(sellAmountInput) * parseFloat(sellPriceInput)) - this.sellBtnDisable = false - } + if (targetAmount.length === 0) { + this.isValidAmount = false + this.sellBtnDisable = true + e.target.blur() + e.target.focus() + e.target.invalid = true + } else { + const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value + const sellPriceInput = this.shadowRoot.getElementById('sellPriceInput').value + this.shadowRoot.getElementById('sellTotalInput').value = this.round(parseFloat(sellAmountInput) * parseFloat(sellPriceInput)) + this.sellBtnDisable = false + } - e.target.blur() - e.target.focus() + e.target.blur() + e.target.focus() - e.target.validityTransform = (newValue, nativeValidity) => { - if (newValue.includes('-') === true) { - this.sellBtnDisable = true - return { - valid: false, - } - } else if (!nativeValidity.valid) { - if (newValue.includes('.') === true) { - let myAmount = newValue.split('.') - if (myAmount[1].length > 8) { - this.sellBtnDisable = true - } else { - const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value - const sellPriceInput = this.shadowRoot.getElementById('sellPriceInput').value - this.shadowRoot.getElementById('sellTotalInput').value = this.round(parseFloat(sellAmountInput) * parseFloat(sellPriceInput)) - this.sellBtnDisable = false - return { - valid: true, - } - } - } - } else { - const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value - const sellPriceInput = this.shadowRoot.getElementById('sellPriceInput').value - this.shadowRoot.getElementById('sellTotalInput').value = this.round(parseFloat(sellAmountInput) * parseFloat(sellPriceInput)) - this.sellBtnDisable = false - } - } - } + e.target.validityTransform = (newValue, nativeValidity) => { + if (newValue.includes('-') === true) { + this.sellBtnDisable = true + return { + valid: false + } + } else if (!nativeValidity.valid) { + if (newValue.includes('.') === true) { + let myAmount = newValue.split('.') + if (myAmount[1].length > 8) { + this.sellBtnDisable = true + } else { + const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value + const sellPriceInput = this.shadowRoot.getElementById('sellPriceInput').value + this.shadowRoot.getElementById('sellTotalInput').value = this.round(parseFloat(sellAmountInput) * parseFloat(sellPriceInput)) + this.sellBtnDisable = false + return { + valid: true + } + } + } + } else { + const sellAmountInput = this.shadowRoot.getElementById('sellAmountInput').value + const sellPriceInput = this.shadowRoot.getElementById('sellPriceInput').value + this.shadowRoot.getElementById('sellTotalInput').value = this.round(parseFloat(sellAmountInput) * parseFloat(sellPriceInput)) + this.sellBtnDisable = false + } + } + } - _checkBuyAmount(e) { - const targetAmount = e.target.value - const target = e.target + _checkBuyAmount(e) { + const targetAmount = e.target.value + const target = e.target - if (targetAmount.length === 0) { - this.isValidAmount = false - this.sellBtnDisable = true - e.target.blur() - e.target.focus() - e.target.invalid = true - } else { - this.buyBtnDisable = false - } + if (targetAmount.length === 0) { + this.isValidAmount = false + this.sellBtnDisable = true + e.target.blur() + e.target.focus() + e.target.invalid = true + } else { + this.buyBtnDisable = false + } - e.target.blur() - e.target.focus() + e.target.blur() + e.target.focus() - e.target.validityTransform = (newValue, nativeValidity) => { - if (newValue.includes('-') === true) { - this.buyBtnDisable = true - return { - valid: false, - } - } else if (!nativeValidity.valid) { - if (newValue.includes('.') === true) { - let myAmount = newValue.split('.') - if (myAmount[1].length > 8) { - this.buyBtnDisable = true - } else { - this.buyBtnDisable = false - return { - valid: true, - } - } - } - } else { - this.buyBtnDisable = false - } - } - } + e.target.validityTransform = (newValue, nativeValidity) => { + if (newValue.includes('-') === true) { + this.buyBtnDisable = true + return { + valid: false + } + } else if (!nativeValidity.valid) { + if (newValue.includes('.') === true) { + let myAmount = newValue.split('.') + if (myAmount[1].length > 8) { + this.buyBtnDisable = true + } else { + this.buyBtnDisable = false + return { + valid: true + } + } + } + } else { + this.buyBtnDisable = false + } + } + } - async tradeFee() { - 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/unitfee?txType=DEPLOY_AT` - await fetch(url).then((response) => { - if (response.ok) { - return response.json() - } - return Promise.reject(response) - }).then((json) => { - this.listedCoins.get("QORTAL").tradeFee = (Number(json) * 2) / 1e8 - }) - } + async tradeFee() { + 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/unitfee?txType=DEPLOY_AT` + await fetch(url).then((response) => { + if (response.ok) { + return response.json() + } + return Promise.reject(response) + }).then((json) => { + this.listedCoins.get("QORTAL").tradeFee = (Number(json) * 2) / 1e8 + }) + } + clearBuyForm() { + this.shadowRoot.getElementById('buyAmountInput').value = this.initialAmount + this.shadowRoot.getElementById('buyPriceInput').value = this.initialAmount + this.shadowRoot.getElementById('buyTotalInput').value = this.initialAmount + this.shadowRoot.getElementById('qortalAtAddress').value = '' + this.buyBtnDisable = true + } - getApiKey() { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - return myNode.apiKey; - } + clearSellForm() { + this.shadowRoot.getElementById('sellAmountInput').value = this.initialAmount + this.shadowRoot.getElementById('sellPriceInput').value = this.initialAmount + this.shadowRoot.getElementById('sellTotalInput').value = this.initialAmount + } - clearBuyForm() { - this.shadowRoot.getElementById('buyAmountInput').value = this.initialAmount - this.shadowRoot.getElementById('buyPriceInput').value = this.initialAmount - this.shadowRoot.getElementById('buyTotalInput').value = this.initialAmount - this.shadowRoot.getElementById('qortalAtAddress').value = '' - this.buyBtnDisable = true - } + /** + * Inline Worker - Takes in a function and a modifier then returns an instance of a Web Worker + * + * - Modifiers are simply an Array of Object containing placeholders (containers for variables used in the passedFunction ) in the and its values. + * These placeholders gets replaced with it value during instantiation of the function to be used by the Worker. + * - Example of modifiers: const modifiers = [ + * { searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address, }, + * ] + * + * @param {Function} passedFunction + * @param {Array} modifiers + * @returns {Worker} Worker + */ - clearSellForm() { - this.shadowRoot.getElementById('sellAmountInput').value = this.initialAmount - this.shadowRoot.getElementById('sellPriceInput').value = this.initialAmount - this.shadowRoot.getElementById('sellTotalInput').value = this.initialAmount - } + inlineWorker(passedFunction, modifiers) { + let parsedFunction = `` - isEmptyArray(arr) { - if (!arr) { - return true - } - return arr.length === 0 - } + modifiers.forEach((modifier) => { + let regex = new RegExp(modifier.searchValue, 'g') + parsedFunction = parsedFunction.length === 0 ? `(function ${passedFunction.toString().trim().replace(regex, modifier.replaceValue)})()` : parsedFunction.toString().trim().replace(regex, modifier.replaceValue) + }) - round(number) { - return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) - } + const workerUrl = URL.createObjectURL(new Blob([parsedFunction], { type: 'text/javascript' })) + const worker = new Worker(workerUrl) + URL.revokeObjectURL(workerUrl) + return worker + } - /** - * Inline Worker - Takes in a function and a modifier then returns an instance of a Web Worker - * - * - Modifiers are simply an Array of Object containing placeholders (containers for variables used in the passedFunction ) in the and its values. - * These placeholders gets replaced with it value during instantiation of the function to be used by the Worker. - * - Example of modifiers: const modifiers = [ - * { searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address, }, - * ] - * - * @param {Function} passedFunction - * @param {Array} modifiers - * @returns {Worker} Worker - */ + clearPaneCache() { + this._openOrdersGrid.clearCache() + this._myHistoricTradesGrid.clearCache() + this._historicTradesGrid.clearCache() + this._myOrdersGrid.clearCache() + } - inlineWorker(passedFunction, modifiers) { - let parsedFunction = `` + createConnection() { + if (workers.get(this.selectedCoin).tradesConnectedWorker !== null) { + this.isLoadingHistoricTrades = false + this.isLoadingOpenTrades = false + return + } - modifiers.forEach((modifier) => { - let regex = new RegExp(modifier.searchValue, 'g') - parsedFunction = parsedFunction.length === 0 ? `(function ${passedFunction.toString().trim().replace(regex, modifier.replaceValue)})()` : parsedFunction.toString().trim().replace(regex, modifier.replaceValue) - }) + const handleMessage = (message) => { + switch (message.type) { + case 'TRADE_OFFERS': + if (!message.isRestarted) { + this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter = message.counter + this.processTradeOffers(JSON.parse(message.data)) + this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter === 1 ? this.clearPaneCache() : null + workers.get(this.selectedCoin).tradesConnectedWorker.postMessage(this.listedCoins.get(this.selectedCoin).openOrders) + workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "open_orders", content: this.listedCoins.get(this.selectedCoin).openOrders }) + } + return null + case 'TRADE_BOT': + if (!message.isRestarted) this.processTradeBotStates(JSON.parse(message.data)) + return null + case 'PRESENCE': + this.tradesPresenceCleaned = [] + this.listedCoins.get(message.data.relatedCoin).openOrders = message.data.offers + this.tradesPresenceCleaned = message.data.filteredOffers - const workerUrl = URL.createObjectURL(new Blob([parsedFunction], { type: 'text/javascript' })) - const worker = new Worker(workerUrl) - URL.revokeObjectURL(workerUrl) - return worker - } + const filterPresenceList = () => { + this.blockedTradesList.forEach(item => { + const toDelete = item.recipient + this.tradesPresenceCleaned = this.tradesPresenceCleaned.filter(el => { + return el.qortalCreatorTradeAddress !== toDelete + }) + }) + } - clearPaneCache() { - this._openOrdersGrid.clearCache() - this._myHistoricTradesGrid.clearCache() - this._historicTradesGrid.clearCache() - this._myOrdersGrid.clearCache() - } + filterPresenceList() + this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned + this.reRenderOpenFilteredOrders() + return null + default: + break + } + } - createConnection() { - if (workers.get(this.selectedCoin).tradesConnectedWorker !== null) { - this.isLoadingHistoricTrades = false - this.isLoadingOpenTrades = false - return - } + let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + let nodeUrl = myNode.domain + ':' + myNode.port - const handleMessage = (message) => { - switch (message.type) { - case 'TRADE_OFFERS': - if (!message.isRestarted) { - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter = message.counter - this.processTradeOffers(JSON.parse(message.data)) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter === 1 ? this.clearPaneCache() : null - workers.get(this.selectedCoin).tradesConnectedWorker.postMessage(this.listedCoins.get(this.selectedCoin).openOrders) - workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "open_orders", content: this.listedCoins.get(this.selectedCoin).openOrders }) - } - return null - case 'TRADE_BOT': - if (!message.isRestarted) this.processTradeBotStates(JSON.parse(message.data)) - return null - case 'PRESENCE': - this.tradesPresenceCleaned = [] - this.listedCoins.get(message.data.relatedCoin).openOrders = message.data.offers - this.tradesPresenceCleaned = message.data.filteredOffers + const modifiers = [ + { searchValue: 'NODEURL', replaceValue: nodeUrl }, + { searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }, + ] - const filterPresenceList = () => { - this.blockedTradesList.forEach(item => { - const toDelete = item.recipient - this.tradesPresenceCleaned = this.tradesPresenceCleaned.filter(el => { - return el.qortalCreatorTradeAddress !== toDelete - }) - }) - } + workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers) - filterPresenceList() - this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned - this.reRenderOpenFilteredOrders() - return null - default: - break - } - } + workers.get(this.selectedCoin).tradesConnectedWorker.addEventListener('message', function (event) { handleMessage(event.data) }, { passive: true }) - let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - let nodeUrl = myNode.domain + ':' + myNode.port + workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "set_coin", content: this.selectedCoin }) - const modifiers = [ - { searchValue: 'NODEURL', replaceValue: nodeUrl }, - { searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }, - ] + } - workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers) + async getNewBlockedTrades() { + const unconfirmedTransactionsList = async () => { + const myNodeInf = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + const myNodeUrl = myNodeInf.protocol + '://' + myNodeInf.domain + ':' + myNodeInf.port + const unconfirmedTransactionslUrl = `${myNodeUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` - workers.get(this.selectedCoin).tradesConnectedWorker.addEventListener('message', function (event) { handleMessage(event.data) }, { passive: true }) + var addBlockedTrades = JSON.parse(localStorage.getItem('failedTrades') || '[]') - workers.get(this.selectedCoin).tradesConnectedWorker.postMessage({ type: "set_coin", content: this.selectedCoin }) + await fetch(unconfirmedTransactionslUrl).then(response => { + return response.json() + }).then(data => { + data.map(item => { + const unconfirmedNessageTimeDiff = Date.now() - item.timestamp + const timeOneHour = 60 * 60 * 1000 + if (Number(unconfirmedNessageTimeDiff) > Number(timeOneHour)) { + const addBlocked = { + timestamp: item.timestamp, + recipient: item.recipient + } + addBlockedTrades.push(addBlocked) + } + }) + localStorage.setItem("failedTrades", JSON.stringify(addBlockedTrades)) + this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') + }) + } - } + await unconfirmedTransactionsList() - async getNewBlockedTrades() { - const unconfirmedTransactionsList = async () => { - const myNodeInf = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - const myNodeUrl = myNodeInf.protocol + '://' + myNodeInf.domain + ':' + myNodeInf.port - const unconfirmedTransactionslUrl = `${myNodeUrl}/transactions/unconfirmed?txType=MESSAGE&limit=0&reverse=true` + const filterUnconfirmedTransactionsList = async () => { + let cleanBlockedTrades = this.blockedTradesList.reduce((newArray, cut) => { + if (!newArray.some(obj => obj.recipient === cut.recipient)) { + newArray.push(cut) + } + return newArray + }, []) + localStorage.setItem("failedTrades", JSON.stringify(cleanBlockedTrades)) + this.blockedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") + } - var addBlockedTrades = JSON.parse(localStorage.getItem('failedTrades') || '[]') + await filterUnconfirmedTransactionsList() + } - await fetch(unconfirmedTransactionslUrl).then(response => { - return response.json() - }).then(data => { - data.map(item => { - const unconfirmedNessageTimeDiff = Date.now() - item.timestamp - const timeOneHour = 60 * 60 * 1000 - if (Number(unconfirmedNessageTimeDiff) > Number(timeOneHour)) { - const addBlocked = { - timestamp: item.timestamp, - recipient: item.recipient - } - addBlockedTrades.push(addBlocked) - } - }) - localStorage.setItem("failedTrades", JSON.stringify(addBlockedTrades)) - this.blockedTradesList = JSON.parse(localStorage.getItem('failedTrades') || '[]') - }) - } + handleStuckTrades() { + let tradeBotStates = [] - await unconfirmedTransactionsList() + self.addEventListener('message', function (event) { + tradeBotStates = event.data + }) - const filterUnconfirmedTransactionsList = async () => { - let cleanBlockedTrades = this.blockedTradesList.reduce((newArray, cut) => { - if(!newArray.some(obj => obj.recipient === cut.recipient)) { - newArray.push(cut) - } - return newArray - },[]) - localStorage.setItem("failedTrades", JSON.stringify(cleanBlockedTrades)) - this.blockedTradesList = JSON.parse(localStorage.getItem("failedTrades") || "[]") - } + const getCompletedTrades = async () => { + const url = `http://NODEURL/crosschain/trades?limit=25&reverse=true&foreignBlockchain=FOREIGN_BLOCKCHAIN` + const res = await fetch(url) + const historicTrades = await res.json() + const compareFn = (a, b) => { + return b.tradeTimestamp - a.tradeTimestamp + } + const sortedTrades = historicTrades.sort(compareFn) + self.postMessage({ type: 'HISTORIC_TRADES', data: sortedTrades }) + } - await filterUnconfirmedTransactionsList() - } - - handleStuckTrades() { - let tradeBotStates = [] - - self.addEventListener('message', function (event) { - tradeBotStates = event.data - }) - - const getCompletedTrades = async () => { - const url = `http://NODEURL/crosschain/trades?limit=25&reverse=true&foreignBlockchain=FOREIGN_BLOCKCHAIN` - const res = await fetch(url) - const historicTrades = await res.json() - const compareFn = (a, b) => { - return b.tradeTimestamp - a.tradeTimestamp - } - const sortedTrades = historicTrades.sort(compareFn) - self.postMessage({ type: 'HISTORIC_TRADES', data: sortedTrades }) - } - - const filterStuckOffers = (myOffers) => { - const myTradeBotStates = tradeBotStates.filter((state) => state.creatorAddress === 'SELECTED_ADDRESS') + const filterStuckOffers = (myOffers) => { + const myTradeBotStates = tradeBotStates.filter((state) => state.creatorAddress === 'SELECTED_ADDRESS') return myOffers.filter((myOffer) => { let value = myTradeBotStates.some((myTradeBotState) => myOffer.qortalAtAddress === myTradeBotState.atAddress) return !value }) - } + } - const getOffers = async () => { - const url = `http://NODEURL/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN` - const res = await fetch(url) - const openTradeOrders = await res.json() - const myOpenTradeOrders = await openTradeOrders.filter((order) => order.mode === 'OFFERING' && order.qortalCreator === 'SELECTED_ADDRESS') - const stuckOffers = filterStuckOffers(myOpenTradeOrders) - self.postMessage({ type: 'STUCK_OFFERS', data: stuckOffers }) - } - setTimeout(() => { getOffers() }, 1000) - setTimeout(() => { getCompletedTrades() }, 1000) - } + const getOffers = async () => { + const url = `http://NODEURL/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN` + const res = await fetch(url) + const openTradeOrders = await res.json() + const myOpenTradeOrders = await openTradeOrders.filter((order) => order.mode === 'OFFERING' && order.qortalCreator === 'SELECTED_ADDRESS') + const stuckOffers = filterStuckOffers(myOpenTradeOrders) + self.postMessage({ type: 'STUCK_OFFERS', data: stuckOffers }) + } + setTimeout(() => { getOffers() }, 1000) + setTimeout(() => { getCompletedTrades() }, 1000) + } - filterStuckTrades(states) { - if (workers.get(this.selectedCoin).handleStuckTradesConnectedWorker !== null) { - this.isLoadingOpenTrades = false - return - } + filterStuckTrades(states) { + if (workers.get(this.selectedCoin).handleStuckTradesConnectedWorker !== null) { + this.isLoadingOpenTrades = false + return + } - this.shadowRoot.getElementById('loadingHistoricTrades').style.display = "block"; - let isHandleTradesDone = false - let isHandleStuckOffersDone = false + this.shadowRoot.getElementById('loadingHistoricTrades').style.display = "block"; + let isHandleTradesDone = false + let isHandleStuckOffersDone = false - const handleMessage = (message) => { - switch (message.type) { - case 'HISTORIC_TRADES': - this.listedCoins.get(this.selectedCoin).historicTrades = message.data - this.reRenderHistoricTrades() - isHandleTradesDone = true - break - case 'STUCK_OFFERS': - doStuckOffers(message.data) - isHandleStuckOffersDone = true - break - default: - break - } - if (isHandleTradesDone === true && isHandleStuckOffersDone === true) return workers.get(this.selectedCoin).handleStuckTradesConnectedWorker.terminate() - } + const handleMessage = (message) => { + switch (message.type) { + case 'HISTORIC_TRADES': + this.listedCoins.get(this.selectedCoin).historicTrades = message.data + this.reRenderHistoricTrades() + isHandleTradesDone = true + break + case 'STUCK_OFFERS': + doStuckOffers(message.data) + isHandleStuckOffersDone = true + break + default: + break + } + if (isHandleTradesDone === true && isHandleStuckOffersDone === true) return workers.get(this.selectedCoin).handleStuckTradesConnectedWorker.terminate() + } - const doStuckOffers = (message) => { - const offers = message - const offerItem = (offer) => { - return { - ...offer, - price: this.round(parseFloat(offer.expectedForeignAmount) / parseFloat(offer.qortAmount)), - } - } - const addStuckOrders = (offerItem) => { - if (offerItem.qortalCreator === this.selectedAddress.address) { - this._stuckOrdersGrid.items.unshift(offerItem) - this._stuckOrdersGrid.clearCache() - } - } - const handleOffers = () => { - offers.forEach((offer) => { - addStuckOrders(offerItem(offer)) - }) - } - handleOffers() - } + const doStuckOffers = (message) => { + const offers = message + const offerItem = (offer) => { + return { + ...offer, + price: this.round(parseFloat(offer.expectedForeignAmount) / parseFloat(offer.qortAmount)), + } + } + const addStuckOrders = (offerItem) => { + if (offerItem.qortalCreator === this.selectedAddress.address) { + this._stuckOrdersGrid.items.unshift(offerItem) + this._stuckOrdersGrid.clearCache() + } + } + const handleOffers = () => { + offers.forEach((offer) => { + addStuckOrders(offerItem(offer)) + }) + } + handleOffers() + } - let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - let nodeUrl = myNode.domain + ':' + myNode.port + let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + let nodeUrl = myNode.domain + ':' + myNode.port - const modifiers = [ - { searchValue: 'NODEURL', replaceValue: nodeUrl }, - { searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address, }, - { searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin, }, - ] + const modifiers = [ + { searchValue: 'NODEURL', replaceValue: nodeUrl }, + { searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address, }, + { searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin, }, + ] - workers.get(this.selectedCoin).handleStuckTradesConnectedWorker = this.inlineWorker(this.handleStuckTrades, modifiers) - workers.get(this.selectedCoin).handleStuckTradesConnectedWorker.postMessage(states) - workers.get(this.selectedCoin).handleStuckTradesConnectedWorker.addEventListener( - 'message', - function (event) { - handleMessage(event.data) - }, - { passive: true } - ) - } + workers.get(this.selectedCoin).handleStuckTradesConnectedWorker = this.inlineWorker(this.handleStuckTrades, modifiers) + workers.get(this.selectedCoin).handleStuckTradesConnectedWorker.postMessage(states) + workers.get(this.selectedCoin).handleStuckTradesConnectedWorker.addEventListener( + 'message', + function (event) { + handleMessage(event.data) + }, + { passive: true } + ) + } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } } -window.customElements.define('trade-portal', TradePortal) +window.customElements.define('trade-portal', TradePortal) \ No newline at end of file diff --git a/plugins/plugins/core/wallet/wallet-app.src.js b/plugins/plugins/core/wallet/wallet-app.src.js index 45b3cd61..a49333d4 100644 --- a/plugins/plugins/core/wallet/wallet-app.src.js +++ b/plugins/plugins/core/wallet/wallet-app.src.js @@ -1,15 +1,15 @@ -import {css, html, LitElement} from 'lit' -import {render} from 'lit/html.js' -import {Epml} from '../../../epml.js' +import { html, LitElement } from 'lit' +import { render } from 'lit/html.js' +import { Epml } from '../../../epml' +import { decryptData, encryptData } from '../../../../core/src/lockScreen' +import { multiWalletStyles } from '../components/plugins-css' import isElectron from 'is-electron' -import {get, registerTranslateConfig, translate, use} from '../../../../core/translate' -import Base58 from '../../../../crypto/api/deps/Base58.js' -import {decryptData, encryptData} from '../../../../core/src/lockScreen.js' import FileSaver from 'file-saver' -import '../components/ButtonIconCopy.js' -import '../components/QortalQrcodeGenerator.js' -import '../components/frag-file-input.js' -import '../components/time-elements/index.js' +import Base58 from '../../../../crypto/api/deps/Base58' +import '../components/ButtonIconCopy' +import '../components/QortalQrcodeGenerator' +import '../components/frag-file-input' +import '../components/time-elements/index' import '@material/mwc-button' import '@material/mwc-checkbox' import '@material/mwc-dialog' @@ -18,20 +18,22 @@ import '@material/mwc-icon' import '@material/mwc-icon-button' import '@material/mwc-tab-bar' import '@material/mwc-textfield' +import '@polymer/iron-icons/iron-icons.js' import '@polymer/paper-dialog/paper-dialog.js' 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' import '@vaadin/icons' import '@vaadin/password-field' +// Multi language support +import { get, registerTranslateConfig, translate, use } from '../../../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -39,4031 +41,3503 @@ const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) const coinsNames = ['qort', 'btc', 'ltc', 'doge', 'dgb', 'rvn', 'arrr'] class MultiWallet extends LitElement { - static get properties() { - return { - loading: { type: Boolean }, - transactions: { type: Object }, - lastBlock: { type: Object }, - selectedTransaction: { type: Object }, - isTextMenuOpen: { type: Boolean }, - wallets: { type: Map }, - _selectedWallet: 'qort', - nodeConfig: { type: Object }, - nodeDomain: { type: String }, - theme: { type: String, reflect: true }, - amount: { type: Number }, - recipient: { type: String }, - btcRecipient: { type: String }, - btcAmount: { type: Number }, - ltcRecipient: { type: String }, - ltcAmount: { type: Number }, - dogeRecipient: { type: String }, - dogeAmount: { type: Number }, - dgbRecipient: { type: String }, - dgbAmount: { type: Number }, - rvnRecipient: { type: String }, - rvnAmount: { type: Number }, - arrrRecipient: { type: String }, - arrrAmount: { type: Number }, - arrrMemo: { type: String }, - errorMessage: { type: String }, - arrrWalletAddress: { type: String }, - unusedWalletAddress: { type: String }, - successMessage: { type: String }, - sendMoneyLoading: { type: Boolean }, - btnDisable: { type: Boolean }, - qortWarning: { type: Boolean }, - isValidAmount: { type: Boolean }, - balance: { type: Number }, - balanceString: { type: String }, - btcServer: { type: Number }, - ltcServer: { type: Number }, - dogeServer: { type: Number }, - dgbServer: { type: Number }, - rvnServer: { type: Number }, - arrrServer: { type: Number }, - qortPaymentFee: { type: Number }, - btcFeePerByte: { type: Number }, - ltcFeePerByte: { type: Number }, - dogeFeePerByte: { type: Number }, - dgbFeePerByte: { type: Number }, - rvnFeePerByte: { type: Number }, - qortBook: { type: Array }, - btcBook: { type: Array }, - ltcBook: { type: Array }, - dogeBook: { type: Array }, - dgbBook: { type: Array }, - rvnBook: { type: Array }, - arrrBook: { type: Array }, - qortBookName: { type: String }, - btcBookName: { type: String }, - ltcBookName: { type: String }, - dogeBookName: { type: String }, - dgbBookName: { type: String }, - rvnBookName: { type: String }, - arrrBookName: { type: String }, - qortBookAddress: { type: String }, - btcBookAddress: { type: String }, - ltcBookAddress: { type: String }, - dogeBookAddress: { type: String }, - dgbBookAddress: { type: String }, - rvnBookAddress: { type: String }, - arrrBookAddress: { type: String }, - myElementId: { type: String }, - walletSalt: { type: String }, - walletStorageData: { type: String }, - walletLockScreenPass: { type: String }, - walletLockScreenSet: { type: String }, - walletLockPass: { type: String }, - walletLockSet: { type: String }, - myWalletLockScreenPass: { type: String }, - myWalletLockScreenSet: { type: String }, - walletHelperMessage: { type: String }, - bookQortalAddress: { type: String }, - bookBitcoinAddress: { type: String }, - bookLitecoinAddress: { type: String }, - bookDogecoinAddress: { type: String }, - bookDigibyteAddress: { type: String }, - bookRavencoinAddress: { type: String }, - bookPiratechainAddress: { type: String } - } - } - - static get observers() { - return ['_kmxKeyUp(amount)'] - } - - static get styles() { - return css` - * { - box-sizing: border-box; - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --mdc-theme-surface: var(--white); - --mdc-theme-error: rgb(255, 89, 89); - --mdc-dialog-content-ink-color: var(--black); - --mdc-dialog-min-width: 500px; - --mdc-dialog-max-width: 1024px; - --paper-input-container-focus-color: var(--mdc-theme-primary); - --lumo-primary-text-color: rgb(0, 167, 245); - --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); - --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1); - --lumo-primary-color: hsl(199, 100%, 48%); - --lumo-base-color: var(--white); - --lumo-secondary-text-color: var(--sectxt); - --lumo-contrast-60pct: var(--vdicon); - --lumo-body-text-color: var(--black); - --_lumo-grid-border-color: var(--border); - --_lumo-grid-secondary-border-color: var(--border2); - } - - #pages { - display: flex; - flex-wrap: wrap; - padding: 10px 5px 5px 5px; - margin: 0px 20px 20px 20px; - } - - #pages > button { - user-select: none; - padding: 5px; - margin: 0 5px; - border-radius: 10%; - border: 0; - background: transparent; - font: inherit; - outline: none; - cursor: pointer; - color: var(--black); - } - - #pages > button:not([disabled]):hover, - #pages > button:focus { - color: #ccc; - background-color: #eee; - } - - #pages > button[selected] { - font-weight: bold; - color: var(--white); - background-color: #ccc; - } - - #pages > button[disabled] { - opacity: 0.5; - cursor: default; - } - - #tabs-height { - --mdc-tab-height: 50px; - } - - #tabs-1-content { - height: 100%; - padding-bottom: 10px; - } - - mwc-tab-bar { - --mdc-text-transform: none; - --mdc-tab-color-default: var(--black); - --mdc-tab-text-label-color-default: var(--black); - } - - paper-slider.blue { - --paper-slider-knob-color: var(--paper-light-blue-500); - --paper-slider-active-color: var(--paper-light-blue-500); - --paper-slider-pin-color: var(--paper-light-blue-500); - } - - paper-progress { - --paper-progress-active-color: var(--mdc-theme-primary); - } - - .red { - --mdc-theme-primary: #F44336; - } - - .green { - color: var(--paper-green-500); - } - - paper-spinner-lite { - height: 75px; - width: 75px; - --paper-spinner-color: var(--mdc-theme-primary); - --paper-spinner-stroke-width: 3px; - } - - .unconfirmed { - font-style: italic; - } - - .roboto { - font-family: 'Roboto', sans-serif; - } - - .mono { - font-family: 'Roboto Mono', monospace; - } - - .sans { - font-family: 'Open Sans', sans-serif; - } - - .magistral { - font-family: 'magistralbold'; - } - - .montserrat { - font-family: 'Montserrat', sans-serif; - } - - .maven { - font-family: 'MavenPro', sans-serif; - } - - .weight-100 { - font-weight: 100; - } - - .text-white-primary { - color: var(--white); - } - - .text-white-secondary { - color: var(--white-secondary); - } - - .text-white-disabled { - color: var(--white-disabled); - } - - .text-white-hint { - color: var(--white-divider); - } - - .white-bg { - height: 100vh; - background: var(--white); - } - - span { - font-size: 18px; - word-break: break-all; - } - - .floatleft { - float: left; - } - - .floatright { - float: right; - } - - .title { - font-weight: 600; - font-size: 12px; - line-height: 32px; - opacity: 0.66; - } - - #transactionList { - padding: 0; - } - - .color-in { - color: #02977e; - background-color: rgba(0, 201, 167, 0.2); - font-weight: 700; - font-size: 0.60938rem; - border-radius: 0.25rem !important; - padding: 0.2rem 0.5rem; - margin-left: 4px; - } - - .color-out { - color: #b47d00; - background-color: rgba(219, 154, 4, 0.2); - font-weight: 700; - font-size: 0.60938rem; - border-radius: 0.25rem !important; - padding: 0.2rem 0.5rem; - margin-left: 4px; - } - - body { - margin: 0; - padding: 0; - background: var(--white); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } - - h2 { - margin: 0; - color: var(--black); - font-weight: 400; - font: 24px/24px 'Open Sans', sans-serif; - } - - h3 { - margin: 0 0 5px; - color: var(--black); - font-weight: 600; - font-size: 18px; - line-height: 18px; - } - - .hrstyle { - color: var(--border); - border-radius: 80%; - margin-bottom: 1rem; - } - - .header-title { - display: inlinr; - font-size: 32px; - color: var(--black); - font-weight: 600; - text-align: center; - margin-top: 1rem; - } - - .fullWidth { - width: 100%; - } - - .wrapper { - margin: 0 auto; - height: 100%; - overflow: hidden; - border-radius: 8px; - background-color: var(--white); - } - - .wallet { - width: 200px; - height: 100vh; - border-top-left-radius: inherit; - border-bottom-left-radius: inherit; - border-right: 1px solid var(--border); - } - - .transactions-wrapper { - width: 100%; - padding: 30px 0 0 0; - height: 100%; - } - - .wallet-header { - margin: 0 20px; - color: var(--black); - } - - .wallet-address { - display: flex; - align-items: center; - font-size: 18px; - color: var(--black); - margin: 4px 0 20px; - } - - .wallet-balance { - display: inline-block; - font-weight: 600; - font-size: 32px; - color: var(--black); - } - - #transactions { - margin-top: 30px; - margin-left: 20px; - margin-right: 20px; - border-top: 1px solid var(--border); - padding-top: 0px; - height: 100%; - } - - .show { - animation: fade-in 0.3s 1; - } - - .transaction-item { - display: flex; - justify-content: space-between; - position: relative; - padding-left: 40px; - margin-bottom: 45px; - margin-right: 50px; - } - - .transaction-item::before { - position: absolute; - content: ''; - border: 2px solid #e1e1e1; - border-radius: 50%; - height: 25px; - width: 25px; - left: 0; - top: 10px; - box-sizing: border-box; - vertical-align: middle; - color: #666666; - } - - .credit::before { - content: '+'; - font-size: 25px; - line-height: 19px; - padding: 0 4px 0; - } - - .debit::before { - content: '-'; - font-size: 20px; - line-height: 21px; - padding: 0 5px; - } - - .transaction-item .details { - font-size: 14px; - line-height: 14px; - color: #999; - } - - .transaction-item_details { - width: 270px; - } - - .transaction-item_amount .amount { - font-weight: 600; - font-size: 18px; - line-height: 45px; - position: relative; - margin: 0; - display: inline-block; - } - - .active { - background: var(--menuactive); - } - - .currency-image { - display: inline-block; - height: 42px; - width: 42px; - background-repeat: no-repeat; - background-size: cover; - border-radius: 3px; - filter: grayscale(100%); - } - - .qort .currency-image { - background-image: url('/img/qort.png'); - } - - .btc .currency-image { - background-image: url('/img/btc.png'); - } - - .ltc .currency-image { - background-image: url('/img/ltc.png'); - } - - .doge .currency-image { - background-image: url('/img/doge.png'); - } - - .dgb .currency-image { - background-image: url('/img/dgb.png'); - } - - .rvn .currency-image { - background-image: url('/img/rvn.png'); - } - - .arrr .currency-image { - background-image: url('/img/arrr.png'); - } - - .card-list { - margin-top: 20px; - } - - .card-list .currency-image { - cursor: pointer; - margin-right: 15px; - transition: 0.1s; - } - - .card-list .currency-image:hover { - transform: scale(1.1); - } - - .buttons { - width: auto !important; - } - - .send-coin-dialog { - min-height: 300px; - min-width: 300px; - box-sizing: border-box; - position: relative; - } - - .unused-address-dialog { - min-height: 150px; - min-width: 550px; - box-sizing: border-box; - position: relative; - } - - .btn-clear-success { - --mdc-icon-button-size: 32px; - color: red; - } - - .btn-clear-error { - --mdc-icon-button-size: 32px; - color: green; - } - - @keyframes fade-in { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - - .successBox { - height: 34px; - min-width: 300px; - width: 100%; - border: 1px solid green; - border-radius: 5px; - background-color: transparent; - margin-top: 15px; - } - - .errorBox { - height: 34px; - min-width: 300px; - width: 100%; - border: 1px solid red; - border-radius: 5px; - background-color: transparent; - margin-top: 15px; - } - - .qrcode-pos { - margin-top: -175px; - float: right; - } - - .send-pos { - margin-top: 20px; - margin-left: 20px; - width: 185px; - } - - .book-pos { - margin-top: -44px; - margin-left: 215px; - width: 185px; - } - - @media (max-width: 863px) { - .wallet { - width: 100%; - height: max-content; - border-top-right-radius: inherit; - padding-bottom: 25px; - } - .cards { - margin-top: 25px; - } - } - - .checkboxLabel:hover{ - cursor: pointer; - } - - .warning-text { - animation: blinker 1.5s linear infinite; - text-align: center; - margin-top: 10px; - color: rgb(255, 89, 89); - } - - @keyframes blinker { - 50% { - opacity: 0; - } - } - - @media (max-width: 764px) { - .wallet { - width: 100%; - height: max-content; - border-top-right-radius: inherit; - padding-bottom: 25px; - } - .cards { - margin-top: 25px; - } - } - - @media (max-width: 530px) { - h3 { - line-height: 24px; - } - .cards { - text-align: center; - } - .wallet-balance { - font-size: 22px; - } - } - - @media (max-width: 390px) { - .wallet { - height: max-content; - padding: 50px 25px; - } - .transactions-wrapper { - padding: 50px 25px; - } - h2 { - font: 18px/24px 'Open Sans', sans-serif; - } - } - - .setpass-wrapper { - width: 100%; - min-width: 400px; - max-width: 450px; - text-align: center; - background: var(--white); - border: 1px solid var(--black); - border-radius: 15px; - padding: 10px 10px 0px; - box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); - } - - .lock-wrapper { - width: 100%; - height: 100%; - min-width: 600px; - max-width: 600px; - min-height: 400px; - max-height: 400px; - text-align: center; - background: url("/img/qortal-lock.jpg"); - border: 1px solid var(--black); - border-radius: 25px; - padding: 10px 10px 0px; - } - - .text-wrapper { - width: 100%; - height: 100%; - min-width: 280px; - max-width: 280px; - min-height: 64px; - max-height: 64px; - text-align: center; - margin-left: 35px; - margin-top: 125px; - overflow: hidden; - } - - .lock-title-white { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #ffffff; - } - - .lock-title-red { - font-family: 'magistralbold'; - font-weight: 700; - font-size: 26px; - line-height: 32px; - color: #df3636; - } - ` - } - - constructor() { - super() - - this.lastBlock = { - height: 0, - } - - this.balanceString = this.renderFetchText() - this.selectedTransaction = {} - this.isTextMenuOpen = false - this.loading = true - - this.nodeConfig = {} - this.nodeDomain = '' - this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'; - - this.qortBook = [] - this.btcBook = [] - this.ltcBook = [] - this.dogeBook = [] - this.dgbBook = [] - this.rvnBook = [] - this.arrrBook = [] - this.qortBookName = '' - this.btcBookName = '' - this.ltcBookName = '' - this.dogeBookName = '' - this.dgbBookName = '' - this.rvnBookName = '' - this.arrrBookName = '' - this.qortBookAddress = '' - this.btcBookAddress = '' - this.ltcBookAddress = '' - this.dogeBookAddress = '' - this.dgbBookAddress = '' - this.rvnBookAddress = '' - this.arrrBookAddress = '' - this.recipient = '' - this.btcRecipient = '' - this.ltcRecipient = '' - this.dogeRecipient = '' - this.dgbRecipient = '' - this.rvnRecipient = '' - this.arrrRecipient = '' - this.arrrMemo = '' - this.arrrWalletAddress = '' - this.unusedWalletAddress = '' - this.btcServer = '' - this.ltcServer = '' - this.dogeServer = '' - this.dgbServer = '' - this.rvnServer = '' - this.arrrServer = '' - this.errorMessage = '' - this.successMessage = '' - this.myElementId = '' - this.sendMoneyLoading = false - this.isValidAmount = false - this.btnDisable = false - this.qortWarning = false - this.balance = 0 - this.amount = 0 - this.btcAmount = 0 - this.ltcAmount = 0 - this.dogeAmount = 0 - this.dgbAmount = 0 - this.rvnAmount = 0 - this.arrrAmount = 0 - this.qortPaymentFee = 0.001 - this.btcFeePerByte = 100 - this.btcSatMinFee = 20 - this.btcSatMaxFee = 150 - this.ltcFeePerByte = 30 - this.ltcSatMinFee = 10 - this.ltcSatMaxFee = 100 - this.dogeFeePerByte = 1000 - this.dogeSatMinFee = 100 - this.dogeSatMaxFee = 10000 - this.dgbFeePerByte = 10 - this.dgbSatMinFee = 1 - this.dgbSatMaxFee = 100 - this.rvnFeePerByte = 1125 - this.rvnSatMinFee = 1000 - this.rvnSatMaxFee = 10000 - this.walletSalt = '' - this.walletStorageData = '' - this.walletLockScreenPass = '' - this.walletLockScreenSet = '' - this.walletLockPass = '' - this.walletLockSet = '' - this.myWalletLockScreenPass = '' - this.myWalletLockScreenSet = '' - this.walletHelperMessage = '' - this.bookQortalAddress = '' - this.bookBitcoinAddress = '' - this.bookLitecoinAddress = '' - this.bookDogecoinAddress = '' - this.bookDigibyteAddress = '' - this.bookRavencoinAddress = '' - this.bookPiratechainAddress = '' - - this.wallets = new Map() - - let coinProp = { - balance: 0, - wallet: null, - transactions: [], - fetchingWalletBalance: false, - fetchingWalletTransactions: false - } - - coinsNames.forEach((c, i) => { - this.wallets.set(c, { ...coinProp }) - }, this) - - this.wallets.get('qort').wallet = window.parent.reduxStore.getState().app.selectedAddress - this.wallets.get('btc').wallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet - this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet - this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet - this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet - this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet - this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet - - this._selectedWallet = 'qort' - - parentEpml.ready().then(() => { - parentEpml.subscribe('selected_address', async (selectedAddress) => { - selectedAddress = JSON.parse(selectedAddress) - if (!selectedAddress || Object.entries(selectedAddress).length === 0) return - - this.wallets.get('qort').wallet = selectedAddress - this.wallets.get('btc').wallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet - this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet - this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet - this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet - this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet - this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet - }) - parentEpml.subscribe('coin_balances', async (payload) => { - const coinBalances = JSON.parse(payload) - if(coinBalances[this._selectedWallet]){ - const res = coinBalances[this._selectedWallet].fullValue - let value = Number(res).toFixed(8) - if(this._selectedWallet !== 'qort'){ - value = (Number(res) / 1e8).toFixed(8) - } - this.wallets.get(this._selectedWallet).balance = value - this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() - this.balance = this.wallets.get(this._selectedWallet).balance - } - }) - }) - - this.pingCoinBalancesController = this.pingCoinBalancesController.bind(this) - } - - refreshWallet(){ - const coin = this._selectedWallet - switch (coin) { - case 'qort': - this.tabWalletQort(); - break - case 'arrr': - this.tabWalletArrr(); - break - case 'btc': - this.tabWalletBtc(); - break; - case 'ltc': - this.tabWalletLtc(); - break; - case 'doge': - this.tabWalletDoge(); - break - case 'dgb': - this.tabWalletDgb() - break; - case 'rvn': - this.tabWalletRvn(); - break - default: - break - } - - } - - render() { - return html` -
    -
    - ${translate("walletpage.wchange22")} ${this.renderWalletLockButton()} -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    -
    - ${translate("walletpage.wchange2")} - - -
    -
    - ${this.getSelectedWalletAddress()} - - -
    - - ${this.balanceString} - -
    - ${this.getSelectedWalletServer()} -
    -

    -
    - ${this.renderSendButton()} -
    -
    - ${this.renderAddressbookButton()} -
    -
    - -
    -
    - - ${this.loading ? html`` : ''} -
    -
    -
    - - -
    -

    ${translate("walletpage.wchange5")}

    -
    -
    -
    - ${translate("walletpage.wchange6")} -
    -
    - ${this.selectedTransaction.type} - ${this.selectedTransaction.txnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} -
    - ${translate("walletpage.wchange9")} -
    -
    ${this.selectedTransaction.type === 'AT' ? html`${this.selectedTransaction.atAddress}` : html`${this.selectedTransaction.creatorAddress}`}
    - ${translate("walletpage.wchange10")} -
    -
    - ${this.selectedTransaction.type === 'DEPLOY_AT' ? html`${this.renderCAB()}` : html`${this.renderSQB()}`} -
    -
    - ${!this.selectedTransaction.amount ? '' : html` - ${translate("walletpage.wchange11")} -
    -
    ${this.selectedTransaction.amount} QORT
    - `} - ${translate("walletpage.wchange12")} -
    -
    ${this.selectedTransaction.fee}
    - ${translate("walletpage.wchange13")} -
    -
    ${this.selectedTransaction.blockHeight}
    - ${translate("walletpage.wchange14")} -
    -
    ${new Date(this.selectedTransaction.timestamp).toString()}
    - ${translate("walletpage.wchange15")} -
    -
    ${this.selectedTransaction.signature}
    -
    - - ${translate("general.close")} - -
    - - -
    -

    ${translate("walletpage.wchange5")}

    -
    -
    -
    - ${translate("walletpage.wchange6")} -
    -
    - ${translate("walletpage.wchange40")} - ${this.selectedTransaction.btcTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} -
    - ${translate("walletpage.wchange9")} -
    -
    - ${this.selectedTransaction.btcSender} -
    - ${translate("walletpage.wchange10")} -
    -
    - ${this.selectedTransaction.btcReceiver} - this.sendToBtcAddress()} title="${translate("walletpage.wchange46")}"> - this.openAddBtcAddressDialog()} title="${translate("walletpage.wchange49")}"> -
    -
    - ${translate("walletpage.wchange12")} -
    -
    - ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} BTC -
    - ${translate("walletpage.wchange37")} -
    -
    - ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} BTC -
    - ${translate("walletpage.wchange14")} -
    -
    ${new Date(this.selectedTransaction.timestamp).toString()}
    - ${translate("walletpage.wchange16")} -
    -
    - ${this.selectedTransaction.txHash} -
    -
    - - ${translate("general.close")} - -
    - - -
    -

    ${translate("walletpage.wchange5")}

    -
    -
    -
    - ${translate("walletpage.wchange6")}e -
    -
    - ${translate("walletpage.wchange40")} - ${this.selectedTransaction.ltcTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} -
    - ${translate("walletpage.wchange9")} -
    -
    - ${this.selectedTransaction.ltcSender} -
    - ${translate("walletpage.wchange10")} -
    -
    - ${this.selectedTransaction.ltcReceiver} - this.sendToLtcAddress()} title="${translate("walletpage.wchange46")}"> - this.openAddLtcAddressDialog()} title="${translate("walletpage.wchange49")}"> -
    -
    - ${translate("walletpage.wchange12")} -
    -
    - ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} LTC -
    - ${translate("walletpage.wchange37")} -
    -
    - ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} LTC -
    - ${translate("walletpage.wchange14")} -
    -
    ${new Date(this.selectedTransaction.timestamp).toString()}
    - ${translate("walletpage.wchange16")} -
    -
    - ${this.selectedTransaction.txHash} -
    -
    - - ${translate("general.close")} - -
    - - -
    -

    ${translate("walletpage.wchange5")}

    -
    -
    -
    - ${translate("walletpage.wchange6")} -
    -
    - ${translate("walletpage.wchange40")} - ${this.selectedTransaction.dogeTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} -
    - ${translate("walletpage.wchange9")} -
    -
    - ${this.selectedTransaction.dogeSender} -
    -
    - ${translate("walletpage.wchange10")} -
    -
    - ${this.selectedTransaction.dogeReceiver} - this.sendToDogeAddress()} title="${translate("walletpage.wchange46")}"> - this.openAddDogeAddressDialog()} title="${translate("walletpage.wchange49")}"> -
    -
    - ${translate("walletpage.wchange12")} -
    -
    - ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} DOGE -
    - ${translate("walletpage.wchange37")} -
    -
    - ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} DOGE -
    - ${translate("walletpage.wchange14")} -
    -
    ${new Date(this.selectedTransaction.timestamp).toString()}
    - ${translate("walletpage.wchange16")} -
    -
    - ${this.selectedTransaction.txHash} -
    -
    - - ${translate("general.close")} - -
    - - -
    -

    ${translate("walletpage.wchange5")}

    -
    -
    -
    - ${translate("walletpage.wchange6")} -
    -
    - ${translate("walletpage.wchange40")} - ${this.selectedTransaction.dgbTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} -
    - ${translate("walletpage.wchange9")} -
    -
    - ${this.selectedTransaction.dgbSender} -
    - ${translate("walletpage.wchange10")} -
    -
    - ${this.selectedTransaction.dgbReceiver} - this.sendToDgbAddress()} title="${translate("walletpage.wchange46")}"> - this.openAddDgbAddressDialog()} title="${translate("walletpage.wchange49")}"> -
    -
    - ${translate("walletpage.wchange12")} -
    -
    - ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} DGB -
    - ${translate("walletpage.wchange37")} -
    -
    - ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} DGB -
    - ${translate("walletpage.wchange14")} -
    -
    ${new Date(this.selectedTransaction.timestamp).toString()}
    - ${translate("walletpage.wchange16")} -
    -
    - ${this.selectedTransaction.txHash} -
    -
    - - ${translate("general.close")} - -
    - - -
    -

    ${translate("walletpage.wchange5")}

    -
    -
    -
    - ${translate("walletpage.wchange6")} -
    -
    - ${translate("walletpage.wchange40")} - ${this.selectedTransaction.rvnTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} -
    - ${translate("walletpage.wchange9")} -
    -
    - ${this.selectedTransaction.rvnSender} -
    - ${translate("walletpage.wchange10")} -
    -
    - ${this.selectedTransaction.rvnReceiver} - this.sendToRvnAddress()} title="${translate("walletpage.wchange46")}"> - this.openAddRvnAddressDialog()} title="${translate("walletpage.wchange49")}"> -
    -
    - ${translate("walletpage.wchange12")} -
    -
    - ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} RVN -
    - ${translate("walletpage.wchange37")} -
    -
    - ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} RVN -
    - ${translate("walletpage.wchange14")} -
    -
    ${new Date(this.selectedTransaction.timestamp).toString()}
    - ${translate("walletpage.wchange16")} -
    -
    - ${this.selectedTransaction.txHash} -
    -
    - - ${translate("general.close")} - -
    - - -
    -

    ${translate("walletpage.wchange5")}

    -
    -
    -
    - ${translate("walletpage.wchange6")} -
    -
    - ${translate("walletpage.wchange40")} - ${this.selectedTransaction.arrrTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} -
    - ${translate("walletpage.wchange9")} -
    -
    - ${this.selectedTransaction.arrrSender} -
    - ${translate("walletpage.wchange10")} -
    -
    - ${this.selectedTransaction.arrrReceiver} - this.sendToArrrAddress()} title="${translate("walletpage.wchange46")}"> - this.openAddArrrAddressDialog()} title="${translate("walletpage.wchange49")}"> -
    -
    - ${translate("walletpage.wchange12")} -
    -
    - ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} ARRR -
    - ${translate("walletpage.wchange37")} -
    -
    - ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} ARRR -
    - ${translate("walletpage.wchange14")} -
    -
    ${new Date(this.selectedTransaction.timestamp).toString()}
    - ${translate("walletpage.wchange16")} -
    -
    - ${this.selectedTransaction.txHash} -
    -
    - - ${translate("general.close")} - -
    - - -
    -
    - -

    ${translate("walletpage.wchange17")} QORT

    -
    -
    -

    - ${translate("walletpage.wchange18")}:
    - ${this.getSelectedWalletAddress()} -

    -

    - ${translate("walletpage.wchange19")}:
    - ${this.balanceString}
    - - this.calculateQortAll()}> ${translate("walletpage.wchange45")} QORT -
      -

    -

    - - -

    -

    - - -

    -
    -

    ${translate("walletpage.wchange21")} ${this.qortPaymentFee} QORT

    -
    - ${this.renderClearSuccess()} - ${this.renderClearError()} - ${this.sendMoneyLoading ? html` ` : ''} -
    -
    - this.sendQort()}> - - ${translate("walletpage.wchange17")} QORT - -
    ${this.renderWarning()}
    -
    -
    -
    - - ${translate("general.close")} - -
    - - -
    -
    - -

    ${translate("walletpage.wchange17")} BTC

    -
    -
    -

    - From address:
    - ${this.getSelectedWalletAddress()} -

    -

    - Available balance:
    - ${this.balanceString}
    - - this.calculateBtcAll()}> ${translate("walletpage.wchange45")} BTC -
      -

    -

    - - -

    -

    - - -

    -
    -

    ${translate("walletpage.wchange24")}: ${(this.btcFeePerByte / 1e8).toFixed(8)} BTC
    ${translate("walletpage.wchange25")}

    - - -
    - ${this.renderClearSuccess()} - ${this.renderClearError()} - ${this.sendMoneyLoading ? html` ` : ''} -
    -
    - this.sendBtc()}> - - ${translate("walletpage.wchange17")} BTC - -
    -
    -
    - - ${translate("general.close")} - -
    - - -
    -
    - -

    ${translate("walletpage.wchange17")} LTC

    -
    -
    -

    - ${translate("walletpage.wchange18")}:
    - ${this.getSelectedWalletAddress()} -

    -

    - ${translate("walletpage.wchange19")}:
    - ${this.balanceString}
    - - this.calculateLtcAll()}> ${translate("walletpage.wchange45")} LTC -
      -

    -

    - - -

    -

    - - -

    -
    -

    ${translate("walletpage.wchange24")}: ${(this.ltcFeePerByte / 1e8).toFixed(8)} LTC
    ${translate("walletpage.wchange25")}

    - - -
    - ${this.renderClearSuccess()} - ${this.renderClearError()} - ${this.sendMoneyLoading ? html` ` : ''} -
    -
    - this.sendLtc()}> - - ${translate("walletpage.wchange17")} LTC - -
    -
    -
    - - ${translate("general.close")} - -
    - - -
    -
    - -

    ${translate("walletpage.wchange17")} DOGE

    -
    -
    -

    - ${translate("walletpage.wchange18")}:
    - ${this.getSelectedWalletAddress()} -

    -

    - ${translate("walletpage.wchange19")}:
    - ${this.balanceString}
    - - this.calculateDogeAll()}> ${translate("walletpage.wchange45")} DOGE -
      -

    -

    - - -

    -

    - - -

    -
    -

    - ${translate("walletpage.wchange24")}: ${(this.dogeFeePerByte / 1e8).toFixed(8)} DOGE
    ${translate("walletpage.wchange25")} -

    - - -
    - ${this.renderClearSuccess()} - ${this.renderClearError()} - ${this.sendMoneyLoading ? html` ` : ''} -
    -
    - this.sendDoge()}> - - ${translate("walletpage.wchange17")} DOGE - -
    -
    -
    - - ${translate("general.close")} - -
    - - -
    -
    - -

    ${translate("walletpage.wchange17")} DGB

    -
    -
    -

    - ${translate("walletpage.wchange18")}:
    - ${this.getSelectedWalletAddress()} -

    -

    - ${translate("walletpage.wchange19")}:
    - ${this.balanceString}
    - - this.calculateDgbAll()}> ${translate("walletpage.wchange45")} DGB -
      -

    -

    - - -

    -

    - - -

    -
    -

    - ${translate("walletpage.wchange24")}: ${(this.dgbFeePerByte / 1e8).toFixed(8)} DGB
    ${translate("walletpage.wchange25")} -

    - - -
    - ${this.renderClearSuccess()} - ${this.renderClearError()} - ${this.sendMoneyLoading ? html` ` : ''} -
    -
    - this.sendDgb()}> - - ${translate("walletpage.wchange17")} DGB - -
    -
    -
    - - ${translate("general.close")} - -
    - - -
    -
    - -

    ${translate("walletpage.wchange17")} RVN

    -
    -
    -

    - ${translate("walletpage.wchange18")}:
    - ${this.getSelectedWalletAddress()} -

    -

    - ${translate("walletpage.wchange19")}:
    - ${this.balanceString}
    - - this.calculateRvnAll()}> ${translate("walletpage.wchange45")} RVN -
      -

    -

    - - -

    -

    - - -

    -
    -

    - ${translate("walletpage.wchange24")}: ${(this.rvnFeePerByte / 1e8).toFixed(8)} RVN
    ${translate("walletpage.wchange25")} -

    - - -
    - ${this.renderClearSuccess()} - ${this.renderClearError()} - ${this.sendMoneyLoading ? html` ` : ''} -
    -
    - this.sendRvn()}> - - ${translate("walletpage.wchange17")} RVN - -
    -
    -
    - - ${translate("general.close")} - -
    - - -
    -
    - -

    ${translate("walletpage.wchange17")} ARRR

    -
    -
    -

    - ${translate("walletpage.wchange18")}:
    - ${this.getSelectedWalletAddress()} -

    -

    - ${translate("walletpage.wchange19")}:
    - ${this.balanceString}
    - - this.calculateArrrAll()}> ${translate("walletpage.wchange45")} ARRR -
      -

    -

    - - -

    -

    - - -

    -

    - - -

    -

    ${this.errorMessage}

    -

    ${this.successMessage}

    - ${this.sendMoneyLoading ? html` ` : ''} -
    -
    - this.sendArrr()}> - - ${translate("walletpage.wchange17")} ARRR - -
    -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Qortal ${translate("walletpage.wchange47")}

    -
    -
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    -
    -
    - - - - { - render(html`${this.renderSendFromQortAddressbookButton(data.item)}`, root); - }}> - - { - render(html` this.removeQortAddress(data.item.address)}>delete ${translate("nodepage.nchange12")}`, root) - }}> - - - ${this.isEmptyArray(this.qortBook) ? html` - ${translate("walletpage.wchange48")} - `: ''} - - ${translate("general.close")} - - this.openAddToQortAddressbook()} - > - ${translate("rewardsharepage.rchange14")} - -
    - - -
    - -

    Bitcoin ${translate("walletpage.wchange47")}

    -
    -
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    -
    -
    - - - - { - render(html`${this.renderSendFromBtcAddressbookButton(data.item)}`, root); - }}> - - { - render(html` this.removeBtcAddress(data.item.address)}>delete ${translate("nodepage.nchange12")}`, root) - }}> - - - ${this.isEmptyArray(this.btcBook) ? html` - ${translate("walletpage.wchange48")} - `: ''} - - ${translate("general.close")} - - this.openAddToBtcAddressbook()} - > - ${translate("rewardsharepage.rchange14")} - -
    - - -
    - -

    Litecoin ${translate("walletpage.wchange47")}

    -
    -
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    -
    -
    - - - - { - render(html`${this.renderSendFromLtcAddressbookButton(data.item)}`, root); - }}> - - { - render(html` this.removeLtcAddress(data.item.address)}>delete ${translate("nodepage.nchange12")}`, root) - }}> - - - ${this.isEmptyArray(this.ltcBook) ? html` - ${translate("walletpage.wchange48")} - `: ''} - - ${translate("general.close")} - - this.openAddToLtcAddressbook()} - > - ${translate("rewardsharepage.rchange14")} - -
    - - -
    - -

    Dogecoin ${translate("walletpage.wchange47")}

    -
    -
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    -
    -
    - - - - { - render(html`${this.renderSendFromDogeAddressbookButton(data.item)}`, root); - }}> - - { - render(html` this.removeDogeAddress(data.item.address)}>delete ${translate("nodepage.nchange12")}`, root) - }}> - - - ${this.isEmptyArray(this.dogeBook) ? html` - ${translate("walletpage.wchange48")} - `: ''} - - ${translate("general.close")} - - this.openAddToDogeAddressbook()} - > - ${translate("rewardsharepage.rchange14")} - -
    - - -
    - -

    Digibyte ${translate("walletpage.wchange47")}

    -
    -
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    -
    -
    - - - - { - render(html`${this.renderSendFromDgbAddressbookButton(data.item)}`, root); - }}> - - { - render(html` this.removeDgbAddress(data.item.address)}>delete ${translate("nodepage.nchange12")}`, root) - }}> - - - ${this.isEmptyArray(this.dgbBook) ? html` - ${translate("walletpage.wchange48")} - `: ''} - - ${translate("general.close")} - - this.openAddToDgbAddressbook()} - > - ${translate("rewardsharepage.rchange14")} - -
    - - -
    - -

    Ravencoin ${translate("walletpage.wchange47")}

    -
    -
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    -
    -
    - - - - { - render(html`${this.renderSendFromRvnAddressbookButton(data.item)}`, root); - }}> - - { - render(html` this.removeRvnAddress(data.item.address)}>delete ${translate("nodepage.nchange12")}`, root) - }}> - - - ${this.isEmptyArray(this.rvnBook) ? html` - ${translate("walletpage.wchange48")} - `: ''} - - ${translate("general.close")} - - this.openAddToRvnAddressbook()} - > - ${translate("rewardsharepage.rchange14")} - -
    - - -
    - -

    Pirate Chain ${translate("walletpage.wchange47")}

    -
    -
    ${this.renderExportAddressbookButton()}
    ${this.renderImportAddressbookButton()}


    -
    -
    - - - - { - render(html`${this.renderSendFromArrrAddressbookButton(data.item)}`, root); - }}> - - { - render(html` this.removeArrrAddress(data.item.address)}>delete ${translate("nodepage.nchange12")}`, root) - }}> - - - ${this.isEmptyArray(this.arrrBook) ? html` - ${translate("walletpage.wchange48")} - `: ''} - - ${translate("general.close")} - - this.openAddToArrrAddressbook()} - > - ${translate("rewardsharepage.rchange14")} - -
    - - -
    - -

    Qortal ${translate("walletpage.wchange47")}


    -

    ${translate("walletpage.wchange49")}

    -
    -
    -
    -
    -

    - - -

    -

    - - -

    -
    -
    -
    - this.addToQortalAddressbook()}> - - ${translate("walletpage.wchange49")} - -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Bitcoin ${translate("walletpage.wchange47")}


    -

    ${translate("walletpage.wchange49")}

    -
    -
    -
    -
    -

    - - -

    -

    - - -

    -
    -
    -
    - this.addToBitcoinAddressbook()}> - - ${translate("walletpage.wchange49")} - -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Litecoin ${translate("walletpage.wchange47")}


    -

    ${translate("walletpage.wchange49")}

    -
    -
    -
    -
    -

    - - -

    -

    - - -

    -
    -
    -
    - this.addToLitecoinAddressbook()}> - - ${translate("walletpage.wchange49")} - -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Dogecoin ${translate("walletpage.wchange47")}


    -

    ${translate("walletpage.wchange49")}

    -
    -
    -
    -
    -

    - - -

    -

    - - -

    -
    -
    -
    - this.addToDogecoinAddressbook()}> - - ${translate("walletpage.wchange49")} - -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Digibyte ${translate("walletpage.wchange47")}


    -

    ${translate("walletpage.wchange49")}

    -
    -
    -
    -
    -

    - - -

    -

    - - -

    -
    -
    -
    - this.addToDigibyteAddressbook()}> - - ${translate("walletpage.wchange49")} - -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Ravencoin ${translate("walletpage.wchange47")}


    -

    ${translate("walletpage.wchange49")}

    -
    -
    -
    -
    -

    - - -

    -

    - - -

    -
    -
    -
    - this.addToRavencoinAddressbook()}> - - ${translate("walletpage.wchange49")} - -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Pirate Chain ${translate("walletpage.wchange47")}


    -

    ${translate("walletpage.wchange49")}

    -
    -
    -
    -
    -

    - - -

    -

    - - -

    -
    -
    -
    - this.addToPiratechainAddressbook()}> - - ${translate("walletpage.wchange49")} - -
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Qortal ${translate("walletpage.wchange53")}


    -
    -
    -
    -
    - -

    ${translate("walletpage.wchange56")}

    -
    ${translate("walletpage.wchange55")}
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Bitcoin ${translate("walletpage.wchange53")}


    -
    -
    -
    -
    - -

    ${translate("walletpage.wchange56")}

    -
    ${translate("walletpage.wchange55")}
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Litecoin ${translate("walletpage.wchange53")}


    -
    -
    -
    -
    - -

    ${translate("walletpage.wchange56")}

    -
    ${translate("walletpage.wchange55")}
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Dogecoin ${translate("walletpage.wchange53")}


    -
    -
    -
    -
    - -

    ${translate("walletpage.wchange56")}

    -
    ${translate("walletpage.wchange55")}
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Digibyte ${translate("walletpage.wchange53")}


    -
    -
    -
    -
    - -

    ${translate("walletpage.wchange56")}

    -
    ${translate("walletpage.wchange55")}
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Litecoin ${translate("walletpage.wchange53")}


    -
    -
    -
    -
    - -

    ${translate("walletpage.wchange56")}

    -
    ${translate("walletpage.wchange55")}
    -
    - - ${translate("general.close")} - -
    - - -
    - -

    Pirate Chain ${translate("walletpage.wchange53")}


    -
    -
    -
    -
    - -

    ${translate("walletpage.wchange56")}

    -
    ${translate("walletpage.wchange55")}
    -
    - - ${translate("general.close")} - -
    -
    - -
    -

    Qortal ${translate("tabmenu.tm5")} ${translate("login.lp1")}

    -
    -
    -
    -

    ${translate("login.lp2")}

    -

    ${translate("login.lp3")}

    -
    -
    - password - -
    -
    - password - -
    -
    - ${translate("login.lp4")} - ${translate("login.lp5")} -
    -
    - -
    -

    Qortal ${translate("tabmenu.tm5")} ${translate("login.lp1")}

    -
    -
    -
    -

    ${translate("login.lessthen8")}

    -
    -
    - ${translate("login.lp4")} - ${translate("login.lp5")} -
    -
    - -
    - ${translate("sidemenu.wallets")}
    - ${translate("login.lp9")} - ${translate("login.lp10")} -
    -
    - password - -
    - ${this.walletHelperMessage} -
    -
    -
    -
    - -
    -
    - ` - } - - firstUpdated() { - - this.changeTheme() - this.changeLanguage() - this.paymentFee() - this.getNodeConfig() - - this.bookQortalAddress = window.parent.reduxStore.getState().app.selectedAddress.address - this.bookBitcoinAddress = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address - this.bookLitecoinAddress = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address - this.bookDogecoinAddress = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address - this.bookDigibyteAddress = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address - this.bookRavencoinAddress = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address - this.bookPiratechainAddress = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address - - this.walletHelperMessage = this.renderWalletHelperPass() - - this.walletSalt = '' - this.walletSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) - - this.walletStorageData = '' - this.walletStorageData = window.parent.reduxStore.getState().app.selectedAddress.address - - this.walletLockScreenPass = '' - this.walletLockScreenPass = 'walletLockScreenPass-' + this.walletStorageData - - this.walletLockScreenSet = '' - this.walletLockScreenSet = 'walletLockScreenSet-' + this.walletStorageData - - this.walletLockPass = '' - this.walletLockPass = encryptData(false, this.walletSalt) - - this.walletLockSet = '' - this.walletLockSet = encryptData(false, this.walletSalt) - - if (localStorage.getItem(this.walletLockScreenPass) === null && localStorage.getItem(this.walletLockScreenSet) === null) { - localStorage.setItem(this.walletLockScreenPass, this.walletLockPass) - localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) - this.myWalletLockScreenPass = '' - this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) - this.myWalletLockScreenSet = '' - this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) - } else { - this.myWalletLockScreenPass = '' - this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) - this.myWalletLockScreenSet = '' - this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) - } - - if (this.myWalletLockScreenSet === true) { - this.shadowRoot.getElementById('walletLockScreenActive').open() - } - - this.qortAddressbook() - this.btcAddressbook() - this.ltcAddressbook() - this.dogeAddressbook() - this.dgbAddressbook() - this.rvnAddressbook() - this.arrrAddressbook() - - this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') - - this.showWallet() - - window.addEventListener('storage', () => { - 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) - }) - - if (!isElectron()) { - } else { - window.addEventListener('contextmenu', (event) => { - event.preventDefault() - window.parent.electronAPI.showMyMenu() - }) - } - - this.clearConsole() - - setInterval(() => { - this.clearConsole() - this.getNodeConfig() - }, 60000) - - setInterval(() => { - this.paymentFee() - }, 600000) - } - - async paymentFee() { - 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/unitfee?txType=PAYMENT` - await fetch(url).then((response) => { - if (response.ok) { - return response.json() - } - return Promise.reject(response) - }).then((json) => { - this.qortPaymentFee = (Number(json) / 1e8).toFixed(8) - }) - } - - clearConsole() { - if (!isElectron()) { - } else { - console.clear() - window.parent.electronAPI.clearCache() - } - } - - pingCoinBalancesController(){ - if(!this._selectedWallet) return - const customEvent = new CustomEvent('ping-coin-controller-with-coin', { - detail: this._selectedWallet - }); - window.parent.dispatchEvent(customEvent); - } - - connectedCallback() { - super.connectedCallback() - this.intervalID = setInterval(this.pingCoinBalancesController, 30000) - } - - disconnectedCallback() { - super.disconnectedCallback() - if(this.intervalID) { - clearInterval(this.intervalID) - } - } - - renderWalletLockButton() { - if (this.myWalletLockScreenPass === false && this.myWalletLockScreenSet === false) { - return html` -
    - this.openWalletSetScreenLockPass()} title="${translate("login.lp11")}"> -
    - ` - } else if (this.myWalletLockScreenSet === false) { - return html` -
    - this.setWalletLockQortal()} title="${translate("login.lp11")}"> -
    - ` - } else if (this.myWalletLockScreenSet === true) { - return html` -
    - -
    - ` - } - } - - openWalletSetScreenLockPass() { - this.shadowRoot.getElementById('walletLockPassword').value = '' - this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' - this.shadowRoot.getElementById('setWalletLockScreenPass').open() - } - - closewWalletSetScreenLockPass() { - this.shadowRoot.getElementById('setWalletLockScreenPass').close() - } - - walletCheckPass() { - const walletPassword = this.shadowRoot.getElementById('walletLockPassword').value - const walletRePassword = this.shadowRoot.getElementById('walletLockPasswordConfirm').value - - if (walletPassword === '') { - let snackbar1string = get("login.pleaseenter") - parentEpml.request('showSnackBar', `${snackbar1string}`) - return - } - - if (walletPassword != walletRePassword) { - let snackbar2string = get("login.notmatch") - parentEpml.request('showSnackBar', `${snackbar2string}`) - return - } - - if (walletPassword.length < 8) { - let snackbar3string = get("login.lessthen8") - parentEpml.request('showSnackBar', `${snackbar3string}`) - this.walletExtraConfirm() - } - - if (walletPassword.length >= 8) { - this.setWalletNewScreenPass() - let snackbar4string = get("login.lp6") - parentEpml.request('showSnackBar', `${snackbar4string}`) - } - } - - walletExtraConfirm() { - this.shadowRoot.getElementById('setWalletLockScreenPass').close() - this.shadowRoot.getElementById('walletExtraConfirmPass').open() - } - - closWalletExtraConfirmPass() { - this.shadowRoot.getElementById('walletExtraConfirmPass').close() - this.shadowRoot.getElementById('walletLockPassword').value = '' - this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' - } - - setWalletNewScreenPass() { - const walletRawPassword = this.shadowRoot.getElementById('walletLockPassword').value - const walletCryptPassword = encryptData(walletRawPassword, this.walletSalt) - localStorage.setItem(this.walletLockScreenPass, walletCryptPassword) - this.myWalletLockScreenPass = '' - this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) - this.shadowRoot.getElementById('setWalletLockScreenPass').close() - this.shadowRoot.getElementById('walletExtraConfirmPass').close() - this.shadowRoot.getElementById('walletLockPassword').value = '' - this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' - } - - setWalletLockQortal() { - this.walletHelperMessage = this.renderWalletHelperPass() - this.walletLockSet = '' - this.walletLockSet = encryptData(true, this.walletSalt) - localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) - this.myWalletLockScreenSet = '' - this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) - this.shadowRoot.getElementById('walletLockScreenActive').open() - } - - walletPassKeyListener(e) { - if (e.key === 'Enter') { - this.closeWalletLockScreenActive() - } - } - - async closeWalletLockScreenActive() { - const myWalletPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) - const walletCheckPass = this.shadowRoot.getElementById('walletUnlockPassword').value - const errDelay = ms => new Promise(res => setTimeout(res, ms)) - - if (walletCheckPass === myWalletPass) { - this.walletLockSet = '' - this.walletLockSet = encryptData(false, this.walletSalt) - localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) - this.myWalletLockScreenSet = '' - this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) - this.shadowRoot.getElementById('walletLockScreenActive').close() - this.shadowRoot.getElementById('walletUnlockPassword').value = '' - this.walletHelperMessage = this.renderWalletHelperPass() - } else { - this.shadowRoot.getElementById('walletUnlockPassword').value = '' - this.walletHelperMessage = this.renderWalletHelperErr() - await errDelay(3000) - this.walletHelperMessage = this.renderWalletHelperPass() - - } - } - - renderWalletHelperPass() { - return html`${translate("login.pleaseenter")}` - } - - renderWalletHelperErr() { - return html`${translate("login.lp8")}` - } - - renderWarning() { - return html`${translate("tradepage.tchange48")} QORT` - } - - renderClearSuccess() { - let strSuccessValue = this.successMessage - if (strSuccessValue === "") { - return html`` - } else { - return html` -
    - ${this.successMessage} - -
    -
    -

    ${translate("walletpage.wchange43")}

    -
    - ` - } - } - - renderClearError() { - let strErrorValue = this.errorMessage - if (strErrorValue === "") { - return html`` - } else { - return html` -
    - ${this.errorMessage} - -
    -
    -

    ${translate("walletpage.wchange44")}

    -
    - ` - } - } - - tabWalletQort() { - this._selectedWallet = 'qort' - this.showWallet() - } - - tabWalletBtc() { - this._selectedWallet = 'btc' - this.showWallet() - } - - tabWalletLtc() { - this._selectedWallet = 'ltc' - this.showWallet() - } - - tabWalletDoge() { - this._selectedWallet = 'doge' - this.showWallet() - } - - tabWalletDgb() { - this._selectedWallet = 'dgb' - this.showWallet() - } - - tabWalletRvn() { - this._selectedWallet = 'rvn' - this.showWallet() - } - - tabWalletArrr() { - this._selectedWallet = 'arrr' - this.showWallet() - } - - qortAddressbook() { - const storedQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress - if (localStorage.getItem(storedQortalAddressBook) === null) { - localStorage.setItem(storedQortalAddressBook, "") - } else { - this.qortBook = JSON.parse(localStorage.getItem(storedQortalAddressBook) || "[]") - } - } - - btcAddressbook() { - const storedBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress - if (localStorage.getItem(storedBitcoinAddressBook) === null) { - localStorage.setItem(storedBitcoinAddressBook, "") - } else { - this.btcBook = JSON.parse(localStorage.getItem(storedBitcoinAddressBook) || "[]") - } - } - - ltcAddressbook() { - const storedLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress - if (localStorage.getItem(storedLitecoinAddressBook) === null) { - localStorage.setItem(storedLitecoinAddressBook, "") - } else { - this.ltcBook = JSON.parse(localStorage.getItem(storedLitecoinAddressBook) || "[]") - } - } - - dogeAddressbook() { - const storedDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress - if (localStorage.getItem(storedDogecoinAddressBook) === null) { - localStorage.setItem(storedDogecoinAddressBook, "") - } else { - this.dogeBook = JSON.parse(localStorage.getItem(storedDogecoinAddressBook) || "[]") - } - } - - dgbAddressbook() { - const storedDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress - if (localStorage.getItem(storedDigibyteAddressBook) === null) { - localStorage.setItem(storedDigibyteAddressBook, "") - } else { - this.dgbBook = JSON.parse(localStorage.getItem(storedDigibyteAddressBook) || "[]") - } - } - - rvnAddressbook() { - const storedRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress - if (localStorage.getItem(storedRavencoinAddressBook) === null) { - localStorage.setItem(storedRavencoinAddressBook, "") - } else { - this.rvnBook = JSON.parse(localStorage.getItem(storedRavencoinAddressBook) || "[]") - } - } - - arrrAddressbook() { - const storedPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress - if (localStorage.getItem(storedPiratechainAddressBook) === null) { - localStorage.setItem(storedPiratechainAddressBook, "") - } else { - this.arrrBook = JSON.parse(localStorage.getItem(storedPiratechainAddressBook) || "[]") - } - } - - openQortAddressbook() { - this.shadowRoot.querySelector("#qortBookDialog").show() - } - - openBtcAddressbook() { - this.shadowRoot.querySelector("#btcBookDialog").show() - } - - openLtcAddressbook() { - this.shadowRoot.querySelector("#ltcBookDialog").show() - } - - openDogeAddressbook() { - this.shadowRoot.querySelector("#dogeBookDialog").show() - } - - openDgbAddressbook() { - this.shadowRoot.querySelector("#dgbBookDialog").show() - } - - openRvnAddressbook() { - this.shadowRoot.querySelector("#rvnBookDialog").show() - } - - openArrrAddressbook() { - this.shadowRoot.querySelector("#arrrBookDialog").show() - } - - openAddQortAddressDialog() { - this.qortBookAddress = this.selectedTransaction.recipient - this.openAddToQortAddressbook() - this.shadowRoot.querySelector('#showTransactionDetailsDialog').close() - } - - openAddBtcAddressDialog() { - this.btcBookAddress = this.selectedTransaction.btcReceiver - this.openAddToBtcAddressbook() - this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').close() - } - - openAddLtcAddressDialog() { - this.ltcBookAddress = this.selectedTransaction.ltcReceiver - this.openAddToLtcAddressbook() - this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close() - } - - openAddDogeAddressDialog() { - this.dogeBookAddress = this.selectedTransaction.dogeReceiver - this.openAddToDogeAddressbook() - this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').close() - } - - openAddDgbAddressDialog() { - this.dgbBookAddress = this.selectedTransaction.dgbReceiver - this.openAddToDgbAddressbook() - this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').close() - } - - openAddRvnAddressDialog() { - this.rvnBookAddress = this.selectedTransaction.rvnReceiver - this.openAddToRvnAddressbook() - this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() - } - - openAddArrrAddressDialog() { - this.arrrBookAddress = this.selectedTransaction.arrrReceiver - this.openAddToArrrAddressbook() - this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() - } - - openAddToQortAddressbook() { - this.shadowRoot.querySelector("#addQortAddressDialog").show() - } - - openAddToBtcAddressbook() { - this.shadowRoot.querySelector("#addBtcAddressDialog").show() - } - - openAddToLtcAddressbook() { - this.shadowRoot.querySelector("#addLtcAddressDialog").show() - } - - openAddToDogeAddressbook() { - this.shadowRoot.querySelector("#addDogeAddressDialog").show() - } - - openAddToDgbAddressbook() { - this.shadowRoot.querySelector("#addDgbAddressDialog").show() - } - - openAddToRvnAddressbook() { - this.shadowRoot.querySelector("#addRvnAddressDialog").show() - } - - openAddToArrrAddressbook() { - this.shadowRoot.querySelector("#addArrrAddressDialog").show() - } - - openImportQortAddressbook() { - this.shadowRoot.querySelector("#importQortAddressbookDialog").show() - } - - openImportBtcAddressbook() { - this.shadowRoot.querySelector("#importBtcAddressbookDialog").show() - } - - openImportLtcAddressbook() { - this.shadowRoot.querySelector("#importLtcAddressbookDialog").show() - } - - openImportDogeAddressbook() { - this.shadowRoot.querySelector("#importDogeAddressbookDialog").show() - } - - openImportDgbAddressbook() { - this.shadowRoot.querySelector("#importDgbAddressbookDialog").show() - } - - openImportRvnAddressbook() { - this.shadowRoot.querySelector("#importRvnAddressbookDialog").show() - } - - openImportArrrAddressbook() { - this.shadowRoot.querySelector("#importArrrAddressbookDialog").show() - } - - closeQortAddressDialog() { - this.shadowRoot.querySelector('#addQortAddressDialog').close() - this.shadowRoot.getElementById('qortNameInput').value = '' - this.shadowRoot.getElementById('qortAddressInput').value = '' - this.qortBookName = '' - this.qortBookAddress = '' - } - - closeBtcAddressDialog() { - this.shadowRoot.querySelector('#addBtcAddressDialog').close() - this.shadowRoot.getElementById('btcNameInput').value = '' - this.shadowRoot.getElementById('btcAddressInput').value = '' - this.btcBookName = '' - this.btcBookAddress = '' - } - - closeLtcAddressDialog() { - this.shadowRoot.querySelector('#addLtcAddressDialog').close() - this.shadowRoot.getElementById('ltcNameInput').value = '' - this.shadowRoot.getElementById('ltcAddressInput').value = '' - this.ltcBookName = '' - this.ltcBookAddress = '' - } - - closeDogeAddressDialog() { - this.shadowRoot.querySelector('#addDogeAddressDialog').close() - this.shadowRoot.getElementById('dogeNameInput').value = '' - this.shadowRoot.getElementById('dogeAddressInput').value = '' - this.dogeBookName = '' - this.dogeBookAddress = '' - } - - closeDgbAddressDialog() { - this.shadowRoot.querySelector('#addDgbAddressDialog').close() - this.shadowRoot.getElementById('dgbNameInput').value = '' - this.shadowRoot.getElementById('dgbAddressInput').value = '' - this.dgbBookName = '' - this.dgbBookAddress = '' - } - - closeRvnAddressDialog() { - this.shadowRoot.querySelector('#addRvnAddressDialog').close() - this.shadowRoot.getElementById('rvnNameInput').value = '' - this.shadowRoot.getElementById('rvnAddressInput').value = '' - this.rvnBookName = '' - this.rvnBookAddress = '' - } - - closeArrrAddressDialog() { - this.shadowRoot.querySelector('#addArrrAddressDialog').close() - this.shadowRoot.getElementById('arrrNameInput').value = '' - this.shadowRoot.getElementById('arrrAddressInput').value = '' - this.arrrBookName = '' - this.arrrBookAddress = '' - } - - closeImportQortAddressbookDialog() { - this.shadowRoot.querySelector("#importQortAddressbookDialog").close() - } - - closeImportBtcAddressbookDialog() { - this.shadowRoot.querySelector("#importBtcAddressbookDialog").close() - } - - closeImportLtcAddressbookDialog() { - this.shadowRoot.querySelector("#importLtcAddressbookDialog").close() - } - - closeImportDogeAddressbookDialog() { - this.shadowRoot.querySelector("#importDogeAddressbookDialog").close() - } - - closeImportDgbAddressbookDialog() { - this.shadowRoot.querySelector("#importDgbAddressbookDialog").close() - } - - closeImportRvnAddressbookDialog() { - this.shadowRoot.querySelector("#importRvnAddressbookDialog").close() - } - - closeImportArrrAddressbookDialog() { - this.shadowRoot.querySelector("#importArrrAddressbookDialog").close() - } - - addToQortalAddressbook() { - const myQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress - - let name = this.shadowRoot.getElementById('qortNameInput').value - let address = this.shadowRoot.getElementById('qortAddressInput').value - - var oldQortalBook = JSON.parse(localStorage.getItem(myQortalAddressBook) || "[]") - - if (name.length === 0) { - let qortbookstring1 = get("walletpage.wchange50") - parentEpml.request('showSnackBar', `${qortbookstring1}`) - return false - } - - if (address.length === 0) { - let qortbookstring2 = get("walletpage.wchange51") - parentEpml.request('showSnackBar', `${qortbookstring2}`) - return false - } - - const newQortalBookItem = { - name: name, - address: address - } - - oldQortalBook.push(newQortalBookItem) - - localStorage.setItem(myQortalAddressBook, JSON.stringify(oldQortalBook)) - - let qortbookstring2 = get("walletpage.wchange52") - parentEpml.request('showSnackBar', `${qortbookstring2}`) - - this.closeQortAddressDialog() - this.qortBook = JSON.parse(localStorage.getItem(myQortalAddressBook) || "[]") - } - - addToBitcoinAddressbook() { - const myBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress + static get properties() { + return { + loading: { type: Boolean }, + transactions: { type: Object }, + lastBlock: { type: Object }, + selectedTransaction: { type: Object }, + isTextMenuOpen: { type: Boolean }, + wallets: { type: Map }, + _selectedWallet: 'qort', + nodeConfig: { type: Object }, + nodeDomain: { type: String }, + theme: { type: String, reflect: true }, + amount: { type: Number }, + recipient: { type: String }, + btcRecipient: { type: String }, + btcAmount: { type: Number }, + ltcRecipient: { type: String }, + ltcAmount: { type: Number }, + dogeRecipient: { type: String }, + dogeAmount: { type: Number }, + dgbRecipient: { type: String }, + dgbAmount: { type: Number }, + rvnRecipient: { type: String }, + rvnAmount: { type: Number }, + arrrRecipient: { type: String }, + arrrAmount: { type: Number }, + arrrMemo: { type: String }, + errorMessage: { type: String }, + arrrWalletAddress: { type: String }, + unusedWalletAddress: { type: String }, + successMessage: { type: String }, + sendMoneyLoading: { type: Boolean }, + btnDisable: { type: Boolean }, + qortWarning: { type: Boolean }, + isValidAmount: { type: Boolean }, + balance: { type: Number }, + balanceString: { type: String }, + btcServer: { type: Number }, + ltcServer: { type: Number }, + dogeServer: { type: Number }, + dgbServer: { type: Number }, + rvnServer: { type: Number }, + arrrServer: { type: Number }, + qortPaymentFee: { type: Number }, + btcFeePerByte: { type: Number }, + ltcFeePerByte: { type: Number }, + dogeFeePerByte: { type: Number }, + dgbFeePerByte: { type: Number }, + rvnFeePerByte: { type: Number }, + qortBook: { type: Array }, + btcBook: { type: Array }, + ltcBook: { type: Array }, + dogeBook: { type: Array }, + dgbBook: { type: Array }, + rvnBook: { type: Array }, + arrrBook: { type: Array }, + qortBookName: { type: String }, + btcBookName: { type: String }, + ltcBookName: { type: String }, + dogeBookName: { type: String }, + dgbBookName: { type: String }, + rvnBookName: { type: String }, + arrrBookName: { type: String }, + qortBookAddress: { type: String }, + btcBookAddress: { type: String }, + ltcBookAddress: { type: String }, + dogeBookAddress: { type: String }, + dgbBookAddress: { type: String }, + rvnBookAddress: { type: String }, + arrrBookAddress: { type: String }, + myElementId: { type: String }, + walletSalt: { type: String }, + walletStorageData: { type: String }, + walletLockScreenPass: { type: String }, + walletLockScreenSet: { type: String }, + walletLockPass: { type: String }, + walletLockSet: { type: String }, + myWalletLockScreenPass: { type: String }, + myWalletLockScreenSet: { type: String }, + walletHelperMessage: { type: String }, + bookQortalAddress: { type: String }, + bookBitcoinAddress: { type: String }, + bookLitecoinAddress: { type: String }, + bookDogecoinAddress: { type: String }, + bookDigibyteAddress: { type: String }, + bookRavencoinAddress: { type: String }, + bookPiratechainAddress: { type: String } + } + } + + static get styles() { + return [multiWalletStyles] + } + + static get observers() { + return ['_kmxKeyUp(amount)'] + } + + constructor() { + super() + this.lastBlock = { + height: 0 + } + this.balanceString = this.renderFetchText() + this.selectedTransaction = {} + this.isTextMenuOpen = false + this.loading = true + this.nodeConfig = {} + this.nodeDomain = '' + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + this.qortBook = [] + this.btcBook = [] + this.ltcBook = [] + this.dogeBook = [] + this.dgbBook = [] + this.rvnBook = [] + this.arrrBook = [] + this.qortBookName = '' + this.btcBookName = '' + this.ltcBookName = '' + this.dogeBookName = '' + this.dgbBookName = '' + this.rvnBookName = '' + this.arrrBookName = '' + this.qortBookAddress = '' + this.btcBookAddress = '' + this.ltcBookAddress = '' + this.dogeBookAddress = '' + this.dgbBookAddress = '' + this.rvnBookAddress = '' + this.arrrBookAddress = '' + this.recipient = '' + this.btcRecipient = '' + this.ltcRecipient = '' + this.dogeRecipient = '' + this.dgbRecipient = '' + this.rvnRecipient = '' + this.arrrRecipient = '' + this.arrrMemo = '' + this.arrrWalletAddress = '' + this.unusedWalletAddress = '' + this.btcServer = '' + this.ltcServer = '' + this.dogeServer = '' + this.dgbServer = '' + this.rvnServer = '' + this.arrrServer = '' + this.errorMessage = '' + this.successMessage = '' + this.myElementId = '' + this.sendMoneyLoading = false + this.isValidAmount = false + this.btnDisable = false + this.qortWarning = false + this.balance = 0 + this.amount = 0 + this.btcAmount = 0 + this.ltcAmount = 0 + this.dogeAmount = 0 + this.dgbAmount = 0 + this.rvnAmount = 0 + this.arrrAmount = 0 + this.qortPaymentFee = 0.001 + this.btcFeePerByte = 100 + this.btcSatMinFee = 20 + this.btcSatMaxFee = 150 + this.ltcFeePerByte = 30 + this.ltcSatMinFee = 10 + this.ltcSatMaxFee = 100 + this.dogeFeePerByte = 1000 + this.dogeSatMinFee = 100 + this.dogeSatMaxFee = 10000 + this.dgbFeePerByte = 10 + this.dgbSatMinFee = 1 + this.dgbSatMaxFee = 100 + this.rvnFeePerByte = 1125 + this.rvnSatMinFee = 1000 + this.rvnSatMaxFee = 10000 + this.walletSalt = '' + this.walletStorageData = '' + this.walletLockScreenPass = '' + this.walletLockScreenSet = '' + this.walletLockPass = '' + this.walletLockSet = '' + this.myWalletLockScreenPass = '' + this.myWalletLockScreenSet = '' + this.walletHelperMessage = '' + this.bookQortalAddress = '' + this.bookBitcoinAddress = '' + this.bookLitecoinAddress = '' + this.bookDogecoinAddress = '' + this.bookDigibyteAddress = '' + this.bookRavencoinAddress = '' + this.bookPiratechainAddress = '' + this.wallets = new Map() + + let coinProp = { + balance: 0, + wallet: null, + transactions: [], + fetchingWalletBalance: false, + fetchingWalletTransactions: false + } + + coinsNames.forEach((c, i) => { + this.wallets.set(c, { ...coinProp }) + }, this) + + this.wallets.get('qort').wallet = window.parent.reduxStore.getState().app.selectedAddress + this.wallets.get('btc').wallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet + this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet + this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet + this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet + this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet + this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet + + this._selectedWallet = 'qort' + + parentEpml.ready().then(() => { + parentEpml.subscribe('selected_address', async (selectedAddress) => { + selectedAddress = JSON.parse(selectedAddress) + if (!selectedAddress || Object.entries(selectedAddress).length === 0) return + + this.wallets.get('qort').wallet = selectedAddress + this.wallets.get('btc').wallet = window.parent.reduxStore.getState().app.selectedAddress.btcWallet + this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet + this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet + this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet + this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet + this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet + }) + parentEpml.subscribe('coin_balances', async (payload) => { + const coinBalances = JSON.parse(payload) + if (coinBalances[this._selectedWallet]) { + const res = coinBalances[this._selectedWallet].fullValue + let value = Number(res).toFixed(8) + if (this._selectedWallet !== 'qort') { + value = (Number(res) / 1e8).toFixed(8) + } + this.wallets.get(this._selectedWallet).balance = value + this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() + this.balance = this.wallets.get(this._selectedWallet).balance + } + }) + }) + + this.pingCoinBalancesController = this.pingCoinBalancesController.bind(this) + } + + refreshWallet() { + const coin = this._selectedWallet + switch (coin) { + case 'qort': + this.tabWalletQort() + break + case 'arrr': + this.tabWalletArrr() + break + case 'btc': + this.tabWalletBtc() + break; + case 'ltc': + this.tabWalletLtc() + break; + case 'doge': + this.tabWalletDoge() + break + case 'dgb': + this.tabWalletDgb() + break; + case 'rvn': + this.tabWalletRvn() + break + default: + break + } + } + + render() { + return html` +
    +
    + ${translate("walletpage.wchange22")} ${this.renderWalletLockButton()} +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +

    +
    + ${translate("walletpage.wchange2")} + +
    +
    + ${this.getSelectedWalletAddress()} + + +
    + + ${this.balanceString} + +
    + ${this.getSelectedWalletServer()} +
    +

    +
    + ${this.renderSendButton()} +
    +
    + ${this.renderAddressbookButton()} +
    +
    + +
    +
    + ${this.loading ? html` + + ` : ''} +
    +
    +
    + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")} +
    +
    + ${this.selectedTransaction.type} + ${this.selectedTransaction.txnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    ${this.selectedTransaction.type === 'AT' ? html`${this.selectedTransaction.atAddress}` : html`${this.selectedTransaction.creatorAddress}`}
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.type === 'DEPLOY_AT' ? html`${this.renderCAB()}` : html`${this.renderSQB()}`} +
    +
    + ${!this.selectedTransaction.amount ? '' : html` + ${translate("walletpage.wchange11")} +
    +
    ${this.selectedTransaction.amount} QORT
    + `} + ${translate("walletpage.wchange12")} +
    +
    ${this.selectedTransaction.fee}
    + ${translate("walletpage.wchange13")} +
    +
    ${this.selectedTransaction.blockHeight}
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange15")} +
    +
    ${this.selectedTransaction.signature}
    +
    + + ${translate("general.close")} + +
    + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")} +
    +
    + ${translate("walletpage.wchange40")} + ${this.selectedTransaction.btcTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    + ${this.selectedTransaction.btcSender} +
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.btcReceiver} + this.sendToBtcAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddBtcAddressDialog()} title="${translate("walletpage.wchange49")}"> +
    +
    + ${translate("walletpage.wchange12")} +
    +
    + ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} BTC +
    + ${translate("walletpage.wchange37")} +
    +
    + ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} BTC +
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange16")} +
    +
    + ${this.selectedTransaction.txHash} +
    +
    + + ${translate("general.close")} + +
    + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")}e +
    +
    + ${translate("walletpage.wchange40")} + ${this.selectedTransaction.ltcTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    + ${this.selectedTransaction.ltcSender} +
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.ltcReceiver} + this.sendToLtcAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddLtcAddressDialog()} title="${translate("walletpage.wchange49")}"> +
    +
    + ${translate("walletpage.wchange12")} +
    +
    + ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} LTC +
    + ${translate("walletpage.wchange37")} +
    +
    + ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} LTC +
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange16")} +
    +
    + ${this.selectedTransaction.txHash} +
    +
    + + ${translate("general.close")} + +
    + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")} +
    +
    + ${translate("walletpage.wchange40")} + ${this.selectedTransaction.dogeTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    + ${this.selectedTransaction.dogeSender} +
    +
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.dogeReceiver} + this.sendToDogeAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddDogeAddressDialog()} title="${translate("walletpage.wchange49")}"> +
    +
    + ${translate("walletpage.wchange12")} +
    +
    + ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} DOGE +
    + ${translate("walletpage.wchange37")} +
    +
    + ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} DOGE +
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange16")} +
    +
    + ${this.selectedTransaction.txHash} +
    +
    + + ${translate("general.close")} + +
    + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")} +
    +
    + ${translate("walletpage.wchange40")} + ${this.selectedTransaction.dgbTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    + ${this.selectedTransaction.dgbSender} +
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.dgbReceiver} + this.sendToDgbAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddDgbAddressDialog()} title="${translate("walletpage.wchange49")}"> +
    +
    + ${translate("walletpage.wchange12")} +
    +
    + ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} DGB +
    + ${translate("walletpage.wchange37")} +
    +
    + ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} DGB +
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange16")} +
    +
    + ${this.selectedTransaction.txHash} +
    +
    + + ${translate("general.close")} + +
    + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")} +
    +
    + ${translate("walletpage.wchange40")} + ${this.selectedTransaction.rvnTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    + ${this.selectedTransaction.rvnSender} +
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.rvnReceiver} + this.sendToRvnAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddRvnAddressDialog()} title="${translate("walletpage.wchange49")}"> +
    +
    + ${translate("walletpage.wchange12")} +
    +
    + ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} RVN +
    + ${translate("walletpage.wchange37")} +
    +
    + ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} RVN +
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange16")} +
    +
    + ${this.selectedTransaction.txHash} +
    +
    + + ${translate("general.close")} + +
    + +
    +

    ${translate("walletpage.wchange5")}

    +
    +
    +
    + ${translate("walletpage.wchange6")} +
    +
    + ${translate("walletpage.wchange40")} + ${this.selectedTransaction.arrrTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
    + ${translate("walletpage.wchange9")} +
    +
    + ${this.selectedTransaction.arrrSender} +
    + ${translate("walletpage.wchange10")} +
    +
    + ${this.selectedTransaction.arrrReceiver} + this.sendToArrrAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddArrrAddressDialog()} title="${translate("walletpage.wchange49")}"> +
    +
    + ${translate("walletpage.wchange12")} +
    +
    + ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} ARRR +
    + ${translate("walletpage.wchange37")} +
    +
    + ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} ARRR +
    + ${translate("walletpage.wchange14")} +
    +
    ${new Date(this.selectedTransaction.timestamp).toString()}
    + ${translate("walletpage.wchange16")} +
    +
    + ${this.selectedTransaction.txHash} +
    +
    + + ${translate("general.close")} + +
    + +
    +
    + +

    ${translate("walletpage.wchange17")} QORT

    +
    +
    +

    + ${translate("walletpage.wchange18")}:
    + ${this.getSelectedWalletAddress()} +

    +

    + ${translate("walletpage.wchange19")}:
    + ${this.balanceString}
    + + this.calculateQortAll()}> + + ${translate("walletpage.wchange45")} QORT + + +
      +

    +

    + + +

    +

    + + +

    +
    +

    ${translate("walletpage.wchange21")} ${this.qortPaymentFee} QORT

    +
    + ${this.renderClearSuccess()} + ${this.renderClearError()} + ${this.sendMoneyLoading ? html` + + ` : ''} +
    +
    + this.sendQort()}> + + ${translate("walletpage.wchange17")} QORT + +
    ${this.renderWarning()}
    +
    +
    +
    + + ${translate("general.close")} + +
    + +
    +
    + +

    ${translate("walletpage.wchange17")} BTC

    +
    +
    +

    + From address:
    + ${this.getSelectedWalletAddress()} +

    +

    + Available balance:
    + ${this.balanceString}
    + + this.calculateBtcAll()}> + + ${translate("walletpage.wchange45")} BTC + + +
      +

    +

    + + +

    +

    + + +

    +
    +

    ${translate("walletpage.wchange24")}: ${(this.btcFeePerByte / 1e8).toFixed(8)} BTC
    ${translate("walletpage.wchange25")}

    + + +
    + ${this.renderClearSuccess()} + ${this.renderClearError()} + ${this.sendMoneyLoading ? html` + + ` : ''} +
    +
    + this.sendBtc()}> + + ${translate("walletpage.wchange17")} BTC + +
    +
    +
    + + ${translate("general.close")} + +
    + +
    +
    + +

    ${translate("walletpage.wchange17")} LTC

    +
    +
    +

    + ${translate("walletpage.wchange18")}:
    + ${this.getSelectedWalletAddress()} +

    +

    + ${translate("walletpage.wchange19")}:
    + ${this.balanceString}
    + + this.calculateLtcAll()}> + + ${translate("walletpage.wchange45")} LTC + + +
      +

    +

    + + +

    +

    + + +

    +
    +

    ${translate("walletpage.wchange24")}: ${(this.ltcFeePerByte / 1e8).toFixed(8)} LTC
    ${translate("walletpage.wchange25")}

    + + +
    + ${this.renderClearSuccess()} + ${this.renderClearError()} + ${this.sendMoneyLoading ? html` + + ` : ''} +
    +
    + this.sendLtc()}> + + ${translate("walletpage.wchange17")} LTC + +
    +
    +
    + + ${translate("general.close")} + +
    + +
    +
    + +

    ${translate("walletpage.wchange17")} DOGE

    +
    +
    +

    + ${translate("walletpage.wchange18")}:
    + ${this.getSelectedWalletAddress()} +

    +

    + ${translate("walletpage.wchange19")}:
    + ${this.balanceString}
    + + this.calculateDogeAll()}> + + ${translate("walletpage.wchange45")} DOGE + + +
      +

    +

    + + +

    +

    + + +

    +
    +

    + ${translate("walletpage.wchange24")}: ${(this.dogeFeePerByte / 1e8).toFixed(8)} DOGE
    ${translate("walletpage.wchange25")} +

    + + +
    + ${this.renderClearSuccess()} + ${this.renderClearError()} + ${this.sendMoneyLoading ? html` + + ` : ''} +
    +
    + this.sendDoge()}> + + ${translate("walletpage.wchange17")} DOGE + +
    +
    +
    + + ${translate("general.close")} + +
    + +
    +
    + +

    ${translate("walletpage.wchange17")} DGB

    +
    +
    +

    + ${translate("walletpage.wchange18")}:
    + ${this.getSelectedWalletAddress()} +

    +

    + ${translate("walletpage.wchange19")}:
    + ${this.balanceString}
    + + this.calculateDgbAll()}> + + ${translate("walletpage.wchange45")} DGB + + +
      +

    +

    + + +

    +

    + + +

    +
    +

    + ${translate("walletpage.wchange24")}: ${(this.dgbFeePerByte / 1e8).toFixed(8)} DGB
    ${translate("walletpage.wchange25")} +

    + + +
    + ${this.renderClearSuccess()} + ${this.renderClearError()} + ${this.sendMoneyLoading ? html` + + ` : ''} +
    +
    + this.sendDgb()}> + + ${translate("walletpage.wchange17")} DGB + +
    +
    +
    + + ${translate("general.close")} + +
    + +
    +
    + +

    ${translate("walletpage.wchange17")} RVN

    +
    +
    +

    + ${translate("walletpage.wchange18")}:
    + ${this.getSelectedWalletAddress()} +

    +

    + ${translate("walletpage.wchange19")}:
    + ${this.balanceString}
    + + this.calculateRvnAll()}> + + ${translate("walletpage.wchange45")} RVN + + +
      +

    +

    + + +

    +

    + + +

    +
    +

    + ${translate("walletpage.wchange24")}: ${(this.rvnFeePerByte / 1e8).toFixed(8)} RVN
    ${translate("walletpage.wchange25")} +

    + + +
    + ${this.renderClearSuccess()} + ${this.renderClearError()} + ${this.sendMoneyLoading ? html` + + ` : ''} +
    +
    + this.sendRvn()}> + + ${translate("walletpage.wchange17")} RVN + +
    +
    +
    + + ${translate("general.close")} + +
    + +
    +
    + +

    ${translate("walletpage.wchange17")} ARRR

    +
    +
    +

    + ${translate("walletpage.wchange18")}:
    + ${this.getSelectedWalletAddress()} +

    +

    + ${translate("walletpage.wchange19")}:
    + ${this.balanceString}
    + + this.calculateArrrAll()}> + + ${translate("walletpage.wchange45")} ARRR + + +
      +

    +

    + + +

    +

    + + +

    +

    + + +

    +

    ${this.errorMessage}

    +

    ${this.successMessage}

    + ${this.sendMoneyLoading ? html` + + ` : ''} +
    +
    + this.sendArrr()}> + + ${translate("walletpage.wchange17")} ARRR + +
    +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Qortal ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    +
    ${this.renderImportAddressbookButton()}
    +

    +
    +
    + + + + { + render(html`${this.renderSendFromQortAddressbookButton(data.item)}`, root) + }}> + + { + render(html` + this.removeQortAddress(data.item.address)}> + delete +  ${translate("nodepage.nchange12")} + + `, root) + }}> + + + ${this.isEmptyArray(this.qortBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToQortAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + +
    + +

    Bitcoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    +
    ${this.renderImportAddressbookButton()}
    +

    +
    +
    + + + + { + render(html`${this.renderSendFromBtcAddressbookButton(data.item)}`, root) + }}> + + { + render(html` + this.removeBtcAddress(data.item.address)}> + delete +  ${translate("nodepage.nchange12")} + + `, root) + }}> + + + ${this.isEmptyArray(this.btcBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToBtcAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + +
    + +

    Litecoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    +
    ${this.renderImportAddressbookButton()}
    +

    +
    +
    + + + + { + render(html`${this.renderSendFromLtcAddressbookButton(data.item)}`, root) + }}> + + { + render(html` + this.removeLtcAddress(data.item.address)}> + delete +  ${translate("nodepage.nchange12")} + + `, root) + }}> + + + ${this.isEmptyArray(this.ltcBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToLtcAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + +
    + +

    Dogecoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    +
    ${this.renderImportAddressbookButton()}
    +

    +
    +
    + + + + { + render(html`${this.renderSendFromDogeAddressbookButton(data.item)}`, root) + }}> + + { + render(html` + this.removeDogeAddress(data.item.address)}> + delete +  ${translate("nodepage.nchange12")} + + `, root) + }}> + + + ${this.isEmptyArray(this.dogeBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToDogeAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + +
    + +

    Digibyte ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    +
    ${this.renderImportAddressbookButton()}
    +

    +
    +
    + + + + { + render(html`${this.renderSendFromDgbAddressbookButton(data.item)}`, root) + }}> + + { + render(html` + this.removeDgbAddress(data.item.address)}> + delete +  ${translate("nodepage.nchange12")} + + `, root) + }}> + + + ${this.isEmptyArray(this.dgbBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToDgbAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + +
    + +

    Ravencoin ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    +
    ${this.renderImportAddressbookButton()}
    +

    +
    +
    + + + + { + render(html`${this.renderSendFromRvnAddressbookButton(data.item)}`, root) + }}> + + { + render(html` + this.removeRvnAddress(data.item.address)}> + delete +  ${translate("nodepage.nchange12")} + + `, root) + }}> + + + ${this.isEmptyArray(this.rvnBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToRvnAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + +
    + +

    Pirate Chain ${translate("walletpage.wchange47")}

    +
    +
    ${this.renderExportAddressbookButton()}
    +
    ${this.renderImportAddressbookButton()}
    +

    +
    +
    + + + + { + render(html`${this.renderSendFromArrrAddressbookButton(data.item)}`, root) + }}> + + { + render(html` + this.removeArrrAddress(data.item.address)}> + delete +  ${translate("nodepage.nchange12")} + + `, root) + }}> + + + ${this.isEmptyArray(this.arrrBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToArrrAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
    + +
    + +

    Qortal ${translate("walletpage.wchange47")}

    +
    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + + this.addToQortalAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Bitcoin ${translate("walletpage.wchange47")}

    +
    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + + this.addToBitcoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Litecoin ${translate("walletpage.wchange47")}

    +
    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + + this.addToLitecoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Dogecoin ${translate("walletpage.wchange47")}

    +
    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + + this.addToDogecoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Digibyte ${translate("walletpage.wchange47")}

    +
    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + + this.addToDigibyteAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Ravencoin ${translate("walletpage.wchange47")}

    +
    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + + this.addToRavencoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Pirate Chain ${translate("walletpage.wchange47")}

    +
    +

    ${translate("walletpage.wchange49")}

    +
    +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +
    + + this.addToPiratechainAddressbook()}> + + ${translate("walletpage.wchange49")} + +
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Qortal ${translate("walletpage.wchange53")}

    +
    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Bitcoin ${translate("walletpage.wchange53")}

    +
    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Litecoin ${translate("walletpage.wchange53")}

    +
    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Dogecoin ${translate("walletpage.wchange53")}

    +
    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Digibyte ${translate("walletpage.wchange53")}

    +
    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Litecoin ${translate("walletpage.wchange53")}

    +
    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    + +
    + +

    Pirate Chain ${translate("walletpage.wchange53")}

    +
    +
    +
    +
    +
    + +

    ${translate("walletpage.wchange56")}

    +
    ${translate("walletpage.wchange55")}
    +
    + + ${translate("general.close")} + +
    +
    + +
    +

    Qortal ${translate("tabmenu.tm5")} ${translate("login.lp1")}

    +
    +
    +
    +

    ${translate("login.lp2")}

    +

    ${translate("login.lp3")}

    +
    +
    + password + +
    +
    + password + +
    +
    + ${translate("login.lp4")} + ${translate("login.lp5")} +
    +
    + +
    +

    Qortal ${translate("tabmenu.tm5")} ${translate("login.lp1")}

    +
    +
    +
    +

    ${translate("login.lessthen8")}

    +
    +
    + ${translate("login.lp4")} + ${translate("login.lp5")} +
    +
    + +
    + ${translate("sidemenu.wallets")}
    + ${translate("login.lp9")} + ${translate("login.lp10")} +
    +
    + password + +
    + ${this.walletHelperMessage} +
    +
    +
    +
    + +
    +
    + ` + } + + firstUpdated() { + + this.changeTheme() + this.changeLanguage() + this.paymentFee() + this.getNodeConfig() + + this.bookQortalAddress = window.parent.reduxStore.getState().app.selectedAddress.address + this.bookBitcoinAddress = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address + this.bookLitecoinAddress = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address + this.bookDogecoinAddress = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address + this.bookDigibyteAddress = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address + this.bookRavencoinAddress = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address + this.bookPiratechainAddress = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.address + + this.walletHelperMessage = this.renderWalletHelperPass() + + this.walletSalt = '' + this.walletSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) + + this.walletStorageData = '' + this.walletStorageData = window.parent.reduxStore.getState().app.selectedAddress.address + + this.walletLockScreenPass = '' + this.walletLockScreenPass = 'walletLockScreenPass-' + this.walletStorageData + + this.walletLockScreenSet = '' + this.walletLockScreenSet = 'walletLockScreenSet-' + this.walletStorageData + + this.walletLockPass = '' + this.walletLockPass = encryptData(false, this.walletSalt) + + this.walletLockSet = '' + this.walletLockSet = encryptData(false, this.walletSalt) + + if (localStorage.getItem(this.walletLockScreenPass) === null && localStorage.getItem(this.walletLockScreenSet) === null) { + localStorage.setItem(this.walletLockScreenPass, this.walletLockPass) + localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) + this.myWalletLockScreenPass = '' + this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + } else { + this.myWalletLockScreenPass = '' + this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + } + + if (this.myWalletLockScreenSet === true) { + this.shadowRoot.getElementById('walletLockScreenActive').open() + } + + this.qortAddressbook() + this.btcAddressbook() + this.ltcAddressbook() + this.dogeAddressbook() + this.dgbAddressbook() + this.rvnAddressbook() + this.arrrAddressbook() + + this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') + + this.showWallet() + + window.addEventListener('storage', () => { + 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) + }) + + if (!isElectron()) { + } else { + window.addEventListener('contextmenu', (event) => { + event.preventDefault() + window.parent.electronAPI.showMyMenu() + }) + } + + this.clearConsole() + + setInterval(() => { + this.clearConsole() + this.getNodeConfig() + }, 60000) + + setInterval(() => { + this.paymentFee() + }, 600000) + } + + async paymentFee() { + 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/unitfee?txType=PAYMENT` + + await fetch(url).then((response) => { + if (response.ok) { + return response.json() + } + return Promise.reject(response) + }).then((json) => { + this.qortPaymentFee = (Number(json) / 1e8).toFixed(8) + }) + } + + clearConsole() { + if (!isElectron()) { + } else { + console.clear() + window.parent.electronAPI.clearCache() + } + } + + pingCoinBalancesController() { + if (!this._selectedWallet) return + const customEvent = new CustomEvent('ping-coin-controller-with-coin', { + detail: this._selectedWallet + }) + window.parent.dispatchEvent(customEvent) + } + + connectedCallback() { + super.connectedCallback() + this.intervalID = setInterval(this.pingCoinBalancesController, 30000) + } + + disconnectedCallback() { + super.disconnectedCallback() + if (this.intervalID) { + clearInterval(this.intervalID) + } + } + + renderWalletLockButton() { + if (this.myWalletLockScreenPass === false && this.myWalletLockScreenSet === false) { + return html` +
    + this.openWalletSetScreenLockPass()} title="${translate("login.lp11")}"> +
    + ` + } else if (this.myWalletLockScreenSet === false) { + return html` +
    + this.setWalletLockQortal()} title="${translate("login.lp11")}"> +
    + ` + } else if (this.myWalletLockScreenSet === true) { + return html` +
    + +
    + ` + } + } + + openWalletSetScreenLockPass() { + this.shadowRoot.getElementById('walletLockPassword').value = '' + this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setWalletLockScreenPass').open() + } + + closewWalletSetScreenLockPass() { + this.shadowRoot.getElementById('setWalletLockScreenPass').close() + } + + walletCheckPass() { + const walletPassword = this.shadowRoot.getElementById('walletLockPassword').value + const walletRePassword = this.shadowRoot.getElementById('walletLockPasswordConfirm').value + + if (walletPassword === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (walletPassword != walletRePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (walletPassword.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.walletExtraConfirm() + } + + if (walletPassword.length >= 8) { + this.setWalletNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + walletExtraConfirm() { + this.shadowRoot.getElementById('setWalletLockScreenPass').close() + this.shadowRoot.getElementById('walletExtraConfirmPass').open() + } + + closWalletExtraConfirmPass() { + this.shadowRoot.getElementById('walletExtraConfirmPass').close() + this.shadowRoot.getElementById('walletLockPassword').value = '' + this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' + } + + setWalletNewScreenPass() { + const walletRawPassword = this.shadowRoot.getElementById('walletLockPassword').value + const walletCryptPassword = encryptData(walletRawPassword, this.walletSalt) + localStorage.setItem(this.walletLockScreenPass, walletCryptPassword) + this.myWalletLockScreenPass = '' + this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + this.shadowRoot.getElementById('setWalletLockScreenPass').close() + this.shadowRoot.getElementById('walletExtraConfirmPass').close() + this.shadowRoot.getElementById('walletLockPassword').value = '' + this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' + } + + setWalletLockQortal() { + this.walletHelperMessage = this.renderWalletHelperPass() + this.walletLockSet = '' + this.walletLockSet = encryptData(true, this.walletSalt) + localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + this.shadowRoot.getElementById('walletLockScreenActive').open() + } + + walletPassKeyListener(e) { + if (e.key === 'Enter') { + this.closeWalletLockScreenActive() + } + } + + async closeWalletLockScreenActive() { + const myWalletPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + const walletCheckPass = this.shadowRoot.getElementById('walletUnlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (walletCheckPass === myWalletPass) { + this.walletLockSet = '' + this.walletLockSet = encryptData(false, this.walletSalt) + localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + this.shadowRoot.getElementById('walletLockScreenActive').close() + this.shadowRoot.getElementById('walletUnlockPassword').value = '' + this.walletHelperMessage = this.renderWalletHelperPass() + } else { + this.shadowRoot.getElementById('walletUnlockPassword').value = '' + this.walletHelperMessage = this.renderWalletHelperErr() + await errDelay(3000) + this.walletHelperMessage = this.renderWalletHelperPass() + } + } + + renderWalletHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderWalletHelperErr() { + return html`${translate("login.lp8")}` + } + + renderWarning() { + return html`${translate("tradepage.tchange48")} QORT` + } + + renderClearSuccess() { + let strSuccessValue = this.successMessage + if (strSuccessValue === "") { + return html`` + } else { + return html` +
    + ${this.successMessage} + + + +
    +
    +

    ${translate("walletpage.wchange43")}

    +
    + ` + } + } + + renderClearError() { + let strErrorValue = this.errorMessage + if (strErrorValue === "") { + return html`` + } else { + return html` +
    + ${this.errorMessage} + + + +
    +
    +

    ${translate("walletpage.wchange44")}

    +
    + ` + } + } + + tabWalletQort() { + this._selectedWallet = 'qort' + this.showWallet() + } + + tabWalletBtc() { + this._selectedWallet = 'btc' + this.showWallet() + } + + tabWalletLtc() { + this._selectedWallet = 'ltc' + this.showWallet() + } + + tabWalletDoge() { + this._selectedWallet = 'doge' + this.showWallet() + } + + tabWalletDgb() { + this._selectedWallet = 'dgb' + this.showWallet() + } + + tabWalletRvn() { + this._selectedWallet = 'rvn' + this.showWallet() + } + + tabWalletArrr() { + this._selectedWallet = 'arrr' + this.showWallet() + } + + qortAddressbook() { + const storedQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress + if (localStorage.getItem(storedQortalAddressBook) === null) { + localStorage.setItem(storedQortalAddressBook, "") + } else { + this.qortBook = JSON.parse(localStorage.getItem(storedQortalAddressBook) || "[]") + } + } + + btcAddressbook() { + const storedBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress + if (localStorage.getItem(storedBitcoinAddressBook) === null) { + localStorage.setItem(storedBitcoinAddressBook, "") + } else { + this.btcBook = JSON.parse(localStorage.getItem(storedBitcoinAddressBook) || "[]") + } + } + + ltcAddressbook() { + const storedLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress + if (localStorage.getItem(storedLitecoinAddressBook) === null) { + localStorage.setItem(storedLitecoinAddressBook, "") + } else { + this.ltcBook = JSON.parse(localStorage.getItem(storedLitecoinAddressBook) || "[]") + } + } + + dogeAddressbook() { + const storedDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress + if (localStorage.getItem(storedDogecoinAddressBook) === null) { + localStorage.setItem(storedDogecoinAddressBook, "") + } else { + this.dogeBook = JSON.parse(localStorage.getItem(storedDogecoinAddressBook) || "[]") + } + } + + dgbAddressbook() { + const storedDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress + if (localStorage.getItem(storedDigibyteAddressBook) === null) { + localStorage.setItem(storedDigibyteAddressBook, "") + } else { + this.dgbBook = JSON.parse(localStorage.getItem(storedDigibyteAddressBook) || "[]") + } + } + + rvnAddressbook() { + const storedRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress + if (localStorage.getItem(storedRavencoinAddressBook) === null) { + localStorage.setItem(storedRavencoinAddressBook, "") + } else { + this.rvnBook = JSON.parse(localStorage.getItem(storedRavencoinAddressBook) || "[]") + } + } + + arrrAddressbook() { + const storedPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress + if (localStorage.getItem(storedPiratechainAddressBook) === null) { + localStorage.setItem(storedPiratechainAddressBook, "") + } else { + this.arrrBook = JSON.parse(localStorage.getItem(storedPiratechainAddressBook) || "[]") + } + } + + openQortAddressbook() { + this.shadowRoot.querySelector("#qortBookDialog").show() + } + + openBtcAddressbook() { + this.shadowRoot.querySelector("#btcBookDialog").show() + } + + openLtcAddressbook() { + this.shadowRoot.querySelector("#ltcBookDialog").show() + } + + openDogeAddressbook() { + this.shadowRoot.querySelector("#dogeBookDialog").show() + } + + openDgbAddressbook() { + this.shadowRoot.querySelector("#dgbBookDialog").show() + } + + openRvnAddressbook() { + this.shadowRoot.querySelector("#rvnBookDialog").show() + } + + openArrrAddressbook() { + this.shadowRoot.querySelector("#arrrBookDialog").show() + } + + openAddQortAddressDialog() { + this.qortBookAddress = this.selectedTransaction.recipient + this.openAddToQortAddressbook() + this.shadowRoot.querySelector('#showTransactionDetailsDialog').close() + } + + openAddBtcAddressDialog() { + this.btcBookAddress = this.selectedTransaction.btcReceiver + this.openAddToBtcAddressbook() + this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').close() + } + + openAddLtcAddressDialog() { + this.ltcBookAddress = this.selectedTransaction.ltcReceiver + this.openAddToLtcAddressbook() + this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close() + } + + openAddDogeAddressDialog() { + this.dogeBookAddress = this.selectedTransaction.dogeReceiver + this.openAddToDogeAddressbook() + this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').close() + } + + openAddDgbAddressDialog() { + this.dgbBookAddress = this.selectedTransaction.dgbReceiver + this.openAddToDgbAddressbook() + this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').close() + } + + openAddRvnAddressDialog() { + this.rvnBookAddress = this.selectedTransaction.rvnReceiver + this.openAddToRvnAddressbook() + this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() + } + + openAddArrrAddressDialog() { + this.arrrBookAddress = this.selectedTransaction.arrrReceiver + this.openAddToArrrAddressbook() + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() + } + + openAddToQortAddressbook() { + this.shadowRoot.querySelector("#addQortAddressDialog").show() + } + + openAddToBtcAddressbook() { + this.shadowRoot.querySelector("#addBtcAddressDialog").show() + } + + openAddToLtcAddressbook() { + this.shadowRoot.querySelector("#addLtcAddressDialog").show() + } + + openAddToDogeAddressbook() { + this.shadowRoot.querySelector("#addDogeAddressDialog").show() + } + + openAddToDgbAddressbook() { + this.shadowRoot.querySelector("#addDgbAddressDialog").show() + } + + openAddToRvnAddressbook() { + this.shadowRoot.querySelector("#addRvnAddressDialog").show() + } + + openAddToArrrAddressbook() { + this.shadowRoot.querySelector("#addArrrAddressDialog").show() + } + + openImportQortAddressbook() { + this.shadowRoot.querySelector("#importQortAddressbookDialog").show() + } + + openImportBtcAddressbook() { + this.shadowRoot.querySelector("#importBtcAddressbookDialog").show() + } + + openImportLtcAddressbook() { + this.shadowRoot.querySelector("#importLtcAddressbookDialog").show() + } + + openImportDogeAddressbook() { + this.shadowRoot.querySelector("#importDogeAddressbookDialog").show() + } + + openImportDgbAddressbook() { + this.shadowRoot.querySelector("#importDgbAddressbookDialog").show() + } + + openImportRvnAddressbook() { + this.shadowRoot.querySelector("#importRvnAddressbookDialog").show() + } + + openImportArrrAddressbook() { + this.shadowRoot.querySelector("#importArrrAddressbookDialog").show() + } + + closeQortAddressDialog() { + this.shadowRoot.querySelector('#addQortAddressDialog').close() + this.shadowRoot.getElementById('qortNameInput').value = '' + this.shadowRoot.getElementById('qortAddressInput').value = '' + this.qortBookName = '' + this.qortBookAddress = '' + } + + closeBtcAddressDialog() { + this.shadowRoot.querySelector('#addBtcAddressDialog').close() + this.shadowRoot.getElementById('btcNameInput').value = '' + this.shadowRoot.getElementById('btcAddressInput').value = '' + this.btcBookName = '' + this.btcBookAddress = '' + } + + closeLtcAddressDialog() { + this.shadowRoot.querySelector('#addLtcAddressDialog').close() + this.shadowRoot.getElementById('ltcNameInput').value = '' + this.shadowRoot.getElementById('ltcAddressInput').value = '' + this.ltcBookName = '' + this.ltcBookAddress = '' + } + + closeDogeAddressDialog() { + this.shadowRoot.querySelector('#addDogeAddressDialog').close() + this.shadowRoot.getElementById('dogeNameInput').value = '' + this.shadowRoot.getElementById('dogeAddressInput').value = '' + this.dogeBookName = '' + this.dogeBookAddress = '' + } + + closeDgbAddressDialog() { + this.shadowRoot.querySelector('#addDgbAddressDialog').close() + this.shadowRoot.getElementById('dgbNameInput').value = '' + this.shadowRoot.getElementById('dgbAddressInput').value = '' + this.dgbBookName = '' + this.dgbBookAddress = '' + } + + closeRvnAddressDialog() { + this.shadowRoot.querySelector('#addRvnAddressDialog').close() + this.shadowRoot.getElementById('rvnNameInput').value = '' + this.shadowRoot.getElementById('rvnAddressInput').value = '' + this.rvnBookName = '' + this.rvnBookAddress = '' + } + + closeArrrAddressDialog() { + this.shadowRoot.querySelector('#addArrrAddressDialog').close() + this.shadowRoot.getElementById('arrrNameInput').value = '' + this.shadowRoot.getElementById('arrrAddressInput').value = '' + this.arrrBookName = '' + this.arrrBookAddress = '' + } + + closeImportQortAddressbookDialog() { + this.shadowRoot.querySelector("#importQortAddressbookDialog").close() + } + + closeImportBtcAddressbookDialog() { + this.shadowRoot.querySelector("#importBtcAddressbookDialog").close() + } + + closeImportLtcAddressbookDialog() { + this.shadowRoot.querySelector("#importLtcAddressbookDialog").close() + } + + closeImportDogeAddressbookDialog() { + this.shadowRoot.querySelector("#importDogeAddressbookDialog").close() + } + + closeImportDgbAddressbookDialog() { + this.shadowRoot.querySelector("#importDgbAddressbookDialog").close() + } + + closeImportRvnAddressbookDialog() { + this.shadowRoot.querySelector("#importRvnAddressbookDialog").close() + } + + closeImportArrrAddressbookDialog() { + this.shadowRoot.querySelector("#importArrrAddressbookDialog").close() + } + + addToQortalAddressbook() { + const myQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress + + let name = this.shadowRoot.getElementById('qortNameInput').value + let address = this.shadowRoot.getElementById('qortAddressInput').value + + var oldQortalBook = JSON.parse(localStorage.getItem(myQortalAddressBook) || "[]") + + if (name.length === 0) { + let qortbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${qortbookstring1}`) + return false + } + + if (address.length === 0) { + let qortbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${qortbookstring2}`) + return false + } + + const newQortalBookItem = { + name: name, + address: address + } + + oldQortalBook.push(newQortalBookItem) + + localStorage.setItem(myQortalAddressBook, JSON.stringify(oldQortalBook)) + + let qortbookstring2 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${qortbookstring2}`) + + this.closeQortAddressDialog() + this.qortBook = JSON.parse(localStorage.getItem(myQortalAddressBook) || "[]") + } + + addToBitcoinAddressbook() { + const myBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress - let name = this.shadowRoot.getElementById('btcNameInput').value - let address = this.shadowRoot.getElementById('btcAddressInput').value + let name = this.shadowRoot.getElementById('btcNameInput').value + let address = this.shadowRoot.getElementById('btcAddressInput').value - var oldBitcoinBook = JSON.parse(localStorage.getItem(myBitcoinAddressBook) || "[]") + var oldBitcoinBook = JSON.parse(localStorage.getItem(myBitcoinAddressBook) || "[]") - if (name.length === 0) { - let btcbookstring1 = get("walletpage.wchange50") - parentEpml.request('showSnackBar', `${btcbookstring1}`) - return false - } + if (name.length === 0) { + let btcbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${btcbookstring1}`) + return false + } - if (address.length === 0) { - let btcbookstring2 = get("walletpage.wchange51") - parentEpml.request('showSnackBar', `${btcbookstring2}`) - return false - } + if (address.length === 0) { + let btcbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${btcbookstring2}`) + return false + } - const newBitcoinBookItem = { - name: name, - address: address - } + const newBitcoinBookItem = { + name: name, + address: address + } - oldBitcoinBook.push(newBitcoinBookItem) + oldBitcoinBook.push(newBitcoinBookItem) - localStorage.setItem(myBitcoinAddressBook, JSON.stringify(oldBitcoinBook)) + localStorage.setItem(myBitcoinAddressBook, JSON.stringify(oldBitcoinBook)) - let btcbookstring3 = get("walletpage.wchange52") - parentEpml.request('showSnackBar', `${btcbookstring3}`) + let btcbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${btcbookstring3}`) - this.closeBtcAddressDialog() - this.btcBook = JSON.parse(localStorage.getItem(myBitcoinAddressBook) || "[]") - } + this.closeBtcAddressDialog() + this.btcBook = JSON.parse(localStorage.getItem(myBitcoinAddressBook) || "[]") + } - addToLitecoinAddressbook() { - const myLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress + addToLitecoinAddressbook() { + const myLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress - let name = this.shadowRoot.getElementById('ltcNameInput').value - let address = this.shadowRoot.getElementById('ltcAddressInput').value + let name = this.shadowRoot.getElementById('ltcNameInput').value + let address = this.shadowRoot.getElementById('ltcAddressInput').value - var oldLitecoinBook = JSON.parse(localStorage.getItem(myLitecoinAddressBook) || "[]") + var oldLitecoinBook = JSON.parse(localStorage.getItem(myLitecoinAddressBook) || "[]") - if (name.length === 0) { - let ltcbookstring1 = get("walletpage.wchange50") - parentEpml.request('showSnackBar', `${ltcbookstring1}`) - return false - } + if (name.length === 0) { + let ltcbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${ltcbookstring1}`) + return false + } - if (address.length === 0) { - let ltcbookstring2 = get("walletpage.wchange51") - parentEpml.request('showSnackBar', `${ltcbookstring2}`) - return false - } + if (address.length === 0) { + let ltcbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${ltcbookstring2}`) + return false + } - const newLitecoinBookItem = { - name: name, - address: address - } + const newLitecoinBookItem = { + name: name, + address: address + } - oldLitecoinBook.push(newLitecoinBookItem) + oldLitecoinBook.push(newLitecoinBookItem) - localStorage.setItem(myLitecoinAddressBook, JSON.stringify(oldLitecoinBook)) + localStorage.setItem(myLitecoinAddressBook, JSON.stringify(oldLitecoinBook)) - let ltcbookstring3 = get("walletpage.wchange52") - parentEpml.request('showSnackBar', `${ltcbookstring3}`) + let ltcbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${ltcbookstring3}`) - this.closeLtcAddressDialog() - this.ltcBook = JSON.parse(localStorage.getItem(myLitecoinAddressBook) || "[]") - } + this.closeLtcAddressDialog() + this.ltcBook = JSON.parse(localStorage.getItem(myLitecoinAddressBook) || "[]") + } - addToDogecoinAddressbook() { - const myDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress + addToDogecoinAddressbook() { + const myDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress - let name = this.shadowRoot.getElementById('dogeNameInput').value - let address = this.shadowRoot.getElementById('dogeAddressInput').value + let name = this.shadowRoot.getElementById('dogeNameInput').value + let address = this.shadowRoot.getElementById('dogeAddressInput').value - var oldDogecoinBook = JSON.parse(localStorage.getItem(myDogecoinAddressBook) || "[]") + var oldDogecoinBook = JSON.parse(localStorage.getItem(myDogecoinAddressBook) || "[]") - if (name.length === 0) { - let dogebookstring1 = get("walletpage.wchange50") - parentEpml.request('showSnackBar', `${dogebookstring1}`) - return false - } + if (name.length === 0) { + let dogebookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${dogebookstring1}`) + return false + } - if (address.length === 0) { - let dogebookstring2 = get("walletpage.wchange51") - parentEpml.request('showSnackBar', `${dogebookstring2}`) - return false - } + if (address.length === 0) { + let dogebookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${dogebookstring2}`) + return false + } - const newDogecoinBookItem = { - name: name, - address: address - } + const newDogecoinBookItem = { + name: name, + address: address + } - oldDogecoinBook.push(newDogecoinBookItem) + oldDogecoinBook.push(newDogecoinBookItem) - localStorage.setItem(myDogecoinAddressBook, JSON.stringify(oldDogecoinBook)) + localStorage.setItem(myDogecoinAddressBook, JSON.stringify(oldDogecoinBook)) - let dogebookstring3 = get("walletpage.wchange52") - parentEpml.request('showSnackBar', `${dogebookstring3}`) + let dogebookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${dogebookstring3}`) - this.closeDogeAddressDialog() - this.dogeBook = JSON.parse(localStorage.getItem(myDogecoinAddressBook) || "[]") - } + this.closeDogeAddressDialog() + this.dogeBook = JSON.parse(localStorage.getItem(myDogecoinAddressBook) || "[]") + } - addToDigibyteAddressbook() { - const myDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress + addToDigibyteAddressbook() { + const myDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress - let name = this.shadowRoot.getElementById('dgbNameInput').value - let address = this.shadowRoot.getElementById('dgbAddressInput').value + let name = this.shadowRoot.getElementById('dgbNameInput').value + let address = this.shadowRoot.getElementById('dgbAddressInput').value - var oldDigibyteBook = JSON.parse(localStorage.getItem(myDigibyteAddressBook) || "[]") + var oldDigibyteBook = JSON.parse(localStorage.getItem(myDigibyteAddressBook) || "[]") - if (name.length === 0) { - let dgbbookstring1 = get("walletpage.wchange50") - parentEpml.request('showSnackBar', `${dgbbookstring1}`) - return false - } + if (name.length === 0) { + let dgbbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${dgbbookstring1}`) + return false + } - if (address.length === 0) { - let dgbbookstring2 = get("walletpage.wchange51") - parentEpml.request('showSnackBar', `${dgbbookstring2}`) - return false - } + if (address.length === 0) { + let dgbbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${dgbbookstring2}`) + return false + } - const newDigibyteBookItem = { - name: name, - address: address - } + const newDigibyteBookItem = { + name: name, + address: address + } - oldDigibyteBook.push(newDigibyteBookItem) + oldDigibyteBook.push(newDigibyteBookItem) - localStorage.setItem(myDigibyteAddressBook, JSON.stringify(oldDigibyteBook)) + localStorage.setItem(myDigibyteAddressBook, JSON.stringify(oldDigibyteBook)) - let dgbbookstring3 = get("walletpage.wchange52") - parentEpml.request('showSnackBar', `${dgbbookstring3}`) + let dgbbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${dgbbookstring3}`) - this.closeDgbAddressDialog() - this.dgbBook = JSON.parse(localStorage.getItem(myDigibyteAddressBook) || "[]") - } + this.closeDgbAddressDialog() + this.dgbBook = JSON.parse(localStorage.getItem(myDigibyteAddressBook) || "[]") + } - addToRavencoinAddressbook() { - const myRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress + addToRavencoinAddressbook() { + const myRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress - let name = this.shadowRoot.getElementById('rvnNameInput').value - let address = this.shadowRoot.getElementById('rvnAddressInput').value + let name = this.shadowRoot.getElementById('rvnNameInput').value + let address = this.shadowRoot.getElementById('rvnAddressInput').value - var oldRavencoinBook = JSON.parse(localStorage.getItem(myRavencoinAddressBook) || "[]") + var oldRavencoinBook = JSON.parse(localStorage.getItem(myRavencoinAddressBook) || "[]") - if (name.length === 0) { - let rvnbookstring1 = get("walletpage.wchange50") - parentEpml.request('showSnackBar', `${rvnbookstring1}`) - return false - } + if (name.length === 0) { + let rvnbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${rvnbookstring1}`) + return false + } - if (address.length === 0) { - let rvnbookstring2 = get("walletpage.wchange51") - parentEpml.request('showSnackBar', `${rvnbookstring2}`) - return false - } + if (address.length === 0) { + let rvnbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${rvnbookstring2}`) + return false + } - const newRavencoinBookItem = { - name: name, - address: address - } + const newRavencoinBookItem = { + name: name, + address: address + } - oldRavencoinBook.push(newRavencoinBookItem) + oldRavencoinBook.push(newRavencoinBookItem) - localStorage.setItem(myRavencoinAddressBook, JSON.stringify(oldRavencoinBook)) + localStorage.setItem(myRavencoinAddressBook, JSON.stringify(oldRavencoinBook)) - let rvnbookstring3 = get("walletpage.wchange52") - parentEpml.request('showSnackBar', `${rvnbookstring3}`) + let rvnbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${rvnbookstring3}`) - this.closeRvnAddressDialog() - this.rvnBook = JSON.parse(localStorage.getItem(myRavencoinAddressBook) || "[]") - } + this.closeRvnAddressDialog() + this.rvnBook = JSON.parse(localStorage.getItem(myRavencoinAddressBook) || "[]") + } - addToPiratechainAddressbook() { - const myPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress + addToPiratechainAddressbook() { + const myPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress - let name = this.shadowRoot.getElementById('arrrNameInput').value - let address = this.shadowRoot.getElementById('arrrAddressInput').value + let name = this.shadowRoot.getElementById('arrrNameInput').value + let address = this.shadowRoot.getElementById('arrrAddressInput').value - var oldPiratechainBook = JSON.parse(localStorage.getItem(myPiratechainAddressBook) || "[]") + var oldPiratechainBook = JSON.parse(localStorage.getItem(myPiratechainAddressBook) || "[]") - if (name.length === 0) { - let arrrbookstring1 = get("walletpage.wchange50") - parentEpml.request('showSnackBar', `${arrrbookstring1}`) - return false - } + if (name.length === 0) { + let arrrbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${arrrbookstring1}`) + return false + } - if (address.length === 0) { - let arrrbookstring2 = get("walletpage.wchange51") - parentEpml.request('showSnackBar', `${arrrbookstring2}`) - return false - } + if (address.length === 0) { + let arrrbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${arrrbookstring2}`) + return false + } - const newPiratechainBookItem = { - name: name, - address: address - } + const newPiratechainBookItem = { + name: name, + address: address + } - oldPiratechainBook.push(newPiratechainBookItem) + oldPiratechainBook.push(newPiratechainBookItem) - localStorage.setItem(myPiratechainAddressBook, JSON.stringify(oldPiratechainBook)) + localStorage.setItem(myPiratechainAddressBook, JSON.stringify(oldPiratechainBook)) - let arrrbookstring3 = get("walletpage.wchange52") - parentEpml.request('showSnackBar', `${arrrbookstring3}`) + let arrrbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${arrrbookstring3}`) - this.closeArrrAddressDialog() - this.arrrBook = JSON.parse(localStorage.getItem(myPiratechainAddressBook) || "[]") - } + this.closeArrrAddressDialog() + this.arrrBook = JSON.parse(localStorage.getItem(myPiratechainAddressBook) || "[]") + } - sendFromQortAddressbook(websiteObj) { + sendFromQortAddressbook(websiteObj) { this.recipient = websiteObj.address - this.openSendQort() - this.shadowRoot.querySelector('#qortBookDialog').close() - } + this.openSendQort() + this.shadowRoot.querySelector('#qortBookDialog').close() + } - sendFromBtcAddressbook(websiteObj) { + sendFromBtcAddressbook(websiteObj) { this.btcRecipient = websiteObj.address - this.openSendBtc() - this.shadowRoot.querySelector('#btcBookDialog').close() - } + this.openSendBtc() + this.shadowRoot.querySelector('#btcBookDialog').close() + } - sendFromLtcAddressbook(websiteObj) { + sendFromLtcAddressbook(websiteObj) { this.ltcRecipient = websiteObj.address - this.openSendLtc() - this.shadowRoot.querySelector('#ltcBookDialog').close() - } + this.openSendLtc() + this.shadowRoot.querySelector('#ltcBookDialog').close() + } - sendFromDogeAddressbook(websiteObj) { + sendFromDogeAddressbook(websiteObj) { this.dogeRecipient = websiteObj.address - this.openSendDoge() - this.shadowRoot.querySelector('#dogeBookDialog').close() - } + this.openSendDoge() + this.shadowRoot.querySelector('#dogeBookDialog').close() + } - sendFromDgbAddressbook(websiteObj) { + sendFromDgbAddressbook(websiteObj) { this.dgbRecipient = websiteObj.address - this.openSendDgb() - this.shadowRoot.querySelector('#dgbBookDialog').close() - } + this.openSendDgb() + this.shadowRoot.querySelector('#dgbBookDialog').close() + } - sendFromRvnAddressbook(websiteObj) { + sendFromRvnAddressbook(websiteObj) { this.rvnRecipient = websiteObj.address - this.openSendRvn() - this.shadowRoot.querySelector('#rvnBookDialog').close() - } + this.openSendRvn() + this.shadowRoot.querySelector('#rvnBookDialog').close() + } - sendFromArrrAddressbook(websiteObj) { + sendFromArrrAddressbook(websiteObj) { this.arrrRecipient = websiteObj.address - this.openSendArrr() - this.shadowRoot.querySelector('#arrrBookDialog').close() - } + this.openSendArrr() + this.shadowRoot.querySelector('#arrrBookDialog').close() + } - removeQortAddress(adressObj) { - const theQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress - const addressToRemove = adressObj - this.newQortBookFilter = [] - this.newQortBookFilter = this.qortBook.filter((item) => item.address !== addressToRemove) - const myNewObj = JSON.stringify(this.newQortBookFilter) - localStorage.removeItem(theQortalAddressBook) - localStorage.setItem(theQortalAddressBook, myNewObj) - this.qortBook = JSON.parse(localStorage.getItem(theQortalAddressBook) || "[]") - } + removeQortAddress(adressObj) { + const theQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress + const addressToRemove = adressObj + this.newQortBookFilter = [] + this.newQortBookFilter = this.qortBook.filter((item) => item.address !== addressToRemove) + const myNewObj = JSON.stringify(this.newQortBookFilter) + localStorage.removeItem(theQortalAddressBook) + localStorage.setItem(theQortalAddressBook, myNewObj) + this.qortBook = JSON.parse(localStorage.getItem(theQortalAddressBook) || "[]") + } - removeBtcAddress(adressObj) { - const theBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress - const addressToRemove = adressObj - this.newBtcBookFilter = [] - this.newBtcBookFilter = this.btcBook.filter((item) => item.address !== addressToRemove) - const myNewObj = JSON.stringify(this.newBtcBookFilter) - localStorage.removeItem(theBitcoinAddressBook) - localStorage.setItem(theBitcoinAddressBook, myNewObj) - this.btcBook = JSON.parse(localStorage.getItem(theBitcoinAddressBook) || "[]") - } + removeBtcAddress(adressObj) { + const theBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress + const addressToRemove = adressObj + this.newBtcBookFilter = [] + this.newBtcBookFilter = this.btcBook.filter((item) => item.address !== addressToRemove) + const myNewObj = JSON.stringify(this.newBtcBookFilter) + localStorage.removeItem(theBitcoinAddressBook) + localStorage.setItem(theBitcoinAddressBook, myNewObj) + this.btcBook = JSON.parse(localStorage.getItem(theBitcoinAddressBook) || "[]") + } - removeLtcAddress(adressObj) { - const theLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress - const addressToRemove = adressObj - this.newLtcBookFilter = [] - this.newLtcBookFilter = this.ltcBook.filter((item) => item.address !== addressToRemove) - const myNewObj = JSON.stringify(this.newLtcBookFilter) - localStorage.removeItem(theLitecoinAddressBook) - localStorage.setItem(theLitecoinAddressBook, myNewObj) - this.ltcBook = JSON.parse(localStorage.getItem(theLitecoinAddressBook) || "[]") - } + removeLtcAddress(adressObj) { + const theLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress + const addressToRemove = adressObj + this.newLtcBookFilter = [] + this.newLtcBookFilter = this.ltcBook.filter((item) => item.address !== addressToRemove) + const myNewObj = JSON.stringify(this.newLtcBookFilter) + localStorage.removeItem(theLitecoinAddressBook) + localStorage.setItem(theLitecoinAddressBook, myNewObj) + this.ltcBook = JSON.parse(localStorage.getItem(theLitecoinAddressBook) || "[]") + } - removeDogeAddress(adressObj) { - const theDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress - const addressToRemove = adressObj - this.newDogeBookFilter = [] - this.newDogeBookFilter = this.dogeBook.filter((item) => item.address !== addressToRemove) - const myNewObj = JSON.stringify(this.newDogeBookFilter) - localStorage.removeItem(theDogecoinAddressBook) - localStorage.setItem(theDogecoinAddressBook, myNewObj) - this.dogeBook = JSON.parse(localStorage.getItem(theDogecoinAddressBook) || "[]") - } + removeDogeAddress(adressObj) { + const theDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress + const addressToRemove = adressObj + this.newDogeBookFilter = [] + this.newDogeBookFilter = this.dogeBook.filter((item) => item.address !== addressToRemove) + const myNewObj = JSON.stringify(this.newDogeBookFilter) + localStorage.removeItem(theDogecoinAddressBook) + localStorage.setItem(theDogecoinAddressBook, myNewObj) + this.dogeBook = JSON.parse(localStorage.getItem(theDogecoinAddressBook) || "[]") + } - removeDgbAddress(adressObj) { - const theDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress - const addressToRemove = adressObj - this.newDgbBookFilter = [] - this.newDgbBookFilter = this.dgbBook.filter((item) => item.address !== addressToRemove) - const myNewObj = JSON.stringify(this.newDgbBookFilter) - localStorage.removeItem(theDigibyteAddressBook) - localStorage.setItem(theDigibyteAddressBook, myNewObj) - this.dgbBook = JSON.parse(localStorage.getItem(theDigibyteAddressBook) || "[]") - } + removeDgbAddress(adressObj) { + const theDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress + const addressToRemove = adressObj + this.newDgbBookFilter = [] + this.newDgbBookFilter = this.dgbBook.filter((item) => item.address !== addressToRemove) + const myNewObj = JSON.stringify(this.newDgbBookFilter) + localStorage.removeItem(theDigibyteAddressBook) + localStorage.setItem(theDigibyteAddressBook, myNewObj) + this.dgbBook = JSON.parse(localStorage.getItem(theDigibyteAddressBook) || "[]") + } - removeRvnAddress(adressObj) { - const theRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress - const addressToRemove = adressObj - this.newRvnBookFilter = [] - this.newRvnBookFilter = this.rvnBook.filter((item) => item.address !== addressToRemove) - const myNewObj = JSON.stringify(this.newRvnBookFilter) - localStorage.removeItem(theRavencoinAddressBook) - localStorage.setItem(theRavencoinAddressBook, myNewObj) - this.rvnBook = JSON.parse(localStorage.getItem(theRavencoinAddressBook) || "[]") - } + removeRvnAddress(adressObj) { + const theRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress + const addressToRemove = adressObj + this.newRvnBookFilter = [] + this.newRvnBookFilter = this.rvnBook.filter((item) => item.address !== addressToRemove) + const myNewObj = JSON.stringify(this.newRvnBookFilter) + localStorage.removeItem(theRavencoinAddressBook) + localStorage.setItem(theRavencoinAddressBook, myNewObj) + this.rvnBook = JSON.parse(localStorage.getItem(theRavencoinAddressBook) || "[]") + } - removeArrrAddress(adressObj) { - const thePiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress - const addressToRemove = adressObj - this.newArrrBookFilter = [] - this.newArrrBookFilter = this.arrrBook.filter((item) => item.address !== addressToRemove) - const myNewObj = JSON.stringify(this.newArrrBookFilter) - localStorage.removeItem(thePiratechainAddressBook) - localStorage.setItem(thePiratechainAddressBook, myNewObj) - this.arrrBook = JSON.parse(localStorage.getItem(thePiratechainAddressBook) || "[]") - } + removeArrrAddress(adressObj) { + const thePiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress + const addressToRemove = adressObj + this.newArrrBookFilter = [] + this.newArrrBookFilter = this.arrrBook.filter((item) => item.address !== addressToRemove) + const myNewObj = JSON.stringify(this.newArrrBookFilter) + localStorage.removeItem(thePiratechainAddressBook) + localStorage.setItem(thePiratechainAddressBook, myNewObj) + this.arrrBook = JSON.parse(localStorage.getItem(thePiratechainAddressBook) || "[]") + } - renderSendFromQortAddressbookButton(websiteObj) { - return html`` - } + renderSendFromQortAddressbookButton(websiteObj) { + return html`` + } - renderSendFromBtcAddressbookButton(websiteObj) { - return html`` - } + renderSendFromBtcAddressbookButton(websiteObj) { + return html`` + } - renderSendFromLtcAddressbookButton(websiteObj) { - return html`` - } + renderSendFromLtcAddressbookButton(websiteObj) { + return html`` + } - renderSendFromDogeAddressbookButton(websiteObj) { - return html`` - } + renderSendFromDogeAddressbookButton(websiteObj) { + return html`` + } - renderSendFromDgbAddressbookButton(websiteObj) { - return html`` - } + renderSendFromDgbAddressbookButton(websiteObj) { + return html`` + } - renderSendFromRvnAddressbookButton(websiteObj) { - return html`` - } + renderSendFromRvnAddressbookButton(websiteObj) { + return html`` + } - renderSendFromArrrAddressbookButton(websiteObj) { - return html`` - } + renderSendFromArrrAddressbookButton(websiteObj) { + return html`` + } - exportQortAddressbook() { - const expQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress - let bookname = "" - const qortBookData = JSON.stringify(localStorage.getItem(expQortalAddressBook)) - const qortBookSave = JSON.parse((qortBookData) || "[]") - const blob = new Blob([qortBookSave], { type: 'text/plain;charset=utf-8' }) - bookname = "qortal_addressbook." + this.bookQortalAddress + ".qort.json" - this.saveFileToDisk(blob, bookname) - } + exportQortAddressbook() { + const expQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress + let bookname = "" + const qortBookData = JSON.stringify(localStorage.getItem(expQortalAddressBook)) + const qortBookSave = JSON.parse((qortBookData) || "[]") + const blob = new Blob([qortBookSave], { type: 'text/plain;charset=utf-8' }) + bookname = "qortal_addressbook." + this.bookQortalAddress + ".qort.json" + this.saveFileToDisk(blob, bookname) + } - exportBtcAddressbook() { - const expBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress - let bookname = "" - const btcBookData = JSON.stringify(localStorage.getItem(expBitcoinAddressBook)) - const btcBookSave = JSON.parse((btcBookData) || "[]") - const blob = new Blob([btcBookSave], { type: 'text/plain;charset=utf-8' }) - bookname = "bitcoin_addressbook." + this.bookBitcoinAddress + ".btc.json" - this.saveFileToDisk(blob, bookname) - } + exportBtcAddressbook() { + const expBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress + let bookname = "" + const btcBookData = JSON.stringify(localStorage.getItem(expBitcoinAddressBook)) + const btcBookSave = JSON.parse((btcBookData) || "[]") + const blob = new Blob([btcBookSave], { type: 'text/plain;charset=utf-8' }) + bookname = "bitcoin_addressbook." + this.bookBitcoinAddress + ".btc.json" + this.saveFileToDisk(blob, bookname) + } - exportLtcAddressbook() { - const expLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress - let bookname = "" - const ltcBookData = JSON.stringify(localStorage.getItem(expLitecoinAddressBook)) - const ltcBookSave = JSON.parse((ltcBookData) || "[]") - const blob = new Blob([ltcBookSave], { type: 'text/plain;charset=utf-8' }) - bookname = "litecoin_addressbook." + this.bookLitecoinAddress + ".ltc.json" - this.saveFileToDisk(blob, bookname) - } + exportLtcAddressbook() { + const expLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress + let bookname = "" + const ltcBookData = JSON.stringify(localStorage.getItem(expLitecoinAddressBook)) + const ltcBookSave = JSON.parse((ltcBookData) || "[]") + const blob = new Blob([ltcBookSave], { type: 'text/plain;charset=utf-8' }) + bookname = "litecoin_addressbook." + this.bookLitecoinAddress + ".ltc.json" + this.saveFileToDisk(blob, bookname) + } - exportDogeAddressbook() { - const expDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress - let bookname = "" - const dogeBookData = JSON.stringify(localStorage.getItem(expDogecoinAddressBook)) - const dogeBookSave = JSON.parse((dogeBookData) || "[]") - const blob = new Blob([dogeBookSave], { type: 'text/plain;charset=utf-8' }) - bookname = "dogecoin_addressbook." + this.bookDogecoinAddress + ".doge.json" - this.saveFileToDisk(blob, bookname) - } + exportDogeAddressbook() { + const expDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress + let bookname = "" + const dogeBookData = JSON.stringify(localStorage.getItem(expDogecoinAddressBook)) + const dogeBookSave = JSON.parse((dogeBookData) || "[]") + const blob = new Blob([dogeBookSave], { type: 'text/plain;charset=utf-8' }) + bookname = "dogecoin_addressbook." + this.bookDogecoinAddress + ".doge.json" + this.saveFileToDisk(blob, bookname) + } - exportDgbAddressbook() { - const expDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress - let bookname = "" - const dgbBookData = JSON.stringify(localStorage.getItem(expDigibyteAddressBook)) - const dgbBookSave = JSON.parse((dgbBookData) || "[]") - const blob = new Blob([dgbBookSave], { type: 'text/plain;charset=utf-8' }) - bookname = "digibyte_addressbook." + this.bookDigibyteAddress + ".dgb.json" - this.saveFileToDisk(blob, bookname) - } + exportDgbAddressbook() { + const expDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress + let bookname = "" + const dgbBookData = JSON.stringify(localStorage.getItem(expDigibyteAddressBook)) + const dgbBookSave = JSON.parse((dgbBookData) || "[]") + const blob = new Blob([dgbBookSave], { type: 'text/plain;charset=utf-8' }) + bookname = "digibyte_addressbook." + this.bookDigibyteAddress + ".dgb.json" + this.saveFileToDisk(blob, bookname) + } - exportRvnAddressbook() { - const expRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress - let bookname = "" - const rvnBookData = JSON.stringify(localStorage.getItem(expRavencoinAddressBook)) - const rvnBookSave = JSON.parse((rvnBookData) || "[]") - const blob = new Blob([rvnBookSave], { type: 'text/plain;charset=utf-8' }) - bookname = "ravencoin_addressbook." + this.bookRavencoinAddress + ".rvn.json" - this.saveFileToDisk(blob, bookname) - } + exportRvnAddressbook() { + const expRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress + let bookname = "" + const rvnBookData = JSON.stringify(localStorage.getItem(expRavencoinAddressBook)) + const rvnBookSave = JSON.parse((rvnBookData) || "[]") + const blob = new Blob([rvnBookSave], { type: 'text/plain;charset=utf-8' }) + bookname = "ravencoin_addressbook." + this.bookRavencoinAddress + ".rvn.json" + this.saveFileToDisk(blob, bookname) + } - exportArrrAddressbook() { - const expPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress - let bookname = "" - const arrrBookData = JSON.stringify(localStorage.getItem(expPiratechainAddressBook)) - const arrrBookSave = JSON.parse((arrrBookData) || "[]") - const blob = new Blob([arrrBookSave], { type: 'text/plain;charset=utf-8' }) - bookname = "piratechain_addressbook." + this.bookPiratechainAddress + ".arrr.json" - this.saveFileToDisk(blob, bookname) - } + exportArrrAddressbook() { + const expPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress + let bookname = "" + const arrrBookData = JSON.stringify(localStorage.getItem(expPiratechainAddressBook)) + const arrrBookSave = JSON.parse((arrrBookData) || "[]") + const blob = new Blob([arrrBookSave], { type: 'text/plain;charset=utf-8' }) + bookname = "piratechain_addressbook." + this.bookPiratechainAddress + ".arrr.json" + this.saveFileToDisk(blob, bookname) + } - importQortAddressbook(file) { - const impQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress - localStorage.removeItem(impQortalAddressBook) - const newItems = JSON.parse((file) || "[]") - localStorage.setItem(impQortalAddressBook, JSON.stringify(newItems)) - this.qortBook = JSON.parse(localStorage.getItem(impQortalAddressBook) || "[]") - this.shadowRoot.querySelector('#importQortAddressbookDialog').close() - } + importQortAddressbook(file) { + const impQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress + localStorage.removeItem(impQortalAddressBook) + const newItems = JSON.parse((file) || "[]") + localStorage.setItem(impQortalAddressBook, JSON.stringify(newItems)) + this.qortBook = JSON.parse(localStorage.getItem(impQortalAddressBook) || "[]") + this.shadowRoot.querySelector('#importQortAddressbookDialog').close() + } - importBtcAddressbook(file) { - const impBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress - localStorage.removeItem(impBitcoinAddressBook) - const newItems = JSON.parse((file) || "[]") - localStorage.setItem(impBitcoinAddressBook, JSON.stringify(newItems)) - this.btcBook = JSON.parse(localStorage.getItem(impBitcoinAddressBook) || "[]") - this.shadowRoot.querySelector('#importBtcAddressbookDialog').close() - } + importBtcAddressbook(file) { + const impBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress + localStorage.removeItem(impBitcoinAddressBook) + const newItems = JSON.parse((file) || "[]") + localStorage.setItem(impBitcoinAddressBook, JSON.stringify(newItems)) + this.btcBook = JSON.parse(localStorage.getItem(impBitcoinAddressBook) || "[]") + this.shadowRoot.querySelector('#importBtcAddressbookDialog').close() + } - importLtcAddressbook(file) { - const impLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress - localStorage.removeItem(impLitecoinAddressBook) - const newItems = JSON.parse((file) || "[]") - localStorage.setItem(impLitecoinAddressBook, JSON.stringify(newItems)) - this.ltcBook = JSON.parse(localStorage.getItem(impLitecoinAddressBook) || "[]") - this.shadowRoot.querySelector('#importLtcAddressbookDialog').close() - } + importLtcAddressbook(file) { + const impLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress + localStorage.removeItem(impLitecoinAddressBook) + const newItems = JSON.parse((file) || "[]") + localStorage.setItem(impLitecoinAddressBook, JSON.stringify(newItems)) + this.ltcBook = JSON.parse(localStorage.getItem(impLitecoinAddressBook) || "[]") + this.shadowRoot.querySelector('#importLtcAddressbookDialog').close() + } - importDogeAddressbook(file) { - const impDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress - localStorage.removeItem(impDogecoinAddressBook) - const newItems = JSON.parse((file) || "[]") - localStorage.setItem(impDogecoinAddressBook, JSON.stringify(newItems)) - this.dogeBook = JSON.parse(localStorage.getItem(impDogecoinAddressBook) || "[]") - this.shadowRoot.querySelector('#importDogeAddressbookDialog').close() - } + importDogeAddressbook(file) { + const impDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress + localStorage.removeItem(impDogecoinAddressBook) + const newItems = JSON.parse((file) || "[]") + localStorage.setItem(impDogecoinAddressBook, JSON.stringify(newItems)) + this.dogeBook = JSON.parse(localStorage.getItem(impDogecoinAddressBook) || "[]") + this.shadowRoot.querySelector('#importDogeAddressbookDialog').close() + } - importDgbAddressbook(file) { - const impDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress - localStorage.removeItem(impDigibyteAddressBook) - const newItems = JSON.parse((file) || "[]") - localStorage.setItem(impDigibyteAddressBook, JSON.stringify(newItems)) - this.dgbBook = JSON.parse(localStorage.getItem(impDigibyteAddressBook) || "[]") - this.shadowRoot.querySelector('#importDgbAddressbookDialog').close() - } + importDgbAddressbook(file) { + const impDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress + localStorage.removeItem(impDigibyteAddressBook) + const newItems = JSON.parse((file) || "[]") + localStorage.setItem(impDigibyteAddressBook, JSON.stringify(newItems)) + this.dgbBook = JSON.parse(localStorage.getItem(impDigibyteAddressBook) || "[]") + this.shadowRoot.querySelector('#importDgbAddressbookDialog').close() + } - importRvnAddressbook(file) { - const impRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress - localStorage.removeItem(impRavencoinAddressBook) - const newItems = JSON.parse((file) || "[]") - localStorage.setItem(impRavencoinAddressBook, JSON.stringify(newItems)) - this.rvnBook = JSON.parse(localStorage.getItem(impRavencoinAddressBook) || "[]") - this.shadowRoot.querySelector('#importRvnAddressbookDialog').close() - } + importRvnAddressbook(file) { + const impRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress + localStorage.removeItem(impRavencoinAddressBook) + const newItems = JSON.parse((file) || "[]") + localStorage.setItem(impRavencoinAddressBook, JSON.stringify(newItems)) + this.rvnBook = JSON.parse(localStorage.getItem(impRavencoinAddressBook) || "[]") + this.shadowRoot.querySelector('#importRvnAddressbookDialog').close() + } - importArrrAddressbook(file) { - const impPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress - localStorage.removeItem(impPiratechainAddressBook) - const newItems = JSON.parse((file) || "[]") - localStorage.setItem(impPiratechainAddressBook, JSON.stringify(newItems)) - this.arrrBook = JSON.parse(localStorage.getItem(impPiratechainAddressBook) || "[]") - this.shadowRoot.querySelector('#importArrrAddressbookDialog').close() - } + importArrrAddressbook(file) { + const impPiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress + localStorage.removeItem(impPiratechainAddressBook) + const newItems = JSON.parse((file) || "[]") + localStorage.setItem(impPiratechainAddressBook, JSON.stringify(newItems)) + this.arrrBook = JSON.parse(localStorage.getItem(impPiratechainAddressBook) || "[]") + this.shadowRoot.querySelector('#importArrrAddressbookDialog').close() + } - closeQortDialog() { - this.shadowRoot.querySelector('#sendQortDialog').close() - this.shadowRoot.getElementById('amountInput').value = '' - this.shadowRoot.getElementById('recipient').value = '' - this.recipient = '' - this.amount = 0 - this.successMessage = '' - this.errorMessage = '' - } + closeQortDialog() { + this.shadowRoot.querySelector('#sendQortDialog').close() + this.shadowRoot.getElementById('amountInput').value = '' + this.shadowRoot.getElementById('recipient').value = '' + this.recipient = '' + this.amount = 0 + this.successMessage = '' + this.errorMessage = '' + } - closeBtcDialog() { - this.shadowRoot.querySelector('#sendBtcDialog').close() - this.shadowRoot.getElementById('btcAmountInput').value = 0 - this.shadowRoot.getElementById('btcRecipient').value = '' - this.btcRecipient = '' - this.btcAmount = 0 - this.successMessage = '' - this.errorMessage = '' - } + closeBtcDialog() { + this.shadowRoot.querySelector('#sendBtcDialog').close() + this.shadowRoot.getElementById('btcAmountInput').value = 0 + this.shadowRoot.getElementById('btcRecipient').value = '' + this.btcRecipient = '' + this.btcAmount = 0 + this.successMessage = '' + this.errorMessage = '' + } - closeLtcDialog() { - this.shadowRoot.querySelector('#sendLtcDialog').close() - this.shadowRoot.getElementById('ltcAmountInput').value = 0 - this.shadowRoot.getElementById('ltcRecipient').value = '' - this.ltcRecipient = '' - this.ltcAmount = 0 - this.successMessage = '' - this.errorMessage = '' - } + closeLtcDialog() { + this.shadowRoot.querySelector('#sendLtcDialog').close() + this.shadowRoot.getElementById('ltcAmountInput').value = 0 + this.shadowRoot.getElementById('ltcRecipient').value = '' + this.ltcRecipient = '' + this.ltcAmount = 0 + this.successMessage = '' + this.errorMessage = '' + } - closeDogeDialog() { - this.shadowRoot.querySelector('#sendDogeDialog').close() - this.shadowRoot.getElementById('dogeAmountInput').value = 0 - this.shadowRoot.getElementById('dogeRecipient').value = '' - this.dogeRecipient = '' - this.dogeAmount = 0 - this.successMessage = '' - this.errorMessage = '' - } + closeDogeDialog() { + this.shadowRoot.querySelector('#sendDogeDialog').close() + this.shadowRoot.getElementById('dogeAmountInput').value = 0 + this.shadowRoot.getElementById('dogeRecipient').value = '' + this.dogeRecipient = '' + this.dogeAmount = 0 + this.successMessage = '' + this.errorMessage = '' + } - closeDgbDialog() { - this.shadowRoot.querySelector('#sendDgbDialog').close() - this.shadowRoot.getElementById('dgbAmountInput').value = 0 - this.shadowRoot.getElementById('dgbRecipient').value = '' - this.dgbRecipient = '' - this.dgbAmount = 0 - this.successMessage = '' - this.errorMessage = '' - } + closeDgbDialog() { + this.shadowRoot.querySelector('#sendDgbDialog').close() + this.shadowRoot.getElementById('dgbAmountInput').value = 0 + this.shadowRoot.getElementById('dgbRecipient').value = '' + this.dgbRecipient = '' + this.dgbAmount = 0 + this.successMessage = '' + this.errorMessage = '' + } - closeRvnDialog() { - this.shadowRoot.querySelector('#sendRvnDialog').close() - this.shadowRoot.getElementById('rvnAmountInput').value = 0 - this.shadowRoot.getElementById('rvRecipient').value = '' - this.rvnRecipient = '' - this.rvnAmount = 0 - this.successMessage = '' - this.errorMessage = '' - } + closeRvnDialog() { + this.shadowRoot.querySelector('#sendRvnDialog').close() + this.shadowRoot.getElementById('rvnAmountInput').value = 0 + this.shadowRoot.getElementById('rvRecipient').value = '' + this.rvnRecipient = '' + this.rvnAmount = 0 + this.successMessage = '' + this.errorMessage = '' + } - closeArrrDialog() { - this.shadowRoot.querySelector('#sendArrrDialog').close() - this.shadowRoot.getElementById('arrrRecipient').value = '' - this.shadowRoot.getElementById('arrrMemo').value = '' - this.arrrRecipient = '' - this.arrrMemo='' - this.arrrAmount = 0 - this.successMessage = '' - this.errorMessage = '' - } + closeArrrDialog() { + this.shadowRoot.querySelector('#sendArrrDialog').close() + this.shadowRoot.getElementById('arrrRecipient').value = '' + this.shadowRoot.getElementById('arrrMemo').value = '' + this.arrrRecipient = '' + this.arrrMemo = '' + this.arrrAmount = 0 + this.successMessage = '' + this.errorMessage = '' + } - sendToQortAddress() { - this.recipient = this.selectedTransaction.recipient - this.openSendQort() - this.shadowRoot.querySelector('#showTransactionDetailsDialog').close() - } + sendToQortAddress() { + this.recipient = this.selectedTransaction.recipient + this.openSendQort() + this.shadowRoot.querySelector('#showTransactionDetailsDialog').close() + } - sendToBtcAddress() { - this.btcRecipient = this.selectedTransaction.btcReceiver - this.openSendBtc() - this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').close() - } + sendToBtcAddress() { + this.btcRecipient = this.selectedTransaction.btcReceiver + this.openSendBtc() + this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').close() + } - sendToLtcAddress() { - this.ltcRecipient = this.selectedTransaction.ltcReceiver - this.openSendLtc() - this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close() - } + sendToLtcAddress() { + this.ltcRecipient = this.selectedTransaction.ltcReceiver + this.openSendLtc() + this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close() + } - sendToDogeAddress() { - this.dogeRecipient = this.selectedTransaction.dogeReceiver - this.openSendDoge() - this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').close() - } + sendToDogeAddress() { + this.dogeRecipient = this.selectedTransaction.dogeReceiver + this.openSendDoge() + this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').close() + } - sendToDgbAddress() { - this.dgbRecipient = this.selectedTransaction.dgbReceiver - this.openSendDgb() - this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').close() - } + sendToDgbAddress() { + this.dgbRecipient = this.selectedTransaction.dgbReceiver + this.openSendDgb() + this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').close() + } - sendToRvnAddress() { - this.rvnRecipient = this.selectedTransaction.rvnReceiver - this.openSendRvn() - this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() - } + sendToRvnAddress() { + this.rvnRecipient = this.selectedTransaction.rvnReceiver + this.openSendRvn() + this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() + } - sendToArrrAddress() { - this.arrrRecipient = this.selectedTransaction.arrrReceiver - this.openSendArrr() - this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() - } + sendToArrrAddress() { + this.arrrRecipient = this.selectedTransaction.arrrReceiver + this.openSendArrr() + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() + } - calculateQortAll() { - this.amount = 0 - this.shadowRoot.getElementById('amountInput').value = this.amount - if (this.balance < 0.01100000) { - let not_enough_string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${not_enough_string}`) - } else { - this.amount = (this.balance - 0.01100000).toFixed(8) - this.shadowRoot.getElementById('amountInput').value = this.amount - this.shadowRoot.getElementById('amountInput').blur() - this.shadowRoot.getElementById('amountInput').focus() - } - } + calculateQortAll() { + this.amount = 0 + this.shadowRoot.getElementById('amountInput').value = this.amount + if (this.balance < 0.01100000) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.amount = (this.balance - 0.01100000).toFixed(8) + this.shadowRoot.getElementById('amountInput').value = this.amount + this.shadowRoot.getElementById('amountInput').blur() + this.shadowRoot.getElementById('amountInput').focus() + } + } - calculateBtcAll() { - if (this.balance < 0.00051000) { - let not_enough_string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${not_enough_string}`) - } else { - this.btcAmount = (this.balance - 0.00050000).toFixed(8) - this.btcFeePerByte = 100 - } - } + calculateBtcAll() { + if (this.balance < 0.00051000) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.btcAmount = (this.balance - 0.00050000).toFixed(8) + this.btcFeePerByte = 100 + } + } - calculateLtcAll() { - if (this.balance < 0.00031000) { - let not_enough_string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${not_enough_string}`) - } else { - this.ltcAmount = (this.balance - 0.00030000).toFixed(8) - this.ltcFeePerByte = 15 - } - } + calculateLtcAll() { + if (this.balance < 0.00031000) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.ltcAmount = (this.balance - 0.00030000).toFixed(8) + this.ltcFeePerByte = 15 + } + } - calculateDogeAll() { - if (this.balance < 0.05100000) { - let not_enough_string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${not_enough_string}`) - } else { - this.dogeAmount = (this.balance - 0.05000000).toFixed(8) - this.dogeFeePerByte = 1000 - } - } + calculateDogeAll() { + if (this.balance < 0.05100000) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.dogeAmount = (this.balance - 0.05000000).toFixed(8) + this.dogeFeePerByte = 1000 + } + } - calculateDgbAll() { - if (this.balance < 0.00005100) { - let not_enough_string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${not_enough_string}`) - } else { - this.dgbAmount = (this.balance - 0.00005000).toFixed(8) - this.dgbFeePerByte = 10 - } - } + calculateDgbAll() { + if (this.balance < 0.00005100) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.dgbAmount = (this.balance - 0.00005000).toFixed(8) + this.dgbFeePerByte = 10 + } + } - calculateRvnAll() { - if (this.balance < 0.00572500) { - let not_enough_string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${not_enough_string}`) - } else { - this.rvnAmount = (this.balance - 0.00562500).toFixed(8) - this.rvnFeePerByte = 1125 - } - } + calculateRvnAll() { + if (this.balance < 0.00572500) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.rvnAmount = (this.balance - 0.00562500).toFixed(8) + this.rvnFeePerByte = 1125 + } + } - calculateArrrAll() { - if (this.balance < 0.00011000) { - let not_enough_string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${not_enough_string}`) - } else { - this.arrrAmount = (this.balance - 0.00010000).toFixed(8) - } - } + calculateArrrAll() { + if (this.balance < 0.00011000) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.arrrAmount = (this.balance - 0.00010000).toFixed(8) + } + } - renderSQB() { - let displaybutton = this.selectedTransaction.recipient - if (displaybutton == null) { - return html`${this.selectedTransaction.recipient}` - } else { - return html` - ${this.selectedTransaction.recipient} - this.sendToQortAddress()} title="${translate("walletpage.wchange46")}"> - this.openAddQortAddressDialog()} title="${translate("walletpage.wchange49")}"> - ` - } - } + renderSQB() { + let displaybutton = this.selectedTransaction.recipient + if (displaybutton == null) { + return html`${this.selectedTransaction.recipient}` + } else { + return html` + ${this.selectedTransaction.recipient} + this.sendToQortAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddQortAddressDialog()} title="${translate("walletpage.wchange49")}"> + ` + } + } - renderCAB() { - return html` + renderCAB() { + return html` ${this.selectedTransaction.aTAddress} ` - } + } - renderFetchText() { - return html`${translate("walletpage.wchange1")}` - } + renderFetchText() { + return html`${translate("walletpage.wchange1")}` + } - renderInvalidText() { - return html`${translate("walletpage.wchange27")}` - } + renderInvalidText() { + return html`${translate("walletpage.wchange27")}` + } - renderReceiverText() { - return html`${translate("walletpage.wchange29")}` - } + renderReceiverText() { + return html`${translate("walletpage.wchange29")}` + } - renderSuccessText() { - return html`${translate("walletpage.wchange30")}` - } + renderSuccessText() { + return html`${translate("walletpage.wchange30")}` + } - renderFailText() { - return html`${translate("walletpage.wchange31")}` - } + renderFailText() { + return html`${translate("walletpage.wchange31")}` + } - renderOutText() { - return html`${translate("walletpage.wchange7")}` - } + renderOutText() { + return html`${translate("walletpage.wchange7")}` + } - renderInText() { - return html`${translate("walletpage.wchange8")}` - } + renderInText() { + return html`${translate("walletpage.wchange8")}` + } - _checkAmount(e) { - const targetAmount = e.target.value - const target = e.target + _checkAmount(e) { + const targetAmount = e.target.value + const target = e.target - if (targetAmount.length === 0) { - this.isValidAmount = false - this.btnDisable = true + if (targetAmount.length === 0) { + this.isValidAmount = false + this.btnDisable = true - e.target.blur() - e.target.focus() + e.target.blur() + e.target.focus() - e.target.invalid = true - e.target.validationMessage = this.renderInvalidText() - } else { - this.btnDisable = false - } + e.target.invalid = true + e.target.validationMessage = this.renderInvalidText() + } else { + this.btnDisable = false + } - e.target.blur() - e.target.focus() + e.target.blur() + e.target.focus() - e.target.validityTransform = (newValue, nativeValidity) => { - if (newValue.includes('-') === true) { - this.btnDisable = true - target.validationMessage = this.renderInvalidText() + e.target.validityTransform = (newValue, nativeValidity) => { + if (newValue.includes('-') === true) { + this.btnDisable = true + target.validationMessage = this.renderInvalidText() - return { - valid: false, - } - } else if (!nativeValidity.valid) { - if (newValue.includes('.') === true) { - let myAmount = newValue.split('.') - if (myAmount[1].length > 8) { - this.btnDisable = true - target.validationMessage = this.renderInvalidText() - } else { - return { - valid: true, - } - } - } - } else { - this.btnDisable = false - } - } - } + return { + valid: false + } + } else if (!nativeValidity.valid) { + if (newValue.includes('.') === true) { + let myAmount = newValue.split('.') + if (myAmount[1].length > 8) { + this.btnDisable = true + target.validationMessage = this.renderInvalidText() + } else { + return { + valid: true + } + } + } + } else { + this.btnDisable = false + } + } + } - checkQortAmount(e) { - const targetAmount = e.target.value - const target = e.target - this.btnDisable = true - this.qortWarning = false + checkQortAmount(e) { + const targetAmount = e.target.value + const target = e.target + this.btnDisable = true + this.qortWarning = false - if (targetAmount.length === 0) { - this.isValidAmount = false - this.btnDisable = true - this.qortWarning = false - e.target.blur() - e.target.focus() - e.target.invalid = true - } else { - const checkQortAmountInput = this.shadowRoot.getElementById('amountInput').value - const checkQortAmount = this.round(parseFloat(checkQortAmountInput)) - const myFunds = this.round(parseFloat(this.balance - 0.01100000)) - if (Number(myFunds) >= Number(checkQortAmount)) { - this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput - this.btnDisable = false - this.qortWarning = false - } else { - this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput - this.btnDisable = true - this.qortWarning = true - } - } + if (targetAmount.length === 0) { + this.isValidAmount = false + this.btnDisable = true + this.qortWarning = false + e.target.blur() + e.target.focus() + e.target.invalid = true + } else { + const checkQortAmountInput = this.shadowRoot.getElementById('amountInput').value + const checkQortAmount = this.round(parseFloat(checkQortAmountInput)) + const myFunds = this.round(parseFloat(this.balance - 0.01100000)) + if (Number(myFunds) >= Number(checkQortAmount)) { + this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput + this.btnDisable = false + this.qortWarning = false + } else { + this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput + this.btnDisable = true + this.qortWarning = true + } + } - e.target.blur() - e.target.focus() + e.target.blur() + e.target.focus() - e.target.validityTransform = (newValue, nativeValidity) => { - if (newValue.includes('-') === true) { - this.btnDisable = true - this.qortWarning = false - return { - valid: false, - } - } else if (!nativeValidity.valid) { - if (newValue.includes('.') === true) { - let myAmount = newValue.split('.') - if (myAmount[1].length > 8) { - this.btnDisable = true - this.qortWarning = false - } else { - const checkQortAmountInput = this.shadowRoot.getElementById('amountInput').value - const checkQortAmount = this.round(parseFloat(checkQortAmountInput)) - const myFunds = this.round(parseFloat(this.balance - 0.01100000)) - if (Number(myFunds) >= Number(checkQortAmount)) { - this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput - this.btnDisable = false - this.qortWarning = false - } else { - this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput - this.btnDisable = true - this.qortWarning = true - } - return { - valid: true, - } - } - } - } else { - const checkQortAmountInput = this.shadowRoot.getElementById('amountInput').value - const checkQortAmount = this.round(parseFloat(checkQortAmountInput)) - const myFunds = this.round(parseFloat(this.balance - 0.01100000)) - if (Number(myFunds) >= Number(checkQortAmount)) { - this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput - this.btnDisable = false - this.qortWarning = false - } else { - this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput - this.btnDisable = true - this.qortWarning = true - } - } - } - } + e.target.validityTransform = (newValue, nativeValidity) => { + if (newValue.includes('-') === true) { + this.btnDisable = true + this.qortWarning = false + return { + valid: false + } + } else if (!nativeValidity.valid) { + if (newValue.includes('.') === true) { + let myAmount = newValue.split('.') + if (myAmount[1].length > 8) { + this.btnDisable = true + this.qortWarning = false + } else { + const checkQortAmountInput = this.shadowRoot.getElementById('amountInput').value + const checkQortAmount = this.round(parseFloat(checkQortAmountInput)) + const myFunds = this.round(parseFloat(this.balance - 0.01100000)) + if (Number(myFunds) >= Number(checkQortAmount)) { + this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput + this.btnDisable = false + this.qortWarning = false + } else { + this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput + this.btnDisable = true + this.qortWarning = true + } + return { + valid: true + } + } + } + } else { + const checkQortAmountInput = this.shadowRoot.getElementById('amountInput').value + const checkQortAmount = this.round(parseFloat(checkQortAmountInput)) + const myFunds = this.round(parseFloat(this.balance - 0.01100000)) + if (Number(myFunds) >= Number(checkQortAmount)) { + this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput + this.btnDisable = false + this.qortWarning = false + } else { + this.shadowRoot.getElementById('amountInput').value = checkQortAmountInput + this.btnDisable = true + this.qortWarning = true + } + } + } + } - async sendQort() { - const sendFee = this.qortPaymentFee - const amount = this.shadowRoot.getElementById('amountInput').value - let recipient = this.shadowRoot.getElementById('recipient').value + async sendQort() { + const sendFee = this.qortPaymentFee + const amount = this.shadowRoot.getElementById('amountInput').value + let recipient = this.shadowRoot.getElementById('recipient').value - this.sendMoneyLoading = true - this.btnDisable = true + this.sendMoneyLoading = true + this.btnDisable = true - if (parseFloat(amount) + parseFloat(0.001) > parseFloat(this.balance)) { - this.sendMoneyLoading = false - this.btnDisable = false - let snack1string = get("walletpage.wchange26") - parentEpml.request('showSnackBar', `${snack1string}`) - return false - } + if (parseFloat(amount) + parseFloat(0.001) > parseFloat(this.balance)) { + this.sendMoneyLoading = false + this.btnDisable = false + let snack1string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${snack1string}`) + return false + } - if (parseFloat(amount) <= 0) { - this.sendMoneyLoading = false - this.btnDisable = false - let snack2string = get("walletpage.wchange27") - parentEpml.request('showSnackBar', `${snack2string}`) - return false - } + if (parseFloat(amount) <= 0) { + this.sendMoneyLoading = false + this.btnDisable = false + let snack2string = get("walletpage.wchange27") + parentEpml.request('showSnackBar', `${snack2string}`) + return false + } - if (recipient.length === 0) { - this.sendMoneyLoading = false - this.btnDisable = false - let snack3string = get("walletpage.wchange28") - parentEpml.request('showSnackBar', `${snack3string}`) - return false - } + if (recipient.length === 0) { + this.sendMoneyLoading = false + this.btnDisable = false + let snack3string = get("walletpage.wchange28") + parentEpml.request('showSnackBar', `${snack3string}`) + return false + } - const getLastRef = async () => { - return await parentEpml.request('apiCall', { - type: 'api', - url: `/addresses/lastreference/${this.getSelectedWalletAddress()}`, - }) - } + const getLastRef = async () => { + return await parentEpml.request('apiCall', { + type: 'api', + url: `/addresses/lastreference/${this.getSelectedWalletAddress()}` + }) + } - const validateName = async (receiverName) => { - let myRes - let myNameRes = await parentEpml.request('apiCall', { - type: 'api', - url: `/names/${receiverName}`, - }) + const validateName = async (receiverName) => { + let myRes + let myNameRes = await parentEpml.request('apiCall', { + type: 'api', + url: `/names/${receiverName}` + }) - if (myNameRes.error === 401) { - myRes = false - } else { - myRes = myNameRes - } - return myRes - } + if (myNameRes.error === 401) { + myRes = false + } else { + myRes = myNameRes + } + return myRes + } - const validateAddress = async (receiverAddress) => { + const validateAddress = async (receiverAddress) => { return await window.parent.validateAddress(receiverAddress) - } + } - const validateReceiver = async (recipient) => { - let lastRef = await getLastRef() - let isAddress + const validateReceiver = async (recipient) => { + let lastRef = await getLastRef() + let isAddress - try { - isAddress = await validateAddress(recipient) - } catch (err) { - isAddress = false - } + try { + isAddress = await validateAddress(recipient) + } catch (err) { + isAddress = false + } - if (isAddress) { - let myTransaction = await makeTransactionRequest(recipient, lastRef) - getTxnRequestResponse(myTransaction) - } else { - let myNameRes = await validateName(recipient) - if (myNameRes !== false) { - let myNameAddress = myNameRes.owner - let myTransaction = await makeTransactionRequest(myNameAddress, lastRef) - getTxnRequestResponse(myTransaction) - } else { - console.error(this.renderReceiverText()) - this.errorMessage = this.renderReceiverText() - this.sendMoneyLoading = false - this.btnDisable = false - } - } - } + if (isAddress) { + let myTransaction = await makeTransactionRequest(recipient, lastRef) + getTxnRequestResponse(myTransaction) + } else { + let myNameRes = await validateName(recipient) + if (myNameRes !== false) { + let myNameAddress = myNameRes.owner + let myTransaction = await makeTransactionRequest(myNameAddress, lastRef) + getTxnRequestResponse(myTransaction) + } else { + console.error(this.renderReceiverText()) + this.errorMessage = this.renderReceiverText() + this.sendMoneyLoading = false + this.btnDisable = false + } + } + } - const getName = async (recipient)=> { - try { - const getNames = await parentEpml.request("apiCall", { - type: "api", - url: `/names/address/${recipient}`, - }) - if(getNames?.length > 0 ){ - return getNames[0].name - } else { - return '' - } - } catch (error) { - return "" - } - } + const getName = async (recipient) => { + try { + const getNames = await parentEpml.request("apiCall", { + type: "api", + url: `/names/address/${recipient}` + }) + if (getNames?.length > 0) { + return getNames[0].name + } else { + return '' + } + } catch (error) { + return '' + } + } - const makeTransactionRequest = async (receiver, lastRef) => { - let myReceiver = receiver - let mylastRef = lastRef - let dialogamount = get("transactions.amount") - let dialogAddress = get("login.address") - let dialogName = get("login.name") - let dialogto = get("transactions.to") - let recipientName = await getName(myReceiver) + const makeTransactionRequest = async (receiver, lastRef) => { + let myReceiver = receiver + let mylastRef = lastRef + let dialogamount = get("transactions.amount") + let dialogAddress = get("login.address") + let dialogName = get("login.name") + let dialogto = get("transactions.to") + let recipientName = await getName(myReceiver) - return await parentEpml.request('transaction', { - type: 2, - nonce: this.wallets.get(this._selectedWallet).wallet.nonce, - params: { - recipient: myReceiver, - recipientName: recipientName, - amount: amount, - lastReference: mylastRef, - fee: sendFee, - dialogamount: dialogamount, - dialogto: dialogto, - dialogAddress, - dialogName - }, - }) - } + return await parentEpml.request('transaction', { + type: 2, + nonce: this.wallets.get(this._selectedWallet).wallet.nonce, + params: { + recipient: myReceiver, + recipientName: recipientName, + amount: amount, + lastReference: mylastRef, + fee: sendFee, + dialogamount: dialogamount, + dialogto: dialogto, + dialogAddress, + dialogName + }, + }) + } - const getTxnRequestResponse = (txnResponse) => { - if (txnResponse.success === false && txnResponse.message) { - this.errorMessage = txnResponse.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } else if (txnResponse.success === true && !txnResponse.data.error) { - this.shadowRoot.getElementById('amountInput').value = '' - this.shadowRoot.getElementById('recipient').value = '' - this.errorMessage = '' - this.recipient = '' - this.amount = 0 - this.successMessage = this.renderSuccessText() - this.sendMoneyLoading = false - this.btnDisable = false - } else { - this.errorMessage = txnResponse.data.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } - } - await validateReceiver(recipient) - await this.showWallet() - } + const getTxnRequestResponse = (txnResponse) => { + if (txnResponse.success === false && txnResponse.message) { + this.errorMessage = txnResponse.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else if (txnResponse.success === true && !txnResponse.data.error) { + this.shadowRoot.getElementById('amountInput').value = '' + this.shadowRoot.getElementById('recipient').value = '' + this.errorMessage = '' + this.recipient = '' + this.amount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else { + this.errorMessage = txnResponse.data.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } + } + await validateReceiver(recipient) + await this.showWallet() + } - async sendBtc() { - const btcAmount = this.shadowRoot.getElementById('btcAmountInput').value - let btcRecipient = this.shadowRoot.getElementById('btcRecipient').value - const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey + async sendBtc() { + const btcAmount = this.shadowRoot.getElementById('btcAmountInput').value + let btcRecipient = this.shadowRoot.getElementById('btcRecipient').value + const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey - this.sendMoneyLoading = true - this.btnDisable = true + this.sendMoneyLoading = true + this.btnDisable = true - const makeRequest = async () => { - const opts = { - xprv58: xprv58, - receivingAddress: btcRecipient, - bitcoinAmount: btcAmount, - feePerByte: (this.btcFeePerByte / 1e8).toFixed(8), - } - return await parentEpml.request('sendBtc', opts) - } + const makeRequest = async () => { + const opts = { + xprv58: xprv58, + receivingAddress: btcRecipient, + bitcoinAmount: btcAmount, + feePerByte: (this.btcFeePerByte / 1e8).toFixed(8) + } + return await parentEpml.request('sendBtc', opts) + } - const manageResponse = (response) => { - if (response.length === 64) { - this.shadowRoot.getElementById('btcAmountInput').value = 0 - this.shadowRoot.getElementById('btcRecipient').value = '' - this.errorMessage = '' - this.btcRecipient = '' - this.btcAmount = 0 - this.successMessage = this.renderSuccessText() - this.sendMoneyLoading = false - this.btnDisable = false - } else if (response === false) { - this.errorMessage = this.renderFailText() - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } else { - this.errorMessage = response.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(response) - } - } - const res = await makeRequest() - manageResponse(res) - await this.showWallet() - } + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('btcAmountInput').value = 0 + this.shadowRoot.getElementById('btcRecipient').value = '' + this.errorMessage = '' + this.btcRecipient = '' + this.btcAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + await this.showWallet() + } - async sendLtc() { - const ltcAmount = this.shadowRoot.getElementById('ltcAmountInput').value - const ltcRecipient = this.shadowRoot.getElementById('ltcRecipient').value - const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey + async sendLtc() { + const ltcAmount = this.shadowRoot.getElementById('ltcAmountInput').value + const ltcRecipient = this.shadowRoot.getElementById('ltcRecipient').value + const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey - this.sendMoneyLoading = true - this.btnDisable = true + this.sendMoneyLoading = true + this.btnDisable = true - const makeRequest = async () => { - const opts = { - xprv58: xprv58, - receivingAddress: ltcRecipient, - litecoinAmount: ltcAmount, - feePerByte: (this.ltcFeePerByte / 1e8).toFixed(8), - } + const makeRequest = async () => { + const opts = { + xprv58: xprv58, + receivingAddress: ltcRecipient, + litecoinAmount: ltcAmount, + feePerByte: (this.ltcFeePerByte / 1e8).toFixed(8) + } return await parentEpml.request('sendLtc', opts) - } + } - const manageResponse = (response) => { - if (response.length === 64) { - this.shadowRoot.getElementById('ltcAmountInput').value = 0 - this.shadowRoot.getElementById('ltcRecipient').value = '' - this.errorMessage = '' - this.ltcRecipient = '' - this.ltcAmount = 0 - this.successMessage = this.renderSuccessText() - this.sendMoneyLoading = false - this.btnDisable = false - } else if (response === false) { - this.errorMessage = this.renderFailText() - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } else { - this.errorMessage = response.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(response) - } - } - const res = await makeRequest() - manageResponse(res) - await this.showWallet() - } + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('ltcAmountInput').value = 0 + this.shadowRoot.getElementById('ltcRecipient').value = '' + this.errorMessage = '' + this.ltcRecipient = '' + this.ltcAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + await this.showWallet() + } - async sendDoge() { - const dogeAmount = this.shadowRoot.getElementById('dogeAmountInput').value - let dogeRecipient = this.shadowRoot.getElementById('dogeRecipient').value - const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey + async sendDoge() { + const dogeAmount = this.shadowRoot.getElementById('dogeAmountInput').value + let dogeRecipient = this.shadowRoot.getElementById('dogeRecipient').value + const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey - this.sendMoneyLoading = true - this.btnDisable = true + this.sendMoneyLoading = true + this.btnDisable = true - const makeRequest = async () => { - const opts = { - xprv58: xprv58, - receivingAddress: dogeRecipient, - dogecoinAmount: dogeAmount, - feePerByte: (this.dogeFeePerByte / 1e8).toFixed(8), - } - return await parentEpml.request('sendDoge', opts) - } + const makeRequest = async () => { + const opts = { + xprv58: xprv58, + receivingAddress: dogeRecipient, + dogecoinAmount: dogeAmount, + feePerByte: (this.dogeFeePerByte / 1e8).toFixed(8) + } + return await parentEpml.request('sendDoge', opts) + } - const manageResponse = (response) => { - if (response.length === 64) { - this.shadowRoot.getElementById('dogeAmountInput').value = 0 - this.shadowRoot.getElementById('dogeRecipient').value = '' - this.errorMessage = '' - this.dogeRecipient = '' - this.dogeAmount = 0 - this.successMessage = this.renderSuccessText() - this.sendMoneyLoading = false - this.btnDisable = false - } else if (response === false) { - this.errorMessage = this.renderFailText() - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } else { - this.errorMessage = response.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(response) - } - } - const res = await makeRequest() - manageResponse(res) - await this.showWallet() - } + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('dogeAmountInput').value = 0 + this.shadowRoot.getElementById('dogeRecipient').value = '' + this.errorMessage = '' + this.dogeRecipient = '' + this.dogeAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + await this.showWallet() + } - async sendDgb() { - const dgbAmount = this.shadowRoot.getElementById('dgbAmountInput').value - let dgbRecipient = this.shadowRoot.getElementById('dgbRecipient').value - const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey + async sendDgb() { + const dgbAmount = this.shadowRoot.getElementById('dgbAmountInput').value + let dgbRecipient = this.shadowRoot.getElementById('dgbRecipient').value + const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey - this.sendMoneyLoading = true - this.btnDisable = true + this.sendMoneyLoading = true + this.btnDisable = true - const makeRequest = async () => { - const opts = { - xprv58: xprv58, - receivingAddress: dgbRecipient, - digibyteAmount: dgbAmount, - feePerByte: (this.dgbFeePerByte / 1e8).toFixed(8), - } - return await parentEpml.request('sendDgb', opts) - } + const makeRequest = async () => { + const opts = { + xprv58: xprv58, + receivingAddress: dgbRecipient, + digibyteAmount: dgbAmount, + feePerByte: (this.dgbFeePerByte / 1e8).toFixed(8) + } + return await parentEpml.request('sendDgb', opts) + } - const manageResponse = (response) => { - if (response.length === 64) { - this.shadowRoot.getElementById('dgbAmountInput').value = 0 - this.shadowRoot.getElementById('dgbRecipient').value = '' - this.errorMessage = '' - this.dgbRecipient = '' - this.dgbAmount = 0 - this.successMessage = this.renderSuccessText() - this.sendMoneyLoading = false - this.btnDisable = false - } else if (response === false) { - this.errorMessage = this.renderFailText() - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } else { - this.errorMessage = response.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(response) - } - } - const res = await makeRequest() - manageResponse(res) - await this.showWallet() - } + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('dgbAmountInput').value = 0 + this.shadowRoot.getElementById('dgbRecipient').value = '' + this.errorMessage = '' + this.dgbRecipient = '' + this.dgbAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + await this.showWallet() + } - async sendRvn() { - const rvnAmount = this.shadowRoot.getElementById('rvnAmountInput').value - let rvnRecipient = this.shadowRoot.getElementById('rvnRecipient').value - const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey + async sendRvn() { + const rvnAmount = this.shadowRoot.getElementById('rvnAmountInput').value + let rvnRecipient = this.shadowRoot.getElementById('rvnRecipient').value + const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey - this.sendMoneyLoading = true - this.btnDisable = true + this.sendMoneyLoading = true + this.btnDisable = true - const makeRequest = async () => { - const opts = { - xprv58: xprv58, - receivingAddress: rvnRecipient, - ravencoinAmount: rvnAmount, - feePerByte: (this.rvnFeePerByte / 1e8).toFixed(8), - } + const makeRequest = async () => { + const opts = { + xprv58: xprv58, + receivingAddress: rvnRecipient, + ravencoinAmount: rvnAmount, + feePerByte: (this.rvnFeePerByte / 1e8).toFixed(8) + } return await parentEpml.request('sendRvn', opts) - } - - const manageResponse = (response) => { - if (response.length === 64) { - this.shadowRoot.getElementById('rvnAmountInput').value = 0 - this.shadowRoot.getElementById('rvnRecipient').value = '' - this.errorMessage = '' - this.rvnRecipient = '' - this.rvnAmount = 0 - this.successMessage = this.renderSuccessText() - this.sendMoneyLoading = false - this.btnDisable = false - } else if (response === false) { - this.errorMessage = this.renderFailText() - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } else { - this.errorMessage = response.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(response) - } - } - const res = await makeRequest() - manageResponse(res) - await this.showWallet() - } - - async sendArrr() { - const arrrAmount = this.shadowRoot.getElementById('arrrAmountInput').value - let arrrRecipient = this.shadowRoot.getElementById('arrrRecipient').value - let arrrMemo = this.shadowRoot.getElementById('arrrMemo').value - const seed58 = this.wallets.get(this._selectedWallet).wallet.seed58 - - this.sendMoneyLoading = true - this.btnDisable = true - - const makeRequest = async () => { - const opts = { - entropy58: seed58, - receivingAddress: arrrRecipient, - arrrAmount: arrrAmount, - memo: arrrMemo - } - return await parentEpml.request('sendArrr', opts) - } - - const manageResponse = (response) => { - if (response.length === 64) { - this.shadowRoot.getElementById('arrrAmountInput').value = 0 - this.shadowRoot.getElementById('arrrRecipient').value = '' - this.shadowRoot.getElementById('arrrMemo').value = '' - this.errorMessage = '' - this.arrrRecipient = '' - this.arrrMemo='' - this.arrrAmount = 0 - this.successMessage = this.renderSuccessText() - this.sendMoneyLoading = false - this.btnDisable = false - } else if (response === false) { - this.errorMessage = this.renderFailText() - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(txnResponse) - } else { - this.errorMessage = response.message - this.sendMoneyLoading = false - this.btnDisable = false - throw new Error(response) - } - } - const res = await makeRequest() - manageResponse(res) - await this.showWallet() - } - - async showWallet() { - this.transactionsDOM.hidden = true - this.loading = true - - if (this._selectedWallet == 'qort') { - if (!window.parent.reduxStore.getState().app.blockInfo.height) { - await parentEpml.request('apiCall', { url: `/blocks/height`, type: 'api' }) - .then(height => parentEpml.request('updateBlockInfo', { height })) - } - } - const coin = this._selectedWallet - await this.fetchWalletAddress(this._selectedWallet) - await this.fetchWalletServer(this._selectedWallet) - await this.fetchWalletDetails(this._selectedWallet) - await this.fetchWalletServer(this._selectedWallet) - if (this._selectedWallet == coin) { - await this.renderTransactions() - await this.getTransactionGrid(this._selectedWallet) - await this.updateItemsFromPage(1, true) - this.loading = false - this.transactionsDOM.hidden = false - } - } - - async fetchWalletDetails(coin) { - switch (coin) { - case 'qort': - this.balanceString = this.renderFetchText() - parentEpml.request('apiCall', { - url: `/addresses/balance/${this.wallets.get('qort').wallet.address}?apiKey=${this.getApiKey()}`, - }) - .then((res) => { - if (isNaN(Number(res))) { - let snack4string = get("walletpage.wchange32") - parentEpml.request('showSnackBar', `${snack4string}`) - } else { - if (this._selectedWallet == coin) { - this.wallets.get(coin).balance = Number(res).toFixed(8) - this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() - this.balance = this.wallets.get(this._selectedWallet).balance - } - } - }) - const txsQort = await parentEpml.request('apiCall', { - url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true&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 pendingTxsQort = await parentEpml.request('apiCall', { - url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true&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`, - }) - if (this._selectedWallet == coin) { - this.wallets.get(coin).transactions = pendingTxsQort.concat(txsQort) - } - break - case 'btc': - case 'ltc': - case 'doge': - case 'dgb': - case 'rvn': - this.balanceString = this.renderFetchText() - const walletName = `${coin}Wallet` - parentEpml.request('apiCall', { - url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress[walletName].derivedMasterPublicKey}`, - }) - .then((res) => { - if (isNaN(Number(res))) { - let snack5string = get("walletpage.wchange33") - let snack6string = get("walletpage.wchange34") - parentEpml.request('showSnackBar', `${snack5string} ${coin.toLocaleUpperCase()} ${snack6string}!`) - } else { - if (this._selectedWallet == coin) { - this.wallets.get(this._selectedWallet).balance = (Number(res) / 1e8).toFixed(8) - this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() - this.balance = this.wallets.get(this._selectedWallet).balance - } - } - }) - - const txs = await parentEpml.request('apiCall', { - url: `/crosschain/${coin}/wallettransactions?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress[walletName].derivedMasterPublicKey}`, - }) - - const compareFn = (a, b) => { - return b.timestamp - a.timestamp - } - - const sortedTransactions = txs.sort(compareFn) - if (this._selectedWallet == coin) { - this.wallets.get(this._selectedWallet).transactions = sortedTransactions - } - break - case 'arrr': - const arrrWalletName = `${coin}Wallet` - - const res = await parentEpml.request('apiCall', { - url: `/crosschain/${coin}/syncstatus?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, - }) - - if (coin != this._selectedWallet) { - // We've switched away from this coin - } - - if (res.indexOf('<') > -1) { - this.balanceString = this.renderFetchText() - await new Promise(resolve => setTimeout(resolve, 2000)) - await this.showWallet() - return - } else if (res !== "Synchronized") { - this.balanceString = res - await new Promise(resolve => setTimeout(resolve, 2000)) - await this.showWallet() - return - } - - this.balanceString = this.renderFetchText() - - parentEpml.request('apiCall', { - url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, - }) - .then((res) => { - if (isNaN(Number(res))) { - let snack5string = get("walletpage.wchange33") - let snack6string = get("walletpage.wchange34") - parentEpml.request('showSnackBar', `${snack5string} ${coin.toLocaleUpperCase()} ${snack6string}!`) - } else { - if (this._selectedWallet == coin) { - this.wallets.get(this._selectedWallet).balance = (Number(res) / 1e8).toFixed(8) - this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() - this.balance = this.wallets.get(this._selectedWallet).balance - } - } - }) - - const arrrTxs = await parentEpml.request('apiCall', { - url: `/crosschain/${coin}/wallettransactions?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, - }) - - const arrrCompareFn = (a, b) => { - return b.timestamp - a.timestamp - } - - const arrrSortedTransactions = arrrTxs.sort(arrrCompareFn) - - if (this._selectedWallet == coin) { - this.wallets.get(this._selectedWallet).transactions = arrrSortedTransactions - } - break - default: - break - } - } - - async fetchWalletAddress(coin) { - switch (coin) { - case 'arrr': - const arrrWalletName = `${coin}Wallet` - let res = await parentEpml.request('apiCall', { - url: `/crosschain/${coin}/walletaddress?apiKey=${this.getApiKey()}`, - method: 'POST', - body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, - }) - if (res != null && res.error != 1201 && res.length === 78) { - this.arrrWalletAddress = res - } - break - - default: - // Not used for other coins yet - break - } - } - - renderSendButton() { - if ( this._selectedWallet === "qort" ) { - return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` - } else if ( this._selectedWallet === "btc" ) { - return html` this.openSendBtc()}> ${translate("walletpage.wchange17")} BTC` - } else if ( this._selectedWallet === "ltc" ) { - return html` this.openSendLtc()}> ${translate("walletpage.wchange17")} LTC` - } else if ( this._selectedWallet === "doge" ) { - return html` this.openSendDoge()}> ${translate("walletpage.wchange17")} DOGE` - } else if ( this._selectedWallet === "dgb" ) { - return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` - } else if ( this._selectedWallet === "rvn" ) { - return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` - } else if ( this._selectedWallet === "arrr" ) { - return html` this.openSendArrr()}> ${translate("walletpage.wchange17")} ARRR` - } else { - return html`` - } - } - - renderAddressbookButton() { - if ( this._selectedWallet === "qort" ) { - return html` this.openQortAddressbook()}> ${translate("walletpage.wchange47")}` - } else if ( this._selectedWallet === "btc" ) { - return html` this.openBtcAddressbook()}> ${translate("walletpage.wchange47")}` - } else if ( this._selectedWallet === "ltc" ) { - return html` this.openLtcAddressbook()}> ${translate("walletpage.wchange47")}` - } else if ( this._selectedWallet === "doge" ) { - return html` this.openDogeAddressbook()}> ${translate("walletpage.wchange47")}` - } else if ( this._selectedWallet === "dgb" ) { - return html` this.openDgbAddressbook()}> ${translate("walletpage.wchange47")}` - } else if ( this._selectedWallet === "rvn" ) { - return html` this.openRvnAddressbook()}> ${translate("walletpage.wchange47")}` - } else if ( this._selectedWallet === "arrr" ) { - return html` this.openArrrAddressbook()}> ${translate("walletpage.wchange47")}` - } else { - return html`` - } - } - - renderExportAddressbookButton() { - if ( this._selectedWallet === "qort" ) { - return html` this.exportQortAddressbook()}> ${translate("walletpage.wchange54")}` - } else if ( this._selectedWallet === "btc" ) { - return html` this.exportBtcAddressbook()}> ${translate("walletpage.wchange54")}` - } else if ( this._selectedWallet === "ltc" ) { - return html` this.exportLtcAddressbook()}> ${translate("walletpage.wchange54")}` - } else if ( this._selectedWallet === "doge" ) { - return html` this.exportDogeAddressbook()}> ${translate("walletpage.wchange54")}` - } else if ( this._selectedWallet === "dgb" ) { - return html` this.exportDgbAddressbook()}> ${translate("walletpage.wchange54")}` - } else if ( this._selectedWallet === "rvn" ) { - return html` this.exportRvnAddressbook()}> ${translate("walletpage.wchange54")}` - } else if ( this._selectedWallet === "arrr" ) { - return html` this.exportArrrAddressbook()}> ${translate("walletpage.wchange54")}` - } else { - return html`` - } - } - - renderImportAddressbookButton() { - if ( this._selectedWallet === "qort" ) { - return html` this.openImportQortAddressbook()}> ${translate("walletpage.wchange53")}` - } else if ( this._selectedWallet === "btc" ) { - return html` this.openImportBtcAddressbook()}> ${translate("walletpage.wchange53")}` - } else if ( this._selectedWallet === "ltc" ) { - return html` this.openImportLtcAddressbook()}> ${translate("walletpage.wchange53")}` - } else if ( this._selectedWallet === "doge" ) { - return html` this.openImportDogeAddressbook()}> ${translate("walletpage.wchange53")}` - } else if ( this._selectedWallet === "dgb" ) { - return html` this.openImportDgbAddressbook()}> ${translate("walletpage.wchange53")}` - } else if ( this._selectedWallet === "rvn" ) { - return html` this.openImportRvnAddressbook()}> ${translate("walletpage.wchange53")}` - } else if ( this._selectedWallet === "arrr" ) { - return html` this.openImportArrrAddressbook()}> ${translate("walletpage.wchange53")}` - } else { - return html`` - } - } - - openSendQort() { - this.shadowRoot.querySelector("#sendQortDialog").show(); - } - - openSendBtc() { - this.shadowRoot.querySelector("#sendBtcDialog").show(); - } - - openSendLtc() { - this.shadowRoot.querySelector("#sendLtcDialog").show(); - } - - openSendDoge() { - this.shadowRoot.querySelector("#sendDogeDialog").show(); - } - - openSendDgb() { - this.shadowRoot.querySelector("#sendDgbDialog").show(); - } - - openSendRvn() { - this.shadowRoot.querySelector("#sendRvnDialog").show(); - } - - openSendArrr() { - this.shadowRoot.querySelector("#sendArrrDialog").show(); - } - - changeTheme() { - const checkTheme = localStorage.getItem('qortalTheme') - if (checkTheme === 'dark') { - this.theme = 'dark'; - } else { - this.theme = 'light'; - } - document.querySelector('html').setAttribute('theme', this.theme); - } - - changeLanguage() { - const checkLanguage = localStorage.getItem('qortalLanguage') - - if (checkLanguage === null || checkLanguage.length === 0) { - localStorage.setItem('qortalLanguage', 'us') - use('us') - } else { - use(checkLanguage) - } - } - - getSelectedWalletAddress() { - switch (this._selectedWallet) { - case "arrr": - // Use address returned by core API - return this.arrrWalletAddress - - default: - // Use locally derived address - return this.wallets.get(this._selectedWallet).wallet.address - } - } - - getSelectedWalletServer() { - switch (this._selectedWallet) { - case "qort": - return this.nodeDomain - - case "btc": - return this.btcServer - - case "ltc": - return this.ltcServer - - case "doge": - return this.dogeServer - - case "dgb": - return this.dgbServer - - case "rvn": - return this.rvnServer - - case "arrr": - return this.arrrServer - - default: - return - } - } - - async fetchWalletServer(coin) { - if (coin == 'qort') { - return - } - let walletServer = '' - try { - const serverInfo = await parentEpml.request('apiCall', { - type: 'api', - /* TODO */ - url: `/crosschain/${coin}/serverinfos`, - // TODO when 'current' parameter is added to 'serverinfos' API call, change above line to: - // url: `/crosschain/${coin}/serverinfos?current=true`, - }) - /* TODO */ - let currentServerFound = false - for (const server of serverInfo.servers) { - if (server.isCurrent === true) { - walletServer = `${server.hostName}:${server.port}` - currentServerFound = true - break - } - } - if (!currentServerFound) { - walletServer = 'Not Connected' - } - // TODO when 'current' parameter is added to 'serverinfos' API call, change above 'let,for,if' sections to: - /*if (serverInfo.servers[0]) { - const currentServerInfo = `${serverInfo.servers[0].hostName}:${serverInfo.servers[0].port}` - walletServer = currentServerInfo - } else { - walletServer = 'Not Connected' - }*/ - } catch (error) { - console.error('Failed to fetch server info:', error) - walletServer = `Error fetching server: ${error}` - } - switch (coin) { - case "btc": - this.btcServer = walletServer - break - case "ltc": - this.ltcServer = walletServer - break - case "doge": - this.dogeServer = walletServer - break - case "dgb": - this.dgbServer = walletServer - break - case "rvn": - this.rvnServer = walletServer - break - case "arrr": - this.arrrServer = walletServer - break - default: - break - } - } - - getNodeConfig() { - this.nodeDomain = "" - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - this.nodeDomain = myNode.domain + ":" + myNode.port - - this.nodeConfig = {} - parentEpml.request("getNodeConfig").then((res) => { - this.nodeConfig = res - }) - } - - async getTransactionGrid(coin) { - this.transactionsGrid = this.shadowRoot.querySelector(`#${coin}TransactionsGrid`) - if (coin === 'qort') { - this.transactionsGrid.addEventListener( - 'click', - (e) => { - let qortItem = this.transactionsGrid.getEventContext(e).item - this.showQortTransactionDetails(qortItem, this.wallets.get(this._selectedWallet).transactions) - }, - { passive: true } - ) - } else if (coin === 'btc') { - this.transactionsGrid.addEventListener( - 'click', - (e) => { - let btcItem = this.transactionsGrid.getEventContext(e).item - this.showBtcTransactionDetails(btcItem, this.wallets.get(this._selectedWallet).transactions) - }, - { passive: true } - ) - } else if (coin === 'ltc') { - this.transactionsGrid.addEventListener( - 'click', - (e) => { - let ltcItem = this.transactionsGrid.getEventContext(e).item - this.showLtcTransactionDetails(ltcItem, this.wallets.get(this._selectedWallet).transactions) - }, - { passive: true } - ) - } else if (coin === 'doge') { - this.transactionsGrid.addEventListener( - 'click', - (e) => { - let dogeItem = this.transactionsGrid.getEventContext(e).item - this.showDogeTransactionDetails(dogeItem, this.wallets.get(this._selectedWallet).transactions) - }, - { passive: true } - ) - } else if (coin === 'dgb') { - this.transactionsGrid.addEventListener( - 'click', - (e) => { - let dgbItem = this.transactionsGrid.getEventContext(e).item - this.showDgbTransactionDetails(dgbItem, this.wallets.get(this._selectedWallet).transactions) - }, - { passive: true } - ) - } else if (coin === 'rvn') { - this.transactionsGrid.addEventListener( - 'click', - (e) => { - let rvnItem = this.transactionsGrid.getEventContext(e).item - this.showRvnTransactionDetails(rvnItem, this.wallets.get(this._selectedWallet).transactions) - }, - { passive: true } - ) - } else if (coin === 'arrr') { - this.transactionsGrid.addEventListener( - 'click', - (e) => { - let arrrItem = this.transactionsGrid.getEventContext(e).item - this.showArrrTransactionDetails(arrrItem, this.wallets.get(this._selectedWallet).transactions) - }, - { passive: true } - ) - } - - this.pagesControl = this.shadowRoot.querySelector('#pages') - this.pages = undefined - } - - async renderTransactions() { - if (this._selectedWallet === 'qort') { - render(this.renderQortTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } else if (this._selectedWallet === 'btc') { - render(this.renderBtcTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } else if (this._selectedWallet === 'ltc') { - render(this.renderLtcTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } else if (this._selectedWallet === 'doge') { - render(this.renderDogeTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } else if (this._selectedWallet === 'dgb') { - render(this.renderDgbTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } else if (this._selectedWallet === 'rvn') { - render(this.renderRvnTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } else if (this._selectedWallet === 'arrr') { - render(this.renderArrrTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } - } - - renderQortTransactions(transactions, coin) { - const requiredConfirmations = 3 - const currentBlockHeight = window.parent.reduxStore.getState().app.blockInfo.height - if (Array.isArray(transactions)) { - transactions = transactions.map(tx => { - tx.confirmations = (currentBlockHeight - (tx.blockHeight - 1)) || '' - return tx - }) - } - - return html` -
    ${translate("walletpage.wchange38")}
    - - { - if (!currentBlockHeight) { - return render(html``, root) - } - const confirmed = data.item.confirmations >= requiredConfirmations - const unconfirmed = data.item.confirmations == 0 - if (confirmed) { - render(html`check`, root) - } else if (unconfirmed) { - render(html`schedule`, root) - } else { - render(html`schedule`, root) - } - }} - > - - { - render(html` ${data.item.type} ${data.item.creatorAddress === this.wallets.get('qort').wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) - }} - > - - { - render(html`${data.item.type === 'AT' ? html`${data.item.atAddress}` : html`${data.item.creatorAddress}`}`, root) - }} - > - - { - render(html`${data.item.type === 'DEPLOY_AT' ? html`${data.item.aTAddress}` : html`${data.item.recipient}`}`, root) - }} - > - - - - { - const time = new Date(data.item.timestamp) - render(html` `, root) - }} - > - - -
    - ` - } - - renderBtcTransactions(transactions, coin) { - return html` -
    ${translate("walletpage.wchange38")}
    - - { - render(html`check`, root) - }} - > - - { - render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) - }} - > - - { - render(html`${data.item.inputs[0].address}`, root) - }} - > - - { - render(html`${data.item.outputs[0].address}`, root) - }} - > - - - { - const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) - render(html`${amount}`, root) - }} - > - - { - const time = new Date(data.item.timestamp) - render(html` `, root) - }} - > - - -
    - ` - } - - renderLtcTransactions(transactions, coin) { - return html` -
    ${translate("walletpage.wchange38")}
    - - { - render(html`check`, root) - }} - > - - { - render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) - }} - > - - { - render(html`${data.item.inputs[0].address}`, root) - }} - > - - { - render(html`${data.item.outputs[0].address}`, root) - }} - > - - - { - const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) - render(html`${amount}`, root) - }} - > - - { - const time = new Date(data.item.timestamp) - render(html` `, root) - }} - > - - -
    - ` - } - - renderDogeTransactions(transactions, coin) { - return html` -
    ${translate("walletpage.wchange38")}
    - - { - render(html`check`, root) - }} - > - - { - render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) - }} - > - - { - render(html`${data.item.inputs[0].address}`, root) - }} - > - - { - render(html`${data.item.outputs[0].address}`, root) - }} - > - - - { - const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) - render(html`${amount}`, root) - }} - > - - { - const time = new Date(data.item.timestamp) - render(html` `, root) - }} - > - - -
    - ` - } - - renderDgbTransactions(transactions, coin) { - return html` -
    ${translate("walletpage.wchange38")}
    - - { - render(html`check`, root) - }} - > - - { - render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) - }} - > - - { - render(html`${data.item.inputs[0].address}`, root) - }} - > - - { - render(html`${data.item.outputs[0].address}`, root) - }} - > - - - { - const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) - render(html`${amount}`, root) - }} - > - - { - const time = new Date(data.item.timestamp) - render(html` `, root) - }} - > - - -
    - ` - } - - renderRvnTransactions(transactions, coin) { - return html` -
    ${translate("walletpage.wchange38")}
    - - { - render(html`check`, root) - }} - > - - { - render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) - }} - > - - { - render(html`${data.item.inputs[0].address}`, root) - }} - > - - { - render(html`${data.item.outputs[0].address}`, root) - }} - > - - - { - const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) - render(html`${amount}`, root) - }} - > - - { - const time = new Date(data.item.timestamp) - render(html` `, root) - }} - > - - -
    - ` - } - - renderArrrTransactions(transactions, coin) { - return html` -
    ${translate("walletpage.wchange38")}
    - - { - render(html`check`, root) - }} - > - - { - render(html` ${translate("walletpage.wchange40")} ${data.item.totalAmount < 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) - }} - > - - - - { - const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) - render(html`${amount}`, root) - }} - > - - { - const time = new Date(data.item.timestamp) - render(html` `, root) - }} - > - - { - render(html`${data.item.memo}`, root) - }} - > - - -
    - ` - } - - async updateItemsFromPage(page, changeWallet = false) { - if (page === undefined) { - return - } - - changeWallet === true ? (this.pagesControl.innerHTML = '') : null - - if (!this.pages) { - this.pages = Array.apply(null, { length: Math.ceil(this.wallets.get(this._selectedWallet).transactions.length / this.transactionsGrid.pageSize) }).map((item, index) => { - return index + 1 - }) - - const prevBtn = document.createElement('button') - prevBtn.textContent = '<' - prevBtn.addEventListener('click', () => { - const selectedPage = parseInt(this.pagesControl.querySelector('[selected]').textContent) - this.updateItemsFromPage(selectedPage - 1) - }) - this.pagesControl.appendChild(prevBtn) - - this.pages.forEach((pageNumber) => { - const pageBtn = document.createElement('button') - pageBtn.textContent = pageNumber - pageBtn.addEventListener('click', (e) => { - this.updateItemsFromPage(parseInt(e.target.textContent)) - }) - if (pageNumber === page) { - pageBtn.setAttribute('selected', true) - } - this.pagesControl.appendChild(pageBtn) - }) - - const nextBtn = window.document.createElement('button') - nextBtn.textContent = '>' - nextBtn.addEventListener('click', () => { - const selectedPage = parseInt(this.pagesControl.querySelector('[selected]').textContent) - this.updateItemsFromPage(selectedPage + 1) - }) - this.pagesControl.appendChild(nextBtn) - } - - const buttons = Array.from(this.pagesControl.children) - buttons.forEach((btn, index) => { - if (parseInt(btn.textContent) === page) { - btn.setAttribute('selected', true) - } else { - btn.removeAttribute('selected') - } - if (index === 0) { - if (page === 1) { - btn.setAttribute('disabled', '') - } else { - btn.removeAttribute('disabled') - } - } - if (index === buttons.length - 1) { - if (page === this.pages.length) { - btn.setAttribute('disabled', '') - } else { - btn.removeAttribute('disabled') - } - } - }) - let start = (page - 1) * this.transactionsGrid.pageSize - let end = page * this.transactionsGrid.pageSize - - this.transactionsGrid.items = this.wallets.get(this._selectedWallet).transactions.slice(start, end) - } - - getApiKey() { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return myNode.apiKey - } - - transactionItem(transactionObject) { - return ` -
    -
    -

    ${transactionObject.name}

    - ${transactionObject.category} ${transactionObject.ID} - ${transactionObject.date} -
    -
    -

    ${transactionObject.amount}

    -
    -
    - ` - } - - showQortTransactionDetails(myTransaction, allTransactions) { - allTransactions.forEach((transaction) => { - if (myTransaction.signature === transaction.signature) { - let txnFlow = myTransaction.creatorAddress === this.wallets.get('qort').wallet.address ? 'OUT' : 'IN' - this.selectedTransaction = { ...transaction, txnFlow } - if (this.selectedTransaction.signature.length != 0) { - this.shadowRoot.querySelector('#showTransactionDetailsDialog').show() - } - } - }) - } - - showBtcTransactionDetails(myTransaction, allTransactions) { - allTransactions.forEach((transaction) => { - if (myTransaction.txHash === transaction.txHash) { - let btcTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' - let btcSender = myTransaction.inputs[0].address - let btcReceiver = myTransaction.outputs[0].address - this.selectedTransaction = { ...transaction, btcTxnFlow, btcSender, btcReceiver } - if (this.selectedTransaction.txHash.length != 0) { - this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').show() - } - } - }) - } - - showLtcTransactionDetails(myTransaction, allTransactions) { - allTransactions.forEach((transaction) => { - if (myTransaction.txHash === transaction.txHash) { - let ltcTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' - let ltcSender = myTransaction.inputs[0].address - let ltcReceiver = myTransaction.outputs[0].address - this.selectedTransaction = { ...transaction, ltcTxnFlow, ltcSender, ltcReceiver } - if (this.selectedTransaction.txHash.length != 0) { - this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').show() - } - } - }) - } - - showDogeTransactionDetails(myTransaction, allTransactions) { - allTransactions.forEach((transaction) => { - if (myTransaction.txHash === transaction.txHash) { - let dogeTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' - let dogeSender = myTransaction.inputs[0].address - let dogeReceiver = myTransaction.outputs[0].address - this.selectedTransaction = { ...transaction, dogeTxnFlow, dogeSender, dogeReceiver } - if (this.selectedTransaction.txHash.length != 0) { - this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').show() - } - } - }) - } - - showDgbTransactionDetails(myTransaction, allTransactions) { - allTransactions.forEach((transaction) => { - if (myTransaction.txHash === transaction.txHash) { - let dgbTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' - let dgbSender = myTransaction.inputs[0].address - let dgbReceiver = myTransaction.outputs[0].address - this.selectedTransaction = { ...transaction, dgbTxnFlow, dgbSender, dgbReceiver } - if (this.selectedTransaction.txHash.length != 0) { - this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').show() - } - } - }) - } - - showRvnTransactionDetails(myTransaction, allTransactions) { - allTransactions.forEach((transaction) => { - if (myTransaction.txHash === transaction.txHash) { - let rvnTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' - let rvnSender = myTransaction.inputs[0].address - let rvnReceiver = myTransaction.outputs[0].address - this.selectedTransaction = { ...transaction, rvnTxnFlow, rvnSender, rvnReceiver } - if (this.selectedTransaction.txHash.length != 0) { - this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').show() - } - } - }) - } - - showArrrTransactionDetails(myTransaction, allTransactions) { - allTransactions.forEach((transaction) => { - if (myTransaction.txHash === transaction.txHash) { - let arrrTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' - let arrrSender = myTransaction.inputs[0].address - let arrrReceiver = myTransaction.outputs[0].address - this.selectedTransaction = { ...transaction, arrrTxnFlow, arrrSender, arrrReceiver } - if (this.selectedTransaction.txHash.length != 0) { - this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').show() - } - } - }) - } - - async saveFileToDisk(blob, fileName) { - try { - const fileHandle = await self.showSaveFilePicker({ - suggestedName: fileName, - types: [{ - description: "File", - }] - }) - const writeFile = async (fileHandle, contents) => { - const writable = await fileHandle.createWritable() - await writable.write(contents) - await writable.close() - } - writeFile(fileHandle, blob).then(() => console.log("FILE SAVED")) - let snack4string = get("general.save") - parentEpml.request('showSnackBar', `${snack4string} ${fileName} ✅`) - } catch (error) { - if (error.name === 'AbortError') { - return - } - FileSaver.saveAs(blob, fileName) - } - } - - isEmptyArray(arr) { - if (!arr) { - return true - } - return arr.length === 0 - } - - floor(num) { - num = parseFloat(num) - return isNaN(num) ? 0 : this._format(Math.floor(num)) - } - - decimals(num) { - num = parseFloat(num) - return num % 1 > 0 ? (num + '').split('.')[1] : '0' - } - - round(number) { - return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) - } - - subtract(num1, num2) { - return num1 - num2 - } - - getConfirmations(height, lastBlockHeight) { - return lastBlockHeight - height + 1 - } - - _format(num) { - return num.toLocaleString() - } - - _unconfirmedClass(unconfirmed) { - return unconfirmed ? 'unconfirmed' : '' - } + } + + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('rvnAmountInput').value = 0 + this.shadowRoot.getElementById('rvnRecipient').value = '' + this.errorMessage = '' + this.rvnRecipient = '' + this.rvnAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + await this.showWallet() + } + + async sendArrr() { + const arrrAmount = this.shadowRoot.getElementById('arrrAmountInput').value + let arrrRecipient = this.shadowRoot.getElementById('arrrRecipient').value + let arrrMemo = this.shadowRoot.getElementById('arrrMemo').value + const seed58 = this.wallets.get(this._selectedWallet).wallet.seed58 + + this.sendMoneyLoading = true + this.btnDisable = true + + const makeRequest = async () => { + const opts = { + entropy58: seed58, + receivingAddress: arrrRecipient, + arrrAmount: arrrAmount, + memo: arrrMemo + } + return await parentEpml.request('sendArrr', opts) + } + + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('arrrAmountInput').value = 0 + this.shadowRoot.getElementById('arrrRecipient').value = '' + this.shadowRoot.getElementById('arrrMemo').value = '' + this.errorMessage = '' + this.arrrRecipient = '' + this.arrrMemo = '' + this.arrrAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + await this.showWallet() + } + + async showWallet() { + this.transactionsDOM.hidden = true + this.loading = true + + if (this._selectedWallet == 'qort') { + if (!window.parent.reduxStore.getState().app.blockInfo.height) { + await parentEpml.request('apiCall', { url: `/blocks/height`, type: 'api' }) + .then(height => parentEpml.request('updateBlockInfo', { height })) + } + } + const coin = this._selectedWallet + await this.fetchWalletAddress(this._selectedWallet) + await this.fetchWalletServer(this._selectedWallet) + await this.fetchWalletDetails(this._selectedWallet) + await this.fetchWalletServer(this._selectedWallet) + if (this._selectedWallet == coin) { + await this.renderTransactions() + await this.getTransactionGrid(this._selectedWallet) + await this.updateItemsFromPage(1, true) + this.loading = false + this.transactionsDOM.hidden = false + } + } + + async fetchWalletDetails(coin) { + switch (coin) { + case 'qort': + this.balanceString = this.renderFetchText() + parentEpml.request('apiCall', { + url: `/addresses/balance/${this.wallets.get('qort').wallet.address}?apiKey=${this.getApiKey()}` + }).then((res) => { + if (isNaN(Number(res))) { + let snack4string = get("walletpage.wchange32") + parentEpml.request('showSnackBar', `${snack4string}`) + } else { + if (this._selectedWallet == coin) { + this.wallets.get(coin).balance = Number(res).toFixed(8) + this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() + this.balance = this.wallets.get(this._selectedWallet).balance + } + } + }) + const txsQort = await parentEpml.request('apiCall', { + url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true&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 pendingTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true&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`, + }) + if (this._selectedWallet == coin) { + this.wallets.get(coin).transactions = pendingTxsQort.concat(txsQort) + } + break + case 'btc': + case 'ltc': + case 'doge': + case 'dgb': + case 'rvn': + this.balanceString = this.renderFetchText() + const walletName = `${coin}Wallet` + parentEpml.request('apiCall', { + url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[walletName].derivedMasterPublicKey}` + }).then((res) => { + if (isNaN(Number(res))) { + let snack5string = get("walletpage.wchange33") + let snack6string = get("walletpage.wchange34") + parentEpml.request('showSnackBar', `${snack5string} ${coin.toLocaleUpperCase()} ${snack6string}!`) + } else { + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).balance = (Number(res) / 1e8).toFixed(8) + this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() + this.balance = this.wallets.get(this._selectedWallet).balance + } + } + }) + + const txs = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/wallettransactions?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[walletName].derivedMasterPublicKey}`, + }) + + const compareFn = (a, b) => { + return b.timestamp - a.timestamp + } + + const sortedTransactions = txs.sort(compareFn) + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).transactions = sortedTransactions + } + break + case 'arrr': + const arrrWalletName = `${coin}Wallet` + + const res = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/syncstatus?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}` + }) + + if (coin != this._selectedWallet) { + // We've switched away from this coin + } + + if (res.indexOf('<') > -1) { + this.balanceString = this.renderFetchText() + await new Promise(resolve => setTimeout(resolve, 2000)) + await this.showWallet() + return + } else if (res !== "Synchronized") { + this.balanceString = res + await new Promise(resolve => setTimeout(resolve, 2000)) + await this.showWallet() + return + } + + this.balanceString = this.renderFetchText() + + parentEpml.request('apiCall', { + url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }).then((res) => { + if (isNaN(Number(res))) { + let snack5string = get("walletpage.wchange33") + let snack6string = get("walletpage.wchange34") + parentEpml.request('showSnackBar', `${snack5string} ${coin.toLocaleUpperCase()} ${snack6string}!`) + } else { + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).balance = (Number(res) / 1e8).toFixed(8) + this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() + this.balance = this.wallets.get(this._selectedWallet).balance + } + } + }) + + const arrrTxs = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/wallettransactions?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + + const arrrCompareFn = (a, b) => { + return b.timestamp - a.timestamp + } + + const arrrSortedTransactions = arrrTxs.sort(arrrCompareFn) + + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).transactions = arrrSortedTransactions + } + break + default: + break + } + } + + async fetchWalletAddress(coin) { + switch (coin) { + case 'arrr': + const arrrWalletName = `${coin}Wallet` + let res = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/walletaddress?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + if (res != null && res.error != 1201 && res.length === 78) { + this.arrrWalletAddress = res + } + break + + default: + // Not used for other coins yet + break + } + } + + renderSendButton() { + if (this._selectedWallet === "qort") { + return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` + } else if (this._selectedWallet === "btc") { + return html` this.openSendBtc()}> ${translate("walletpage.wchange17")} BTC` + } else if (this._selectedWallet === "ltc") { + return html` this.openSendLtc()}> ${translate("walletpage.wchange17")} LTC` + } else if (this._selectedWallet === "doge") { + return html` this.openSendDoge()}> ${translate("walletpage.wchange17")} DOGE` + } else if (this._selectedWallet === "dgb") { + return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` + } else if (this._selectedWallet === "rvn") { + return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` + } else if (this._selectedWallet === "arrr") { + return html` this.openSendArrr()}> ${translate("walletpage.wchange17")} ARRR` + } else { + return html`` + } + } + + renderAddressbookButton() { + if (this._selectedWallet === "qort") { + return html` this.openQortAddressbook()}> ${translate("walletpage.wchange47")}` + } else if (this._selectedWallet === "btc") { + return html` this.openBtcAddressbook()}> ${translate("walletpage.wchange47")}` + } else if (this._selectedWallet === "ltc") { + return html` this.openLtcAddressbook()}> ${translate("walletpage.wchange47")}` + } else if (this._selectedWallet === "doge") { + return html` this.openDogeAddressbook()}> ${translate("walletpage.wchange47")}` + } else if (this._selectedWallet === "dgb") { + return html` this.openDgbAddressbook()}> ${translate("walletpage.wchange47")}` + } else if (this._selectedWallet === "rvn") { + return html` this.openRvnAddressbook()}> ${translate("walletpage.wchange47")}` + } else if (this._selectedWallet === "arrr") { + return html` this.openArrrAddressbook()}> ${translate("walletpage.wchange47")}` + } else { + return html`` + } + } + + renderExportAddressbookButton() { + if (this._selectedWallet === "qort") { + return html` this.exportQortAddressbook()}> ${translate("walletpage.wchange54")}` + } else if (this._selectedWallet === "btc") { + return html` this.exportBtcAddressbook()}> ${translate("walletpage.wchange54")}` + } else if (this._selectedWallet === "ltc") { + return html` this.exportLtcAddressbook()}> ${translate("walletpage.wchange54")}` + } else if (this._selectedWallet === "doge") { + return html` this.exportDogeAddressbook()}> ${translate("walletpage.wchange54")}` + } else if (this._selectedWallet === "dgb") { + return html` this.exportDgbAddressbook()}> ${translate("walletpage.wchange54")}` + } else if (this._selectedWallet === "rvn") { + return html` this.exportRvnAddressbook()}> ${translate("walletpage.wchange54")}` + } else if (this._selectedWallet === "arrr") { + return html` this.exportArrrAddressbook()}> ${translate("walletpage.wchange54")}` + } else { + return html`` + } + } + + renderImportAddressbookButton() { + if (this._selectedWallet === "qort") { + return html` this.openImportQortAddressbook()}> ${translate("walletpage.wchange53")}` + } else if (this._selectedWallet === "btc") { + return html` this.openImportBtcAddressbook()}> ${translate("walletpage.wchange53")}` + } else if (this._selectedWallet === "ltc") { + return html` this.openImportLtcAddressbook()}> ${translate("walletpage.wchange53")}` + } else if (this._selectedWallet === "doge") { + return html` this.openImportDogeAddressbook()}> ${translate("walletpage.wchange53")}` + } else if (this._selectedWallet === "dgb") { + return html` this.openImportDgbAddressbook()}> ${translate("walletpage.wchange53")}` + } else if (this._selectedWallet === "rvn") { + return html` this.openImportRvnAddressbook()}> ${translate("walletpage.wchange53")}` + } else if (this._selectedWallet === "arrr") { + return html` this.openImportArrrAddressbook()}> ${translate("walletpage.wchange53")}` + } else { + return html`` + } + } + + openSendQort() { + this.shadowRoot.querySelector("#sendQortDialog").show(); + } + + openSendBtc() { + this.shadowRoot.querySelector("#sendBtcDialog").show(); + } + + openSendLtc() { + this.shadowRoot.querySelector("#sendLtcDialog").show(); + } + + openSendDoge() { + this.shadowRoot.querySelector("#sendDogeDialog").show(); + } + + openSendDgb() { + this.shadowRoot.querySelector("#sendDgbDialog").show(); + } + + openSendRvn() { + this.shadowRoot.querySelector("#sendRvnDialog").show(); + } + + openSendArrr() { + this.shadowRoot.querySelector("#sendArrrDialog").show(); + } + + changeTheme() { + const checkTheme = localStorage.getItem('qortalTheme') + if (checkTheme === 'dark') { + this.theme = 'dark'; + } else { + this.theme = 'light'; + } + document.querySelector('html').setAttribute('theme', this.theme); + } + + changeLanguage() { + const checkLanguage = localStorage.getItem('qortalLanguage') + + if (checkLanguage === null || checkLanguage.length === 0) { + localStorage.setItem('qortalLanguage', 'us') + use('us') + } else { + use(checkLanguage) + } + } + + getSelectedWalletAddress() { + switch (this._selectedWallet) { + case "arrr": + // Use address returned by core API + return this.arrrWalletAddress + + default: + // Use locally derived address + return this.wallets.get(this._selectedWallet).wallet.address + } + } + + getSelectedWalletServer() { + switch (this._selectedWallet) { + case "qort": + return this.nodeDomain + case "btc": + return this.btcServer + case "ltc": + return this.ltcServer + case "doge": + return this.dogeServer + case "dgb": + return this.dgbServer + case "rvn": + return this.rvnServer + case "arrr": + return this.arrrServer + default: + return + } + } + + async fetchWalletServer(coin) { + if (coin == 'qort') { + return + } + let walletServer = '' + try { + const serverInfo = await parentEpml.request('apiCall', { + type: 'api', + /* TODO */ + url: `/crosschain/${coin}/serverinfos`, + // TODO when 'current' parameter is added to 'serverinfos' API call, change above line to: + // url: `/crosschain/${coin}/serverinfos?current=true`, + }) + /* TODO */ + let currentServerFound = false + for (const server of serverInfo.servers) { + if (server.isCurrent === true) { + walletServer = `${server.hostName}:${server.port}` + currentServerFound = true + break + } + } + if (!currentServerFound) { + walletServer = 'Not Connected' + } + // TODO when 'current' parameter is added to 'serverinfos' API call, change above 'let,for,if' sections to: + /*if (serverInfo.servers[0]) { + const currentServerInfo = `${serverInfo.servers[0].hostName}:${serverInfo.servers[0].port}` + walletServer = currentServerInfo + } else { + walletServer = 'Not Connected' + }*/ + } catch (error) { + console.error('Failed to fetch server info:', error) + walletServer = `Error fetching server: ${error}` + } + switch (coin) { + case "btc": + this.btcServer = walletServer + break + case "ltc": + this.ltcServer = walletServer + break + case "doge": + this.dogeServer = walletServer + break + case "dgb": + this.dgbServer = walletServer + break + case "rvn": + this.rvnServer = walletServer + break + case "arrr": + this.arrrServer = walletServer + break + default: + break + } + } + + getNodeConfig() { + this.nodeDomain = "" + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + this.nodeDomain = myNode.domain + ":" + myNode.port + this.nodeConfig = {} + parentEpml.request("getNodeConfig").then((res) => { + this.nodeConfig = res + }) + } + + async getTransactionGrid(coin) { + this.transactionsGrid = this.shadowRoot.querySelector(`#${coin}TransactionsGrid`) + if (coin === 'qort') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let qortItem = this.transactionsGrid.getEventContext(e).item + this.showQortTransactionDetails(qortItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) + } else if (coin === 'btc') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let btcItem = this.transactionsGrid.getEventContext(e).item + this.showBtcTransactionDetails(btcItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) + } else if (coin === 'ltc') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let ltcItem = this.transactionsGrid.getEventContext(e).item + this.showLtcTransactionDetails(ltcItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) + } else if (coin === 'doge') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let dogeItem = this.transactionsGrid.getEventContext(e).item + this.showDogeTransactionDetails(dogeItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) + } else if (coin === 'dgb') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let dgbItem = this.transactionsGrid.getEventContext(e).item + this.showDgbTransactionDetails(dgbItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) + } else if (coin === 'rvn') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let rvnItem = this.transactionsGrid.getEventContext(e).item + this.showRvnTransactionDetails(rvnItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) + } else if (coin === 'arrr') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let arrrItem = this.transactionsGrid.getEventContext(e).item + this.showArrrTransactionDetails(arrrItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) + } + + this.pagesControl = this.shadowRoot.querySelector('#pages') + this.pages = undefined + } + + async renderTransactions() { + if (this._selectedWallet === 'qort') { + render(this.renderQortTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'btc') { + render(this.renderBtcTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'ltc') { + render(this.renderLtcTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'doge') { + render(this.renderDogeTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'dgb') { + render(this.renderDgbTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'rvn') { + render(this.renderRvnTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'arrr') { + render(this.renderArrrTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } + } + + renderQortTransactions(transactions, coin) { + const requiredConfirmations = 3 + const currentBlockHeight = window.parent.reduxStore.getState().app.blockInfo.height + if (Array.isArray(transactions)) { + transactions = transactions.map(tx => { + tx.confirmations = (currentBlockHeight - (tx.blockHeight - 1)) || '' + return tx + }) + } + return html` +
    ${translate("walletpage.wchange38")}
    + + { + if (!currentBlockHeight) { + return render(html``, root) + } + const confirmed = data.item.confirmations >= requiredConfirmations + const unconfirmed = data.item.confirmations == 0 + if (confirmed) { + render(html`check`, root) + } else if (unconfirmed) { + render(html`schedule`, root) + } else { + render(html`schedule`, root) + } + }} + > + + { + render(html` + ${data.item.type} ${data.item.creatorAddress === this.wallets.get('qort').wallet.address ? + html` + ${translate("walletpage.wchange7")} + ` : html` + ${translate("walletpage.wchange8")} + ` + } + `, root) + }} + > + + { + render(html`${data.item.type === 'AT' ? html`${data.item.atAddress}` : html`${data.item.creatorAddress}`}`, root) + }} + > + + { + render(html`${data.item.type === 'DEPLOY_AT' ? html`${data.item.aTAddress}` : html`${data.item.recipient}`}`, root) + }} + > + + + + { + const time = new Date(data.item.timestamp) + render(html` + + `, root) + }} + > + + +
    + ` + } + + renderBtcTransactions(transactions, coin) { + return html` +
    ${translate("walletpage.wchange38")}
    + + { + render(html` + check + `, root) + }} + > + + { + render(html` + ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? + html` + ${translate("walletpage.wchange7")} + ` : html` + ${translate("walletpage.wchange8")} + ` + } + `, root) + }} + > + + { + render(html`${data.item.inputs[0].address}`, root) + }} + > + + { + render(html`${data.item.outputs[0].address}`, root) + }} + > + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp) + render(html` + + `, root) + }} + > + + +
    + ` + } + + renderLtcTransactions(transactions, coin) { + return html` +
    ${translate("walletpage.wchange38")}
    + + { + render(html` + check + `, root) + }} + > + + { + render(html` + ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? + html` + ${translate("walletpage.wchange7")} + ` : html` + ${translate("walletpage.wchange8")} + ` + } + `, root) + }} + > + + { + render(html`${data.item.inputs[0].address}`, root) + }} + > + + { + render(html`${data.item.outputs[0].address}`, root) + }} + > + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp) + render(html` + + `, root) + }} + > + + +
    + ` + } + + renderDogeTransactions(transactions, coin) { + return html` +
    +
    ${translate("walletpage.wchange38")}
    + + { + render(html` + check + `, root) + }} + > + + { + render(html` + ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? + html` + ${translate("walletpage.wchange7")} + ` : html` + ${translate("walletpage.wchange8")} + ` + } + `, root) + }} + > + + { + render(html`${data.item.inputs[0].address}`, root) + }} + > + + { + render(html`${data.item.outputs[0].address}`, root) + }} + > + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp) + render(html` + + `, root) + }} + > + + +
    + ` + } + + renderDgbTransactions(transactions, coin) { + return html` +
    ${translate("walletpage.wchange38")}
    + + { + render(html` + check + `, root) + }} + > + + { + render(html` + ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? + html` + ${translate("walletpage.wchange7")} + ` : html` + ${translate("walletpage.wchange8")} + ` + } + `, root) + }} + > + + { + render(html`${data.item.inputs[0].address}`, root) + }} + > + + { + render(html`${data.item.outputs[0].address}`, root) + }} + > + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp) + render(html` + + `, root) + }} + > + + +
    + ` + } + + renderRvnTransactions(transactions, coin) { + return html` +
    ${translate("walletpage.wchange38")}
    + + { + render(html` + check + `, root) + }} + > + + { + render(html` + ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? + html` + ${translate("walletpage.wchange7")} + ` : html` + ${translate("walletpage.wchange8")} + ` + } + `, root) + }} + > + + { + render(html`${data.item.inputs[0].address}`, root) + }} + > + + { + render(html`${data.item.outputs[0].address}`, root) + }} + > + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp) + render(html` + + `, root) + }} + > + + +
    + ` + } + + renderArrrTransactions(transactions, coin) { + return html` +
    ${translate("walletpage.wchange38")}
    + + { + render(html` + check + `, root) + }} + > + + { + render(html` + ${translate("walletpage.wchange40")} ${data.item.totalAmount < 0 ? + html` + ${translate("walletpage.wchange7")} + ` : html` + ${translate("walletpage.wchange8")} + ` + } + `, root) + }} + > + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp) + render(html` + + `, root) + }} + > + + { + render(html`${data.item.memo}`, root) + }} + > + + +
    + ` + } + + async updateItemsFromPage(page, changeWallet = false) { + if (page === undefined) { + return + } + + changeWallet === true ? (this.pagesControl.innerHTML = '') : null + + if (!this.pages) { + this.pages = Array.apply(null, { length: Math.ceil(this.wallets.get(this._selectedWallet).transactions.length / this.transactionsGrid.pageSize) }).map((item, index) => { + return index + 1 + }) + + const prevBtn = document.createElement('button') + prevBtn.textContent = '<' + prevBtn.addEventListener('click', () => { + const selectedPage = parseInt(this.pagesControl.querySelector('[selected]').textContent) + this.updateItemsFromPage(selectedPage - 1) + }) + this.pagesControl.appendChild(prevBtn) + + this.pages.forEach((pageNumber) => { + const pageBtn = document.createElement('button') + pageBtn.textContent = pageNumber + pageBtn.addEventListener('click', (e) => { + this.updateItemsFromPage(parseInt(e.target.textContent)) + }) + if (pageNumber === page) { + pageBtn.setAttribute('selected', true) + } + this.pagesControl.appendChild(pageBtn) + }) + + const nextBtn = window.document.createElement('button') + nextBtn.textContent = '>' + nextBtn.addEventListener('click', () => { + const selectedPage = parseInt(this.pagesControl.querySelector('[selected]').textContent) + this.updateItemsFromPage(selectedPage + 1) + }) + this.pagesControl.appendChild(nextBtn) + } + + const buttons = Array.from(this.pagesControl.children) + buttons.forEach((btn, index) => { + if (parseInt(btn.textContent) === page) { + btn.setAttribute('selected', true) + } else { + btn.removeAttribute('selected') + } + if (index === 0) { + if (page === 1) { + btn.setAttribute('disabled', '') + } else { + btn.removeAttribute('disabled') + } + } + if (index === buttons.length - 1) { + if (page === this.pages.length) { + btn.setAttribute('disabled', '') + } else { + btn.removeAttribute('disabled') + } + } + }) + let start = (page - 1) * this.transactionsGrid.pageSize + let end = page * this.transactionsGrid.pageSize + + this.transactionsGrid.items = this.wallets.get(this._selectedWallet).transactions.slice(start, end) + } + + transactionItem(transactionObject) { + return ` +
    +
    +

    ${transactionObject.name}

    + ${transactionObject.category} ${transactionObject.ID} - ${transactionObject.date} +
    +
    +

    ${transactionObject.amount}

    +
    +
    + ` + } + + showQortTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.signature === transaction.signature) { + let txnFlow = myTransaction.creatorAddress === this.wallets.get('qort').wallet.address ? 'OUT' : 'IN' + this.selectedTransaction = { ...transaction, txnFlow } + if (this.selectedTransaction.signature.length != 0) { + this.shadowRoot.querySelector('#showTransactionDetailsDialog').show() + } + } + }) + } + + showBtcTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let btcTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let btcSender = myTransaction.inputs[0].address + let btcReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, btcTxnFlow, btcSender, btcReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').show() + } + } + }) + } + + showLtcTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let ltcTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let ltcSender = myTransaction.inputs[0].address + let ltcReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, ltcTxnFlow, ltcSender, ltcReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').show() + } + } + }) + } + + showDogeTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let dogeTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let dogeSender = myTransaction.inputs[0].address + let dogeReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, dogeTxnFlow, dogeSender, dogeReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').show() + } + } + }) + } + + showDgbTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let dgbTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let dgbSender = myTransaction.inputs[0].address + let dgbReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, dgbTxnFlow, dgbSender, dgbReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').show() + } + } + }) + } + + showRvnTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let rvnTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let rvnSender = myTransaction.inputs[0].address + let rvnReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, rvnTxnFlow, rvnSender, rvnReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').show() + } + } + }) + } + + showArrrTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let arrrTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let arrrSender = myTransaction.inputs[0].address + let arrrReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, arrrTxnFlow, arrrSender, arrrReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').show() + } + } + }) + } + + async saveFileToDisk(blob, fileName) { + try { + const fileHandle = await self.showSaveFilePicker({ + suggestedName: fileName, + types: [{ + description: "File" + }] + }) + const writeFile = async (fileHandle, contents) => { + const writable = await fileHandle.createWritable() + await writable.write(contents) + await writable.close() + } + writeFile(fileHandle, blob).then(() => console.log("FILE SAVED")) + let snack4string = get("general.save") + parentEpml.request('showSnackBar', `${snack4string} ${fileName} ✅`) + } catch (error) { + if (error.name === 'AbortError') { + return + } + FileSaver.saveAs(blob, fileName) + } + } + + getConfirmations(height, lastBlockHeight) { + return lastBlockHeight - height + 1 + } + + _unconfirmedClass(unconfirmed) { + return unconfirmed ? 'unconfirmed' : '' + } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } + + floor(num) { + num = parseFloat(num) + return isNaN(num) ? 0 : this.format(Math.floor(num)) + } + + decimals(num) { + num = parseFloat(num) + return num % 1 > 0 ? (num + '').split('.')[1] : '0' + } + + subtract(num1, num2) { + return num1 - num2 + } + + format(num) { + return num.toLocaleString() + } } window.customElements.define('multi-wallet', MultiWallet) \ No newline at end of file diff --git a/plugins/plugins/utils/blocks-needed.js b/plugins/plugins/utils/blocks-needed.js deleted file mode 100644 index ee5dc6ce..00000000 --- a/plugins/plugins/utils/blocks-needed.js +++ /dev/null @@ -1,23 +0,0 @@ -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'; - } -}; \ No newline at end of file diff --git a/plugins/plugins/utils/bytesToMegabytes.js b/plugins/plugins/utils/bytesToMegabytes.js deleted file mode 100644 index 9b271e4f..00000000 --- a/plugins/plugins/utils/bytesToMegabytes.js +++ /dev/null @@ -1,3 +0,0 @@ -export function bytesToMegabytes(bytes) { - return bytes / (1024 * 1024); -} \ No newline at end of file diff --git a/plugins/plugins/utils/classes.js b/plugins/plugins/utils/classes.js new file mode 100644 index 00000000..c16b4bcf --- /dev/null +++ b/plugins/plugins/utils/classes.js @@ -0,0 +1,926 @@ +import { get } from '../../../core/translate' + +const getApiKey = () => { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey +} + +export class RequestQueue { + constructor(maxConcurrent = 5) { + this.queue = [] + this.maxConcurrent = maxConcurrent + this.currentConcurrent = 0 + } + + push(request) { + return new Promise((resolve, reject) => { + this.queue.push({ request, resolve, reject }) + this.checkQueue() + }) + } + + checkQueue() { + if (this.queue.length === 0 || this.currentConcurrent >= this.maxConcurrent) { + return + } + + const { request, resolve, reject } = this.queue.shift() + + this.currentConcurrent++ + + request().then(resolve).catch(reject).finally(() => { + this.currentConcurrent-- + this.checkQueue() + }) + } +} + +export class RequestQueueWithPromise { + constructor(maxConcurrent = 5) { + this.queue = [] + this.maxConcurrent = maxConcurrent + this.currentlyProcessing = 0 + } + + // Add a request to the queue and return a promise + enqueue(request) { + return new Promise((resolve, reject) => { + // Push the request and its resolve and reject callbacks to the queue + this.queue.push({ request, resolve, reject }) + this.process() + }) + } + + // Process requests in the queue + async process() { + while (this.queue.length > 0 && this.currentlyProcessing < this.maxConcurrent) { + this.currentlyProcessing++ + + const { request, resolve, reject } = this.queue.shift() + + try { + const response = await request() + resolve(response) + } catch (error) { + reject(error) + } finally { + this.currentlyProcessing-- + await this.process() + } + } + } +} + +export class Loader { + constructor() { + this.loader = document.createElement("div") + this.loader.className = "loader" + this.loader.innerHTML = `
    ` + this.styles = document.createElement("style") + this.styles.innerHTML = ` + .loader { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000001; + } + + .loader-spinner { + border: 4px solid #f3f3f3; + border-top: 4px solid #3498db; + border-radius: 50%; + width: 32px; + height: 32px; + animation: spin 1s linear infinite; + } + + @keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + ` + } + + show() { + document.head.appendChild(this.styles) + document.body.appendChild(this.loader) + } + + hide() { + if (this.loader.parentNode) { + this.loader.parentNode.removeChild(this.loader) + } + if (this.styles.parentNode) { + this.styles.parentNode.removeChild(this.styles) + } + } +} + +export class ModalHelper { + constructor() { + this.initializeStyles() + } + + async getArbitraryFee() { + const timestamp = Date.now() + 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/unitfee?txType=ARBITRARY×tamp=${timestamp}` + const response = await fetch(url) + + if (!response.ok) { + throw new Error('Error when fetching arbitrary fee') + } + + const data = await response.json() + const arbitraryFee = (Number(data) / 1e8).toFixed(8) + + return { + timestamp, + fee: Number(data), + feeToShow: arbitraryFee + } + } + + async showModalAndWaitPublish(data) { + return new Promise((resolve) => { + const modal = this.createModal(data) + document.body.appendChild(modal) + this.addModalEventListeners(modal, resolve) + }) + } + + createModal(data) { + const modal = document.createElement('div') + modal.id = "backdrop" + modal.classList.add("backdrop") + + modal.innerHTML = ` + + ` + + return modal + } + + addModalEventListeners(modal, resolve) { + // Event listener for the 'OK' button + const okButton = modal.querySelector('#ok-button') + okButton.addEventListener('click', () => { + const userData = { isWithFee: true } + if (modal.parentNode === document.body) { + document.body.removeChild(modal) + } + + resolve({ action: 'accept', userData }) + }) + + // Prevent modal content from closing the modal + const modalContent = modal.querySelector('.modal-content') + modalContent.addEventListener('click', e => { + e.stopPropagation() + }) + + // Event listener for 'Backdrop' button + const backdropClick = document.getElementById('backdrop') + backdropClick.addEventListener('click', () => { + if (modal.parentNode === document.body) { + document.body.removeChild(modal) + } + + resolve({ action: 'reject' }) + }) + + // Event listener for 'Cancel' button + const cancelButton = modal.querySelector('#cancel-button') + cancelButton.addEventListener('click', () => { + if (modal.parentNode === document.body) { + document.body.removeChild(modal) + } + + resolve({ action: 'reject' }) + }) + } + + initializeStyles() { + const styles = ` + * { + --mdc-theme-primary: rgb(3, 169, 244); + --mdc-theme-secondary: var(--mdc-theme-primary); + --paper-input-container-focus-color: var(--mdc-theme-primary); + --mdc-checkbox-unchecked-color: var(--black); + --mdc-theme-on-surface: var(--black); + --mdc-checkbox-disabled-color: var(--black); + --mdc-checkbox-ink-color: var(--black); + } + + .backdrop { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgb(186 186 186 / 26%); + overflow: hidden; + animation: backdrop_blur cubic-bezier(0.22, 1, 0.36, 1) 0.1s forwards; + z-index: 1000000; + } + + @keyframes backdrop_blur { + 0% { + backdrop-filter: blur(0px); + background: transparent; + } + + 100% { + backdrop-filter: blur(5px); + background: rgb(186 186 186 / 26%); + } + } + + @keyframes modal_transition { + 0% { + visibility: hidden; + opacity: 0; + } + + 100% { + visibility: visible; + opacity: 1; + } + } + + .modal { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + animation: 0.1s cubic-bezier(0.22, 1, 0.36, 1) 0s 1 normal forwards running modal_transition; + z-index: 1000001; + } + + @keyframes modal_transition { + 0% { + visibility: hidden; + opacity: 0; + } + + 100% { + visibility: visible; + opacity: 1; + } + } + + .modal-content { + background-color: var(--white); + border-radius: 10px; + 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-body { + padding: 25px; + } + + .modal-subcontainer { + color: var(--black); + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 15px; + } + + .modal-subcontainer-error { + color: var(--black); + display: flex; + flex-direction: column; + align-items: center; + gap: 15px; + } + + .modal-paragraph-error { + font-family: Roboto, sans-serif; + font-size: 20px; + letter-spacing: 0.3px; + font-weight: 700; + color: var(--black); + margin: 0; + } + + .modal-paragraph { + font-family: Roboto, sans-serif; + font-size: 18px; + letter-spacing: 0.3px; + font-weight: 300; + color: var(--black); + margin: 0; + word-wrap: break-word; + overflow-wrap: break-word; + } + + .capitalize-first { + text-transform: capitalize; + } + + .checkbox-row { + display: flex; + align-items: center; + font-family: Montserrat, sans-serif; + font-weight: 600; + color: var(--black); + } + + .modal-buttons { + display: flex; + justify-content: space-between; + margin-top: 20px; + } + + .modal-buttons button { + background-color: #4caf50; + border: none; + color: #fff; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.2s; + } + + .modal-buttons button:hover { + background-color: #3e8e41; + } + + #cancel-button { + background-color: #f44336; + } + + #cancel-button:hover { + background-color: #d32f2f; + } + ` + + const styleSheet = new CSSStyleSheet() + + styleSheet.replaceSync(styles) + + document.adoptedStyleSheets = [styleSheet] + } + + static getInstance() { + if (!ModalHelper.instance) { + ModalHelper.instance = new ModalHelper() + } + + return ModalHelper.instance + } +} + +export class WarningModal { + constructor() { + this.initializeStyles() + } + + async showModalAndWaitPublish(data) { + return new Promise((resolve) => { + const modal = this.createModal(data) + document.body.appendChild(modal) + this.addModalEventListeners(modal, resolve) + }) + } + + createModal(data) { + const modal = document.createElement('div') + + modal.id = "backdrop" + modal.classList.add("backdrop") + + modal.innerHTML = ` + + ` + + return modal + } + + addModalEventListeners(modal, resolve) { + // Event listener for the 'OK' button + const okButton = modal.querySelector('#ok-button') + okButton.addEventListener('click', () => { + const userData = { isWithFee: true } + + if (modal.parentNode === document.body) { + document.body.removeChild(modal) + } + + resolve({ action: 'accept', userData }) + }) + + // Prevent modal content from closing the modal + const modalContent = modal.querySelector('.modal-content') + modalContent.addEventListener('click', e => { + e.stopPropagation() + }) + + // Event listener for 'Backdrop' button + const backdropClick = document.getElementById('backdrop') + backdropClick.addEventListener('click', () => { + if (modal.parentNode === document.body) { + document.body.removeChild(modal) + } + + resolve({ action: 'reject' }) + }) + + // Event listener for 'Cancel' button + const cancelButton = modal.querySelector('#cancel-button') + cancelButton.addEventListener('click', () => { + if (modal.parentNode === document.body) { + document.body.removeChild(modal) + } + + resolve({ action: 'reject' }) + }) + } + + initializeStyles() { + const styles = ` + * { + --mdc-theme-primary: rgb(3, 169, 244); + --mdc-theme-secondary: var(--mdc-theme-primary); + --paper-input-container-focus-color: var(--mdc-theme-primary); + --mdc-checkbox-unchecked-color: var(--black); + --mdc-theme-on-surface: var(--black); + --mdc-checkbox-disabled-color: var(--black); + --mdc-checkbox-ink-color: var(--black); + } + + .backdrop { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgb(186 186 186 / 26%); + overflow: hidden; + animation: backdrop_blur cubic-bezier(0.22, 1, 0.36, 1) 0.1s forwards; + z-index: 1000000; + } + + @keyframes backdrop_blur { + 0% { + backdrop-filter: blur(0px); + background: transparent; + } + + 100% { + backdrop-filter: blur(5px); + background: rgb(186 186 186 / 26%); + } + } + + @keyframes modal_transition { + 0% { + visibility: hidden; + opacity: 0; + } + + 100% { + visibility: visible; + opacity: 1; + } + } + + .modal { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + animation: 0.1s cubic-bezier(0.22, 1, 0.36, 1) 0s 1 normal forwards running modal_transition; + z-index: 1000001; + } + + @keyframes modal_transition { + 0% { + visibility: hidden; + opacity: 0; + } + + 100% { + visibility: visible; + opacity: 1; + } + } + + .modal-content { + background-color: var(--white); + border-radius: 10px; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + max-width: 650px; + min-width: 300px; + display: flex; + flex-direction: column; + justify-content: space-between; + } + + .modal-body { + padding: 25px; + } + + .modal-subcontainer { + color: var(--black); + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 15px; + } + + .modal-subcontainer-error { + color: var(--black); + display: flex; + flex-direction: column; + align-items: center; + gap: 15px; + } + + .modal-paragraph-error { + font-family: Roboto, sans-serif; + font-size: 20px; + letter-spacing: 0.3px; + font-weight: 700; + color: var(--black); + margin: 0; + } + + .modal-paragraph { + font-family: Roboto, sans-serif; + font-size: 18px; + letter-spacing: 0.3px; + font-weight: 300; + color: var(--black); + margin: 0; + word-wrap: break-word; + overflow-wrap: break-word; + } + + .capitalize-first { + text-transform: capitalize; + } + + .checkbox-row { + display: flex; + align-items: center; + font-family: Montserrat, sans-serif; + font-weight: 600; + color: var(--black); + } + + .modal-buttons { + display: flex; + justify-content: space-between; + margin-top: 20px; + } + + .modal-buttons button { + background-color: #4caf50; + border: none; + color: #fff; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.2s; + } + + .modal-buttons button:hover { + background-color: #3e8e41; + } + + #cancel-button { + background-color: #f44336; + } + + #cancel-button:hover { + background-color: #d32f2f; + } + ` + + const styleSheet = new CSSStyleSheet() + + styleSheet.replaceSync(styles) + + document.adoptedStyleSheets = [styleSheet] + } + + static getInstance() { + if (!WarningModal.instance) { + WarningModal.instance = new WarningModal() + } + + return WarningModal.instance + } +} + +export const modalHelper = ModalHelper.getInstance() +export const warningModal = WarningModal.getInstance() + +export const publishData = async ({ + registeredName, + path, + file, + service, + identifier, + parentEpml, + uploadType, + selectedAddress, + worker, + isBase64, + filename, + apiVersion, + withFee, + title, + description, + category, + tag1, + tag2, + tag3, + tag4, + tag5, + feeAmount +}) => { + const validateName = async (receiverName) => { + return await parentEpml.request('apiCall', { + type: 'api', + url: `/names/${receiverName}` + }) + } + + const convertBytesForSigning = async (transactionBytesBase58) => { + return await parentEpml.request('apiCall', { + type: 'api', + method: 'POST', + url: `/transactions/convert`, + body: `${transactionBytesBase58}` + }) + } + + const getArbitraryFee = async () => { + const timestamp = Date.now() + + let fee = await parentEpml.request('apiCall', { + url: `/transactions/unitfee?txType=ARBITRARY×tamp=${timestamp}` + }) + + return { + timestamp, + fee: Number(fee), + feeToShow: (Number(fee) / 1e8).toFixed(8) + } + } + + const signAndProcess = async (transactionBytesBase58) => { + let convertedBytesBase58 = await convertBytesForSigning( + transactionBytesBase58 + ) + + if (convertedBytesBase58.error) { + throw new Error('Error when signing') + } + + const convertedBytes = window.parent.Base58.decode(convertedBytesBase58) + + let nonce = null + + const computPath = window.parent.location.origin + '/memory-pow/memory-pow.wasm.full' + + await new Promise((res, rej) => { + worker.postMessage({ convertedBytes, path: computPath }) + + worker.onmessage = e => { + worker.terminate() + nonce = e.data.nonce + res() + } + }) + + let response = await parentEpml.request('sign_arbitrary', { + nonce: selectedAddress.nonce, + arbitraryBytesBase58: transactionBytesBase58, + arbitraryBytesForSigningBase58: convertedBytesBase58, + arbitraryNonce: nonce, + apiVersion: apiVersion ? apiVersion : null + }) + + let myResponse = { error: '' } + + if (response === false) { + throw new Error('Error when signing') + } else { + myResponse = response + } + + return myResponse + } + + const signAndProcessWithFee = async (transactionBytesBase58) => { + let convertedBytesBase58 = await convertBytesForSigning( + transactionBytesBase58 + ) + + if (convertedBytesBase58.error) { + throw new Error('Error when signing') + } + + let response = await parentEpml.request('sign_arbitrary_with_fee', { + nonce: selectedAddress.nonce, + arbitraryBytesBase58: transactionBytesBase58, + arbitraryBytesForSigningBase58: convertedBytesBase58, + apiVersion: apiVersion ? apiVersion : null + }) + + let myResponse = { error: '' } + + if (response === false) { + throw new Error('Error when signing') + } else { + myResponse = response + } + + return myResponse + } + + const validate = async () => { + let validNameRes = await validateName(registeredName) + + if (validNameRes.error) { + throw new Error('Name not found') + } + + let fee = null + + if (withFee && feeAmount) { + fee = feeAmount + } else if (withFee) { + const res = await getArbitraryFee() + + if (res.fee) { + fee = res.fee + } else { + throw new Error('unable to get fee') + } + } + + let transactionBytes = await uploadData(registeredName, path, file, fee) + + if (transactionBytes.error) { + throw new Error(transactionBytes.message || 'Error when uploading') + } else if (transactionBytes.includes('Error 500 Internal Server Error')) { + throw new Error('Error when uploading') + } + + let signAndProcessRes + + if (withFee) { + signAndProcessRes = await signAndProcessWithFee(transactionBytes) + } + + if (!withFee) { + signAndProcessRes = await signAndProcess(transactionBytes) + } + + if (signAndProcessRes.error) { + throw new Error('Error when signing') + } + + return signAndProcessRes + } + + const uploadData = async (registeredName, path, file, fee) => { + if (identifier != null && identifier.trim().length > 0) { + let postBody = path + let urlSuffix = '' + + if (file != null) { + // If we're sending zipped data, make sure to use the /zip version of the POST /arbitrary/* API + if (uploadType === 'zip') { + urlSuffix = '/zip' + } + + // If we're sending file data, use the /base64 version of the POST /arbitrary/* API + else if (uploadType === 'file') { + urlSuffix = '/base64' + } + + // Base64 encode the file to work around compatibility issues between javascript and java byte arrays + if (isBase64) { + postBody = file + } + + if (!isBase64) { + let fileBuffer = new Uint8Array(await file.arrayBuffer()) + postBody = Buffer.from(fileBuffer).toString("base64") + } + + } + + let uploadDataUrl = `/arbitrary/${service}/${registeredName}${urlSuffix}?apiKey=${getApiKey()}` + + if (identifier.trim().length > 0) { + uploadDataUrl = `/arbitrary/${service}/${registeredName}/${identifier}${urlSuffix}?apiKey=${getApiKey()}` + } + + if (withFee) { + uploadDataUrl = uploadDataUrl + `&fee=${fee}` + } + + if (filename != null && filename != 'undefined') { + uploadDataUrl = uploadDataUrl + '&filename=' + encodeURIComponent(filename) + } + + if (title != null && title != 'undefined') { + uploadDataUrl = uploadDataUrl + '&title=' + encodeURIComponent(title) + } + + if (description != null && description != 'undefined') { + uploadDataUrl = uploadDataUrl + '&description=' + encodeURIComponent(description) + } + + if (category != null && category != 'undefined') { + uploadDataUrl = uploadDataUrl + '&category=' + encodeURIComponent(category) + } + + if (tag1 != null && tag1 != 'undefined') { + uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag1) + } + + if (tag2 != null && tag2 != 'undefined') { + uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag2) + } + + if (tag3 != null && tag3 != 'undefined') { + uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag3) + } + + if (tag4 != null && tag4 != 'undefined') { + uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag4) + } + + if (tag5 != null && tag5 != 'undefined') { + uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag5) + } + + return await parentEpml.request('apiCall', { + type: 'api', + method: 'POST', + url: `${uploadDataUrl}`, + body: `${postBody}` + }) + } + } + + try { + return await validate() + } catch (error) { + throw new Error(error.message) + } +} \ No newline at end of file diff --git a/plugins/plugins/utils/cropAddress.js b/plugins/plugins/utils/cropAddress.js deleted file mode 100644 index 8c0c3f1b..00000000 --- a/plugins/plugins/utils/cropAddress.js +++ /dev/null @@ -1,8 +0,0 @@ -export function cropAddress(string = "", range = 5) { - const [start, end] = [ - string?.substring(0, range), - string?.substring(string?.length - range, string?.length), - // - ]; - return start + "..." + end; -} diff --git a/plugins/plugins/utils/functions.js b/plugins/plugins/utils/functions.js new file mode 100644 index 00000000..138a7b7b --- /dev/null +++ b/plugins/plugins/utils/functions.js @@ -0,0 +1,208 @@ +import { Epml } from '../../epml' + +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + +export const inputKeyCodes = [ + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 160, 161, 162, 163, 164, 165, 170, 171, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 219, 220, 221, + 222, 223, 226 +] + +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' + } +} + +export const getUserNameFromAddress = async (address) => { + try { + const getNames = await parentEpml.request("apiCall", { + type: "api", + url: `/names/address/${address}` + }) + + if (Array.isArray(getNames) && getNames.length > 0 ) { + return getNames[0].name + } else { + return address + } + } catch (error) { + console.error(error) + } +} + +export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isReceipient, decodeMessageFunc, _publicKey, addToUpdateMessageHashmap }) => { + const MAX_CONCURRENT_REQUESTS = 5 // Maximum number of concurrent requests + + const executeWithConcurrencyLimit = async (array, asyncFn) => { + const results = [] + const concurrencyPool = [] + + for (const item of array) { + const promise = asyncFn(item) + concurrencyPool.push(promise) + + if (concurrencyPool.length >= MAX_CONCURRENT_REQUESTS) { + results.push(...await Promise.all(concurrencyPool)) + concurrencyPool.length = 0 // Clear the concurrency pool + } + } + + if (concurrencyPool.length > 0) { + results.push(...await Promise.all(concurrencyPool)) + } + + return results + } + + const findUpdatedMessage = async (msg) => { + let msgItem = { ...msg } + + try { + let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` + if (!isReceipient) { + msgQuery = `&txGroupId=${msg.txGroupId}` + } + + // Find new messages first + const newMsgResponse = await parentEpml.request("apiCall", { + type: "api", + url: `/chat/messages?chatreference=${msg.signature}&reverse=true${msgQuery}&limit=1&sender=${msg.sender}&encoding=BASE64` + }) + + if (Array.isArray(newMsgResponse) && newMsgResponse.length > 0) { + const decodeResponseItem = decodeMessageFunc(newMsgResponse[0], isReceipient, _publicKey) + + delete decodeResponseItem.timestamp + + msgItem = { + ...msgItem, + ...decodeResponseItem, + senderName: msg.senderName, + sender: msg.sender, + editedTimestamp: newMsgResponse[0].timestamp, + originalSignature: msg.signature + } + } + + // Then check and find replies in the same iteration + let parsedMessageObj + + try { + parsedMessageObj = JSON.parse(msg.decodedMessage) + } catch (error) { + // If parsing fails, return the msgItem as is + return msgItem + } + + if (parsedMessageObj.repliedTo) { + let originalReply + + if (+parsedMessageObj.version > 2) { + originalReply = await parentEpml.request("apiCall", { + type: "api", + url: `/chat/message/${parsedMessageObj.repliedTo}?encoding=BASE64` + }) + } else { + originalReply = await parentEpml.request("apiCall", { + type: "api", + url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}&encoding=BASE64` + }) + } + + const originalReplyMessage = originalReply.timestamp ? originalReply : originalReply.length > 0 ? originalReply[0] : null + + const replyResponse = await parentEpml.request("apiCall", { + type: "api", + url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}&limit=1&sender=${originalReplyMessage.sender}&encoding=BASE64` + }) + + if (originalReplyMessage && Array.isArray(replyResponse) && replyResponse.length !== 0) { + const decodeOriginalReply = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey) + const decodeUpdatedReply = decodeMessageFunc(replyResponse[0], isReceipient, _publicKey) + + msgItem.repliedToData = { + ...decodeUpdatedReply, + senderName: decodeOriginalReply.senderName, + sender: decodeOriginalReply.sender + } + } else if (originalReplyMessage) { + msgItem.repliedToData = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey) + } + } + + } catch (error) { + // Handle or log the error gracefully + console.error(error) + } + + return msgItem + } + + const sortedMessages = decodedMessages.sort((a, b) => b.timestamp - a.timestamp) + + // Execute the functions with concurrency limit + const updatedMessages = await executeWithConcurrencyLimit(sortedMessages, findUpdatedMessage) + addToUpdateMessageHashmap(updatedMessages) + + return updatedMessages +} + +export function bytesToMegabytes(bytes) { + return bytes / (1024 * 1024) +} + +export function cropAddress(string = '', range = 5) { + const [start, end] = [ + string?.substring(0, range), + string?.substring(string?.length - range, string?.length) + ] + + return start + '...' + end +} + +export function roundToNearestDecimal(num) { + const mb = num / 1000000 + return Math.round(mb * 10) / 10 +} + +export function simpleHash(str) { + let hash = 0 + + for (let i = 0; i < str.length; i++) { + hash = (hash << 5) - hash + str.charCodeAt(i) + hash = hash & hash // Convert to 32bit integer + } + + return hash.toString() +} + +export function generateIdFromAddresses(address1, address2) { + // Sort addresses lexicographically and concatenate + const sortedAddresses = [address1, address2].sort().join('') + + return simpleHash(sortedAddresses) +} \ No newline at end of file diff --git a/plugins/plugins/utils/getUserNameFromAddress.js b/plugins/plugins/utils/getUserNameFromAddress.js deleted file mode 100644 index be8a3d69..00000000 --- a/plugins/plugins/utils/getUserNameFromAddress.js +++ /dev/null @@ -1,20 +0,0 @@ -import {Epml} from '../../epml.js'; - -const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) - -export const getUserNameFromAddress = async (address) => { - try { - const getNames = await parentEpml.request("apiCall", { - type: "api", - url: `/names/address/${address}`, - }); - - if (Array.isArray(getNames) && getNames.length > 0 ) { - return getNames[0].name; - } else { - return address; - } - } catch (error) { - console.error(error); - } -} diff --git a/plugins/plugins/utils/id-generation.js b/plugins/plugins/utils/id-generation.js deleted file mode 100644 index 88323156..00000000 --- a/plugins/plugins/utils/id-generation.js +++ /dev/null @@ -1,14 +0,0 @@ -export function simpleHash(str) { - let hash = 0; - for (let i = 0; i < str.length; i++) { - hash = (hash << 5) - hash + str.charCodeAt(i); - hash = hash & hash; // Convert to 32bit integer - } - return hash.toString(); -} - -export function generateIdFromAddresses(address1, address2) { - // Sort addresses lexicographically and concatenate - const sortedAddresses = [address1, address2].sort().join(''); - return simpleHash(sortedAddresses); -} \ No newline at end of file diff --git a/plugins/plugins/utils/keyCodes.js b/plugins/plugins/utils/keyCodes.js deleted file mode 100644 index d4d6ca50..00000000 --- a/plugins/plugins/utils/keyCodes.js +++ /dev/null @@ -1 +0,0 @@ -export const inputKeyCodes = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 160, 161, 162, 163, 164, 165, 170, 171, 186, 187, 188, 189, 190, 191, 192, 193, 194, 219, 220, 221, 222, 223, 226]; diff --git a/plugins/plugins/utils/loader.js b/plugins/plugins/utils/loader.js deleted file mode 100644 index 18123c3d..00000000 --- a/plugins/plugins/utils/loader.js +++ /dev/null @@ -1,52 +0,0 @@ -export class Loader { - constructor() { - this.loader = document.createElement("div"); - this.loader.className = "loader"; - this.loader.innerHTML = ` -
    - `; - this.styles = document.createElement("style"); - this.styles.innerHTML = ` - .loader { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000001 - } - - .loader-spinner { - border: 4px solid #f3f3f3; - border-top: 4px solid #3498db; - border-radius: 50%; - width: 32px; - height: 32px; - animation: spin 1s linear infinite; - } - - @keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } - } - `; - } - - show() { - document.head.appendChild(this.styles); - document.body.appendChild(this.loader); - } - - hide() { - if (this.loader.parentNode) { - this.loader.parentNode.removeChild(this.loader); - } - if (this.styles.parentNode) { - this.styles.parentNode.removeChild(this.styles); - } - } - } \ No newline at end of file diff --git a/plugins/plugins/utils/publish-image.js b/plugins/plugins/utils/publish-image.js deleted file mode 100644 index cc408a32..00000000 --- a/plugins/plugins/utils/publish-image.js +++ /dev/null @@ -1,248 +0,0 @@ -const getApiKey = () => { - const myNode = - window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ - window.parent.reduxStore.getState().app.nodeConfig.node - ] - return myNode.apiKey -} - -export const publishData = async ({ - registeredName, - path, - file, - service, - identifier, - parentEpml, - uploadType, - selectedAddress, - worker, - isBase64, - filename, - apiVersion, - withFee, - title, - description, - category, - tag1, - tag2, - tag3, - tag4, - tag5, - feeAmount -}) => { - const validateName = async (receiverName) => { - return await parentEpml.request("apiCall", { - type: "api", - url: `/names/${receiverName}`, - }) - } - - const convertBytesForSigning = async (transactionBytesBase58) => { - return await parentEpml.request("apiCall", { - type: "api", - method: "POST", - url: `/transactions/convert`, - body: `${transactionBytesBase58}`, - }) - } - const getArbitraryFee = async () => { - const timestamp = Date.now() - let fee = await parentEpml.request('apiCall', { - url: `/transactions/unitfee?txType=ARBITRARY×tamp=${timestamp}` - }) - return { - timestamp, - fee : Number(fee), - feeToShow: (Number(fee) / 1e8).toFixed(8) - } - } - - const signAndProcess = async (transactionBytesBase58) => { - let convertedBytesBase58 = await convertBytesForSigning( - transactionBytesBase58 - ) - if (convertedBytesBase58.error) { - throw new Error('Error when signing'); - } - - const convertedBytes = - window.parent.Base58.decode(convertedBytesBase58) - let nonce = null - const computPath =window.parent.location.origin + '/memory-pow/memory-pow.wasm.full' - await new Promise((res, rej) => { - - worker.postMessage({convertedBytes, path: computPath}); - - worker.onmessage = e => { - - worker.terminate() - - nonce = e.data.nonce - res() - - } - }) - - - let response = await parentEpml.request("sign_arbitrary", { - nonce: selectedAddress.nonce, - arbitraryBytesBase58: transactionBytesBase58, - arbitraryBytesForSigningBase58: convertedBytesBase58, - arbitraryNonce: nonce, - apiVersion: apiVersion ? apiVersion : null - }) - let myResponse = { error: "" } - if (response === false) { - throw new Error('Error when signing'); - } else { - myResponse = response - } - - return myResponse - } - - const signAndProcessWithFee = async (transactionBytesBase58) => { - let convertedBytesBase58 = await convertBytesForSigning( - transactionBytesBase58 - ) - if (convertedBytesBase58.error) { - throw new Error('Error when signing'); - } - - - - - let response = await parentEpml.request("sign_arbitrary_with_fee", { - nonce: selectedAddress.nonce, - arbitraryBytesBase58: transactionBytesBase58, - arbitraryBytesForSigningBase58: convertedBytesBase58, - apiVersion: apiVersion ? apiVersion : null - }) - let myResponse = { error: "" } - if (response === false) { - throw new Error('Error when signing'); - } else { - myResponse = response - } - - return myResponse - } - - const validate = async () => { - let validNameRes = await validateName(registeredName) - if (validNameRes.error) { - throw new Error('Name not found'); - } - let fee = null - if(withFee && feeAmount){ - fee= feeAmount - } else if(withFee){ - const res = await getArbitraryFee() - if(res.fee){ - fee= res.fee - } else { - throw new Error('unable to get fee') - } - } - let transactionBytes = await uploadData(registeredName, path, file, fee) - if (transactionBytes.error) { - throw new Error(transactionBytes.message || 'Error when uploading'); - } else if ( - transactionBytes.includes("Error 500 Internal Server Error") - ) { - throw new Error('Error when uploading'); - } - - let signAndProcessRes - if(withFee){ - signAndProcessRes = await signAndProcessWithFee(transactionBytes) - - } - if(!withFee){ - signAndProcessRes = await signAndProcess(transactionBytes) - - } - if (signAndProcessRes.error) { - throw new Error('Error when signing'); - } - return signAndProcessRes - } - - const uploadData = async (registeredName, path, file, fee) => { - if (identifier != null && identifier.trim().length > 0) { - let postBody = path - let urlSuffix = "" - if (file != null) { - // If we're sending zipped data, make sure to use the /zip version of the POST /arbitrary/* API - if (uploadType === "zip") { - urlSuffix = "/zip" - } - // If we're sending file data, use the /base64 version of the POST /arbitrary/* API - else if (uploadType === "file") { - urlSuffix = "/base64" - } - - // Base64 encode the file to work around compatibility issues between javascript and java byte arrays - if(isBase64){ - postBody = file - } - if(!isBase64){ - let fileBuffer = new Uint8Array(await file.arrayBuffer()) - postBody = Buffer.from(fileBuffer).toString("base64") - } - - } - - let uploadDataUrl = `/arbitrary/${service}/${registeredName}${urlSuffix}?apiKey=${getApiKey()}` - if (identifier.trim().length > 0) { - uploadDataUrl = `/arbitrary/${service}/${registeredName}/${identifier}${urlSuffix}?apiKey=${getApiKey()}` - - } - - if(withFee){ - uploadDataUrl = uploadDataUrl + `&fee=${fee}` - } - - if(filename != null && filename != "undefined"){ - uploadDataUrl = uploadDataUrl + '&filename=' + encodeURIComponent(filename) - } - if(title != null && title != "undefined"){ - uploadDataUrl = uploadDataUrl + '&title=' + encodeURIComponent(title) - } - if(description != null && description != "undefined"){ - uploadDataUrl = uploadDataUrl + '&description=' + encodeURIComponent(description) - } - if(category != null && category != "undefined"){ - uploadDataUrl = uploadDataUrl + '&category=' + encodeURIComponent(category) - } - if(tag1 != null && tag1 != "undefined"){ - uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag1) - } - if(tag2 != null && tag2 != "undefined"){ - uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag2) - } - if(tag3 != null && tag3 != "undefined"){ - uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag3) - } - if(tag4 != null && tag4 != "undefined"){ - uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag4) - } - if(tag5 != null && tag5 != "undefined"){ - uploadDataUrl = uploadDataUrl + '&tags=' + encodeURIComponent(tag5) - } - - return await parentEpml.request("apiCall", { - type: "api", - method: "POST", - url: `${uploadDataUrl}`, - body: `${postBody}`, - }) - } - } - try { - return await validate() - } catch (error) { - throw new Error(error.message) - } - -} diff --git a/plugins/plugins/utils/publish-modal.css b/plugins/plugins/utils/publish-modal.css deleted file mode 100644 index f5ded060..00000000 --- a/plugins/plugins/utils/publish-modal.css +++ /dev/null @@ -1,147 +0,0 @@ -.backdrop { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgb(186 186 186 / 26%); - overflow: hidden; - animation: backdrop_blur cubic-bezier(0.22, 1, 0.36, 1) 1s forwards; - z-index: 1000000; -} - -@keyframes backdrop_blur { - 0% { - backdrop-filter: blur(0px); - background: transparent; - } - 100% { - backdrop-filter: blur(5px); - background: rgb(186 186 186 / 26%); - } -} - -@keyframes modal_transition { - 0% { - visibility: hidden; - opacity: 0; -} - 100% { - visibility: visible; - opacity: 1; - } -} - -.modal { - position: relative; - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - animation: 1s cubic-bezier(0.22, 1, 0.36, 1) 0s 1 normal forwards running modal_transition; - z-index: 1000001; -} - -@keyframes modal_transition { - 0% { - visibility: hidden; - opacity: 0; - } - 100% { - visibility: visible; - opacity: 1; - } -} - -.modal-content { - background-color: var(--white); - border-radius: 10px; - 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-body { - padding: 25px; -} - -.modal-subcontainer { - color: var(--black); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 15px; -} - -.modal-subcontainer-error { - color: var(--black); - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; -} - -.modal-paragraph-error { - font-family: Roboto, sans-serif; - font-size: 20px; - letter-spacing: 0.3px; - font-weight: 700; - color: var(--black); - margin: 0; -} - -.modal-paragraph { - font-family: Roboto, sans-serif; - font-size: 18px; - letter-spacing: 0.3px; - font-weight: 300; - color: var(--black); - margin: 0; - word-wrap: break-word; - overflow-wrap: break-word; -} - -.capitalize-first { - text-transform: capitalize; -} - -.checkbox-row { - display: flex; - align-items: center; - font-family: Montserrat, sans-serif; - font-weight: 600; - color: var(--black); -} - -.modal-buttons { - display: flex; - justify-content: space-between; - margin-top: 20px; -} - -.modal-buttons button { - background-color: #4caf50; - border: none; - color: #fff; - padding: 10px 20px; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.2s; -} - -.modal-buttons button:hover { - background-color: #3e8e41; -} - -#cancel-button { - background-color: #f44336; -} - -#cancel-button:hover { - background-color: #d32f2f; -} \ No newline at end of file diff --git a/plugins/plugins/utils/publish-modal.js b/plugins/plugins/utils/publish-modal.js deleted file mode 100644 index 76c60f67..00000000 --- a/plugins/plugins/utils/publish-modal.js +++ /dev/null @@ -1,270 +0,0 @@ -import {get} from '../../../core/translate' - -export class ModalHelper { - constructor() { - this.initializeStyles(); - } - - async getArbitraryFee() { - const timestamp = Date.now(); - 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/unitfee?txType=ARBITRARY×tamp=${timestamp}`; - const response = await fetch(url); - - if (!response.ok) { - throw new Error('Error when fetching arbitrary fee'); - } - - const data = await response.json(); - const arbitraryFee = (Number(data) / 1e8).toFixed(8); - return { - timestamp, - fee: Number(data), - feeToShow: arbitraryFee - }; - } - - async showModalAndWaitPublish(data) { - return new Promise((resolve) => { - const modal = this.createModal(data); - document.body.appendChild(modal); - this.addModalEventListeners(modal, resolve); - }); - } - - createModal(data) { - const modal = document.createElement('div'); - modal.id = "backdrop"; - modal.classList.add("backdrop"); - modal.innerHTML = ` - - `; - return modal; - } - - addModalEventListeners(modal, resolve) { - // Event listener for the 'OK' button - const okButton = modal.querySelector('#ok-button'); - okButton.addEventListener('click', () => { - const userData = { isWithFee: true }; - if (modal.parentNode === document.body) { - document.body.removeChild(modal); - } - resolve({ action: 'accept', userData }); - }); - - // Prevent modal content from closing the modal - const modalContent = modal.querySelector('.modal-content'); - modalContent.addEventListener('click', e => { - e.stopPropagation(); - }); - - // Event listeners for backdrop and 'Cancel' button - const backdropClick = document.getElementById('backdrop'); - backdropClick.addEventListener('click', () => { - if (modal.parentNode === document.body) { - document.body.removeChild(modal); - } - resolve({ action: 'reject' }); - }); - - const cancelButton = modal.querySelector('#cancel-button'); - cancelButton.addEventListener('click', () => { - if (modal.parentNode === document.body) { - document.body.removeChild(modal); - } - resolve({ action: 'reject' }); - }); - } - - initializeStyles() { - const styles = ` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --paper-input-container-focus-color: var(--mdc-theme-primary); - --mdc-checkbox-unchecked-color: var(--black); - --mdc-theme-on-surface: var(--black); - --mdc-checkbox-disabled-color: var(--black); - --mdc-checkbox-ink-color: var(--black); - } - - .backdrop { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgb(186 186 186 / 26%); - overflow: hidden; - animation: backdrop_blur cubic-bezier(0.22, 1, 0.36, 1) 0.1s forwards; - z-index: 1000000; - } - - @keyframes backdrop_blur { - 0% { - backdrop-filter: blur(0px); - background: transparent; - } - 100% { - backdrop-filter: blur(5px); - background: rgb(186 186 186 / 26%); - } - } - - @keyframes modal_transition { - 0% { - visibility: hidden; - opacity: 0; - } - 100% { - visibility: visible; - opacity: 1; - } - } - - .modal { - position: relative; - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - animation: 0.1s cubic-bezier(0.22, 1, 0.36, 1) 0s 1 normal forwards running modal_transition; - z-index: 1000001; - } - - @keyframes modal_transition { - 0% { - visibility: hidden; - opacity: 0; - } - 100% { - visibility: visible; - opacity: 1; - } - } - - .modal-content { - background-color: var(--white); - border-radius: 10px; - 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-body { - padding: 25px; - } - - .modal-subcontainer { - color: var(--black); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 15px; - } - - .modal-subcontainer-error { - color: var(--black); - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; - } - - .modal-paragraph-error { - font-family: Roboto, sans-serif; - font-size: 20px; - letter-spacing: 0.3px; - font-weight: 700; - color: var(--black); - margin: 0; - } - - .modal-paragraph { - font-family: Roboto, sans-serif; - font-size: 18px; - letter-spacing: 0.3px; - font-weight: 300; - color: var(--black); - margin: 0; - word-wrap: break-word; - overflow-wrap: break-word; - } - - .capitalize-first { - text-transform: capitalize; - } - - .checkbox-row { - display: flex; - align-items: center; - font-family: Montserrat, sans-serif; - font-weight: 600; - color: var(--black); - } - - .modal-buttons { - display: flex; - justify-content: space-between; - margin-top: 20px; - } - - .modal-buttons button { - background-color: #4caf50; - border: none; - color: #fff; - padding: 10px 20px; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.2s; - } - - .modal-buttons button:hover { - background-color: #3e8e41; - } - - #cancel-button { - background-color: #f44336; - } - - #cancel-button:hover { - background-color: #d32f2f; - } - `; - - const styleSheet = new CSSStyleSheet(); - styleSheet.replaceSync(styles); - - document.adoptedStyleSheets = [styleSheet]; - } - - static getInstance() { - if (!ModalHelper.instance) { - ModalHelper.instance = new ModalHelper(); - } - return ModalHelper.instance; - } -} - -export const modalHelper = ModalHelper.getInstance(); diff --git a/plugins/plugins/utils/queue.js b/plugins/plugins/utils/queue.js deleted file mode 100644 index f4b9ff62..00000000 --- a/plugins/plugins/utils/queue.js +++ /dev/null @@ -1,71 +0,0 @@ -export class RequestQueue { - constructor(maxConcurrent = 5) { - this.queue = []; - this.maxConcurrent = maxConcurrent; - this.currentConcurrent = 0; - } - - push(request) { - return new Promise((resolve, reject) => { - this.queue.push({ - request, - resolve, - reject, - }); - this.checkQueue(); - }); - } - - checkQueue() { - if (this.queue.length === 0 || this.currentConcurrent >= this.maxConcurrent) return; - - const { request, resolve, reject } = this.queue.shift(); - this.currentConcurrent++; - - request() - .then(resolve) - .catch(reject) - .finally(() => { - this.currentConcurrent--; - this.checkQueue(); - }); - } -} - -export class RequestQueueWithPromise { - constructor(maxConcurrent = 5) { - this.queue = []; - this.maxConcurrent = maxConcurrent; - this.currentlyProcessing = 0; - } - - // Add a request to the queue and return a promise - enqueue(request) { - return new Promise((resolve, reject) => { - // Push the request and its resolve and reject callbacks to the queue - this.queue.push({ request, resolve, reject }); - this.process(); - }); - } - - // Process requests in the queue - async process() { - while (this.queue.length > 0 && this.currentlyProcessing < this.maxConcurrent) { - this.currentlyProcessing++; - const { request, resolve, reject } = this.queue.shift(); - try { - const response = await request(); - resolve(response); - } catch (error) { - reject(error); - } finally { - this.currentlyProcessing--; - await this.process(); - } - } - } - } - - - - diff --git a/plugins/plugins/utils/replace-messages-edited.js b/plugins/plugins/utils/replace-messages-edited.js deleted file mode 100644 index 129a4a8b..00000000 --- a/plugins/plugins/utils/replace-messages-edited.js +++ /dev/null @@ -1,251 +0,0 @@ -// export const replaceMessagesEdited = async ({ -// decodedMessages, -// parentEpml, -// isReceipient, -// decodeMessageFunc, -// _publicKey, -// addToUpdateMessageHashmap -// }) => { -// const findNewMessages = decodedMessages.map(async (msg) => { -// let msgItem = null -// try { -// let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` -// if (!isReceipient) { -// msgQuery = `&txGroupId=${msg.txGroupId}` -// } -// const response = await parentEpml.request("apiCall", { -// type: "api", -// url: `/chat/messages?chatreference=${msg.signature}&reverse=true${msgQuery}&limit=1&sender=${msg.sender}&encoding=BASE64`, -// }) - -// if (response && Array.isArray(response) && response.length !== 0) { -// let responseItem = { ...response[0] } -// const decodeResponseItem = decodeMessageFunc(responseItem, isReceipient, _publicKey) -// delete decodeResponseItem.timestamp - -// msgItem = { -// ...msg, -// ...decodeResponseItem, -// senderName: msg.senderName, -// sender: msg.sender, -// editedTimestamp: response[0].timestamp, -// originalSignature: msg.signature -// } -// } -// } catch (error) { -// } - -// return msgItem -// }) -// const updateMessages = await Promise.all(findNewMessages) -// const filterOutNull = updateMessages.filter((item)=> item !== 'null' && item !== null) - -// const findNewMessages2 = filterOutNull.map(async (msg) => { -// let parsedMessageObj = msg -// try { -// parsedMessageObj = JSON.parse(msg.decodedMessage) -// } catch (error) { -// return msg -// } -// let msgItem = msg -// try { -// let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` -// if (!isReceipient) { -// msgQuery = `&txGroupId=${msg.txGroupId}` -// } -// if (parsedMessageObj.repliedTo) { -// let originalReply -// if(+parsedMessageObj.version > 2){ -// originalReply = await parentEpml.request("apiCall", { -// type: "api", -// url: `/chat/message/${parsedMessageObj.repliedTo}?encoding=BASE64`, -// }) -// } -// if(+parsedMessageObj.version < 3){ -// originalReply = await parentEpml.request("apiCall", { -// type: "api", -// url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}&encoding=BASE64`, -// }) -// } - - - - -// const originalReplyMessage = originalReply.timestamp ? originalReply : originalReply.length !== 0 ? originalReply[0] : null - -// const response = await parentEpml.request("apiCall", { -// type: "api", -// url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}&limit=1&sender=${originalReplyMessage.sender}&encoding=BASE64`, -// }) - -// if ( -// originalReplyMessage && -// response && -// Array.isArray(response) && -// response.length !== 0 -// ) { -// const decodeOriginalReply = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey) - -// const decodeUpdatedReply = decodeMessageFunc(response[0], isReceipient, _publicKey) -// const formattedRepliedToData = { -// ...decodeUpdatedReply, -// senderName: decodeOriginalReply.senderName, -// sender: decodeOriginalReply.sender, -// } -// msgItem = { -// ...msg, -// repliedToData: formattedRepliedToData, -// } -// } else { - - -// if ( -// originalReplyMessage -// ) { - -// msgItem = { -// ...msg, -// repliedToData: decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey), -// } -// } -// } -// } -// } catch (error) { -// } - -// return msgItem -// }) -// const updateMessages2 = await Promise.all(findNewMessages2) -// console.log({updateMessages2}) -// updateMessages2.forEach((item)=> { -// addToUpdateMessageHashmap(item.originalSignature, item) -// }) -// return updateMessages2 -// } - - -export const replaceMessagesEdited = async ({ - decodedMessages, - parentEpml, - isReceipient, - decodeMessageFunc, - _publicKey, - addToUpdateMessageHashmap -}) => { - const MAX_CONCURRENT_REQUESTS = 5; // Maximum number of concurrent requests - - const executeWithConcurrencyLimit = async (array, asyncFn) => { - const results = []; - const concurrencyPool = []; - - for (const item of array) { - const promise = asyncFn(item); - concurrencyPool.push(promise); - - if (concurrencyPool.length >= MAX_CONCURRENT_REQUESTS) { - results.push(...await Promise.all(concurrencyPool)); - concurrencyPool.length = 0; // Clear the concurrency pool - } - } - - if (concurrencyPool.length > 0) { - results.push(...await Promise.all(concurrencyPool)); - } - - return results; - }; - - const findUpdatedMessage = async (msg) => { - let msgItem = { ...msg }; - - try { - let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}`; - if (!isReceipient) { - msgQuery = `&txGroupId=${msg.txGroupId}`; - } - - // Find new messages first - const newMsgResponse = await parentEpml.request("apiCall", { - type: "api", - url: `/chat/messages?chatreference=${msg.signature}&reverse=true${msgQuery}&limit=1&sender=${msg.sender}&encoding=BASE64`, - }); - - if (Array.isArray(newMsgResponse) && newMsgResponse.length > 0) { - const decodeResponseItem = decodeMessageFunc(newMsgResponse[0], isReceipient, _publicKey); - delete decodeResponseItem.timestamp; - - msgItem = { - ...msgItem, - ...decodeResponseItem, - senderName: msg.senderName, - sender: msg.sender, - editedTimestamp: newMsgResponse[0].timestamp, - originalSignature: msg.signature - }; - } - - // Then check and find replies in the same iteration - let parsedMessageObj; - try { - parsedMessageObj = JSON.parse(msg.decodedMessage); - } catch (error) { - // If parsing fails, return the msgItem as is - return msgItem; - } - - if (parsedMessageObj.repliedTo) { - let originalReply; - if(+parsedMessageObj.version > 2){ - originalReply = await parentEpml.request("apiCall", { - type: "api", - url: `/chat/message/${parsedMessageObj.repliedTo}?encoding=BASE64`, - }); - } else { - originalReply = await parentEpml.request("apiCall", { - type: "api", - url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}&encoding=BASE64`, - }); - } - - const originalReplyMessage = originalReply.timestamp ? originalReply : originalReply.length > 0 ? originalReply[0] : null; - - const replyResponse = await parentEpml.request("apiCall", { - type: "api", - url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}&limit=1&sender=${originalReplyMessage.sender}&encoding=BASE64`, - }); - - if ( - originalReplyMessage && - Array.isArray(replyResponse) && - replyResponse.length !== 0 - ) { - const decodeOriginalReply = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey); - const decodeUpdatedReply = decodeMessageFunc(replyResponse[0], isReceipient, _publicKey); - - msgItem.repliedToData = { - ...decodeUpdatedReply, - senderName: decodeOriginalReply.senderName, - sender: decodeOriginalReply.sender, - }; - } else if (originalReplyMessage) { - msgItem.repliedToData = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey); - } - } - - } catch (error) { - // Handle or log the error gracefully - console.error(error); - } - - return msgItem; - }; - - const sortedMessages = decodedMessages.sort((a, b) => b.timestamp - a.timestamp); - - // Execute the functions with concurrency limit - const updatedMessages = await executeWithConcurrencyLimit(sortedMessages, findUpdatedMessage); - addToUpdateMessageHashmap(updatedMessages); - - return updatedMessages; - -}; diff --git a/plugins/plugins/utils/roundToNearestDecimal.js b/plugins/plugins/utils/roundToNearestDecimal.js deleted file mode 100644 index 5e3fe0aa..00000000 --- a/plugins/plugins/utils/roundToNearestDecimal.js +++ /dev/null @@ -1,4 +0,0 @@ -export function roundToNearestDecimal(num) { - const mb = num / 1000000; - return Math.round(mb * 10) / 10; -} \ No newline at end of file diff --git a/plugins/plugins/utils/warning-modal.js b/plugins/plugins/utils/warning-modal.js deleted file mode 100644 index 0399591f..00000000 --- a/plugins/plugins/utils/warning-modal.js +++ /dev/null @@ -1,252 +0,0 @@ -import {get} from '../../../core/translate' - -export class WarningModal { - constructor() { - this.initializeStyles(); - } - - - async showModalAndWaitPublish(data) { - return new Promise((resolve) => { - const modal = this.createModal(data); - document.body.appendChild(modal); - this.addModalEventListeners(modal, resolve); - }); - } - - createModal(data) { - const modal = document.createElement('div'); - modal.id = "backdrop"; - modal.classList.add("backdrop"); - modal.innerHTML = ` - - `; - return modal; - } - - addModalEventListeners(modal, resolve) { - // Event listener for the 'OK' button - const okButton = modal.querySelector('#ok-button'); - okButton.addEventListener('click', () => { - const userData = { isWithFee: true }; - if (modal.parentNode === document.body) { - document.body.removeChild(modal); - } - resolve({ action: 'accept', userData }); - }); - - // Prevent modal content from closing the modal - const modalContent = modal.querySelector('.modal-content'); - modalContent.addEventListener('click', e => { - e.stopPropagation(); - }); - - // Event listeners for backdrop and 'Cancel' button - const backdropClick = document.getElementById('backdrop'); - backdropClick.addEventListener('click', () => { - if (modal.parentNode === document.body) { - document.body.removeChild(modal); - } - resolve({ action: 'reject' }); - }); - - const cancelButton = modal.querySelector('#cancel-button'); - cancelButton.addEventListener('click', () => { - if (modal.parentNode === document.body) { - document.body.removeChild(modal); - } - resolve({ action: 'reject' }); - }); - } - - initializeStyles() { - const styles = ` - * { - --mdc-theme-primary: rgb(3, 169, 244); - --mdc-theme-secondary: var(--mdc-theme-primary); - --paper-input-container-focus-color: var(--mdc-theme-primary); - --mdc-checkbox-unchecked-color: var(--black); - --mdc-theme-on-surface: var(--black); - --mdc-checkbox-disabled-color: var(--black); - --mdc-checkbox-ink-color: var(--black); - } - - .backdrop { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgb(186 186 186 / 26%); - overflow: hidden; - animation: backdrop_blur cubic-bezier(0.22, 1, 0.36, 1) 0.1s forwards; - z-index: 1000000; - } - - @keyframes backdrop_blur { - 0% { - backdrop-filter: blur(0px); - background: transparent; - } - 100% { - backdrop-filter: blur(5px); - background: rgb(186 186 186 / 26%); - } - } - - @keyframes modal_transition { - 0% { - visibility: hidden; - opacity: 0; - } - 100% { - visibility: visible; - opacity: 1; - } - } - - .modal { - position: relative; - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - animation: 0.1s cubic-bezier(0.22, 1, 0.36, 1) 0s 1 normal forwards running modal_transition; - z-index: 1000001; - } - - @keyframes modal_transition { - 0% { - visibility: hidden; - opacity: 0; - } - 100% { - visibility: visible; - opacity: 1; - } - } - - .modal-content { - background-color: var(--white); - border-radius: 10px; - padding: 20px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - max-width: 650px; - min-width: 300px; - display: flex; - flex-direction: column; - justify-content: space-between; - } - - .modal-body { - padding: 25px; - } - - .modal-subcontainer { - color: var(--black); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 15px; - } - - .modal-subcontainer-error { - color: var(--black); - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; - } - - .modal-paragraph-error { - font-family: Roboto, sans-serif; - font-size: 20px; - letter-spacing: 0.3px; - font-weight: 700; - color: var(--black); - margin: 0; - } - - .modal-paragraph { - font-family: Roboto, sans-serif; - font-size: 18px; - letter-spacing: 0.3px; - font-weight: 300; - color: var(--black); - margin: 0; - word-wrap: break-word; - overflow-wrap: break-word; - } - - .capitalize-first { - text-transform: capitalize; - } - - .checkbox-row { - display: flex; - align-items: center; - font-family: Montserrat, sans-serif; - font-weight: 600; - color: var(--black); - } - - .modal-buttons { - display: flex; - justify-content: space-between; - margin-top: 20px; - } - - .modal-buttons button { - background-color: #4caf50; - border: none; - color: #fff; - padding: 10px 20px; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.2s; - } - - .modal-buttons button:hover { - background-color: #3e8e41; - } - - #cancel-button { - background-color: #f44336; - } - - #cancel-button:hover { - background-color: #d32f2f; - } - `; - - const styleSheet = new CSSStyleSheet(); - styleSheet.replaceSync(styles); - - document.adoptedStyleSheets = [styleSheet]; - } - - - static getInstance() { - if (!WarningModal.instance) { - WarningModal.instance = new WarningModal(); - } - return WarningModal.instance; - } -} - -export const warningModal = WarningModal.getInstance(); diff --git a/plugins/watch.js b/plugins/watch.js index e42b9195..f6bb3998 100644 --- a/plugins/watch.js +++ b/plugins/watch.js @@ -1,5 +1,4 @@ const rollup = require('rollup') - const configs = require('./build-config.js')() const watch = () => { @@ -19,4 +18,4 @@ const watch = () => { console.log('WATCH PLUGINS ==> Write Bundle : Done 🎉') } -module.exports = watch +module.exports = watch \ No newline at end of file diff --git a/scripts/afterPack.js b/scripts/afterPack.js index 73bda2a0..f7084bd8 100644 --- a/scripts/afterPack.js +++ b/scripts/afterPack.js @@ -1,45 +1,39 @@ const path = require('path') -const shell = require("shelljs"); +const shell = require("shelljs") const runShellCommand = (appOutDir) => { + shell.exec( + `chmod 4755 ${path.join(appOutDir, "chrome-sandbox")}`, - shell.exec( - `chmod 4755 ${path.join(appOutDir, "chrome-sandbox")}`, - - function (code, stdout, stderr) { - console.log('runShellCommand ==> Exit code:', code); - if (stderr) { - console.log('runShellCommand ==> Program stderr:', stderr); - } - }); + function (code, stdout, stderr) { + console.log('runShellCommand ==> Exit code:', code) + if (stderr) { + console.log('runShellCommand ==> Program stderr:', stderr) + } + } + ) } async function doLinux(context) { + console.log("Running doLinux ==> ") - console.log("Running doLinux ==> "); + const { targets, appOutDir } = context - const { targets, appOutDir } = context - - targets.forEach(async target => { - - if (!["appimage", "snap"].includes(target.name.toLowerCase())) { - - await runShellCommand(appOutDir) - } - }); + targets.forEach(async target => { + if (!["appimage", "snap"].includes(target.name.toLowerCase())) { + await runShellCommand(appOutDir) + } + }) } async function afterPack(context) { + console.log("Running AfterPack") - console.log("Running AfterPack"); - - const electronPlatformName = context.electronPlatformName.toLowerCase(); - - if (electronPlatformName.includes("linux")) { - await doLinux(context); - - } + const electronPlatformName = context.electronPlatformName.toLowerCase() + if (electronPlatformName.includes("linux")) { + await doLinux(context) + } } -module.exports = afterPack +module.exports = afterPack \ No newline at end of file diff --git a/scripts/notarize.js b/scripts/notarize.js index f4541f5c..81a8f6c2 100644 --- a/scripts/notarize.js +++ b/scripts/notarize.js @@ -1,20 +1,21 @@ -require('dotenv').config(); -const { notarize } = require('@electron/notarize'); +require('dotenv').config() +const { notarize } = require('@electron/notarize') exports.default = async function notarizing(context) { - const { electronPlatformName, appOutDir } = context; - if (electronPlatformName !== 'darwin') { - return; - } + const { electronPlatformName, appOutDir } = context - const appName = context.packager.appInfo.productFilename; + if (electronPlatformName !== 'darwin') { + return + } - return await notarize({ - appBundleId: 'org.qortal.QortalUI', - appPath: `${appOutDir}/${appName}.app`, - tool: "notarytool", - teamId: process.env.APPLETEAMID, - appleId: process.env.APPLEID, - appleIdPassword: process.env.APPLEIDPASS, - }); -}; + const appName = context.packager.appInfo.productFilename + + return await notarize({ + appBundleId: 'org.qortal.QortalUI', + appPath: `${appOutDir}/${appName}.app`, + tool: "notarytool", + teamId: process.env.APPLETEAMID, + appleId: process.env.APPLEID, + appleIdPassword: process.env.APPLEIDPASS + }) +} \ No newline at end of file diff --git a/server.js b/server.js index c53090f3..fad65218 100644 --- a/server.js +++ b/server.js @@ -1,30 +1,24 @@ const path = require("path") - const uiCore = require('./core/ui-core.js') const createServer = uiCore('server') - const config = require('./config/config.js') - const pluginsController = require('./plugins/default-plugins.js') + const qortalPlugins = pluginsController('plugins') - -const plugins = [ - ...qortalPlugins -] - +const plugins = [...qortalPlugins] const rootDir = process.env.NODE_ENV === 'production' ? __dirname : __dirname - const conf = { - ...config, - build: { - ...config.build, - options: { - ...config.build.options, - outputDir: path.join(rootDir, '/builtWWW') - } - } + ...config, + build: { + ...config.build, + options: { + ...config.build.options, + outputDir: path.join(rootDir, '/builtWWW') + } + } } const server = createServer(conf, plugins) -server.start() + +server.start() \ No newline at end of file diff --git a/watch-inline.js b/watch-inline.js index e14bbe91..8a870f84 100644 --- a/watch-inline.js +++ b/watch-inline.js @@ -1,25 +1,24 @@ const path = require('path') const uiCore = require('./core/ui-core.js') +const config = require('./config/config.js') +const pluginsController = require('./plugins/default-plugins.js') + const generateBuildConfig = uiCore('generate_build_config') const watchInlines = uiCore('watch_inline') -const config = require('./config/config.js') - -const pluginsController = require('./plugins/default-plugins.js') const watchDefaultPlugins = pluginsController('watch') - let srcConfig = { - ...config.build, - options: { - ...config.build.options, - outputDir: path.join(__dirname, '/builtWWW'), - sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css'), - } + ...config.build, + options: { + ...config.build.options, + outputDir: path.join(__dirname, '/builtWWW'), + sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css') + } } const { inlineConfigs } = generateBuildConfig(srcConfig) module.exports = () => { - watchInlines(inlineConfigs) - watchDefaultPlugins() -} + watchInlines(inlineConfigs) + watchDefaultPlugins() +} \ No newline at end of file diff --git a/watch.js b/watch.js index 3116d7ea..dfd8a096 100644 --- a/watch.js +++ b/watch.js @@ -3,23 +3,22 @@ const uiCore = require('./core/ui-core.js') const generateBuildConfig = uiCore('generate_build_config') const watch = uiCore('watch') const config = require('./config/config.js') - const pluginsController = require('./plugins/default-plugins.js') -const watchPlugins = pluginsController('watch') - const watchInline = require('./watch-inline.js') +const watchPlugins = pluginsController('watch') + let srcConfig = { - ...config.build, - options: { - ...config.build.options, - outputDir: path.join(__dirname, '/builtWWW'), - sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css'), - } + ...config.build, + options: { + ...config.build.options, + outputDir: path.join(__dirname, '/builtWWW'), + sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css') + } } const { buildConfig, inlineConfigs } = generateBuildConfig(srcConfig) watch(buildConfig.options, buildConfig.outputs, buildConfig.outputOptions, buildConfig.inputOptions) watchInline() -watchPlugins() +watchPlugins() \ No newline at end of file From a66d945ed41b7d85b16c07211f14ef897f8311d6 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 8 May 2024 13:21:29 +0200 Subject: [PATCH 06/29] Add missing files become-minter --- .../core/become-minter/not-sponsored.js | 144 ++++++++++++++++++ .../core/become-minter/yes-sponsored.js | 125 +++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 plugins/plugins/core/become-minter/not-sponsored.js create mode 100644 plugins/plugins/core/become-minter/yes-sponsored.js diff --git a/plugins/plugins/core/become-minter/not-sponsored.js b/plugins/plugins/core/become-minter/not-sponsored.js new file mode 100644 index 00000000..2199eef0 --- /dev/null +++ b/plugins/plugins/core/become-minter/not-sponsored.js @@ -0,0 +1,144 @@ +import { html, LitElement } from 'lit' +import { Epml } from '../../../epml' +import { becomeMinterStyles } from '../components/plugins-css' +import '../components/ButtonIconCopy' +import '@material/mwc-button' +import '@material/mwc-textfield' +import '@polymer/paper-spinner/paper-spinner-lite.js' +import '@vaadin/button' + +// Multi language support +import { translate } from '../../../../core/translate' + +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 get styles() { + return [becomeMinterStyles] + } + + constructor() { + super() + this.isLoadingSponsorshipKeySubmit = false + this.sponsorshipKeyValue = '' + this.addMintingAccountMessage = '' + this.atMount = () => {} + } + + render() { + return html` +
    +
    +

    + ${translate('mintingpage.mchange33')} +

    +

    + ${translate('mintingpage.mchange34')} +

    +

    + ${translate('mintingpage.mchange35')} +

    +

    + ${translate('mintingpage.mchange36')} +

    +

    + ${translate('mintingpage.mchange37')} +

    +

    ${this.addMintingAccountMessage}

    +
    +
    + + +
    +
    + + ${this.isLoadingSponsorshipKeySubmit === false ? + html` + ${translate('puzzlepage.pchange15')} + ` + : html` + + ` + } + +
    +
    +
    +
    + ` + } + + firstUpdated() { + // ... + } + + renderErr1Text() { + return html`${translate('nodepage.nchange27')}` + } + + renderErr2Text() { + return html`${translate('nodepage.nchange28')}` + } + + 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 + } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } +} + +window.customElements.define('not-sponsored', NotSponsored) diff --git a/plugins/plugins/core/become-minter/yes-sponsored.js b/plugins/plugins/core/become-minter/yes-sponsored.js new file mode 100644 index 00000000..44179592 --- /dev/null +++ b/plugins/plugins/core/become-minter/yes-sponsored.js @@ -0,0 +1,125 @@ +import { html, LitElement } from 'lit' +import { blocksNeed } from '../../utils/functions' +import { becomeMinterStyles } from '../components/plugins-css' +import '../components/ButtonIconCopy' +import '@material/mwc-button' +import '@material/mwc-textfield' +import '@polymer/paper-spinner/paper-spinner-lite.js' +import '@vaadin/button' + +// Multi language support +import { translate } from '../../../../core/translate' + +class YesSponsored extends LitElement { + static get properties() { + return { + addressInfo: { type: Object }, + rewardSharePublicKey: { type: String }, + isMinting: {type: Boolean} + } + } + + static get styles() { + return [becomeMinterStyles] + } + + constructor() { + super() + this.addressInfo = {} + this.rewardSharePublicKey = '' + this.isMinting = false + } + + render() { + return html` +
    +
    +
    + + ${translate('becomeMinterPage.bchange10')} + +
    +
    +
    +
    +
    + + ${translate('walletpage.wchange41')} + +
    + ${this.isMinting ? html` +

    ${translate('becomeMinterPage.bchange12')}

    + ` : html` +

    ${translate('mintingpage.mchange9')}

    + `} +
    +
    +
    +
    + + ${translate('becomeMinterPage.bchange13')} + +
    +

    + ${this._levelUpBlocks()} + ${translate('mintingpage.mchange26')} +

    +
    +
    +
    +
    + + ${translate('becomeMinterPage.bchange15')} + +
    +

    + ${translate('becomeMinterPage.bchange16')} +

    +
    +

    + ${this.rewardSharePublicKey} +

    + + +
    +
    +
    +
    +
    + ` + } + + firstUpdated() { + // ... + } + + _levelUpBlocks() { + return (blocksNeed(0) - (this.addressInfo?.blocksMinted + this.addressInfo?.blocksMintedAdjustment)).toString() + } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } +} + +window.customElements.define('yes-sponsored', YesSponsored) From 3b4581a448a1ed104ba21348ff54ad8b0bc3a517 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 8 May 2024 13:23:07 +0200 Subject: [PATCH 07/29] Add missing file q-chat --- .../plugins/core/q-chat/computePowWorker.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 plugins/plugins/core/q-chat/computePowWorker.js diff --git a/plugins/plugins/core/q-chat/computePowWorker.js b/plugins/plugins/core/q-chat/computePowWorker.js new file mode 100644 index 00000000..0e260f6b --- /dev/null +++ b/plugins/plugins/core/q-chat/computePowWorker.js @@ -0,0 +1,53 @@ +import { Sha256 } from 'asmcrypto.js' + +function sbrk(size, heap) { + let brk = 512 * 1024 // stack top + let old = brk + brk += size + if (brk > heap.length) throw new Error('heap exhausted') + return old +} + +self.addEventListener('message', async e => { + const response = await computePow(e.data.chatBytes, e.data.path, e.data.difficulty) + postMessage(response) +}) + +const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }) +const heap = new Uint8Array(memory.buffer) + +const computePow = async (chatBytes, path, difficulty) => { + let response = null + await new Promise((resolve, reject) => { + const _chatBytesArray = Object.keys(chatBytes).map(function (key) { + return chatBytes[key] + }) + const chatBytesArray = new Uint8Array(_chatBytesArray) + const chatBytesHash = new Sha256().process(chatBytesArray).finish().result + const hashPtr = sbrk(32, heap) + const hashAry = new Uint8Array(memory.buffer, hashPtr, 32) + hashAry.set(chatBytesHash) + const workBufferLength = 8 * 1024 * 1024 + const workBufferPtr = sbrk(workBufferLength, heap) + const importObject = { + env: { + memory: memory + } + } + function loadWebAssembly(filename, imports) { + // Fetch the file and compile it + return fetch(filename).then(response => response.arrayBuffer()).then(buffer => WebAssembly.compile(buffer)).then(module => { + // Create the instance. + return new WebAssembly.Instance(module, importObject) + }) + } + loadWebAssembly(path) + .then(wasmModule => { + response = { + nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), chatBytesArray + } + resolve() + }) + }) + return response +} \ No newline at end of file From db93f510834f97bf9031156613927d53209e362f Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 8 May 2024 13:24:06 +0200 Subject: [PATCH 08/29] Add missing files browser --- .../core/qdn/browser/computePowWorker.js | 54 +++++++++++++++ .../core/qdn/browser/computePowWorkerFile.js | 65 +++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 plugins/plugins/core/qdn/browser/computePowWorker.js create mode 100644 plugins/plugins/core/qdn/browser/computePowWorkerFile.js diff --git a/plugins/plugins/core/qdn/browser/computePowWorker.js b/plugins/plugins/core/qdn/browser/computePowWorker.js new file mode 100644 index 00000000..d2ee3ab2 --- /dev/null +++ b/plugins/plugins/core/qdn/browser/computePowWorker.js @@ -0,0 +1,54 @@ +import { Sha256 } from 'asmcrypto.js' + +function sbrk(size, heap) { + let brk = 512 * 1024 // stack top + let old = brk + brk += size + if (brk > heap.length) throw new Error('heap exhausted') + return old +} + +self.addEventListener('message', async e => { + const response = await computePow(e.data.chatBytes, e.data.path, e.data.difficulty) + postMessage(response) +}) + +const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }) +const heap = new Uint8Array(memory.buffer) + +const computePow = async (chatBytes, path, difficulty) => { + let response = null + await new Promise((resolve, reject) => { + const _chatBytesArray = Object.keys(chatBytes).map(function (key) { return chatBytes[key]; }) + const chatBytesArray = new Uint8Array(_chatBytesArray) + const chatBytesHash = new Sha256().process(chatBytesArray).finish().result + const hashPtr = sbrk(32, heap); + const hashAry = new Uint8Array(memory.buffer, hashPtr, 32) + hashAry.set(chatBytesHash) + const workBufferLength = 8 * 1024 * 1024 + const workBufferPtr = sbrk(workBufferLength, heap) + const importObject = { + env: { + memory: memory + } + } + function loadWebAssembly(filename, imports) { + // Fetch the file and compile it + return fetch(filename) + .then(response => response.arrayBuffer()) + .then(buffer => WebAssembly.compile(buffer)) + .then(module => { + // Create the instance. + return new WebAssembly.Instance(module, importObject) + }) + } + loadWebAssembly(path).then(wasmModule => { + response = { + nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), + chatBytesArray + } + resolve() + }) + }) + return response +} \ No newline at end of file diff --git a/plugins/plugins/core/qdn/browser/computePowWorkerFile.js b/plugins/plugins/core/qdn/browser/computePowWorkerFile.js new file mode 100644 index 00000000..c20c9d4b --- /dev/null +++ b/plugins/plugins/core/qdn/browser/computePowWorkerFile.js @@ -0,0 +1,65 @@ +import { Sha256 } from 'asmcrypto.js' + +function sbrk(size, heap) { + let brk = 512 * 1024 // stack top + let old = brk + brk += size + if (brk > heap.length) throw new Error('heap exhausted') + return old +} + +self.addEventListener('message', async e => { + const response = await computePow(e.data.convertedBytes, e.data.path) + postMessage(response) +}) + +const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }) +const heap = new Uint8Array(memory.buffer) + +const computePow = async (convertedBytes, path) => { + let response = null + await new Promise((resolve, reject) => { + const _convertedBytesArray = Object.keys(convertedBytes).map( + function (key) { + return convertedBytes[key] + } + ) + const convertedBytesArray = new Uint8Array(_convertedBytesArray) + const convertedBytesHash = new Sha256() + .process(convertedBytesArray) + .finish().result + const hashPtr = sbrk(32, heap) + const hashAry = new Uint8Array( + memory.buffer, + hashPtr, + 32 + ) + hashAry.set(convertedBytesHash) + const difficulty = 14 + const workBufferLength = 8 * 1024 * 1024 + const workBufferPtr = sbrk( + workBufferLength, + heap + ) + const importObject = { + env: { + memory: memory + } + } + function loadWebAssembly(filename, imports) { + return fetch(filename) + .then(response => response.arrayBuffer()) + .then(buffer => WebAssembly.compile(buffer)) + .then(module => { + return new WebAssembly.Instance(module, importObject) + }) + } + loadWebAssembly(path).then(wasmModule => { + response = { + nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty), + } + resolve() + }) + }) + return response +} \ No newline at end of file From 1383022cd6abfea69700b6746dc41dfd34f82417 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 8 May 2024 14:11:48 +0200 Subject: [PATCH 09/29] Update dependencies --- package-lock.json | 558 ++++++++++++++++++---------------------------- package.json | 14 +- 2 files changed, 230 insertions(+), 342 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f938fc1..792fc709 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,9 +27,9 @@ "compressorjs": "1.2.1", "crypto-js": "4.2.0", "driver.js": "1.3.1", - "electron-dl": "4.0.0", + "electron-dl": "3.5.2", "electron-log": "5.1.2", - "electron-store": "9.0.0", + "electron-store": "8.2.0", "electron-updater": "6.1.8", "emoji-picker-js": "https://github.com/Qortal/emoji-picker-js", "extract-zip": "2.0.1", @@ -42,12 +42,12 @@ "prosemirror-gapcursor": "1.3.2", "prosemirror-history": "1.4.0", "prosemirror-keymap": "1.2.2", - "prosemirror-model": "1.20.0", + "prosemirror-model": "1.21.0", "prosemirror-schema-list": "1.3.0", "prosemirror-state": "1.4.3", - "prosemirror-transform": "1.8.0", + "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.6", - "sass": "1.76.0", + "sass": "1.77.0", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, @@ -102,13 +102,13 @@ "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", "@vaadin/tooltip": "24.2.9", - "@zip.js/zip.js": "2.7.43", + "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", "electron": "30.0.2", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", - "eslint-plugin-lit": "1.11.0", + "eslint-plugin-lit": "1.12.0", "eslint-plugin-wc": "2.0.4", "file-saver": "2.0.5", "highcharts": "11.1.0", @@ -618,26 +618,11 @@ "url": "https://github.com/electron/packager?sponsor=1" } }, - "node_modules/@electron/packager/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@electron/packager/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -645,12 +630,6 @@ "node": ">=10" } }, - "node_modules/@electron/packager/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@electron/universal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", @@ -3712,9 +3691,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "devOptional": true, "dependencies": { "undici-types": "~5.26.4" @@ -4020,9 +3999,9 @@ } }, "node_modules/@vaadin/vaadin-development-mode-detector": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.6.tgz", - "integrity": "sha512-N6a5nLT/ytEUlpPo+nvdCKIGoyNjPsj3rzPGvGYK8x9Ceg76OTe1xI/GtN71mRW9e2HUScR0kCNOkl1Z63YDjw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", + "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==", "dev": true }, "node_modules/@vaadin/vaadin-lumo-styles": { @@ -4087,9 +4066,9 @@ } }, "node_modules/@zip.js/zip.js": { - "version": "2.7.43", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.43.tgz", - "integrity": "sha512-kW7elA/Q1o5xusStfZeysCvheD1SvW3TWDfqTCmoWW4ALBSqKonZSTrQgdEGOUec2U/TLMSGq0SuSMTAxy4gFg==", + "version": "2.7.44", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.44.tgz", + "integrity": "sha512-ZzMhAcAyRAYi1FZELsvKaw8I4ADxNTqbiVIjyo/syBe4HGWop9+OADnuBnHpm2TxgXPogxxhhPffOhDD40jUdA==", "dev": true, "engines": { "bun": ">=0.7.0", @@ -4455,18 +4434,6 @@ "url": "https://github.com/sponsors/gjtorikian/" } }, - "node_modules/app-builder-lib/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/app-builder-lib/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -4489,13 +4456,10 @@ } }, "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -4503,12 +4467,6 @@ "node": ">=10" } }, - "node_modules/app-builder-lib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/archiver": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", @@ -4644,12 +4602,11 @@ } }, "node_modules/atomically": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", - "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", - "dependencies": { - "stubborn-fs": "^1.2.5", - "when-exit": "^2.1.1" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "engines": { + "node": ">=10.12.0" } }, "node_modules/author-regex": { @@ -5061,9 +5018,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001615", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz", - "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==", + "version": "1.0.30001616", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", + "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", "dev": true, "funding": [ { @@ -5284,22 +5241,23 @@ "dev": true }, "node_modules/conf": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-12.0.0.tgz", - "integrity": "sha512-fIWyWUXrJ45cHCIQX+Ck1hrZDIf/9DR0P0Zewn3uNht28hbt5OfGUq8rRWsxi96pZWPyBEd0eY9ama01JTaknA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", "dependencies": { - "ajv": "^8.12.0", + "ajv": "^8.6.3", "ajv-formats": "^2.1.1", - "atomically": "^2.0.2", - "debounce-fn": "^5.1.2", - "dot-prop": "^8.0.2", - "env-paths": "^3.0.0", - "json-schema-typed": "^8.0.1", - "semver": "^7.5.4", - "uint8array-extras": "^0.3.0" + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5320,40 +5278,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/conf/node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/conf/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/conf/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/conf/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "bin": { "semver": "bin/semver.js" }, @@ -5361,11 +5294,6 @@ "node": ">=10" } }, - "node_modules/conf/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/config-file-ts": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", @@ -5423,9 +5351,9 @@ } }, "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5546,14 +5474,14 @@ } }, "node_modules/debounce-fn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-5.1.2.tgz", - "integrity": "sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-fn": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5758,25 +5686,14 @@ } }, "node_modules/dot-prop": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-8.0.2.tgz", - "integrity": "sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dependencies": { - "type-fest": "^3.8.0" + "is-obj": "^2.0.0" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5980,16 +5897,16 @@ } }, "node_modules/electron-dl": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-4.0.0.tgz", - "integrity": "sha512-USiB9816d2JzKv0LiSbreRfTg5lDk3lWh0vlx/gugCO92ZIJkHVH0UM18EHvKeadErP6Xn4yiTphWzYfbA2Ong==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-3.5.2.tgz", + "integrity": "sha512-i104cl+u8yJ0lhpRAtUWfeGuWuL1PL6TBiw2gLf0MMIBjfgE485Ags2mcySx4uWU9P9uj/vsD3jd7X+w1lzZxw==", "dependencies": { "ext-name": "^5.0.0", - "pupa": "^3.1.0", - "unused-filename": "^4.0.1" + "pupa": "^2.0.1", + "unused-filename": "^2.1.0" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6103,24 +6020,21 @@ } }, "node_modules/electron-store": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-9.0.0.tgz", - "integrity": "sha512-7LZ2dR3N3bF93G2c4x+1NZ/8fpsKv6bKrMxeOQWLqdRbxvopxVqy9QXQy9axSV2O3P1kVGTj1q2wq5/W4isiOg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.2.0.tgz", + "integrity": "sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==", "dependencies": { - "conf": "^12.0.0", - "type-fest": "^4.18.1" - }, - "engines": { - "node": ">=20" + "conf": "^10.2.0", + "type-fest": "^2.17.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/electron-to-chromium": { - "version": "1.4.754", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.754.tgz", - "integrity": "sha512-7Kr5jUdns5rL/M9wFFmMZAgFDuL2YOnanFH4OI4iFzUqyh3XOL7nAGbSlSMZdzKMIyyTpNSbqZsWG9odwLeKvA==", + "version": "1.4.758", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.758.tgz", + "integrity": "sha512-/o9x6TCdrYZBMdGeTifAP3wlF/gVT+TtWJe3BSmtNh92Mw81U9hrYwW9OAGUh+sEOX/yz5e34sksqRruZbjYrw==", "dev": true }, "node_modules/electron-updater": { @@ -6163,24 +6077,10 @@ "node": ">=12" } }, - "node_modules/electron-updater/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/electron-updater/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "bin": { "semver": "bin/semver.js" }, @@ -6188,11 +6088,6 @@ "node": ">=10" } }, - "node_modules/electron-updater/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/electron/node_modules/@electron/get": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", @@ -6290,7 +6185,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } @@ -6356,14 +6250,11 @@ } }, "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/escape-string-regexp": { @@ -6431,9 +6322,9 @@ } }, "node_modules/eslint-plugin-lit": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.11.0.tgz", - "integrity": "sha512-jVqy2juQTAtOzj1ILf+ZW5GpDobXlSw0kvpP2zu2r8ZbW7KISt7ikj1Gw9DhNeirEU1UlSJR0VIWpdr4lzjayw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.12.0.tgz", + "integrity": "sha512-wADj+b6ZksWs1qqASYBYzi4U6k0Tvhtp4GJupveZ7Z5IfVHMixxFueSSwIl/4ksov4jsahWbyHnhOpvJ5Z8M7w==", "dev": true, "dependencies": { "parse5": "^6.0.1", @@ -7232,28 +7123,12 @@ "node": ">=10.0" } }, - "node_modules/global-agent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/global-agent/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "dev": true, "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -7261,13 +7136,6 @@ "node": ">=10" } }, - "node_modules/global-agent/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7742,6 +7610,14 @@ "node": ">=0.12.0" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -7837,9 +7713,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -7972,9 +7848,9 @@ "dev": true }, "node_modules/json-schema-typed": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz", - "integrity": "sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -8401,14 +8277,11 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/mimic-response": { @@ -8493,6 +8366,14 @@ "node": ">=10" } }, + "node_modules/modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha512-EickqnKq3kVVaZisYuCxhtKbZjInCuwgwZWyAmRIp1NTMhri7r3380/uqwrUHfaDiPzLVTuoNy4whX66bxPVog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8709,12 +8590,11 @@ } }, "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/parent-module": { @@ -8778,7 +8658,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -8888,6 +8767,73 @@ "node": ">=0.10.0" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -9067,9 +9013,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.20.0.tgz", - "integrity": "sha512-q7AY7vMjKYqDCeoedgUiAgrLabliXxndJuuFmcmc2+YU1SblvnOiG2WEACF2lwAZsMlfLpiAilA3L+TWlDqIsQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz", + "integrity": "sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==", "dependencies": { "orderedmap": "^2.0.0" } @@ -9140,11 +9086,11 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz", - "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz", + "integrity": "sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==", "dependencies": { - "prosemirror-model": "^1.0.0" + "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { @@ -9189,17 +9135,14 @@ } }, "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "dependencies": { - "escape-goat": "^4.0.0" + "escape-goat": "^2.0.0" }, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/pwa-helpers": { @@ -9342,6 +9285,15 @@ "node": ">=4" } }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/read-pkg-up/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -9749,9 +9701,9 @@ } }, "node_modules/sass": { - "version": "1.76.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.76.0.tgz", - "integrity": "sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw==", + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz", + "integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -9885,26 +9837,11 @@ "node": ">=10" } }, - "node_modules/simple-update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -9912,12 +9849,6 @@ "node": ">=10" } }, - "node_modules/simple-update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -10200,11 +10131,6 @@ "node": ">=0.10.0" } }, - "node_modules/stubborn-fs": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", - "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" - }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -10483,11 +10409,11 @@ } }, "node_modules/type-fest": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.1.tgz", - "integrity": "sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=16" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10511,17 +10437,6 @@ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" }, - "node_modules/uint8array-extras": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-0.3.0.tgz", - "integrity": "sha512-erJsJwQ0tKdwuqI0359U8ijkFmfiTcq25JvvzRVc1VP+2son1NJRXhxcAKJmAW3ajM8JSGAfsAXye8g4s+znxA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -10537,43 +10452,21 @@ } }, "node_modules/unused-filename": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-4.0.1.tgz", - "integrity": "sha512-ZX6U1J04K1FoSUeoX1OicAhw4d0aro2qo+L8RhJkiGTNtBNkd/Fi1Wxoc9HzcVu6HfOzm0si/N15JjxFmD1z6A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-2.1.0.tgz", + "integrity": "sha512-BMiNwJbuWmqCpAM1FqxCTD7lXF97AvfQC8Kr/DIeA6VtvhJaMDupZ82+inbjl5yVP44PcxOuCSxye1QMS0wZyg==", "dependencies": { - "escape-string-regexp": "^5.0.0", - "path-exists": "^5.0.0" + "modify-filename": "^1.1.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unused-filename/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unused-filename/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.14.tgz", - "integrity": "sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "dev": true, "funding": [ { @@ -10657,11 +10550,6 @@ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" }, - "node_modules/when-exit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.2.tgz", - "integrity": "sha512-u9J+toaf3CCxCAzM/484qNAxQE75rFdVgiFEEV8Xps2gzYhf0tx73s1WXDQhkwV17E3MxRMz40m7Ekd2/121Lg==" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 21b90589..019ccee1 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ "compressorjs": "1.2.1", "crypto-js": "4.2.0", "driver.js": "1.3.1", - "electron-dl": "4.0.0", + "electron-dl": "3.5.2", "electron-log": "5.1.2", - "electron-store": "9.0.0", + "electron-store": "8.2.0", "electron-updater": "6.1.8", "emoji-picker-js": "https://github.com/Qortal/emoji-picker-js", "extract-zip": "2.0.1", @@ -64,12 +64,12 @@ "prosemirror-gapcursor": "1.3.2", "prosemirror-history": "1.4.0", "prosemirror-keymap": "1.2.2", - "prosemirror-model": "1.20.0", + "prosemirror-model": "1.21.0", "prosemirror-schema-list": "1.3.0", "prosemirror-state": "1.4.3", - "prosemirror-transform": "1.8.0", + "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.6", - "sass": "1.76.0", + "sass": "1.77.0", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, @@ -124,13 +124,13 @@ "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", "@vaadin/tooltip": "24.2.9", - "@zip.js/zip.js": "2.7.43", + "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", "electron": "30.0.2", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", - "eslint-plugin-lit": "1.11.0", + "eslint-plugin-lit": "1.12.0", "eslint-plugin-wc": "2.0.4", "file-saver": "2.0.5", "highcharts": "11.1.0", From 62579a8929dacf6c40320ee46f3f7a107cac2d02 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 8 May 2024 18:38:02 +0200 Subject: [PATCH 10/29] Update us.json --- core/language/us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/language/us.json b/core/language/us.json index 85af3543..f67afad4 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -92,7 +92,7 @@ "login": { "login": "Log In", "createaccount": "Create Account", - "name": "Display Name", + "name": "Name", "address": "Address", "password": "Password", "youraccounts": "Your accounts", From 8f8e6255744a50bbd198bc4f76d337018b838ac9 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Thu, 9 May 2024 10:17:28 +0200 Subject: [PATCH 11/29] Fix broken links for readd a plugin --- core/src/components/show-plugin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/components/show-plugin.js b/core/src/components/show-plugin.js index 98fa307f..a5e965a9 100644 --- a/core/src/components/show-plugin.js +++ b/core/src/components/show-plugin.js @@ -1597,19 +1597,19 @@ class NavBar extends connect(store)(LitElement) { } else if (this.pluginType === 'reward-share') { this.pluginPage = 'reward-share/index.html' } else if (this.pluginType === 'q-chat') { - this.pluginPage = 'messaging/q-chat/index.html' + this.pluginPage = 'q-chat/index.html' } else if (this.pluginType === 'name-registration') { this.pluginPage = 'name-registration/index.html' } else if (this.pluginType === 'names-market') { this.pluginPage = 'names-market/index.html' } else if (this.pluginType === 'websites') { - this.pluginPage = 'qdn/index.html' + this.pluginPage = 'q-website/index.html' } else if (this.pluginType === 'qapps') { this.pluginPage = 'q-app/index.html' } else if (this.pluginType === 'group-management') { this.pluginPage = 'group-management/index.html' } else if (this.pluginType === 'data-management') { - this.pluginPage = 'qdn/data-management/index.html' + this.pluginPage = 'data-management/index.html' } else if (this.pluginType === 'puzzles') { this.pluginPage = 'puzzles/index.html' } else if (this.pluginType === 'node-management') { From 33c74b77b163d37e37704f6b2f57bb7e8000444d Mon Sep 17 00:00:00 2001 From: crowetic <5431064+crowetic@users.noreply.github.com> Date: Thu, 9 May 2024 08:51:55 -0700 Subject: [PATCH 12/29] Updated translations --- core/language/de.json | 82 +++++++-------- core/language/es.json | 78 +++++++------- core/language/et.json | 54 +++++----- core/language/fi.json | 38 +++---- core/language/fr.json | 58 +++++----- core/language/hindi.json | 28 ++--- core/language/hr.json | 24 ++--- core/language/hu.json | 22 ++-- core/language/it.json | 16 +-- core/language/jp.json | 26 ++--- core/language/ko.json | 38 +++---- core/language/nl.json | 64 +++++------ core/language/no.json | 30 +++--- core/language/pl.json | 48 ++++----- core/language/pt.json | 56 +++++----- core/language/ro.json | 56 +++++----- core/language/rs.json | 30 +++--- core/language/ru.json | 22 ++-- core/language/us.json | 222 +++++++++++++++++++-------------------- core/language/zhc.json | 42 ++++---- core/language/zht.json | 40 +++---- 21 files changed, 537 insertions(+), 537 deletions(-) diff --git a/core/language/de.json b/core/language/de.json index 22ed7bf3..b1f0b8e2 100644 --- a/core/language/de.json +++ b/core/language/de.json @@ -80,7 +80,7 @@ "tm32": "Diesem Konto folgt keinem Benutzer", "tm33": "Registerkartenmenü importieren", "tm34": "Registerkartenmenü Exportieren", - "tm35": "Ihr vorhandenes Tab-Menü wird gelöscht und auf das hochgeladene Tab-Menü gesetzt.", + "tm35": "Ihr vorhandenes Tab-Menü wird gelöscht und auf das importiert Tab-Menü gesetzt.", "tm36": "Tab-Menü erfolgreich wiederhergestellt", "tm37": "Tab-Menü erfolgreich gespeichert als", "tm38": "DEV-MODUS", @@ -98,43 +98,43 @@ "youraccounts": "Ihre Konten", "clickto": "Klicken Sie auf Ihr Konto, um sich damit anzumelden", "needcreate": "Sie müssen ein Konto erstellen oder speichern, bevor Sie sich anmelden können!", - "upload": "Laden Sie Ihr Qortal-Backup hoch", + "upload": "Importieren Sie Ihre Qortal Backup-Datei", "howlogin": "Wie möchten Sie sich anmelden?", "seed": "Seedphrase", "seedphrase": "seedphrase", "saved": "Gespeichertes Konto", - "qora": "Qora Adresssamen", - "backup": "Qortal wallet backup", - "decrypt": "Entschlüssel Sicherung", + "qora": "QORA Adresssamen", + "backup": "Qortal-Sicherungsdatei", + "decrypt": "Sicherungsdatei entschlüsseln", "save": "In diesem Browser speichern.", - "prepare": "Vorbereiten Ihres Kontos", - "areyousure": "Möchten Sie dieses Wallet wirklich aus den gespeicherten Wallets entfernen?", - "error1": "Sicherung muss gültiges JSON format sein", + "prepare": "Vorbereiten Ihres Kontos...", + "areyousure": "Möchten Sie dieses Wallet wirklich aus den gespeicherten Wallets entfernen? (Wenn es entfernt wird und keine Sicherungsdatei vorhanden ist, könnte das Konto für immer verloren gehen! Stellen Sie sicher, dass Sie über eine Sicherungsdatei verfügen, bevor Sie dies tun!)", + "error1": "Die Sicherungsdatei muss gültiges JSON sein", "error2": "Anmeldeoption nicht ausgewählt", - "createwelcome": "Willkommen bei Qortal, Sie werden feststellen, dass es dem eines RPG-Spiels ähnelt. Sie als Minter im Qortal-Netzwerk (wenn Sie sich dafür entscheiden, einer zu werden) haben die Möglichkeit, Ihr Konto zu verbessern, wodurch Sie mehr von der QORT-Block-Belohnung haben und auch einen größeren Einfluss auf das Netzwerk in Bezug auf die Abstimmung über Entscheidungen für die Plattform zu haben.", + "createwelcome": "Willkommen bei Qortal! Ihre dezentrale digitale Zukunft erwartet Sie! Nur bei Qortal haben Sie die absolute Kontrolle über Ihre Daten. Qortal bietet die Basisebene einer neuen, vollständig benutzergesteuerten digitalen Welt.", "createa": "Eine", "click": "Klicken Sie hier, um die Seedphrase anzuzeigen", "confirmpass": "Passwort bestätigen", - "willbe": "wird zufällig im Hintergrund generiert. Diese wird als Ihr privater Schlüsselgenerator für Ihr Blockchain-Konto in Qortal verwendet.", + "willbe": "wird zufällig im Hintergrund generiert. Wenn Sie die Seedphrase ANZEIGEN möchten, klicken Sie in diesem Text auf die hervorgehobene „Seedphrase“. Dies wird als Ihr privater Schlüsselgenerator für Ihr Blockchain-Konto in Qortal verwendet. Aus Sicherheitsgründen werden Seedphrases standardmäßig nicht angezeigt, es sei denn, dies wurde ausdrücklich ausgewählt.", "clicknext": "Erstellen Sie Ihr Qortal-Konto, indem Sie unten auf WEITER klicken.", - "ready": "Ihr Konto kann jetzt erstellt werden. Es wird in diesem Browser gespeichert. Wenn Sie nicht möchten, dass Ihr neues Konto in Ihrem Browser gespeichert wird, können Sie das Kontrollkästchen unten deaktivieren. Sie können sich weiterhin mit Ihrem neuen Konto anmelden (nachdem Sie sich abgemeldet haben), indem Sie Ihre Brieftaschen-Sicherungsdatei verwenden, die Sie herunterladen MÜSSEN, sobald Sie Ihr Konto erstellt haben.", + "ready": "Ihr Konto kann jetzt erstellt werden. Es wird standardmäßig in verschlüsselter Form in dieser Kopie der Qortal-Benutzeroberfläche gespeichert. Wenn Sie nicht möchten, dass Ihr neues Konto hier gespeichert wird, können Sie das Kontrollkästchen unten deaktivieren. Sie können sich weiterhin mit Ihrem neuen Konto anmelden (nachdem Sie sich abgemeldet haben) und dabei Ihre Wallet-Sicherungsdatei verwenden, die Sie nach der Erstellung Ihres Kontos unbedingt herunterladen müssen.", "welmessage": "Willkommen bei Qortal", "pleaseenter": "Bitte Passwort eingeben!", - "notmatch": "Passwörter stimmen nicht überein!", + "notmatch": "Hoppla! Passwörter stimmen nicht überein! Versuchen Sie es erneut!", "lessthen8": "Ihr Passwort hat weniger als 5 Zeichen! Dies wird nicht empfohlen. Sie können diese Warnung weiterhin ignorieren.", "lessthen8-2": "Ihr Passwort hat weniger als 5 Zeichen!", - "entername": "Bitte geben Sie einen Namen ein!", - "downloaded": "Ihre Wallet BackUp-Datei wird heruntergeladen!", + "entername": "Bitte geben Sie einen Anzeigenamen ein!", + "downloaded": "Ihre Wallet-Backup-Datei wurde gespeichert!", "loading": "Wird geladen, bitte warten...", - "createdseed": "Ihre erstellte Seedphrase", + "createdseed": "Ihre erstellte Seedphrase:", "saveseed": "Seedphrase speichern", - "savein": "Im Browser speichern", - "backup2": "Diese Datei ist die EINZIGE Möglichkeit, auf Ihr Konto auf einem System zuzugreifen, auf dem das Konto nicht in der App oder im Browser gespeichert ist. SICHERN SIE DIESE DATEI AN MEHREREN ORTEN. Die Datei wird sehr sicher verschlüsselt und mit Ihrem lokalen Passwort, das Sie im vorherigen Schritt erstellt haben, entschlüsselt. Sie können es überall sicher speichern, aber stellen Sie sicher, dass Sie dies an mehreren Orten tun.", + "savein": "Speichern Sie in dieser Benutzeroberfläche", + "backup2": "Diese Datei ist (standardmäßig) die EINZIGE Möglichkeit, auf Ihr Konto zuzugreifen, sofern sie nicht in der Benutzeroberfläche gespeichert wird. Stellen Sie sicher, dass Sie diese Datei an mehreren Orten sichern. Die Datei wird sehr sicher verschlüsselt und mit Ihrem lokalen Passwort, das Sie im vorherigen Schritt erstellt haben, entschlüsselt. Sie können es überall sicher speichern, aber achten Sie darauf, dass Sie dies an mehreren Orten tun.", "savewallet": "Speichern Sie die Wallet-Sicherungsdatei", "created1": "Ihr Konto ist jetzt erstellt", - "created2": " und wird in diesem Browser gespeichert.", - "downloadbackup": "Laden Sie die Wallet-Sicherungsdatei herunter", - "passwordhint": "Ein Passwort muss mindestens 5 Zeichen lang sein.", + "created2": " und in verschlüsselter Form in dieser Benutzeroberfläche gespeichert.", + "downloadbackup": "Speichern Sie die Wallet-BackUp-Datei", + "passwordhint": "Das Passwort muss mindestens 5 Zeichen lang sein.", "lp1": "Bildschirm sperren", "lp2": "Es ist kein Passwort für den Sperrbildschirm festgelegt!", "lp3": "Bitte legen Sie eins fest", @@ -163,8 +163,8 @@ "confirmlogout": "Möchten Sie sich wirklich abmelden?" }, "fragfile": { - "selectfile": "Datei auswählen", - "dragfile": "Backup per Drag-and-Drop hierher ziehen" + "selectfile": "Wählen Sie die Sicherungsdatei aus", + "dragfile": "Ziehen Sie die Datei per Drag-and-Drop oder klicken Sie hier, um die Sicherungsdatei auszuwählen" }, "settings": { "generalinfo": "Allgemeine Kontoinformationen", @@ -181,19 +181,19 @@ "notifications": "Benachrichtigungen", "accountsecurity": "Konto Sicherheit", "password": "Passwort", - "download": "Sicherungsdatei herunterladen", - "choose": "Bitte wählen Sie ein Passwort, um Ihr Backup zu verschlüsseln. (Dies kann dasselbe sein wie das, mit dem Sie sich angemeldet haben, oder ein anderes)", + "download": "Sicherungsdatei exportieren/speichern", + "choose": "Bitte geben Sie ein Passwort ein, um Ihre Sicherungsdatei zu verschlüsseln. (Dies kann dasselbe sein wie das, mit dem Sie sich angemeldet haben, oder ein neues.)", "playsound": "Ton abspielen", "shownotifications": "Zeige Benachrichtigungen", "nodeurl": "Knotenverbindung", - "nodehint": "Wählen Sie einen Knoten aus der Standardliste der Knoten oben aus oder fügen Sie der obigen Liste einen benutzerdefinierten Knoten hinzu, indem Sie auf die Schaltfläche unten klicken", + "nodehint": "Wählen Sie einen Knoten aus der Standardliste aus oder fügen Sie der Liste einen benutzerdefinierten Knoten hinzu, indem Sie auf die Schaltfläche unten klicken", "addcustomnode": "Benutzerdefinierten Knoten hinzufügen", "addandsave": "Hinzufügen und speichern", "protocol": "Protokoll", "domain": "Domain", "port": "Port", - "import": "Knoten Importieren", - "export": "Knoten Exportieren", + "import": "Gespeicherte Knoten importieren", + "export": "Gespeicherte Knoten exportieren", "deletecustomnode": "Alle benutzerdefinierten Knoten entfernen", "warning": "Ihre bestehenden Knoten werden gelöscht und aus dem Backup neu erstellt.", "snack1": "Benutzerdefinierten Knoten erfolgreich gelöscht und Standardknoten hinzugefügt", @@ -203,17 +203,17 @@ "snack5": "Knoten erfolgreich importiert", "snack6": "Benutzerdefinierter Knoten erfolgreich entfernt", "snack7": "Benutzerdefinierter Knoten erfolgreich bearbeitet", - "exp1": "Privaten Hauptschlüssel exportieren", + "exp1": "Master-Privatschlüssel exportieren (xpriv)", "exp2": "Hauptschlüssel exportieren", "exp3": "Exportieren", - "exp4": "Bitte wählen Sie eine Brieftasche aus, um den privaten Hauptschlüssel zu sichern.", - "core": "Core-Einstellungen starten", + "exp4": "Bitte wählen Sie eine Wallet aus, um den privaten Master-Schlüssel zu sichern/exportieren.", + "core": "Grundlegende Autostart-Einstellungen", "qappNotification1": "Q-App Benachrichtigungen", "selectnode": "Bitte wählen Sie eine Option", "arrr1": "ARRR-Wallet nicht initialisiert!", - "arrr2": "Bitte gehen Sie zur Registerkarte „Wallet“ und initialisieren Sie zuerst Ihre arrr-Wallet.", + "arrr2": "Bitte gehen Sie zur Registerkarte „Wallet“ und greifen Sie auf das ARRR-Wallet zu, um zuerst das Wallet zu initialisieren.", "arrr3": "Core-Update erforderlich!", - "arrr4": "Um den privaten Schlüssel Ihrer arrr-Wallet zu speichern, benötigen Sie zuerst ein Core-Update!", + "arrr4": "Um den privaten Schlüssel Ihres ARRR-Wallets zu speichern, müssen Sie zunächst den Qortal Core aktualisieren!", "sync_indicator": "Synchronisierungsanzeige-Popup deaktivieren" }, "appinfo": { @@ -283,15 +283,15 @@ }, "startminting": { "smchange1": "Prägekonten können nicht abgerufen werden", - "smchange2": "Schlüssel konnte nicht entfernt werden", - "smchange3": "Prägeschlüssel konnte nicht hinzugefügt werden", + "smchange2": "Minting-Schlüssel konnte nicht entfernt werden", + "smchange3": "Das Hinzufügen des Minting-Schlüssels ist fehlgeschlagen. Wenn der Schlüssel gerade erstellt wurde, warten Sie ein paar Blöcke und fügen Sie ihn erneut hinzu", "smchange4": "Sponsorship-Schlüssel kann nicht erstellt werden", "smchange5": "Beziehung schaffen", "smchange6": "Warten auf Bestätigung in der Blockchain", "smchange7": "Beziehung beenden", "smchange8": "Prägeschlüssel zum Knoten hinzufügen", "smchange9": "Vollständig", - "smchange10": "Pro Node sind nur 2 Minting Keys erlaubt, Sie versuchen 3 Keys zuzuweisen, gehen Sie bitte zu Management - Node Management und entfernen Sie den Key, den Sie diesem Node nicht zuweisen möchten, danke!" + "smchange10": "Pro Knoten sind nur 2 Minting-Schlüssel zulässig. Sie versuchen, 3 Schlüssel zuzuweisen. Gehen Sie bitte zur Knotenverwaltung und entfernen Sie alle unnötigen Schlüssel. Vielen Dank!" }, "mintingpage": { "mchange1": "Allgemeine Prägedetails", @@ -466,10 +466,10 @@ "rchange6": "Empfänger", "rchange7": "Aktion", "rchange8": "Typ", - "rchange9": "Level 1 - 4 können einen Self Share erstellen und Level 5 oder höher können einen Reward Share erstellen!", + "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!", "rchange10": "Öffentlicher Schlüssel des Empfängers", "rchange11": "Belohnungsanteil in Prozent", - "rchange12": "Mache Etwas Leckeres", + "rchange12": "Angeforderter Befehl wird ausgeführt...", "rchange13": "Füge Minting Konto hinzu", "rchange14": "Hinzufügen", "rchange15": "Dieses Konto ist nicht an Belohnungsanteile beteiligt", @@ -507,12 +507,12 @@ "nchange23": "Verkaufspreis", "nchange24": "Keine Namen zu verkaufen", "nchange25": "Name zu verkaufen", - "nchange26": "Sind Sie sicher, dass Sie diesen Namen verkaufen möchten?", + "nchange26": "Sind Sie sicher, dass Sie diesen Namen verkaufen möchten? Wenn der Name von einem anderen Konto gekauft wird, liegt dies außerhalb Ihrer Kontrolle!", "nchange27": "Für diesen Preis in QORT", - "nchange28": "Beim Drücken auf Bestätigen wird die Anfrage zum Verkauf gesendet!", + "nchange28": "Wenn Sie auf „Bestätigen“ klicken, wird Ihr Name zum Verkauf angeboten!", "nchange29": "Name zu stornieren", "nchange30": "Sind Sie sicher, den Verkauf für diesen Namen abzubrechen?", - "nchange31": "Beim Drücken auf Bestätigen wird die Anfrage zum Stornieren des Verkaufs gesendet!", + "nchange31": "Wenn Sie auf „Bestätigen“ klicken, wird der Namensverkauf abgebrochen!", "nchange32": "Namensverkaufsanfrage erfolgreich!", "nchange33": "Verkaufsnamensanfrage erfolgreich stornieren!", "nchange34": "Kaufname-Anfrage erfolgreich!", @@ -549,7 +549,7 @@ "schange15": "Blockierte Webseiten", "schange16": "Sie haben keine Webseiten blockiert", "schange17": "Name nicht gefunden!", - "schange18": "Der Relay-Modus ist aktiviert. Dies bedeutet, dass Ihr Knoten dabei hilft, verschlüsselte Daten im Netzwerk zu transportieren, wenn ein Peer sie anfordert. Sie können sich per Einstellung abmelden, ändern Sie", + "schange18": "Der Relaismodus ist aktiviert. Das bedeutet, dass Ihr Knoten dabei hilft, VERSCHLÜSSELTE/CHUNKIERTE Daten im Netzwerk zu transportieren, wenn ein Peer dies anfordert. Sie können sich per Einstellung abmelden", "schange19": "in", "schange20": "Der Relay-Modus ist deaktiviert. Sie können es durch Einstellung aktivieren, ändern Sie", "schange21": "Webseite veröffentlichen", diff --git a/core/language/es.json b/core/language/es.json index 37197694..55a16689 100644 --- a/core/language/es.json +++ b/core/language/es.json @@ -80,7 +80,7 @@ "tm32": "Esta cuenta no sigue a ningún usuario", "tm33": "Menú de pestaña Importar", "tm34": "Menú de pestaña Exportar", - "tm35": "Tu menú de pestañas existente se eliminará y se establecerá en el menú de pestañas cargado.", + "tm35": "Su menú de pestañas existente se eliminará y se configurará como menú de pestañas importado.", "tm36": "Menú de pestañas restaurado con éxito", "tm37": "Menú de pestañas guardado correctamente como", "tm38": "MODO DEV", @@ -103,37 +103,37 @@ "seed": "Frasesemilla", "seedphrase": "frasesemilla", "saved": "Cuenta guardada", - "qora": "Frase semilla de la dirección Qora", - "backup": "Copia de seguridad del monedero Qortal", - "decrypt": "Descifrar copia de seguridad", + "qora": "Frase semilla de la dirección QORA", + "backup": "Archivo de copia de seguridad Qortal", + "decrypt": "Descifrar archivo de copia de seguridad", "save": "Guardar en este navegador.", - "prepare": "Preparando tu cuenta", - "areyousure": "¿Está seguro que desea eliminar este monedero de los monederos guardados?", + "prepare": "Preparando tu cuenta...", + "areyousure": "¿Está seguro de que desea eliminar esta billetera de las billeteras guardadas? (Si se elimina y no existe un archivo de respaldo, la cuenta podría perderse para siempre. ¡Asegúrese de tener un archivo de respaldo antes de hacer esto!)", "error1": "La copia de seguridad tiene que ser un JSON válido", "error2": "Opción de inicio de sesión no seleccionada", - "createwelcome": "Bienvenido a Qortal, encontrarás que es similar a un juego de rol, usted, como minero en la red Qortal (si decide convertirse en uno) tendrá la oportunidad de subir de nivel su cuenta, dándole más de la recompensa del bloque QORT y también una mayor influencia sobre la red en términos de votación sobre las decisiones en la plataforma.", + "createwelcome": "¡Bienvenidos a Qortal! ¡Tu futuro digital descentralizado te espera! En Qortal sólo tú tienes control absoluto sobre tus datos. Qortal proporciona el nivel básico de un mundo digital nuevo y totalmente controlado por el usuario.", "createa": "A", "click": "Haz clic para ver la frasesemilla", "confirmpass": "Confirmar Contraseña", - "willbe": "Se generará aleatoriamente en segundo plano. Esto se utiliza como su generador de clave privada para su cuenta de blockchain en Qortal.", + "willbe": "se generará aleatoriamente en segundo plano. Si desea VER la frase inicial, haga clic en la 'frase inicial' resaltada en este texto. Esto se utiliza como su generador de clave privada para su cuenta blockchain en Qortal. Por seguridad, de forma predeterminada, las frases iniciales no se muestran a menos que se elijan específicamente para ello.", "clicknext": "Crea tu cuenta Qortal haciendo clic en SIGUIENTE a continuación", - "ready": "Su cuenta está lista para ser creada. Será guardada en este navegador. Si no quiere que su nueva cuenta sea guardada en el navegador, puede desmarcar la casilla de abajo. Podrá seguir accediendo con su nueva cuenta (después de cerrar la sesión), utilizando el archivo de copia de seguridad de su monedero que DEBE descargar una vez que haya creado su cuenta.", + "ready": "Su cuenta ahora está lista para ser creada. Se guardará dentro de esta copia de la interfaz de usuario de Qortal de forma predeterminada, en forma cifrada. Si no desea que su nueva cuenta se guarde aquí, puede desmarcar la casilla a continuación. Aún podrá iniciar sesión con su nueva cuenta (después de cerrar sesión), utilizando el archivo de respaldo de su billetera que DEBE descargar una vez que cree su cuenta.", "welmessage": "Bienvenido a Qortal", "pleaseenter": "Por favor, introduzca una Contraseña!", - "notmatch": "Las contraseñas no coinciden!", + "notmatch": "¡Ups! ¡Las contraseñas no coinciden! ¡Intentar otra vez!", "lessthen8": "Su contraseña tiene menos de 5 caracteres! Esto no es recomendable. Puede continuar para ignorar esta advertencia.", "lessthen8-2": "Su contraseña tiene menos de 5 caracteres!", - "entername": "Por favor, introduzca un Nombre!", - "downloaded": "La copia de seguridad de su monedero ha sido descargada!", + "entername": "¡Ingrese un nombre para mostrar!", + "downloaded": "¡Se guardó su archivo de copia de seguridad de Wallet!", "loading": "Cargando, Por favor espere...", - "createdseed": "Su Frasesemilla creada", + "createdseed": "Su Frasesemilla creada:", "saveseed": "Guardar Frasesemilla", - "savein": "Guardar en el navegador", + "savein": "Guardar en esta UI", "backup2": "Este archivo es la ÚNICA manera de acceder a su cuenta en un sistema que no lo tenga guardado en la aplicación/navegador. ASEGÚRATE DE HACER UNA COPIA DE SEGURIDAD DE ESTE ARCHIVO EN VARIOS LUGARES. El archivo está encriptado de forma muy segura y descifrado con su contraseña local que creó en el paso anterior. Puedes guardarlo en cualquier lugar de forma segura, pero asegúrate de hacerlo en múltiples lugares.", "savewallet": "Guardar archivo de copia de seguridad del monedero", "created1": "Su cuenta ha sido creada", - "created2": " y será guardada en el navegador.", - "downloadbackup": "Descargar archivo de copia de seguridad del monedero", + "created2": " y guardado en esta interfaz de usuario en forma cifrada.", + "downloadbackup": "Guardar archivo de respaldo de Wallet", "passwordhint": "Una contraseña debe tener al menos 5 caracteres.", "lp1": "Pantalla de bloqueo", "lp2": "¡No se estableció una contraseña de pantalla de bloqueo!", @@ -163,8 +163,8 @@ "confirmlogout": "¿Está seguro que desea cerrar sesión?" }, "fragfile": { - "selectfile": "Seleccione un archivo", - "dragfile": "Arrastra y suelta la copia de seguridad aquí" + "selectfile": "Seleccionar archivo de respaldo", + "dragfile": "Arrastre y suelte o haga clic aquí para seleccionar el archivo de respaldo" }, "settings": { "generalinfo": "Información General de la Cuenta", @@ -181,19 +181,19 @@ "notifications": "Notificaciones", "accountsecurity": "Seguridad de la Cuenta", "password": "Contraseña", - "download": "Descargar copia de seguridad", - "choose": "Por favor, elija una contraseña para cifrar su copia de seguridad. (Puede ser la misma con la que ha iniciado la sesión, o diferente)", + "download": "Exportar/guardar archivo de copia de seguridad", + "choose": "Elija una contraseña para cifrar su archivo de copia de seguridad. (Este puede ser el mismo con el que inició sesión o uno nuevo).", "playsound": "Reproducir Sonido", "shownotifications": "Mostrar Notificaciones", "nodeurl": "URL del Nodo", - "nodehint": "Seleccione un nodo de la lista predeterminada de nodos de arriba o añada un nodo personalizado a la lista de arriba haciendo clic en el botón de abajo", + "nodehint": "Seleccione un nodo de la lista predeterminada o agregue un nodo personalizado a la lista haciendo clic en el botón a continuación", "addcustomnode": "Añadir un Nodo Personalizado", "addandsave": "Añadir Y Guardar", "protocol": "Protocolo", "domain": "Dominio", "port": "Puerto", - "import": "Importar Nodos", - "export": "Exportar Nodos", + "import": "Importar nodos guardados", + "export": "Exportar Nodos guardados", "deletecustomnode": "Eliminar todos los nodos personalizados", "warning": "Sus nodos existentes se eliminarán y se crearán nuevos a partir de la copia de seguridad.", "snack1": "Nodos estándar eliminados y agregados con éxito", @@ -203,17 +203,17 @@ "snack5": "Nodos importados con éxito", "snack6": "Nodo personalizado eliminado exitosamente", "snack7": "Nodo personalizado editado con éxito", - "exp1": "Exportar clave maestra privada", + "exp1": "Exportar clave privada maestra (xpriv)", "exp2": "Exportar clave maestra", "exp3": "Exportar", - "exp4": "Elija una billetera para hacer una copia de seguridad de la clave maestra privada.", - "core": "Iniciar configuración básica", + "exp4": "Elija una billetera para hacer una copia de seguridad de la clave privada maestra.", + "core": "Configuración principal de inicio automático", "qappNotification1": "Notificaciones de Q-App", "selectnode": "Por favor seleccione una opción", "arrr1": "¡Cartera ARRR no inicializada!", - "arrr2": "Por favor, vaya a la pestaña de billetera e inicialice su billetera arrr primero.", + "arrr2": "Vaya a la pestaña de billetera y acceda a la billetera ARRR para inicializar la billetera primero.", "arrr3": "¡Necesita actualización principal!", - "arrr4": "¡Para guardar la clave privada de tu billetera arrr, primero necesitas una actualización básica!", + "arrr4": "¡Para guardar la clave privada de su billetera ARRR, primero debe actualizar Qortal Core!", "sync_indicator": "Desactivar la ventana emergente del indicador de sincronización" }, "appinfo": { @@ -283,15 +283,15 @@ }, "startminting": { "smchange1": "No se pueden obtener cuentas de acuñación", - "smchange2": "No se pudo quitar la clave", - "smchange3": "No se pudo agregar la clave de acuñación", + "smchange2": "No se pudo eliminar la clave de acuñación", + "smchange3": "No se pudo agregar la clave de acuñación. Si la clave se acaba de crear, intente esperar unos bloques y agregarla nuevamente.", "smchange4": "No se puede crear la clave de patrocinio", "smchange5": "Creando relación", "smchange6": "En espera de confirmación en blockchain", "smchange7": "Terminando la relación", "smchange8": "Agregar clave de acuñación al nodo", "smchange9": "Completo", - "smchange10": "Solo se permiten 2 claves de acuñación por nodo, está intentando asignar 3 claves, vaya a administración - administración de nodos y elimine la clave que no desea asignar a este nodo, gracias!" + "smchange10": "Solo se permiten 2 claves de acuñación por nodo. Está intentando asignar 3 claves. Vaya a Administración de nodos y elimine las claves innecesarias. ¡Gracias!" }, "mintingpage": { "mchange1": "Detalles Generales de Acuñación", @@ -466,10 +466,10 @@ "rchange6": "Receptor", "rchange7": "Acción", "rchange8": "Tipo", - "rchange9": "Los niveles de 1 a 4 pueden crear una Self Share y los niveles 5 o superior pueden crear una Reward Share!", + "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!", "rchange10": "Clave pública del receptor", "rchange11": "Porcentaje de Reward share", - "rchange12": "Haciendo algo delicioso", + "rchange12": "Ejecutando el comando solicitado", "rchange13": "Añadir cuenta de acuñación", "rchange14": "Añadir", "rchange15": "La cuenta no participa en ninguna reward share", @@ -507,12 +507,12 @@ "nchange23": "Precio de venta", "nchange24": "No hay nombres para vender", "nchange25": "Nombre para vender", - "nchange26": "¿Estás seguro de vender este nombre?", + "nchange26": "¿Estás seguro de que quieres vender este nombre? Si otra cuenta compra el nombre, ¡estará fuera de su control!", "nchange27": "Por este precio en QORT", - "nchange28": "¡Al presionar confirmar, se enviará la solicitud de nombre de venta!", + "nchange28": "¡Al presionar confirmar, su nombre aparecerá a la venta!", "nchange29": "Nombre para cancelar", "nchange30": "¿Está seguro de cancelar la venta de este nombre?", - "nchange31": "¡Al presionar confirmar, se enviará la solicitud de cancelación de nombre de venta!", + "nchange31": "¡Al presionar confirmar, la venta del nombre será cancelada!", "nchange32": "¡Solicitud de nombre de venta exitosa!", "nchange33": "¡Cancelar solicitud de venta de nombre exitosa!", "nchange34": "¡Solicitud de nombre de compra exitosa!", @@ -549,7 +549,7 @@ "schange15": "Sitios web bloqueados", "schange16": "No ha bloqueado ningún sitio web", "schange17": "Nombre no encontrado!", - "schange18": "El modo de retransmisión está activado. Esto significa que tu nodo ayudará a transportar datos encriptados por la red cuando un par lo solicite. Puedes optar por no hacerlo configurando", + "schange18": "El modo de retransmisión está habilitado (relayModeEnabled: true). Esto significa que su nodo ayudará a transportar datos CIFRADOS/CHUNKED por la red cuando un par lo solicite. Puede optar por no participar configurando", "schange19": "en", "schange20": "El modo de retransmisión está desactivado. Puede activarlo configurando", "schange21": "Publicar Sitio Web", @@ -586,7 +586,7 @@ "schange15": "Q-Apps bloqueadas", "schange16": "No has bloqueado ninguna Q-Apps", "schange17": "¡No se encontró el nombre!", - "schange18": "El modo de retransmisión está habilitado. Esto significa que su nodo ayudará a transportar datos cifrados por la red cuando un par lo solicite. Puede optar por no hacerlo configurando", + "schange18": "El modo de retransmisión está habilitado. Esto significa que su nodo ayudará a transportar datos CIFRADOS/CHUNKED por la red cuando un par lo solicite. Puede optar por no participar configurando", "schange19": "en", "schange20": "El modo de relé está deshabilitado. Puedes habilitarlo configurando", "schange21": "Publicar Q-App", @@ -1176,7 +1176,7 @@ "inf7": "Información de compra automática", "inf8": "Cerrar información de compra automática", "inf9": "'Auto Buy' es una función que permite realizar 'órdenes de compra' en el Portal de comercio. Estas 'órdenes de compra' solo son visibles para la persona que las realiza. No son órdenes de compra 'públicas' como las Las 'ventas de mercado abierto' NO se almacenan en la cadena de bloques de Qortal. La compra automática es una característica de la interfaz de usuario y, como tal, requiere que la interfaz de usuario esté FUNCIONANDO.", - "inf10": "Para realizar un pedido de compra automática, haga clic en el botón 'Agregar pedido de compra automática' y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR y el PRECIO al que desea COMPRAR. Una vez la orden está activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que establezca (comenzando en la orden más baja y subiendo en los libros)", + "inf10": "Para realizar un pedido de Compra automática, haga clic en el botón "Agregar pedido de Compra automática" y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR o la cantidad de LTC que desea utilizar, y el PRECIO que desea COMPRAR HASTA. Una vez que la orden esté activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que usted establezca (comenzando en la orden más baja y subiendo en los libros).", "inf11": "¡Simplemente DEJE SU IU FUNCIONANDO y Auto Buy hace el resto, automáticamente!", "inf12": "PUEDE explorar otros complementos en la IU (Q-Chat, carteras, etc.) pero NO PUEDE CERRAR LA IU si desea que se complete su compra automática. Deje la IU 'minimizada' en la 'barra de tareas' o 'panel' está bien, mientras la interfaz de usuario permanezca ABIERTA, Auto Buy funcionará.", "inf13": "Comprar automáticamente", diff --git a/core/language/et.json b/core/language/et.json index 6afb005c..5a67a2d3 100644 --- a/core/language/et.json +++ b/core/language/et.json @@ -80,7 +80,7 @@ "tm32": "See konto ei jälgi ühtegi kasutajat", "tm33": "Impordi vahekaardi menüü", "tm34": "Ekspordi vahekaardi menüü", - "tm35": "Olemasolev vahekaardimenüü kustutatakse ja seatakse üleslaaditud vahekaardi menüüks.", + "tm35": "Teie olemasolev vahekaardimenüü kustutatakse ja seatakse imporditud vahekaardimenüüks.", "tm36": "Vahekaardimenüü edukalt taastatud", "tm37": "Vahekaardimenüü edukalt salvestatud nimega", "tm38": "ARENDAJA REZHIIM", @@ -96,44 +96,44 @@ "address": "Aadress", "password": "Salasõna", "youraccounts": "Sinu kontod", - "clickto": "Klõpsa kontole sellega sisse logimiseks", + "clickto": "Sisselogimiseks klõpsake kontol", "needcreate": "Pead looma või salvestama konto enne sisse logimist!", - "upload": "Laadi üles oma Qortal varukoopia", + "upload": "Importige oma Qortali varukoopiafail", "howlogin": "Kuidas soovid sisse logida?", "seed": "Seemnefraas", "seedphrase": "seemnefraas", "saved": "Konto salvestatud", - "qora": "Qora aadressi seeme", - "backup": "Qortal rahakoti varukoopia", - "decrypt": "Krüpti varukoopia lahti", + "qora": "QORA aadressi seeme", + "backup": "Qortal rahakoti varukoopiafail", + "decrypt": "Krüpti varukoopiafail ", "save": "Salvesta selles sirvikus.", "prepare": "Konto ettevalmistus...", - "areyousure": "Oled kindel, et soovid eemaldada seda rahakotti salvestatud rahakottide hulgast?", - "error1": "Varukoopia peab olema korrektses JSON-formaadis", + "areyousure": "Kas olete kindel, et soovite selle rahakoti salvestatud rahakottide hulgast eemaldada? (Kui eemaldate ja varukoopiafaili pole, võib konto jäädavalt kaduda! Enne seda veenduge, et teil oleks varukoopiafail!)", + "error1": "Varukoopiafail peab olema korrektses JSON-formaadis", "error2": "Sisse logimise viis valimata", - "createwelcome": "Tere tulemast Qortalisse! Sulle genereeritakse nüüd uus juhuslik seemnefraas, mida kasutatakse Sinu privaatvõtme ja aadressi loomiseks Qortali plokiahelasse. Lisaks, kui otsustad hakata ka Qortali platvormil nö. müntijaks, on Sul võimalus oma Qortali kontole saavutada kõrgem tase, mis toob Sulle suurema plokkide tasu QORT digimüntidena ning ka suurema hääletusmõjuvõimu Qortaliga seonduvate tulevikuotsuste osas.", + "createwelcome": "Tere tulemast Qortal! Teie detsentraliseeritud digitaalne tulevik ootab teid! Ainult teil on Qortalis täielik kontroll oma andmete üle. Qortal pakub uue ja täielikult kasutaja juhitava digitaalse maailma baastaseme.", "createa": "", "click": "Klõpsa, et vaadata seemnefraasi", "confirmpass": "Kinnita salasõna", - "willbe": "<- siit näed oma seemnefraasi.", + "willbe": "genereeritakse taustal juhuslikult. Kui soovite lähtelauset VAADATA, klõpsake selles tekstis esiletõstetud 'idufraasi'. Seda kasutatakse teie Qortali plokiahela konto privaatvõtme generaatorina. Turvalisuse huvides vaikimisi seemnefraase ei kuvata, välja arvatud juhul, kui see on spetsiaalselt valitud.", "clicknext": "Qortal konto loomiseks klõpsa allpool olevat nuppu EDASI.", - "ready": "Konto on peaaegu valmis ja see salvestatakse siia keskkonda (Qortal UI sirvikusse). Kui Sa mingil põhjusel seda salvestada ei soovi, võid eemaldada allpool oleva märkeruudu. Oma uue kontoga saad ikkagi sisse logida (pärast välja logimist), kasutades oma konto rahakoti varukoopia faili, mis tuleb KINDLASTI arvutis kuhugi kausta salvestada peale konto loomist.", + "ready": "Teie konto on nüüd loomiseks valmis. See salvestatakse vaikimisi sellesse Qortali kasutajaliidese koopiasse krüpteeritud kujul. Kui te ei soovi, et teie uut kontot siia salvestataks, võite tühjendada alloleva kasti. Saate endiselt oma uue kontoga sisse logida (pärast väljalogimist), kasutades oma rahakoti varukoopiafaili, mille PEATE pärast konto loomist alla laadima.", "welmessage": "Tere tulemast Qortalisse", "pleaseenter": "Palun sisesta salasõna!", - "notmatch": "Salasõnad ei kattu!", + "notmatch": "Oih! Paroolid ei kattu! Proovi uuesti!", "lessthen8": "Salasõna on vähem kui 5 tähemärki! See ei ole turvakaalutlustel soovitatav, kuigi saab ka nii.", "lessthen8-2": "Salasõna on vähem kui 5 tähemärki!", - "entername": "Palun sisesta Nimi!", - "Lae allaed": "Sinu rahakoti varukoopia laeti alla.", + "entername": "Palun sisestage kuvatav nimi!", + "Lae allaed": "Teie Walleti varundusfail salvestati!", "loading": "Laadib, palun oota...", "createdseed": "Sa lõid seemnefraasi", "saveseed": "Salvesta seemnefraas", "savein": "Salvesta sirvikusse", - "backup2": "Konto varukoopia fail on turvaliselt krüpteeritud, ja dekrüpteeritav Sinu poolt sisestatud salasõnaga, ning see fail on AINUS VIIS pääseda Sinu kontole ligi, kui kontot ei ole Qortal UI sirvikusse salvestatud. TEE SELLEST FAILIST VARUKOOPIA(D), et sa ei kaotaks oma kontole ligipääsu!", + "backup2": "See fail on AINUS viis (vaikimisi) oma kontole juurde pääseda, kui seda pole kasutajaliidesesse salvestatud. VARUNDAGE SEE FAIL KINDLASTI MITMES KOHTA. Fail krüpteeritakse väga turvaliselt ja dekrüpteeritakse teie eelmises etapis loodud kohaliku parooliga. Saate selle turvaliselt kõikjale salvestada, kuid tehke seda kindlasti mitmes kohas.", "savewallet": "Salvesta rahakoti varukoopia fail", "created1": "Sinu konto on nüüd loodud", - "created2": " ja salvestatakse siinse arvuti sirvikus.", - "Lae allabackup": "Laadi rahakoti varukoopia fail alla", + "created2": " ja salvestatakse sellesse kasutajaliidesesse krüptitud kujul.", + "Lae allabackup": "Salvesta Walleti varufail", "passwordhint": "Salasõna peab olema vähemalt 5 tähemärki.", "lp1": "Lukusta ekraan", "lp2": "Ekraaniluku salasõna pole seatud.", @@ -163,8 +163,8 @@ "confirmlogout": "Kas soovid kindlasti välja logida?" }, "fragfile": { - "selectfile": "Vali fail", - "dragfile": "või lohista varukoopia fail siia" + "selectfile": "Valige varufail", + "dragfile": "Varundusfaili valimiseks lohistage või klõpsake siin" }, "settings": { "generalinfo": "Üldine konto teave", @@ -181,7 +181,7 @@ "notifications": "Teavitused", "accountsecurity": "Konto turvalisus", "password": "Salasõna", - "Lae alla": "Laadi varukoopia fail alla", + "Lae alla": "Ekspordi/salvesta varukoopiafail", "choose": "Palun vali salasõna, millega varukoopia krüpteerida. (See võib olla sama, millega sisse logisid, või erinev).", "playsound": "Mängi heli", "shownotifications": "Näita teavitusi", @@ -203,17 +203,17 @@ "snack5": "Sõlmed edukalt imporditud", "snack6": "Kohandatud sõlm on edukalt eemaldatud", "snack7": "Kohandatud sõlme edukalt redigeeritud", - "exp1": "Ekspordi privaatne üldvõti", + "exp1": "Ekspordi privaatne üldvõti (xpriv)", "exp2": "Ekspordi üldvõti", "exp3": "Ekspordi", "exp4": "Palun vali rahakott privaatse üldvõtme varundamiseks.", - "core": "Tuuma käivitamise seaded", + "core": "Qortal automaatse käivitamise seaded", "qappNotification1": "Q-App märguanded", "selectnode": "Palun tehke valik", "arrr1": "ARRR rahakott pole initsialiseeritud!", - "arrr2": "Minge rahakoti vahekaardile ja lähtestage esmalt oma arrr rahakott.", + "arrr2": "Minge vahekaardile Rahakott ja avage esmalt ARRR-i rahakott, et rahakott lähtestada.", "arrr3": "Vaja põhivärskendust!", - "arrr4": "Oma arrr rahakoti privaatvõtme salvestamiseks vajate esmalt põhivärskendust!", + "arrr4": "ARRR-i rahakoti privaatvõtme salvestamiseks peate esmalt Qortal Core'i värskendama!", "sync_indicator": "Keela sünkroonimisindikaatori hüpikaken" }, "appinfo": { @@ -284,14 +284,14 @@ "startminting": { "smchange1": "Ei saa müntimise konto(de)le ligi", "smchange2": "Võtme eemaldamine ebaõnnestus", - "smchange3": "Ebaõnnestus müntimise võtme lisamine", + "smchange3": "Võtme lisamine nurjus. Kui võti just loodi, oodake mõni plokk ja lisage uuesti", "smchange4": "Ei saa luua sponsorluse võtit", "smchange5": "Suhte loomine", "smchange6": "Ootab kinnitust plokiahelalt", "smchange7": "Suhte lõpetamine", "smchange8": "Müntimise võtme lisamine sõlme", "smchange9": "Valmis", - "smchange10": "Ühe sõlme kohta on lubatud ainult 2 müntimisvõtit, aga Sina üritad määrata 3. Palun ava Haldus - Sõlme Haldamine ja eemaldage võti, mida Sa ei soovi sellele sõlmele määrata, tänud!" + "smchange10": "Ühe sõlme kohta on lubatud ainult 2 vermimisvõtit, proovite määrata 3 võtit. Minge sõlmede haldusse ja eemaldage kõik mittevajalikud võtmed, aitäh!" }, "mintingpage": { "mchange1": "Üldised müntimise detailid", @@ -507,7 +507,7 @@ "nchange23": "Müügihind", "nchange24": "Müüdavaid Nimesid pole", "nchange25": "Müüa Nimi", - "nchange26": "Kas oled kindel, et müüd selle Nime ära?", + "nchange26": "Kas olete kindel, et soovite selle nime müüa? Kui nime ostab keegi teine, ei ole varasema nimega avaldatud andmed teie kontrolli all!", "nchange27": "Selle hinna eest (QORTis)", "nchange28": "Kui vajutad kinnita, saadetakse Nime müügitaotlus!", "nchange29": "Nimi tühistamiseks", diff --git a/core/language/fi.json b/core/language/fi.json index 9174235f..b961dba9 100644 --- a/core/language/fi.json +++ b/core/language/fi.json @@ -103,38 +103,38 @@ "seed": "Siemenlause", "seedphrase": "siemenlause", "saved": "Tili tallennettu", - "qora": "Qora osoite siemen", + "qora": "QORA osoite siemen", "backup": "Qortal lompakon varmuuskopio", "decrypt": "Pura varmuuskopion salaus", "save": "Tallenna tässä selaimessa.", "prepare": "Tilin valmistelu...", - "areyousure": "Haluatko varmasti poistaa tämän lompakon tallennetuista lompakoistasi?", + "areyousure": "Haluatko varmasti poistaa tämän lompakon tallennetuista lompakoistasi? (Jos se poistetaan, eikä varmuuskopiotiedostoa ole, tili voi kadota lopullisesti! Varmista, että sinulla on varmuuskopiotiedosto ennen kuin teet tämän!)", "error1": "Varmuuskopion on oltava oikeassa JSON-muodossa", "error2": "Kirjautumistapaa ei ole valittu", - "createwelcome": "Tervetuloa Qortaliin! Sinulle luodaan nyt uusi satunnainen siemenlause, jota käytetään yksityisen avaimesi ja osoitteesi luomiseen Qortal-lohkoketjussa. Lisäksi, jos päätät aloittaa myös Qortal-alustalla, ts. kolikonlaskijana sinulla on mahdollisuus saavuttaa korkeampi taso Qortal-tililläsi, mikä tuo sinulle korkeamman lohkopalkkion QORT-digitaalisissa kolikoissa sekä suuremman äänivallan tulevissa Qortaliin liittyvissä päätöksissä.", + "createwelcome": "Tervetuloa Qortaliin! Hajautettu digitaalinen tulevaisuutesi odottaa sinua! Vain Qortalissa voit hallita tietojasi täydellisesti. Qortal tarjoaa perustason uudelle, täysin käyttäjän ohjaamalle digitaaliselle maailmalle.", "createa": "luo", "click": "Klikkaa tästä, et tarkastella seemnefraasi", "confirmpass": "Vahvista salasana", - "willbe": "<- täällä näet siemenlauseesi.", + "willbe": "<- luodaan taustalla satunnaisesti. Jos haluat NÄYTÄ aloituslausetta, napsauta korostettua 'siemenlausetta' tässä tekstissä. Tätä käytetään yksityisen avaimen luojana lohkoketjutilillesi Qortalissa.. Oletusarvoisesti suojaussyistä alkulauseita ei näytetä, ellei niitä ole erikseen valittu.", "clicknext": "Luo Qortal-tili napsauttamalla alla olevaa SEURAAVA-painiketta.", - "ready": "Tili on melkein valmis ja tallennetaan tänne (Qortal UI -selaimeen). Jos et jostain syystä halua tallentaa sitä, voit poistaa alla olevan valintaruudun. Voit silti kirjautua sisään uudella tililläsi (uloskirjautumisen jälkeen) käyttämällä tilisi lompakkovarmuuskopiotiedostoa, joka TÄYTYY tilin luomisen jälkeen tallentaa johonkin kansioon tietokoneellesi.", + "ready": "Tili on melkein valmis ja tallennetaan tänne (Qortal UI). Jos et jostain syystä halua tallentaa sitä, voit poistaa alla olevan valintaruudun. Voit silti kirjautua sisään uudella tililläsi (uloskirjautumisen jälkeen) käyttämällä tilisi lompakkovarmuuskopiotiedostoa, joka TÄYTYY tilin luomisen jälkeen tallentaa johonkin kansioon tietokoneellesi.", "welmessage": "Tervetuloa Qortaliin", "pleaseenter": "Ole hyvä ja anna salasana!", "notmatch": "Salasanat eivät täsmää!", "lessthen8": "Salasana on alle 5 merkkiä pitkä! Tätä ei suositella turvallisuussyistä, vaikka se voidaan tehdä.", "lessthen8-2": "Salasana on alle 5 merkkiä pitkä!", - "entername": "Anna nimi!", - "downloaded": "Lompakkosi varmuuskopio on ladattu.", + "entername": "Kirjoita näyttönimi", + "downloaded": "Lompakkosi varmuuskopiotiedosto tallennettiin.", "loading": "Ladataan, odota...", "createdseed": "Loit alkulauseen", "saveseed": "Tallenna siemenlause", - "savein": "Tallenna selaimeen", + "savein": "Tallenna tässä Qortal-käyttöliittymässä", "backup2": "Tilin varmuuskopiotiedosto on turvallisesti salattu ja sen salaus voidaan purkaa antamallasi salasanalla, ja tämä tiedosto on AINOA TAPA päästä tilillesi, jos tiliä ei ole tallennettu Qortal UI -selaimeen. TEE TÄSTÄ TIEDOSTOSTA VARMUUSKOPIO(T), jotta et menetä pääsyä tiliisi!", "savewallet": "Tallenna lompakon varmuuskopiotiedosto", "created1": "Tilisi on nyt luotu", - "created2": " ja tallennettu tämän tietokoneen selaimeen.", - "downloadbackup": "Lataa lompakon varmuuskopiotiedosto", - "passwordhint": "Salasanan tulee olla vähintään 5 merkkiä pitkä.", + "created2": " ja tallennettu tähän käyttöliittymään salatussa muodossa", + "downloadbackup": "Tallenna Qortal-varmuuskopiotiedosto", + "passwordhint": "Salaussalasanassa on oltava vähintään 5 merkkiä", "lp1": "Lukitse näyttö", "lp2": "Näytön lukituksen salasanaa ei ole asetettu.", "lp3": "Ole hyvä ja luo salasana tätä varten", @@ -163,8 +163,8 @@ "confirmlogout": "Haluatko varmasti kirjautua ulos?" }, "fragfile": { - "selectfile": "Valitse tiedosto", - "dragfile": "tai vedä varmuuskopiotiedosto tähän" + "selectfile": "Valitse varmuuskopiotiedosto", + "dragfile": "valitse napsauttamalla tai vedä varmuuskopiotiedosto tähän" }, "settings": { "generalinfo": "Yleiset tilitiedot", @@ -181,7 +181,7 @@ "notifications": "Ilmoitukset", "accountsecurity": "Tilin turvallisuus", "password": "Salasana", - "download": "Lataa varmuuskopiotiedosto", + "download": "Tallenna/vie varmuuskopiotiedosto", "choose": "Valitse salasana salataksesi varmuuskopion. (Tämä voi olla sama kuin se, jolla kirjauduit sisään, tai eri).", "playsound": "Soita ääni", "shownotifications": "Näytä ilmoitukset", @@ -192,8 +192,8 @@ "protocol": "Protokolla", "domain": "Verkkotunnus", "port": "Portti", - "import": "Tuo solmut", - "export": "Vie solmuja", + "import": "tuo tallennetut solmut", + "export": "Vie tallennetut solmut", "deletecustomnode": "Poista kaikki mukautetut solmut", "warning": "Sinun olemassa olevat solmut poistetaan ja palautetaan oletusasetuksiin.", "snack1": "Oletussolmujen poistaminen ja lisäys onnistui", @@ -207,11 +207,11 @@ "exp2": "Vie pääavain", "exp3": "Viedä", "exp4": "Valitse lompakko varmuuskopioidaksesi yksityisen julkisen avaimesi.", - "core": "Ytimen käynnistysasetukset", + "core": "Qortalin automaattisen käynnistysasetukset", "qappNotification1": "Q-App-ilmoitukset", "selectnode": "Ole hyvä ja tee valinta", "arrr1": "ARRR-lompakkoa ei ole alustettu!", - "arrr2": "Siirry lompakko-välilehdelle ja nollaa ensin ARRR-lompakkosi.", + "arrr2": "Siirry kohtaan 'lompakot' ja käytä ARRR-lompakkoa ensin", "arrr3": "Tarvitaan iso päivitys!", "arrr4": "Jotta voit tallentaa ARRR-lompakkosi yksityisen avaimesi, tarvitset ensin pääpäivityksen!", "sync_indicator": "Poista synkronoinnin ilmaisimen ponnahdusikkuna" @@ -507,7 +507,7 @@ "nchange23": "Alennushinta", "nchange24": "Ei nimiä myytävänä", "nchange25": "Myynnin nimi", - "nchange26": "Haluatko varmasti myydä tämän Nimen?", + "nchange26": "Oletko varma, että haluat myydä tämän nimen? Jos joku muu ostaa nimen, kaikki aikaisemmat nimitiedot eivät ole sinun hallinnassasi!", "nchange27": "Tähän hintaan (QORT)", "nchange28": "Jos painat Vahvista, Nimen myyntipyyntö lähetetään!", "nchange29": "Nimen peruuttaminen", diff --git a/core/language/fr.json b/core/language/fr.json index 76cae9b7..7d7375b7 100644 --- a/core/language/fr.json +++ b/core/language/fr.json @@ -80,7 +80,7 @@ "tm32": "Ce compte ne suit aucun utilisateur", "tm33": "Menu de l'onglet Importer", "tm34": "Menu de l'onglet Exporter", - "tm35": "Votre menu d'onglets existant sera supprimé et défini sur le menu d'onglets téléchargé.", + "tm35": "Votre nouvelle page à onglet existante sera supprimée et définie sur la nouvelle page à onglet importée.", "tm36": "Le menu des onglets a été restauré avec succès", "tm37": "Le menu des onglets a été enregistré avec succès sous", "tm38": "MODE DEV", @@ -96,45 +96,45 @@ "address": "Adresse", "password": "Mot de passe", "youraccounts": "Vos comptes", - "clickto": "Cliquez sur votre compte pour vous connecter", + "clickto": "Cliquez sur compte pour vous connecter", "needcreate": "Vous devez créer ou sauver un compte avant de pouvoir vous connecter!", - "upload": "Envoyer votre sauvegarde Qortal", + "upload": "Importez votre fichier de sauvegarde Qortal", "howlogin": "Comment voulez-vous vous connecter ?", "seed": "Phrase mnémonique", "seedphrase": "phrase mnémonique", "saved": "Compte sauvegardé", - "qora": "Adresse de contrôle Qora", - "backup": "Sauvegarde du portefeuille Qortal", - "decrypt": "Déchiffrer la sauvegarde", + "qora": "Graine d'adresse QORA", + "backup": "Fichier de Sauvegarde Qortal", + "decrypt": "Décrypter le fichier de sauvegarde Qortal", "save": "Sauvegarder dans ce navigateur.", - "prepare": "Préparation de votre compte", - "areyousure": "Êtes-vous sûr de vouloir retirer ce portefeuille des portefeuilles sauvegardés?", + "prepare": "Préparation de votre compte...", + "areyousure": "Etes-vous sûr de vouloir supprimer ce compte ? (S'il est supprimé et qu'aucune sauvegarde Qortal n'existe, le compte pourrait être perdu à jamais ! Assurez-vous d'avoir un fichier de sauvegarde avant de faire cela !)", "error1": "La sauvegarde doit être un JSON valide", "error2": "Option de connexion non sélectionnée", - "createwelcome": "Bienvenue dans Qortal, vous trouverez des similitudes avec un jeu de rôle, où, vous, en tant que frappeur dans le réseau Qortal (si vous choisissez d'en devenir un), aurez la chance d'augmenter votre niveau, vous donnant à la fois une plus grande partie de la récompense de bloc QORT et une plus grande influence sur le réseau en termes de vote sur les décisions pour la plate-forme.", + "createwelcome": "Bienvenue à Qortal ! Votre avenir numérique décentralisé vous attend ! Sur Qortal, vous seul avez un contrôle absolu sur vos données. Qortal fournit le niveau de base d'un nouveau monde numérique entièrement contrôlé par l'utilisateur.", "createa": "Une", "click": "Cliquez pour voir la phrase mnémonique", "confirmpass": "Confirmez votre mot de passe", - "willbe": "sera généré au hasard en arrière-plan. Il sera utilisé comme votre générateur de clé privée pour votre compte blockchain dans Qortal.", + "willbe": "sera généré aléatoirement en arrière-plan. Si vous souhaitez VOIR la phrase de départ, cliquez sur la « phrase de départ » en surbrillance dans ce texte. Ceci est utilisé comme générateur de clé privée pour votre compte blockchain dans Qortal. Pour des raisons de sécurité, par défaut, les phrases de départ ne sont pas affichées à moins d'être spécifiquement choisies.", "clicknext": "Créez votre compte Qortal en cliquant sur SUIVANT ci-dessous.", - "ready": "Votre compte est maintenant prêt à être créé. Il sera enregistré dans ce navigateur. Si vous ne souhaitez pas que votre nouveau compte soit enregistré dans votre navigateur, vous pouvez décocher la case ci-dessous. Vous serez toujours en mesure de vous connecter avec votre nouveau compte (après la déconnexion), en utilisant votre fichier de sauvegarde de portefeuille que vous DEVEZ télécharger une fois que vous créez votre compte.", + "ready": "Votre compte est maintenant prêt à être créé. Il sera enregistré par défaut dans cette copie de l'interface utilisateur de Qortal, sous forme cryptée. Si vous ne souhaitez pas que votre nouveau compte soit enregistré ici, vous pouvez décocher la case ci-dessous. Vous pourrez toujours vous connecter avec votre nouveau compte (après vous être déconnecté), en utilisant votre fichier de sauvegarde Qortal que vous DEVEZ télécharger une fois votre compte créé.", "welmessage": "Bienvenue dans Qortal", "pleaseenter": "Veuillez entrer un mot de passe!", - "notmatch": "Les mots de passe ne correspondent pas!", + "notmatch": "Oops! Les mots de passe ne coïncident pas ! Essayer à nouveau!", "lessthen8": "Votre mot de passe est inférieur à 5 caractères! Ceci n’est pas recommandé. Vous pouvez continuer en ignorant cet avertissement.", "lessthen8-2": "Votre mot de passe est inférieur à 5 caractères!", - "entername": "Veuillez saisir un nom!", - "downloaded": "Le fichier de sauvegarde de votre portefeuille va être téléchargé!", + "entername": "S'il vous plaît entrer un nom d'affichage!", + "downloaded": "Votre fichier de compte Qortal a été enregistré!", "loading": "Chargement en cours, veuillez patienter...", "createdseed": "Votre phrase mnémonique créee", "saveseed": "Sauvegarder votre phrase mnémonique", - "savein": "Sauvegarder dans le navigateur", + "savein": "Enregistrer dans l'interface utilisateur", "backup2": "Ce fichier est la SEULE façon d’accéder à votre compte sur un système qui ne l’a pas d'enregistré dans l’application ou le navigateur. ASSUREZ-VOUS DE SAUVEGARDER CE FICHIER À PLUSIEURS ENDROITS. Le fichier est chiffré de manière très sécurisée et déchiffré avec votre mot de passe local que vous avez créé à l’étape précédente. Vous pouvez l’enregistrer n’importe où en toute sécurité, mais assurez-vous de le faire à plusieurs endroits.", - "savewallet": "Sauvegarder le fichier de sauvegarde du portefeuille", + "savewallet": "Enregistrer le fichier de sauvegarde Qortal", "created1": "Votre compte est maintenant créé", - "created2": " et sera enregistré dans ce navigateur.", - "downloadbackup": "Télécharger le fichier de sauvegarde du portefeuille", - "passwordhint": "Un mot de passe doit comporter au moins 5 caractères.", + "created2": " et enregistré dans cette interface utilisateur sous forme cryptée.", + "downloadbackup": "Enregistrer le fichier de sauvegarde Qortal", + "passwordhint": "Le mot de passe doit comporter au moins 5 caractères.", "lp1": "Verrouiller l'écran", "lp2": "Aucun mot de passe d'écran de verrouillage n'est défini !", "lp3": "Veuillez en définir un", @@ -163,8 +163,8 @@ "confirmlogout": "Êtes-vous certain de vouloir vous déconnecter?" }, "fragfile": { - "selectfile": "Sélectionnez un fichier", - "dragfile": "Glisser-déposer la sauvegarde ici" + "selectfile": "Sélectionnez le fichier de sauvegarde", + "dragfile": "Glissez-déposez ou cliquez ici pour sélectionner le fichier de sauvegarde" }, "settings": { "generalinfo": "Informations générales du compte", @@ -181,7 +181,7 @@ "notifications": "Notifications", "accountsecurity": "Sécurité du compte", "password": "Mot de passe", - "download": "Télécharger le fichier de sauvegarde", + "download": "Exporter/Enregistrer le fichier de sauvegarde", "choose": "Veuillez choisir un mot de passe pour chiffrer votre sauvegarde. (Il peut s’agir du même mot de passe que celui avec lequel vous vous êtes connecté, ou différent)", "playsound": "Lire le son", "shownotifications": "Afficher les notifications", @@ -203,17 +203,17 @@ "snack5": "Les noeuds ont été importés avec succès", "snack6": "Nœud personnalisé supprimé avec succès", "snack7": "Nœud personnalisé édité avec succès", - "exp1": "Exporter la clé principale privée", + "exp1": "Exporter la clé privée principale (xpriv)", "exp2": "Exporter la clé principale", "exp3": "Exporter", - "exp4": "Veuillez choisir un portefeuille pour sauvegarder la clé principale privée.", - "core": "Démarrer les paramètres du noyau", + "exp4": "Veuillez choisir un portefeuille pour sauvegarder la clé privée principale.", + "core": "Paramètres de démarrage automatique de Qortal Core", "qappNotification1": "Notifications Q-App", "selectnode": "Veuillez sélectionner une option", "arrr1": "Portefeuille ARRR non initialisé !", - "arrr2": "Veuillez aller dans l'onglet Portefeuille et initialiser d'abord votre portefeuille arrr.", + "arrr2": "Veuillez accéder à « Portefeuilles » et accéder au portefeuille ARRR pour initialiser d'abord le portefeuille.", "arrr3": "Besoin d'une mise à jour principale !", - "arrr4": "Pour sauvegarder la clé privée de votre portefeuille arrr, vous avez d'abord besoin d'une mise à jour principale !", + "arrr4": "Pour sauvegarder la clé privée de votre portefeuille ARRR vous devez d'abord mettre à jour le Qortal Core!", "sync_indicator": "Désactiver la fenêtre contextuelle de l'indicateur de synchronisation" }, "appinfo": { @@ -284,7 +284,7 @@ "startminting": { "smchange1": "Impossible de récupérer les comptes de frappe", "smchange2": "Échec de la suppression de la clé", - "smchange3": "Échec de l'ajout de la clé de frappe", + "smchange3": "Échec de l'ajout de la clé de frappe, si la clé vient d'être créée, essayez d'attendre quelques blocs et d'ajouter à nouveau.", "smchange4": "Impossible de créer la clé de parrainage", "smchange5": "Créer une relation", "smchange6": "En attente de confirmation sur blockchain", @@ -507,7 +507,7 @@ "nchange23": "Prix de vente", "nchange24": "Aucun nom à vendre", "nchange25": "Nom à vendre", - "nchange26": "Êtes-vous sûr de vendre ce nom ?", + "nchange26": "Êtes-vous sûr de vouloir vendre ce nom ? Si le nom est acheté par un autre compte, les données publiées par ce nom ne seront plus modifiables par vous !", "nchange27": "Pour ce prix en QORT", "nchange28": "En appuyant sur confirmer, la demande de nom de vente sera envoyée !", "nchange29": "Nom à annuler", diff --git a/core/language/hindi.json b/core/language/hindi.json index 1b9c2082..51f6c16a 100644 --- a/core/language/hindi.json +++ b/core/language/hindi.json @@ -108,16 +108,16 @@ "decrypt": "डिक्रिप्ट बैकअप", "save": "इस ब्राउज़र में सेव करें.", "prepare": "आपका खाता तैयार करना", - "areyousure": "क्या आप वाकई इस वॉलेट को सहेजे गए वॉलेट से निकालना चाहते हैं?", + "areyousure": "क्या आप वाकई इस वॉलेट को सहेजे गए वॉलेट से निकालना चाहते हैं? (यदि हटा दिया गया है और कोई बैकअप फ़ाइल मौजूद नहीं है, तो खाता हमेशा के लिए खो सकता है! ऐसा करने से पहले सुनिश्चित करें कि आपके पास एक बैकअप फ़ाइल है!)", "error1": "बैकअप मान्य जेसन होना चाहिए", "error2": "लॉगिन विकल्प नहीं चुना गया", - "createwelcome": "क्वॉर्टल में आपका स्वागत है, आप इसे आरपीजी गेम के समान पाएंगे, आप, क्वॉर्टल नेटवर्क पर एक मिंटर के रूप में (यदि आप एक बनना चुनते हैं) आपके पास अपने खाते को समतल करने का मौका होगा, जिससे आप दोनों को और अधिक मिलेगा मंच के निर्णयों पर मतदान के संदर्भ में क्वॉर्ट ब्लॉक इनाम और नेटवर्क पर भी बड़ा प्रभाव है।", + "createwelcome": "क्वॉर्टल में आपका स्वागत है! आपका विकेन्द्रीकृत डिजिटल भविष्य आपका इंतजार कर रहा है! Qortal पर केवल आपका अपने डेटा पर पूर्ण नियंत्रण होता है। क्वॉर्टल एक नई और पूरी तरह से उपयोगकर्ता-नियंत्रित डिजिटल दुनिया का आधार स्तर प्रदान करता है।", "createa": "ए", "click": "बीजवाक्य देखने के लिए क्लिक करें", "confirmpass": "पासवर्ड की पुष्टि कीजिये", - "willbe": "पृष्ठभूमि में बेतरतीब ढंग से उत्पन्न होगा। यह क्वॉर्टल में आपके ब्लॉकचेन खाते के लिए आपके निजी कुंजी जनरेटर के रूप में उपयोग किया जाता है।", + "willbe": "पृष्ठभूमि में बेतरतीब ढंग से उत्पन्न किया जाएगा. यदि आप सीडफ़्रेज़ देखना चाहते हैं, तो इस पाठ में हाइलाइट किए गए 'सीडफ़्रेज़' पर क्लिक करें। इसका उपयोग Qortal में आपके ब्लॉकचेन खाते के लिए आपके निजी कुंजी जनरेटर के रूप में किया जाता है। डिफ़ॉल्ट रूप से सुरक्षा के लिए, सीडफ़्रेज़ प्रदर्शित नहीं किए जाते हैं जब तक कि विशेष रूप से चुना न जाए।", "clicknext": "नीचे अगला पर क्लिक करके अपना क्वॉर्टल अकाउंट बनाएं।", - "ready": "आपका खाता अब बनने के लिए तैयार है। यह इस ब्राउज़र में सेव हो जाएगा। यदि आप नहीं चाहते कि आपका नया खाता आपके ब्राउज़र में सहेजा जाए, तो आप नीचे दिए गए बॉक्स को अनचेक कर सकते हैं। आप अभी भी अपने वॉलेट बैकअप फ़ाइल का उपयोग करके अपने नए खाते (लॉग आउट करने के बाद) के साथ लॉगिन करने में सक्षम होंगे, जिसे आपको अपना खाता बनाने के बाद डाउनलोड करना होगा।", + "ready": "अब आपका अकाउंट बनने के लिए तैयार है. इसे डिफ़ॉल्ट रूप से, एन्क्रिप्टेड रूप में, Qortal UI की इस प्रति में सहेजा जाएगा। यदि आप नहीं चाहते कि आपका नया खाता यहां सहेजा जाए, तो आप नीचे दिए गए बॉक्स को अनचेक कर सकते हैं। आप अभी भी अपने वॉलेट बैकअप फ़ाइल का उपयोग करके अपने नए खाते से (लॉग आउट करने के बाद) लॉग इन कर पाएंगे, जिसे आपको अपना खाता बनाने के बाद डाउनलोड करना होगा।", "welmessage": "क्वॉर्टल में आपका स्वागत है", "pleaseenter": "कृपया पासवर्ड दर्ज करें!", "notmatch": "पासवर्ड मेल नहीं खाता!", @@ -128,7 +128,7 @@ "loading": "लोड हो रहा है कृपया प्रतीक्षा करें...", "createdseed": "आपका बनाएँ बीज वाक्यांश", "saveseed": "सीडफ़्रेज़ सहेजें", - "savein": "ब्राउज़र में सहेजें", + "savein": "इस यूआई में सहेजें", "backup2": "यह फ़ाइल किसी ऐसे सिस्टम पर आपके खाते तक पहुँचने का एकमात्र तरीका है, जिसमें इसे ऐप/ब्राउज़र में सहेजा नहीं गया है। इस फ़ाइल का कई स्थानों पर बैकअप लेना सुनिश्चित करें। फ़ाइल बहुत सुरक्षित रूप से एन्क्रिप्ट की गई है और पिछले चरण में आपके द्वारा बनाए गए आपके स्थानीय पासवर्ड से डिक्रिप्ट की गई है। आप इसे कहीं भी सुरक्षित रूप से सहेज सकते हैं, लेकिन इसे कई स्थानों पर करना सुनिश्चित करें।", "savewallet": "वॉलेट बैकअप फ़ाइल सहेजें", "created1": "आपका खाता अब निर्मित हो गया है", @@ -164,7 +164,7 @@ }, "fragfile": { "selectfile": "फ़ाइल का चयन करें", - "dragfile": "बैकअप को यहां खींचें और छोड़ें" + "dragfile": "बैकअप फ़ाइल का चयन करने के लिए खींचें और छोड़ें या यहां क्लिक करें" }, "settings": { "generalinfo": "सामान्य खाता जानकारी", @@ -181,7 +181,7 @@ "qr_login_button_2": "लॉगिन क्यूआर कोड जनरेट करें", "accountsecurity": "खाते की सुरक्षा", "password": "पासवर्ड", - "download": "बैकअप फ़ाइल डाउनलोड करें", + "download": "बैकअप फ़ाइल निर्यात/सहेजें", "choose": "कृपया अपने बैकअप को एन्क्रिप्ट करने के लिए पासवर्ड चुनें। (यह वही हो सकता है जैसा आपने एक लॉग इन किया है, या अलग)", "playsound": "ध्वनि चलाएं", "shownotifications": "सूचनाएं दिखाएं", @@ -192,8 +192,8 @@ "protocol": "परोटोकोल", "domain": "डोमेन", "port": "पोर्ट", - "import": "आयात नोड्स", - "export": "निर्यात नोड्स", + "import": "सहेजे गए नोड्स आयात करें", + "export": "सहेजे गए नोड्स निर्यात करें", "deletecustomnode": "सभी कस्टम नोड्स निकालें", "warning": "आपके मौजूदा नोड्स हटा दिए जाएंगे और बैकअप से नया बनाया जाएगा।", "snack1": "मानक नोड्स को सफलतापूर्वक हटा दिया गया और जोड़ा गया", @@ -203,15 +203,15 @@ "snack5": "नोड्स सफलतापूर्वक आयात किए गए", "snack6": "कस्टम नोड सफलतापूर्वक हटा दिया गया", "snack7": "कस्टम नोड सफलतापूर्वक संपादित", - "exp1": "निजी मास्टर कुंजी निर्यात करें", + "exp1": "निजी मास्टर कुंजी निर्यात करें (xpriv)", "exp2": "निर्यात मास्टर कुंजी", "exp3": "निर्यात", "exp4": "निजी मास्टर कुंजी का बैकअप लेने के लिए कृपया एक वॉलेट चुनें।", - "core": "कोर सेटिंग प्रारंभ करें", + "core": "कोर ऑटो-स्टार्ट सेटिंग्स", "qappNotification1": "क्यू-ऐप अधिसूचनाएँ", "selectnode": "कृपया एक विकल्प चुनें", "arrr1": "ARRR वॉलेट प्रारंभ नहीं हुआ!", - "arrr2": "कृपया वॉलेट टैब पर जाएं और पहले अपना Arrr वॉलेट प्रारंभ करें।", + "arrr2": "कृपया पहले वॉलेट प्रारंभ करने के लिए वॉलेट टैब पर जाएं और ARRR वॉलेट तक पहुंचें", "arrr3": "मुख्य अद्यतन की आवश्यकता है!", "arrr4": "अपने Arrr वॉलेट की निजी कुंजी को सहेजने के लिए आपको पहले एक कोर अपडेट की आवश्यकता है!", "sync_indicator": "सिंक संकेतक पॉपअप अक्षम करें" @@ -284,7 +284,7 @@ "startminting": { "smchange1": "खनन खाते नहीं लाए जा सकते", "smchange2": "कुंजी निकालने में विफल", - "smchange3": "मिंटिंग की जोड़ने में विफल", + "smchange3": "मिंटिंग कुंजी जोड़ने में विफल, यदि कुंजी अभी-अभी बनाई गई है तो कुछ ब्लॉक प्रतीक्षा करके पुनः जोड़ने का प्रयास करें", "smchange4": "प्रायोजन कुंजी नहीं बना सकता", "smchange5": "संबंध बनाना", "smchange6": "ब्लॉकचेन पर पुष्टि की प्रतीक्षा में", @@ -507,7 +507,7 @@ "nchange23": "मूल्य बेचें", "nchange24": "बिक्री के लिए कोई नाम नहीं", "nchange25": "बेचने के लिए नाम", - "nchange26": "क्या आप वाकई इस नाम को बेचना चाहते हैं?", + "nchange26": "क्या आप वाकई यह नाम बेचना चाहते हैं? यदि नाम किसी अन्य खाते से खरीदा जाता है तो यह आपके नियंत्रण से बाहर हो जाएगा!", "nchange27": "QORT में इस कीमत के लिए", "nchange28": "पुष्टि करें दबाने पर, विक्रय नाम अनुरोध भेजा जाएगा!", "nchange29": "रद्द करने के लिए नाम", diff --git a/core/language/hr.json b/core/language/hr.json index c25b6f60..0c2e07f1 100644 --- a/core/language/hr.json +++ b/core/language/hr.json @@ -96,28 +96,28 @@ "address": "Adresa", "password": "Lozinka", "youraccounts": "Tvoji računi", - "clickto": "Kliknite svoj račun da biste se prijavili s njim", + "clickto": "Pritisnite račun za prijavu", "needcreate": "Morate stvoriti ili spremiti račun prije nego što se možete prijaviti!", - "upload": "Prenesite Qortal sigurnosnu kopiju", + "upload": "Uvezite datoteku sigurnosne kopije Qortal", "howlogin": "Kako biste se željeli prijaviti?", "seed": "Seed fraza", "seedphrase": "seedphrase", "saved": "Sačuvani račun", - "qora": "Qora Adresa Seed", - "backup": "Qortal sigurnosna kopija novčanika", - "decrypt": "Decrypt sigurnosna kopija", + "qora": "QORA Adresa Seed", + "backup": "Qortal backup datoteka", + "decrypt": "Dešifrirajte datoteku sigurnosne kopije", "save": "Spremite u ovom pregledniku", "prepare": "Pripremite vaš račun", - "areyousure": "Jeste li sigurni da želite ukloniti ovaj novčanik od spremljenih novčanika?", + "areyousure": "Jeste li sigurni da želite ukloniti ovaj novčanik iz spremljenih novčanika? (Ako se ukloni, a ne postoji datoteka sigurnosne kopije, račun bi mogao biti zauvijek izgubljen! Provjerite imate li datoteku sigurnosne kopije prije nego to učinite!)", "error1": "Sigurnosna kopija mora biti valjan JSON", "error2": "Opcija prijave nije odabrana", - "createwelcome": "Dobro došli u Qortal, naći ćete da je sličan onome RPG igre, vi, kao MINTER na Qortal mreži (ako se odlučite da postanete), imat ćete priliku za dizanjem vašeg računa, dajući vam oboje i QORT blok nagrade i također veći utjecaj na mrežu u smislu glasovanja o odlukama za platformu.", + "createwelcome": "Dobrodošli u Qortal! Vaša decentralizirana digitalna budućnost čeka na vas! Samo na Qortalu imate apsolutnu kontrolu nad svojim podacima. Qortal pruža osnovnu razinu novog digitalnog svijeta koji u potpunosti kontrolira korisnik.", "createa": "A", "click": "Kliknite da vidite Seed frazu", "confirmpass": "Potvrdi lozinku", - "willbe": "će se slučajno generirati u pozadini. To se koristi kao vaš generator privatnog ključa za vaš blockchain račun u Qortal-u.", + "willbe": "će se nasumično generirati u pozadini. Ako želite POGLEDATI početnu frazu, kliknite označenu 'seedphrase' u ovom tekstu. Ovo se koristi kao vaš generator privatnog ključa za vaš blockchain račun u Qortalu. Za sigurnost prema zadanim postavkama, početne fraze se ne prikazuju osim ako nije posebno odabrano da budu.", "clicknext": "Stvorite Qortal račun klikom na SLJEDEĆE ispod.", - "ready": "Vaš je račun sada spreman za izradu. Bit će spremljen u ovom pregledniku. Ako ne želite da vaš novi račun bude spremljen u vašem pregledniku, možete poništiti okvir u nastavku. I dalje ćete se moći prijaviti svojim novim računom (nakon odjave), pomoću datoteke sigurnosna kopija novčanika koju morate preuzeti nakon što stvorite svoj račun.", + "ready": "Vaš račun je sada spreman za izradu. Bit će spremljen unutar ove kopije Qortal korisničkog sučelja prema zadanim postavkama, u šifriranom obliku. Ako ne želite da se vaš novi račun ovdje spremi, možete poništiti okvir ispod. I dalje ćete se moći prijaviti sa svojim novim računom (nakon što se odjavite), koristeći datoteku sigurnosne kopije novčanika koju MORATE preuzeti nakon što kreirate svoj račun.", "welmessage": "Dobrodošli u Qortal", "pleaseenter": "Unesite lozinku!", "notmatch": "Lozinke se ne podudaraju!", @@ -164,7 +164,7 @@ }, "fragfile": { "selectfile": "Odaberite datoteku", - "dragfile": "Povucite i ispustite sigurnosnu kopiju ovdje" + "dragfile": "Povucite i ispustite ili kliknite ovdje za odabir datoteke sigurnosne kopije" }, "settings": { "generalinfo": "Opće informacije o računu", @@ -181,7 +181,7 @@ "notifications": "Obavijesti", "accountsecurity": "Sigurnost računa", "password": "Lozinka", - "download": "Preuzmite sigurnosnu kopiju računa", + "download": "Izvezi/spremi datoteku sigurnosne kopije", "choose": "Odaberite lozinku za šifriranje sigurnosne kopije. (Ovo može biti ista kao i ona sa kojom ste se prijavili ili različita)", "playsound": "Puštanje zvuka", "shownotifications": "Prikaži obavijesti", @@ -507,7 +507,7 @@ "nchange23": "Prodajna cijena", "nchange24": "Nema imena za prodaju", "nchange25": "Ime za prodaju", - "nchange26": "Jeste li sigurni da ćete prodati ovo ime?", + "nchange26": "Jeste li sigurni da želite prodati ovo ime? Ako je ime kupljeno putem drugog računa, bit će izvan vaše kontrole!", "nchange27": "Za ovu cijenu u QORT", "nchange28": "Pritiskom na potvrdu, zahtjev za prodajnim imenom bit će poslan!", "nchange29": "Ime za poništavanje", diff --git a/core/language/hu.json b/core/language/hu.json index 627080f8..aefc3b76 100644 --- a/core/language/hu.json +++ b/core/language/hu.json @@ -80,7 +80,7 @@ "tm32": "Ez a fiók nem követ egyetlen felhasználót sem", "tm33": "Importálás lap menü", "tm34": "Exportálás lap menü", - "tm35": "Meglévő lapmenüje törlésre kerül, és a feltöltött lapok menüje lesz.", + "tm35": "A meglévő lapmenü törlésre kerül, és az importált lapmenü lesz.", "tm36": "A lap menüje sikeresen visszaállítva", "tm37": "A lap menüje sikeresen mentve másként", "tm38": "DEV MODE", @@ -96,7 +96,7 @@ "address": "Cím", "password": "Jelszó", "youraccounts": "Fiókjai", - "clickto": "Kattintson a fiókjára a bejelentkezéshez", + "clickto": "Kattintson a fiókra a bejelentkezéshez", "needcreate": "A bejelentkezés előtt létre kell hoznia vagy mentenie kell egy fiókot!", "upload": "A Qortal biztonsági másolat feltöltése", "howlogin": "Hogyan szertne bejelentkezni?", @@ -108,16 +108,16 @@ "decrypt": "Visszafejt biztonsági másolat", "save": "Mentés ebben a böngészőben.", "prepare": "Fiók előkészítése", - "areyousure": "Biztosan el akarja távolítani ezt a pénztárcát a mentett pénztárcákból?", + "areyousure": "Biztosan eltávolítja ezt a pénztárcát a mentett pénztárcák közül? (Ha eltávolítja, és nem létezik biztonsági mentési fájl, a fiók végleg elveszhet! Győződjön meg róla, hogy van biztonsági másolata, mielőtt ezt megtenné!)", "error1": "A biztonsági másolatnak érvényes JSONnak kell lennie", "error2": "Bejelentkezési beállítás nincs kijelölve", - "createwelcome": "Üdvözöljük a Qortalban, úgy fogja találni, hogy hasonló az RPG játékhoz. Mint a Qortal hálózat verője (ha úgy dönt, hogy eggyé válik), lehetősége lesz arra, hogy kiegyenlítse fiókját. Ez mind a QORT blokk jutalmát, mind a nagyobb befolyást biztosítja a hálózatra a platformra vonatkozó döntésekről szóló szavazás tekintetében.", + "createwelcome": "Üdvözöljük a Qortalban! Decentralizált digitális jövője várja Önt! A Qortalon csak Önnek van abszolút ellenőrzése az adatok felett. A Qortal egy új, teljes mértékben felhasználó által vezérelt digitális világ alapszintjét biztosítja.", "createa": "A", "click": "Kattintson ide a magfrázis megtekintéséhez", "confirmpass": "Jelszó megerősítése", - "willbe": "Véletlenszerűen jön létre a háttérben. Ezt használják a Qortal blokklánc-fiókjához tartozó privát kulcsgenerátorként.", + "willbe": "véletlenszerűen generálódik a háttérben. Ha meg szeretné tekinteni az alapkifejezést, kattintson a kiemelt „seedphrase”-ra ebben a szövegben. Ezt használja a privát kulcs generátoraként a blokklánc-fiókjához a Qortalban. Alapértelmezés szerint a biztonság kedvéért a kezdőmondatok nem jelennek meg, hacsak nincs külön kiválasztva.", "clicknext": "Qortal-fiók létrehozása az alábbi TOVÁBB/NEXT gombra kattintva", - "ready": "Fiókja készen áll a létrehozására. Ez a böngészőben lesz mentve.Ha nem szeretné, hogy új fiókját a böngészőbe mentse, törölje a jelet az alábbi jelölőnégyzetből. Továbbra is bejelentkezhet az új fiókjával (kijelentkezés után), a pénztárca biztonsági mentési fájljával, amelyet le kell töltenie a fiók létrehozása után.", + "ready": "Fiókja készen áll a létrehozásra. Alapértelmezés szerint a Qortal felhasználói felület ezen példányába kerül mentésre, titkosított formában. Ha nem szeretné, hogy új fiókja itt kerüljön mentésre, törölje a jelet az alábbi négyzetből. Továbbra is be tud majd jelentkezni az új fiókjával (kijelentkezés után), a pénztárca biztonsági mentési fájljával, amelyet a fiók létrehozása után KELL letöltenie.", "welmessage": "Üdvözöljük a Qortalban", "pleaseenter": "Kérjük, adjon meg egy jelszót!", "notmatch": "A jelszavak nem egyeznek!", @@ -164,7 +164,7 @@ }, "fragfile": { "selectfile": "Fájl kijelölése", - "dragfile": "Biztonsági mentés húzása ide" + "dragfile": "Húzza át vagy kattintson ide a biztonsági mentési fájl kiválasztásához" }, "settings": { "generalinfo": "Általános fiókadatok", @@ -181,7 +181,7 @@ "notifications": "Értesítések", "accountsecurity": "Fiók biztonsága", "password": "Jelszó", - "download": "Biztonságimásolat-fájl letöltése", + "download": "Biztonsági másolat fájl exportálása/mentése", "choose": "Válasszon egy jelszót a biztonsági mentés titkosításához. (Ez lehet ugyanaz, mint az, amelyikbe bejelentkezett, vagy más)", "playsound": "Hang lejátszása", "shownotifications": "Értesítések megjelenítése", @@ -211,7 +211,7 @@ "qappNotification1": "Q-App értesítések", "selectnode": "Kérjük, válasszon egy lehetőséget", "arrr1": "ARRR Wallet nincs inicializálva!", - "arrr2": "Kérjük, lépjen a Wallet fülre, és először inicializálja arrr pénztárcáját.", + "arrr2": "Kérjük, lépjen a Wallet fülre, és nyissa meg az ARRR pénztárcát a pénztárca inicializálásához.", "arrr3": "Alapfrissítésre van szükség!", "arrr4": "Az arrr pénztárca privát kulcsának mentéséhez először egy alapvető frissítésre van szükség!", "sync_indicator": "Szinkronizálásjelző előugró ablak letiltása" @@ -284,7 +284,7 @@ "startminting": { "smchange1": "Nem lehet lekérni a pénzverési számlákat", "smchange2": "Nem sikerült eltávolítani a kulcsot", - "smchange3": "Nem sikerült hozzáadni a pénzverési kulcsot", + "smchange3": "Nem sikerült hozzáadni a pénzverési kulcsot. Ha a kulcs most jött létre, várjon néhány blokkot, majd adja hozzá újra", "smchange4": "Nem hozható létre szponzori kulcs", "smchange5": "Kapcsolatteremtés", "smchange6": "Megerősítésre vár a blokkláncon", @@ -507,7 +507,7 @@ "nchange23": "Eladási ár", "nchange24": "Nincsenek eladható nevek", "nchange25": "Eladó név", - "nchange26": "Biztosan eladja ezt a nevet?", + "nchange26": "Biztos, hogy el akarja adni ezt a nevet? Ha a nevet egy másik fiók vásárolja meg, az nem lesz ellenőrzése!", "nchange27": "Erre az árra QORT-ban", "nchange28": "A megerősítés megnyomására elküldjük az eladási névkérést!", "nchange29": "Megszakítandó név", diff --git a/core/language/it.json b/core/language/it.json index 1b5bbf7d..35592ebe 100644 --- a/core/language/it.json +++ b/core/language/it.json @@ -80,7 +80,7 @@ "tm32": "Questo account non segue nessun utente", "tm33": "Menu scheda Importa", "tm34": "Menu scheda Esporta", - "tm35": "Il menu della scheda esistente verrà eliminato e impostato sul menu della scheda caricato.", + "tm35": "Il menu della scheda esistente verrà eliminato e impostato sul menu della scheda importato.", "tm36": "Menu scheda ripristinato con successo", "tm37": "Menu scheda salvato con successo con nome", "tm38": "MODALITÀ SVILUPPATORE", @@ -96,7 +96,7 @@ "address": "Indirizzo", "password": "Password", "youraccounts": "I tuoi account", - "clickto": "Fai clic sul tuo account per accedere con esso", + "clickto": "Fare clic su account per accedere", "needcreate": "Devi creare o salvare un account prima di poter accedere!", "upload": "Carica il tuo backup di Qortal", "howlogin": "Come vorresti accedere?", @@ -108,16 +108,16 @@ "decrypt": "Decifra backup", "save": "Salva in questo browser.", "prepare": "Preparazione del tuo account", - "areyousure": "Sei sicuro di voler rimuovere questo portafoglio dai portafogli salvati?", + "areyousure": "Sei sicuro di voler rimuovere questo portafoglio dai portafogli salvati? (Se rimosso e non esiste alcun file di backup, l'account potrebbe essere perso per sempre! Assicurati di avere un file di backup prima di farlo!)", "error1": "Il backup deve essere un JSON valido", "error2": "Opzione di accesso non selezionata", - "createwelcome": "Benvenuto in Qortal, lo troverai simile a quello di un gioco di ruolo, tu, come minatore della rete Qortal (se scegli di diventarlo) avrai la possibilità di aumentare di livello il tuo account, incrementando sia le ricompense per blocco e anche l'influenza sulla rete in termini di voto sulle decisioni per la piattaforma.", + "createwelcome": "Benvenuti a Qortal! Il tuo futuro digitale decentralizzato ti aspetta! Su Qortal solo tu hai il controllo assoluto sui tuoi dati. Qortal fornisce il livello base di un mondo digitale nuovo e completamente controllato dall'utente.", "createa": "A", "click": "Clicca per visualizzare la seedphrase", "confirmpass": "Conferma password", - "willbe": "sarà generato casualmente in background. Questo è usato come generatore di chiavi private per il tuo account sulla blockchain di Qortal.", + "willbe": "verrà generato casualmente in background. Se desideri VISUALIZZARE la frase seme, fai clic sulla 'frase seme' evidenziata in questo testo. Questo viene utilizzato come generatore di chiave privata per il tuo account blockchain in Qortal. Per motivi di sicurezza, per impostazione predefinita, le frasi iniziali non vengono visualizzate a meno che non venga specificatamente scelto di esserlo.", "clicknext": "Crea il tuo account Qortal facendo clic su AVANTI di seguito.", - "ready": "Il tuo account è ora pronto per essere creato. Verrà salvato in questo browser. Se non desideri che il tuo nuovo account venga salvato nel tuo browser, puoi deselezionare la casella qui sotto. Sarai comunque in grado di accedere con il tuo nuovo account (dopo il logout), utilizzando il file di backup del tuo portafoglio che DEVI scaricare una volta creato il tuo account.", + "ready": "Il tuo account è ora pronto per essere creato. Verrà salvato all'interno di questa copia dell'interfaccia utente Qortal per impostazione predefinita, in formato crittografato. Se non desideri che il tuo nuovo account venga salvato qui, puoi deselezionare la casella sottostante. Potrai comunque accedere con il tuo nuovo account (dopo esserti disconnesso), utilizzando il file di backup del tuo portafoglio che DEVI scaricare una volta creato il tuo account.", "welmessage": "Benvenuto in Qortal", "pleaseenter": "Inserisci una password!", "notmatch": "La password non corrisponde!", @@ -284,7 +284,7 @@ "startminting": { "smchange1": "Impossibile recuperare i conti di conio", "smchange2": "Impossibile rimuovere la chiave", - "smchange3": "Impossibile aggiungere la chiave di conio", + "smchange3": "Failed to add minting key, if key was just created try waiting a few blocks and adding again", "smchange4": "Impossibile creare la chiave di sponsorizzazione", "smchange5": "Creare relazione", "smchange6": "In attesa di conferma su blockchain", @@ -507,7 +507,7 @@ "nchange23": "Prezzo di vendita", "nchange24": "Nessun nome da vendere", "nchange25": "Nome da vendere", - "nchange26": "Sei sicuro di vendere questo nome?", + "nchange26": "Sei sicuro di voler vendere questo nome? Se il nome viene acquistato da un altro account sarà fuori dal tuo controllo!", "nchange27": "Per questo prezzo in QORT", "nchange28": "Premendo conferma, verrà inviata la richiesta di vendita del nome!", "nchange29": "Nome da cancellare", diff --git a/core/language/jp.json b/core/language/jp.json index 86e398bf..18b4a0fa 100644 --- a/core/language/jp.json +++ b/core/language/jp.json @@ -80,7 +80,7 @@ "tm32": "このアカウントはどのユーザーもフォローしていません", "tm33": "インポートタブメニュー", "tm34": "エクスポートタブメニュー", - "tm35": "既存のタブ メニューは削除され、アップロードされたタブ メニューに設定されます。", + "tm35": "既存のタブメニューが削除され、インポートされたタブメニューに設定されます。", "tm36": "タブメニューが正常に復元されました", "tm37": "タブメニューが名前を付けて保存されました", "tm38": "開発モード", @@ -96,28 +96,28 @@ "address": "アドレス", "password": "パスワード", "youraccounts": "あなたのアカウント", - "clickto": "ログインしたいアカウントをクリックして下さい", + "clickto": "アカウントをクリックしてログインします", "needcreate": "ログインする前にアカウントを作成または保存する必要があります!", "upload": "Qortal のバックアップをアップロードします", "howlogin": "どのようにログインしますか?", "seed": "シードフレーズ", "seedphrase": "シードフレーズ", "saved": "保存したアカウント", - "qora": "Qora アドレス シード", - "backup": "Qortal ウォレットのバックアップ", - "decrypt": "バックアップを復号化", + "qora": "QORA アドレス シード", + "backup": "Qortalバックアップファイル", + "decrypt": "バックアップファイルを復号化する", "save": "このブラウザに保存します。", "prepare": "アカウントを準備", - "areyousure": "保存されたウォレットからこのウォレットを削除しますか?", + "areyousure": "このウォレットを保存されたウォレットから削除してもよろしいですか? (削除してバックアップ ファイルが存在しない場合、アカウントが永久に失われる可能性があります。これを行う前にバックアップ ファイルがあることを確認してください。)", "error1": "バックアップは有効な JSON である必要があります", "error2": "ログイン オプションが選択されていません", - "createwelcome": "Qortal へようこそ。Qortalは RPG ゲームに似ている事に気づくと思います。Qortal ネットワークのミンターとして (なりたいと選択した場合) アカウントをレベルアップすることが出来、QORT のブロック報酬をより多く得られるだけでなく、プラットフォームの決定に対する投票という点で、ネットワークに対してより大きな影響力を持つことが出来ます。", + "createwelcome": "Qortal へようこそ。分散型デジタルの未来があなたを待っています! Qortal では、データを完全に制御できるのはあなただけです。 Qortal は、ユーザーが完全に制御できる新しいデジタル世界の基本レベルを提供します。", "createa": "A", "click": "クリックしてシードフレーズを表示", "confirmpass": "パスワードの確認", - "willbe": "はバックグラウンドでランダムに生成されます。これは、Qortal のブロックチェーン アカウントの秘密キー ジェネレーターとして使用されます。", + "willbe": "バックグラウンドでランダムに生成されます。 シードフレーズを表示したい場合は、このテキスト内で強調表示されている「シードフレーズ」をクリックしてください。 これは、Qortal のブロックチェーン アカウントの秘密キー ジェネレーターとして使用されます。 デフォルトでは、セキュリティのため、特に選択しない限り、シードフレーズは表示されません。", "clicknext": "下の [次へ] をクリックして Qortal アカウントを作成します。", - "ready": "アカウントを作成する準備が出来ました。アカウントはこのブラウザに保存されます。新しいアカウントをブラウザに保存したくない場合は、下のボックスのチェックを外してください。[必ず」新しいアカウントのウォレットのバックアップ ファイルをダウンロードして下さい。(ログアウト後) そのバックアップファイルが無いとログイン不可になります。", + "ready": "これでアカウントを作成する準備ができました。 デフォルトでは、Qortal UI のこのコピー内に暗号化された形式で保存されます。 新しいアカウントをここに保存したくない場合は、下のボックスのチェックを外してください。 アカウントを作成したら必ずダウンロードする必要があるウォレットのバックアップ ファイルを使用して、(ログアウト後も) 新しいアカウントでログインすることができます。", "welmessage": "Qortal へようこそ", "pleaseenter": "パスワードを入力してください!", "notmatch": "パスワードが一致しません!", @@ -207,11 +207,11 @@ "exp2": "マスターキーのエクスポート", "exp3": "エクスポート", "exp4": "秘密マスターキーをバックアップするウォレットを選択してください。", - "core": "Core設定を開始", + "core": "Core自動起動設定", "qappNotification1": "Q-App 通知", "selectnode": "オプションを選択してください", "arrr1": "ARRR ウォレットが初期化されていません!", - "arrr2": "ウォレットタブに移動して、まずarrrウォレットを初期化してください。", + "arrr2": "まずウォレットタブに移動し、ARRR ウォレットにアクセスしてウォレットを初期化してください。", "arrr3": "コアのアップデートが必要です!", "arrr4": "arrr ウォレットの秘密キーを保存するには、まずコアのアップデートが必要です!", "sync_indicator": "同期インジケーターのポップアップを無効にする" @@ -284,7 +284,7 @@ "startminting": { "smchange1": "ミントアカウントを取得出来ません", "smchange2": "キーの削除に失敗しました", - "smchange3": "ミントキーの追加に失敗しました", + "smchange3": "ミントキーを追加できませんでした。キーが作成されたばかりの場合は、数ブロック待ってから再度追加してください", "smchange4": "スポンサーシップ キーを作成出来ません", "smchange5": "関係の構築開始", "smchange6": "ブロックチェーンの承認を待っています", @@ -507,7 +507,7 @@ "nchange23": "売値", "nchange24": "売却する名前はありません", "nchange25": "売却する名前", - "nchange26": "この名前を売却しますか?", + "nchange26": "この名前を販売してもよろしいですか? この名前が別のアカウントによって購入された場合、販売された名前によって公開されたデータにアクセスできなくなります。", "nchange27": "QORT建価格", "nchange28": "確認を押すと、名前の売却リクエストが送信されます!", "nchange29": "売却中止する名前", diff --git a/core/language/ko.json b/core/language/ko.json index e9a070f5..9b5cf2d2 100644 --- a/core/language/ko.json +++ b/core/language/ko.json @@ -108,16 +108,16 @@ "decrypt": "백업 암호 해독", "save": "이 브라우저에 저장", "prepare": "계정 준비", - "areyousure": "저장된 지갑에서 이 지갑을 제거하시겠습니까?", + "areyousure": "저장된 지갑에서 이 지갑을 제거하시겠습니까? (제거되고 백업 파일이 없으면 계정이 영원히 손실될 수 있습니다. 이 작업을 수행하기 전에 백업 파일이 있는지 확인하십시오!)", "error1": "백업은 유호한 json파일 형식이어야 합니다.", "error2": "로그인 옵션이 선택되지 않았습니다.", - "createwelcome": "Qortal에 오신 것을 환영합니다. RPG 게임과 비슷하다는 것을 알게 되실 것입니다. Qortal 네트워크의 관리자로서(만약 당신이 하나를 선택한다면) 계정을 레벨업할 수 있는 기회를 갖게 될 것입니다. Qortal 네트워크에 대한 더 많은 블록 보상은 물론 플랫폼 결정에 대한 투표 측면에서 네트워크에 대한 더 큰 영향력을 갖게 될 것입니다..", + "createwelcome": "Qortal에 오신 것을 환영합니다! 귀하의 분산형 디지털 미래가 귀하를 기다립니다! Qortal에서는 귀하만이 귀하의 데이터를 절대적으로 통제할 수 있습니다. Qortal은 새로운 완전 사용자 제어 디지털 세계의 기본 수준을 제공합니다.", "createa": "A", "click": "시드 구문을 보려면 클릭하십시오.", "confirmpass": "암호 확인", - "willbe": "백그라운드에서 랜덤하게 생성됩니다. 이것은 Qortal의 블록체인 계정에 대한 개인 키 생성기로 사용됩니다.", + "willbe": "백그라운드에서 무작위로 생성됩니다. Seedphrase를 보려면 이 텍스트에서 강조표시된 'seedphrase'를 클릭하세요. 이는 Qortal의 블록체인 계정에 대한 개인 키 생성기로 사용됩니다. 기본적으로 보안을 위해 특별히 선택하지 않는 한 시드 문구는 표시되지 않습니다.", "clicknext": "아래 NEXT를 클릭하여 Qortal 계정을 만드십시오.", - "ready": "계정을 만들 준비가 되었습니다. 이 브라우저에 저장됩니다. 브라우저에 새 계정을 저장하지 않으려면 아래 상자를 선택 취소할 수 있습니다. 계정을 만든 후에는 반드시 다운로드해야 하는 지갑 백업 파일을 사용하여 새 계정으로 로그인할 수 있습니다(로그아웃 후).", + "ready": "이제 귀하의 계정을 생성할 준비가 되었습니다. 기본적으로 이 Qortal UI 복사본 내에 암호화된 형식으로 저장됩니다. 새 계정을 저장하지 않으려면 아래 확인란을 선택 취소하세요. 계정 생성 시 반드시 다운로드해야 하는 지갑 백업 파일을 사용하여 언제든지 새 계정에 액세스할 수 있습니다(로그아웃 후).", "welmessage": "Qortal에 오신 것을 환영합니다.", "pleaseenter": "암호를 입력하십시오!", "notmatch": "암호가 일치하지 않습니다!", @@ -129,11 +129,11 @@ "createdseed": "귀하의 시드구문", "saveseed": "시드구문 저장", "savein": "브라우저에 저장", - "backup2": "이 파일은 앱/브라우저에 저장되지 않은 시스템의 계정에 액세스할 수 있는 유일한 방법입니다. 이 파일을 여러 곳에 백업하십시오. 파일은 매우 안전하게 암호화되고 이전 단계에서 만든 로컬 암호로 해독됩니다. 어디에나 안전하게 저장할 수 있지만 여러 위치에서 저장해야 합니다.", + "backup2": "Qortal 백업 파일은 UI에 저장되지 않는 한 (기본적으로) 계정에 액세스할 수 있는 유일한 방법입니다. 이 파일을 여러 장소에 백업해 두세요! 파일은 매우 안전하게 암호화되었으며 이전 단계에서 생성한 로컬 비밀번호로 해독됩니다. 어디에나 안전하게 저장할 수 있지만 반드시 여러 위치에 저장하세요.", "savewallet": "지갑 백업 파일 저장", "created1": "이제 계정이 생성되었습니다.", - "created2": " 이 브라우저에 저장됩니다.", - "downloadbackup": "지갑 백업 파일 다운로드", + "created2": " 암호화된 형태로 이 UI에 저장됩니다.", + "downloadbackup": "Qortal 백업 파일을 저장하십시오.", "passwordhint": "비밀번호는 5자 이상이어야 합니다.", "lp1": "잠금 화면", "lp2": "잠금 화면 암호가 설정되지 않았습니다!", @@ -164,7 +164,7 @@ }, "fragfile": { "selectfile": "파일선택", - "dragfile": "백업을 여기에 드래그" + "dragfile": "끌어서 놓거나 여기를 클릭하여 백업 파일을 선택하세요." }, "settings": { "generalinfo": "일반 계정 정보", @@ -181,7 +181,7 @@ "notifications": "알림", "accountsecurity": "계정 보안", "password": "비밀번호", - "download": "백업 파일 다운로드", + "download": "Qortal 백업 파일 내보내기/저장", "choose": "백업을 암호화할 암호를 선택하십시오. 암호는 로그인한 암호와 같거나 다를 수 있습니다.", "playsound": "소리 재생", "shownotifications": "알림 표시", @@ -192,8 +192,8 @@ "protocol": "프로토콜", "domain": "도메인", "port": "포트", - "import": "노드 가져오기", - "export": "노드 내보내기", + "import": "저장된 노드 가져오기", + "export": "저장된 노드 내보내기", "deletecustomnode": "모든 사용자 정의 노드 제거", "warning": "기존 노드가 삭제되고 백업에서 새로 생성됩니다.", "snack1": "표준 노드를 성공적으로 삭제 및 추가했습니다.", @@ -203,17 +203,17 @@ "snack5": "노드를 성공적으로 가져왔습니다.", "snack6": "사용자 정의 노드를 성공적으로 제거했습니다", "snack7": "사용자 정의 노드를 성공적으로 편집했습니다", - "exp1": "개인 마스터 키 내보내기", + "exp1": "마스터 개인 키 내보내기(xpriv)", "exp2": "마스터 키 내보내기", "exp3": "내보내기", - "exp4": "개인 마스터 키를 백업할 지갑을 선택하세요.", + "exp4": "마스터 개인키 백업을 위한 지갑을 선택해주세요", "core": "코어 설정 시작", "qappNotification1": "Q-App 알림", "selectnode": "옵션을 선택하세요", - "arrr1": "ARRR 지갑이 초기화되지 않았습니다!", - "arrr2": "지갑 탭으로 이동하여 먼저 arrr 지갑을 초기화하세요.", + "arrr1": "ARRR 지갑이 초기화되지 않음!", + "arrr2": "'지갑'으로 이동하여 ARRR 지갑에 접속하여 먼저 초기화하세요.", "arrr3": "핵심 업데이트가 필요합니다!", - "arrr4": "arrr 지갑의 개인 키를 저장하려면 먼저 핵심 업데이트가 필요합니다!", + "arrr4": "ARRR 지갑의 개인 키를 저장하려면 먼저 Qortal Core를 업데이트해야 합니다!", "sync_indicator": "동기화 표시 팝업 비활성화" }, "appinfo": { @@ -284,14 +284,14 @@ "startminting": { "smchange1": "발행 계정을 가져올 수 없습니다", "smchange2": "키 제거 실패", - "smchange3": "발행 키를 추가하지 못했습니다.", + "smchange3": "'민팅 키' 추가에 실패했습니다. 키가 방금 생성된 경우 몇 블록을 기다렸다가 다시 추가해 보세요.", "smchange4": "스폰서십 키를 생성할 수 없습니다.", "smchange5": "관계 만들기", "smchange6": "블록체인에서 확인 대기 중", "smchange7": "관계 마무리", "smchange8": "노드에 발행 키 추가", "smchange9": "완벽한", - "smchange10": "노드당 발행 키 2개만 허용됩니다. 키 3개를 할당하려고 합니다. 관리 - 노드 관리로 이동하여 이 노드에 할당하고 싶지 않은 키를 제거하십시오. 감사합니다!" + "smchange10": "노드당 2개의 '민팅 키'만 허용됩니다. 현재 3개의 키를 시도하고 있습니다. 노드 관리로 이동하여 불필요한 키를 제거하십시오. 감사합니다!" }, "mintingpage": { "mchange1": "일반 민팅 정보", @@ -507,7 +507,7 @@ "nchange23": "판매 가격", "nchange24": "판매할 이름 없음", "nchange25": "판매할 이름", - "nchange26": "이 이름을 판매하시겠습니까?", + "nchange26": "이 이름을 판매하시겠습니까? 판매되면 이 이름으로 게시된 모든 데이터에 더 이상 액세스할 수 없습니다!", "nchange27": "QORT에서 이 가격", "nchange28": "확인을 누르면 판매 이름 요청이 전송됩니다!", "nchange29": "취소할 이름", diff --git a/core/language/nl.json b/core/language/nl.json index 6d24f0f2..5fbf5599 100644 --- a/core/language/nl.json +++ b/core/language/nl.json @@ -80,7 +80,7 @@ "tm32": "Dit account volgt geen enkele gebruiker", "tm33": "Teb-menu importeren", "tm34": "Tab-menu exporteren", - "tm35": "Het huidige Tab-menu wordt verwijderd, en vervangen door het opgeladen Tab-menu.", + "tm35": "Uw bestaande tab-menu wordt verwijderd en ingesteld op het geïmporteerde tab-menu.", "tm36": "Tab-menu werd opgeladen", "tm37": "Tab-Menü werd opgeslagen als", "tm38": "DEV-MODUS", @@ -98,43 +98,43 @@ "youraccounts": "Uw accounts", "clickto": "Klik op uw account om aan te melden", "needcreate": "U moet een account aanmaken of bewaren, alvorens U kan aanmelden!", - "upload": "Qortal-Backup opladen", + "upload": "Importeer uw Qortal Backup-bestand", "howlogin": "Hoe wenst U aan te melden?", "seed": "Memo-zin", "seedphrase": "memo-zin", "saved": "Opgeslagen account", - "qora": "Qora adres", - "backup": "Backup van Qortal portefeuille", - "decrypt": "Backup ontcijferen", + "qora": "QORA-adreszaad", + "backup": "Qortal-back-upbestand", + "decrypt": "Back-upbestand decoderen", "save": "Bewaren in deze browser.", "prepare": "Voorbereiding van uw account", - "areyousure": "Bent U zeker dat U deze portefeuille wenst te verwijderen uit de bewaarde portefeuilles?", + "areyousure": "Weet u zeker dat u deze portemonnee uit opgeslagen portemonnees wilt verwijderen? (Als het wordt verwijderd en er geen back-upbestand bestaat, kan het account voor altijd verloren gaan! Zorg ervoor dat u over een back-upbestand beschikt voordat u dit doet!)", "error1": "De backup moet een geldig JSON formaat zijn", "error2": "Geen aanmeld-optie geselecteerd", - "createwelcome": "Welkom bij Qortal. U zal merken dat het vergelijkbaar is met een RPG-spel, waarbij U als 'minter' (als U 'minter' wil worden) in het Qortal-netwerk kan opklimmen naar volgende levels, waardoor U meer QORT-blokbeloning krijgt en meer invloed zal krijgen in het netwerk in termen van stemmen bij beslissingen voor het platform.", + "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.", "createa": "Een willekeurige", "click": "Klik hier om uw memo-zin zichtbaar te maken", "confirmpass": "Wachtwoord bevestigen", - "willbe": "zal in achtergrond gegenereerd worden. Deze wordt gebruikt als jouw private-sleutel-generator voor jouw blockchain-account in Qortal.", + "willbe": "wordt willekeurig op de achtergrond gegenereerd. Als u de zaadzin wilt BEKIJKEN, klikt u op de gemarkeerde 'zaadzin' in deze tekst. Dit wordt gebruikt als uw privésleutelgenerator voor uw blockchain-account in Qortal. Uit veiligheidsoverwegingen worden zaadzinnen niet weergegeven, tenzij dit specifiek is gekozen.", "clicknext": "Klik hieronder op VERDER om jouw Qortal-account aan te maken.", - "ready": "Uw account is nu klaar om aan te maken. Het zal bewaard worden in deze browser. Heb je dat liever niet, dan kan je die optie hieronder deactivieren. Je kan je daarna met jouw nieuwe account aanmelden (na het afmelden), met behulp van de backup van je portefeuille, die je MOET DOWNLOADEN van zodra je account aangemaakt werd.", + "ready": "Uw account is nu klaar om te worden aangemaakt. Het wordt standaard in gecodeerde vorm opgeslagen in deze kopie van de Qortal-gebruikersinterface. Als u niet wilt dat uw nieuwe account hierin wordt opgeslagen, kunt u het onderstaande vakje uitschakelen. U kunt nog steeds inloggen met uw nieuwe account (na het uitloggen), met behulp van uw Qortal-back-upbestand dat u MOET opslaan bij het aanmaken van uw account.", "welmessage": "Welkom bij Qortal", "pleaseenter": "Geef een wachtwoord in!", - "notmatch": "De wachtwoorden komen niet overeen!", + "notmatch": "Oeps! Wachtwoorden komen niet overeen! Probeer het nog eens!", "lessthen8": "Uw wachtwoord is minder dan 5 karakters! Dat is niet aan te raden, maar je bent vrij om deze waarschuwing negeren.", "lessthen8-2": "Uw wachtwoord is minder dan 5 karakters!", - "entername": "Gelieve een naam in te geven!", - "downloaded": "De backup van uw portefeuille werd gedownload!", + "entername": "Geef een weergavenaam op!", + "downloaded": "Uw Qortal-back-upbestand is opgeslagen!", "loading": "Bezig met laden. Even geduld...", - "createdseed": "De memo-zin voor uw account", + "createdseed": "De memo-zin voor uw account:", "saveseed": "Memo-zin bewaren", - "savein": "In de browser bewaren", - "backup2": "Dit bestand is de ENIGE manier om uw account te openen wanneer de browser/app op de computer uw account niet bewaard heeft. ZORG ERVOOR DAT JE DIT BESTAND OP MEERDERE PLAATSEN BEWAARD. Dit bestand werd uitermate veilig versleuteld op basis van het wachtwoord uit de vorige stap, wat de enige manier is om het te ontgrendelen. U kan dit bestand dus overal bewaren. Zorg zéker dat je dit bestand op verschillende plaatsen bewaard.", - "savewallet": "Bewaar het backup-bestand van de portefeuille", + "savein": "Bewaar in deze gebruikersinterface", + "backup2": "Dit bestand is de ENIGE manier (standaard) om toegang te krijgen tot uw account, tenzij het is opgeslagen in de gebruikersinterface. ZORG ERVOOR DAT U OP MEERDERE PLAATSEN EEN BACK-UP VAN DIT BESTAND MAAKT. Het bestand wordt zeer veilig gecodeerd en gedecodeerd met uw lokale wachtwoord dat u in de vorige stap heeft aangemaakt. Je kunt het overal veilig opslaan, maar doe dat wel op meerdere locaties.", + "savewallet": "Sla het Qortal-back-upbestand op", "created1": "Uw account werd aangemaakt", - "created2": " en werd in deze browser bewaard.", - "downloadbackup": "Download het backup-bestand van de portefeuille", - "passwordhint": "Uw wachtwoord moet minstens 5 karakters lang zijn.", + "created2": " en opgeslagen in deze gebruikersinterface in gecodeerde vorm.", + "downloadbackup": "Sla het Qortal-back-upbestand op", + "passwordhint": "Het versleutelingswachtwoord moet minimaal 5 tekens lang zijn.", "lp1": "Scherm vergrendelen", "lp2": "Er werd nog geen wachtwoord voor schermvergrendeling vastgelegd!", "lp3": "Gelieve dat nu te doen", @@ -163,8 +163,8 @@ "confirmlogout": "Wenst U echt af te melden?" }, "fragfile": { - "selectfile": "Bestand selecteren", - "dragfile": "Sleep je backup-bestand naar hier" + "selectfile": "Selecteer Qortal back-upbestand", + "dragfile": "Sleep en zet neer of klik hier om het Qortal-back-upbestand te selecteren" }, "settings": { "generalinfo": "Algemene account-informatie", @@ -181,8 +181,8 @@ "notifications": "Waarschuwingen", "accountsecurity": "Account-beveiliging", "password": "Wachtwoord", - "download": "Download backup-bestand", - "choose": "Kies een wachtwoord om het backup-bestand te versleutelen. (Dit kan hetzelfde zijn als bij aanmelding, of een ander)", + "download": "Qortal back-upbestand exporteren/opslaan", + "choose": "Kies een wachtwoord om uw Qortal-back-upbestand te coderen. (Dit kan dezelfde zijn als waarmee u bent ingelogd, of een nieuwe.)"", "playsound": "Geluid afspelen", "shownotifications": "Toon waarschuwingen", "nodeurl": "Adres van de node", @@ -203,17 +203,17 @@ "snack5": "Lijst van nodes werd geïmporteerd", "snack6": "Manueel toegevoegde nodes werd verwijderd", "snack7": "Manueel toegevoegde nodes werd aangepast", - "exp1": "Export/download jouw PRIVÉ hoofdsleutel", + "exp1": "Master-privésleutel exporteren (xpriv)", "exp2": "Export/download jouw hoofdsleutel", "exp3": "Exporteren", "exp4": "Selecteer een portefeuille om de PRIVÉ hoofdsleutel te bewaren.", - "core": "Core-instellingen starten", + "core": "Core automatisch starten", "qappNotification1": "Q-App waarschuwingen", "selectnode": "Gelieve een optie te selecteren", "arrr1": "ARRR portefeuille is niet geïnitialiseerd!", - "arrr2": "Ga naar de portefeuille-tab en initialiseer eerst jouw ARRR portefeuille.", + "arrr2": "Ga naar het tabblad Portemonnees en open de ARRR-portemonnee om eerst de portemonnee te initialiseren.", "arrr3": "De 'core' heeft een update nodig!", - "arrr4": "Om de privé-sleutel van jouw ARRR portefeuille te kunnen bewaren, moet je voor de 'core' eerst een update installeren!", + "arrr4": "Om de privésleutel van uw ARRR-portemonnee op te slaan, moet u eerst de Qortal Core updaten!", "sync_indicator": "Synchronisatie-indicator pop-up uitschakelen" }, "appinfo": { @@ -283,15 +283,15 @@ }, "startminting": { "smchange1": "Minting-accounts kunnen niet opgehaald worden", - "smchange2": "Sleutel kon niet verwijderd worden", - "smchange3": "Mint-sleutel kon niet toegevoegd worden", + "smchange2": "Toewijzing van Qortal Minting-sleutel ongedaan maken is mislukt!", + "smchange3": "Het is niet gelukt om de Qortal Minting-sleutel toe te wijzen. Als de sleutel net is aangemaakt, wacht dan een paar blokken en voeg opnieuw toe", "smchange4": "Sponsor-sleutel kon niet aangemaakt worden", "smchange5": "Relatie wordt aangemaakt", "smchange6": "Even wachten op confirmatie van de blockchain", "smchange7": "Relatie wordt afgewerkt", "smchange8": "Mint-sleutel wordt op node toegevoegd", "smchange9": "Klaar", - "smchange10": "Een node mag maximum 2 mint-sleutels hebben, en U probeert 3 keys toe te wijzen; Ga eerst naar Node-beheer en verwijder de key die U niet aan deze node wenst toe te wijzen; Dank U!" + "smchange10": "Per knooppunt zijn slechts 2 sleutels toegestaan. U probeert 3 sleutels toe te wijzen. Ga naar Knooppuntbeheer en verwijder eventuele onnodige sleutels, bedankt!" }, "mintingpage": { "mchange1": "Algemene Minting-details", @@ -507,7 +507,7 @@ "nchange23": "Verkoopprijs", "nchange24": "Geen namen om te verkopen", "nchange25": "Te verkopen naam", - "nchange26": "Bent U zeker dat U deze naam wenst te verkopen?", + "nchange26": "Weet u zeker dat u deze naam wilt verkopen? Als de naam wordt gekocht door een ander account, kunnen de gegevens die onder deze naam zijn gepubliceerd, niet langer door u worden gewijzigd!", "nchange27": "Voor deze prijs in QORT", "nchange28": "Als je nu bevestigen kiest, dan wordt de verkoop-aanvraag verzonden!", "nchange29": "Te onderbreken naam-verkoop", @@ -1176,7 +1176,7 @@ "inf7": "Informatie over automatische aankoop", "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.", - "inf10": "Om via 'Automatiche aankoop' een bestelling te plaatsen, klik je op 'auto-aankoop toevoegen' en vul je de velden in het dialoogje in. Geef het QORT-BEDRAG in dat je wenst te KOPEN, en de MAXIMUM PRIJS DIE JE ERVOOR WIL BETALEN. Zodra de bestelling actief is, zal 'Auto aankoop' QORT aankopen tot het opgegeven QORT-BEDRAG en daarbij maximum de door jou vastgelegde prijs, én beginnend bij de laagst aangeboden verkoop-prijs in het verkoop-orderboek.", + "inf10": "Om een Auto Buy-bestelling te plaatsen, klikt u op de knop 'Auto Buy-bestelling 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 Auto Buy TOT dat bedrag QORT voor u, tegen TOT de prijs die u instelt (beginnend bij de laagste bestelling en hogerop in de boeken).", "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.", "inf13": "Automatisch aankopen", diff --git a/core/language/no.json b/core/language/no.json index 742abc02..cd46c294 100644 --- a/core/language/no.json +++ b/core/language/no.json @@ -80,7 +80,7 @@ "tm32": "Denne kontoen følger ikke noen bruker", "tm33": "Importer meny", "tm34": "Eksporter fanemeny", - "tm35": "Din eksisterende fanemeny vil bli slettet og satt til opplastet fanemeny.", + "tm35": "Din eksisterende fanemeny vil bli slettet og satt til importert fanemeny.", "tm36": "Fanemenyen ble gjenopprettet", "tm37": "Fanemeny ble lagret som", "tm38": "DEV MODUS", @@ -108,19 +108,19 @@ "decrypt": "Dekrypter backup", "save": "Lagre i denne nettleseren.", "prepare": "Forbereder kontoen din.", - "areyousure": "Er du sikker på at du vil fjerne denne lommeboken fra lagrede lommebøker?", + "areyousure": "Er du sikker på at du vil fjerne denne kontoen fra lagrede kontoer? (Hvis fjernet og ingen sikkerhetskopifil eksisterer, kan kontoen gå tapt for alltid! Sørg for at du har en sikkerhetskopifil før du gjør dette!)", "error1": "Backupen må være gyldig JSON", "error2": "Måte for pålogging ikke valgt", - "createwelcome": "Velkommen til Qortal. Likt et RPG-spill, vil du som minter i Qortal-nettverket (hvis du velger å bli det), ha sjansen til å øke din kontos nivå, noe som gir deg både mer av QORT-blokkbelønning, så vel som større innflytelse over nettverket når det gjelder å stemme på beslutninger for plattformen.", + "createwelcome": "Velkommen til Qortal! Din desentraliserte digitale fremtid venter på deg! I Qortal har du og bare du full kontroll over dataene dine. Qortal gir infrastrukturen til en ny og fullt brukerstyrt digital verden.", "createa": "A", "click": "Klikk for å se minnefrase (seedphrase)", "confirmpass": "Bekreft passord", - "willbe": "vil bli generert tilfeldig i bakgrunnen. Dette brukes som din private nøkkelgenerator for din blokkjedekonto i Qortal.", + "willbe": "vil bli generert tilfeldig i bakgrunnen. Hvis du ønsker å SE seedfrasen, klikk på den uthevede 'seedfrasen' i denne teksten. Dette brukes som din private nøkkelgenerator for din blokkjedekonto i Qortal. For sikkerhet som standard, vises ikke seedfraser med mindre det er spesifikt valgt å være det.", "clicknext": "Opprett din Qortal-konto ved å klikke på NESTE nedenfor.", - "ready": "Kontoen din er nå klar til å opprettes. Den vil bli lagret i denne nettleseren. Hvis du ikke vil at den nye kontoen din skal lagres i nettleseren, kan du fjerne avhukningen i boksen nedenfor. Du vil fortsatt kunne logge på med den nye kontoen din (etter å ha logget av), ved å bruke backup-filen for lommeboken som du MÅ laste ned når du har opprettet kontoen din.", + "ready": "Kontoen din er nå klar til å opprettes. Den vil som standard lagres i denne kopien av Qortal-grensesnittet, i kryptert form. Hvis du ikke vil at den nye kontoen din skal lagres her, kan du fjerne merket i boksen nedenfor. Du vil fortsatt kunne logge på med den nye kontoen din (etter å ha logget ut), ved å bruke sikkerhetskopifilen for lommeboken som du MÅ laste ned når du har opprettet kontoen din.", "welmessage": "Velkommen til Qortal", "pleaseenter": "Skriv inn et passord!", - "notmatch": "Passord matcher ikke!", + "notmatch": "Oops! Passordene samsvarer ikke! Prøv igjen!", "lessthen8": "Passordet ditt er mindre enn 5 tegn! Dette anbefales ikke. Du kan velge å fortsette, og ignorere denne advarselen.", "lessthen8-2": "Passordet ditt er mindre enn 5 tegn!", "entername": "Skriv inn et navn!", @@ -132,7 +132,7 @@ "backup2": "Denne filen er den ENESTE måten å få tilgang på kontoen din i et system hvor den ikke lagres i appen/nettleseren. SØRG FOR Å LAGE BACKUP AV DENNE FILEN PÅ FLERE STEDER. Filen er kryptert veldig sikkert og dekrypteres med ditt lokale passord som du opprettet i forrige trinn. Du kan trygt lagre den hvor som helst, men sørg for å gjøre det på flere steder.", "savewallet": "Lagre backup-fil for lommebok", "created1": "Kontoen din er nå opprettet", - "created2": " og vil bli lagret i denne nettleseren.", + "created2": " og lagret i denne UI i kryptert form.", "downloadbackup": "Last ned backup-fil for lommebok", "passwordhint": "Et passord må være på minst 5 tegn.", "lp1": "Lås skjerm", @@ -163,8 +163,8 @@ "confirmlogout": "Er du sikker på at du vil logge av?" }, "fragfile": { - "selectfile": "Velg fil", - "dragfile": "Dra og slipp backup her" + "selectfile": "Velg sikkerhetskopifil", + "dragfile": "Dra og slipp eller klikk her for å velge sikkerhetskopifil" }, "settings": { "generalinfo": "Generell kontoinformasjon", @@ -203,17 +203,17 @@ "snack5": "Noder ble importert", "snack6": "Tilpasset node er fjernet", "snack7": "Redigert tilpasset node", - "exp1": "Eksporter privat hovednøkkel", + "exp1": "Eksporter privat hovednøkkel (xpriv)", "exp2": "Eksporter hovednøkkel", "exp3": "Eksporter", "exp4": "Velg en lommebok for å sikkerhetskopiere den private hovednøkkelen.", - "core": "Start kjerneinnstillinger", + "core": "Kjerneinnstillinger for automatisk start", "qappNotification1": "Q-App varsler", "selectnode": "Vennligst velg et alternativ", "arrr1": "ARRR-lommebok ikke initialisert !", - "arrr2": "Vennligst gå til lommebok-fanen og initialiser arrr-lommeboken først.", + "arrr2": "Gå til lommebok-fanen og få tilgang til ARRR-lommeboken for å initialisere lommeboken først.", "arrr3": "Trenger kjerneoppdatering!", - "arrr4": "For å lagre den private nøkkelen til arrr-lommeboken din trenger du en kjerneoppdatering først!", + "arrr4": "For å lagre den private nøkkelen til ARRR-lommeboken din må du først oppdatere Qortal Core!", "sync_indicator": "Deaktiver popup for synkroniseringsindikator" }, "appinfo": { @@ -284,7 +284,7 @@ "startminting": { "smchange1": "Kan ikke hente myntingkontoer", "smchange2": "Kunne ikke fjerne nøkkelen", - "smchange3": "Kunne ikke legge til myntnøkkel", + "smchange3": "Kunne ikke legge til myntnøkkel, hvis nøkkelen nettopp ble opprettet, prøv å vente noen blokker og legg til på nytt.", "smchange4": "Kan ikke opprette sponsornøkkel", "smchange5": "Skaper forhold", "smchange6": "Venter på bekreftelse på blockchain", @@ -507,7 +507,7 @@ "nchange23": "Selgspris", "nchange24": "Ingen navn å selge", "nchange25": "Navn å selge", - "nchange26": "Er du sikker på å selge dette navnet?", + "nchange26": "Er du sikker på å selge dette navnet? Hvis navnet er kjøpt av en annen konto, vil alle data publisert av den være utenfor din kontroll!", "nchange27": "For denne prisen i QORT", "nchange28": "Når du trykker bekrefte, vil forespørselen om salgsnavn bli sendt!", "nchange29": "Navn som skal avbrytes", diff --git a/core/language/pl.json b/core/language/pl.json index 0446c70a..0e408433 100644 --- a/core/language/pl.json +++ b/core/language/pl.json @@ -80,7 +80,7 @@ "tm32": "To konto nie obserwuje żadnego użytkownika", "tm33": "Menu zakładki Importuj", "tm34": "Menu zakładki Eksportuj", - "tm35": "Twoje istniejące menu kart zostanie usunięte i ustawione na przesłane menu kart.", + "tm35": "Twoje istniejące menu zakładek zostanie usunięte i ustawione jako zaimportowane menu zakładek.", "tm36": "Menu zakładki pomyślnie przywrócone", "tm37": "Menu zakładki pomyślnie zapisane jako", "tm38": "TRYB DEV", @@ -98,43 +98,43 @@ "youraccounts": "Twoje konta", "clickto": "Kliknij swoje konto, aby się na nim zalogować", "needcreate": "Musisz utworzyć lub zapisać konto, zanim będziesz mógł się zalogować!", - "upload": "Prześlij swoją kopię zapasową Qortal", + "upload": "Zaimportuj plik kopii zapasowej Qortal", "howlogin": "Jak chciałbyś się zalogować?", "seed": "Fraza odzyskiwania", "seedphrase": "fraza odzyskiwania", "saved": "Zapisane konto", - "qora": "Ziarno adresu Qora", - "backup": "Kopia zapasowa portfela Qortal", - "decrypt": "Odszyfruj kopię zapasową", + "qora": "Ziarno adresu QORA", + "backup": "Plik kopii zapasowej Qortal", + "decrypt": "Odszyfruj plik kopii zapasowej", "save": "Zapisz w tej przeglądarce.", "prepare": "Przygotuj swoje konto", - "areyousure": "Czy na pewno chcesz usunąć ten portfel z zapisanych portfeli?", + "areyousure": "Czy na pewno chcesz usunąć to konto z zapisanych kont? (W przypadku usunięcia i braku pliku kopii zapasowej konto może zostać utracone na zawsze! Zanim to zrobisz, upewnij się, że masz plik kopii zapasowej!)", "error1": "Kopia zapasowa musi być poprawnym JSON", "error2": "Nie wybrano opcji logowania", - "createwelcome": "Witamy w Qortal, przekonasz się, że jest to gra podobna do gry RPG, ty, jako minter w sieci Qortal (jeśli zdecydujesz się nią zostać), będziesz miał szansę ulepszyć swoje konto, zyskując więcej nagrody za blok QORT, jak i większy wpływ na sieć w zakresie głosowania na decyzje dotyczące platformy.", + "createwelcome": "Witamy w Qortalu! Twoja zdecentralizowana cyfrowa przyszłość czeka na Ciebie! W Qortal Ty i tylko Ty masz pełną kontrolę nad swoimi danymi. Qortal zapewnia podstawowy poziom nowego, w pełni kontrolowanego przez użytkownika cyfrowego świata.", "createa": "A", "click": "Kliknij, aby zobaczyć frazę odzyskiwania portfela", "confirmpass": "Potwierdź hasło", - "willbe": "zostanie losowo wygenerowany w tle. To jest używane jako generator klucza prywatnego dla Twojego konta blockchain w Qortal.", + "willbe": "będą losowo generowane w tle. Jeśli chcesz ZOBACZYĆ frazę nasion, kliknij słowo „fraza nasion” w tym tekście. Służy jako generator klucza prywatnego dla Twojego konta Blockchain w Qortal. Ze względów bezpieczeństwa domyślnie frazy początkowe nie są wyświetlane, chyba że zostało to specjalnie wybrane.", "clicknext": "Utwórz swoje konto Qortal, klikając przycisk NEXT (DALEJ) poniżej.", - "ready": "Twoje konto jest teraz gotowe do utworzenia. Zostanie zapisane w tej przeglądarce. Jeśli nie chcesz, aby Twoje nowe konto było zapisywane w przeglądarce, możesz odznaczyć poniższe pole. Nadal będziesz mógł logować się na nowe konto (po wylogowaniu), korzystając z pliku kopii zapasowej portfela, który MUSISZ pobrać po utworzeniu konta.", + "ready": "Twoje konto jest teraz gotowe do utworzenia. Zostanie on domyślnie zapisany w tej kopii interfejsu użytkownika Qortal, w formie zaszyfrowanej. Jeśli nie chcesz, aby Twoje nowe konto było tutaj zapisywane, możesz odznaczyć pole poniżej. Nadal będziesz mógł zalogować się na swoje nowe konto (po wylogowaniu), korzystając z pliku kopii zapasowej portfela, który MUSISZ pobrać po utworzeniu konta.", "welmessage": "Witamy w Qortal", "pleaseenter": "Proszę wprowadzić Hasło!", "notmatch": "Hasła nie pasują!", "lessthen8": "Twoje hasło ma mniej niż 5 znaków! Nie jest to zalecane. Możesz zignorować to ostrzeżenie.", "lessthen8-2": "Twoje hasło ma mniej niż 5 znaków!", - "entername": "Proszę podać Nazwę!", - "downloaded": "Twój plik kopii zapasowej Portfela zostanie pobrany!", + "entername": "Proszę wprowadzić nazwę wyświetlaną!", + "downloaded": "Twój plik kopii zapasowej Portfela został zapisany!", "loading": "Ładowanie, proszę czekać...", "createdseed": "Twoja utworzona fraza odzyskiwania", "saveseed": "Zapisz frazę odzyskiwania", - "savein": "Zapisz w przeglądarce", - "backup2": "Ten plik jest JEDYNYM sposobem uzyskania dostępu do konta w systemie, jeżeli nie ma go zapisanego w aplikacji/przeglądarce. PAMIĘTAJ, ABY ZAPISAĆ KOPIĘ ZAPASOWĄ TEGO PLIKU W WIELU MIEJSCACH. Plik jest bezpiecznie zaszyfrowany i może być odszyfrowany za pomocą Twojego hasła utworzonego w poprzednim kroku. Możesz go bezpiecznie zapisać w dowolnym miejscu, ale pamiętaj, aby zrobić to w wielu lokalizacjach.", + "savein": "Zapisz w tym interfejsie użytkownika", + "backup2": "Ten plik jest JEDYNYM (domyślnym) sposobem uzyskania dostępu do Twojego konta, chyba że zostanie zapisany w interfejsie użytkownika. NALEŻY ZROBIĆ KOPIĘ ZAPASOWĄ TEGO PLIKU W WIELU MIEJSCACH. Plik zostanie bardzo bezpiecznie zaszyfrowany i odszyfrowany za pomocą lokalnego hasła utworzonego w poprzednim kroku. Możesz bezpiecznie zapisać go w dowolnym miejscu, ale pamiętaj, aby zrobić to w wielu lokalizacjach.", "savewallet": "Zapisz plik kopii zapasowej portfela", "created1": "Twoje konto zostało utworzone", - "created2": " i zostanie zapisane w tej przeglądarce.", - "downloadbackup": "Pobierz plik kopii zapasowej portfela", - "passwordhint": "Hasło musi mieć co najmniej 5 znaków.", + "created2": " i zapisane w tym interfejsie użytkownika w formie zaszyfrowanej.", + "downloadbackup": "Zapisz plik kopii zapasowej Qortal", + "passwordhint": "Hasło szyfrujące musi składać się z co najmniej 5 znaków.", "lp1": "Ekran blokady", "lp2": "Nie ustawiono hasła blokady ekranu!", "lp3": "Proszę ustawić jeden", @@ -163,8 +163,8 @@ "confirmlogout": "Czy na pewno chcesz się wylogować?" }, "fragfile": { - "selectfile": "Wybierz plik", - "dragfile": "Przeciągnij i upuść kopię zapasową tutaj" + "selectfile": "Wybierz plik kopii zapasowej", + "dragfile": "Przeciągnij i upuść lub kliknij tutaj, aby wybrać plik kopii zapasowej" }, "settings": { "generalinfo": "Ogólne informacje o koncie", @@ -203,17 +203,17 @@ "snack5": "Węzły pomyślnie zaimportowane", "snack6": "Pomyślnie usunięto węzeł niestandardowy", "snack7": "Pomyślnie edytowano węzeł niestandardowy", - "exp1": "Eksportuj prywatny klucz główny", + "exp1": "Eksportuj główny klucz prywatny (xpriv)", "exp2": "Eksportuj klucz główny", "exp3": "Eksportuj", "exp4": "Wybierz portfel do wykonania kopii zapasowej prywatnego klucza głównego.", - "core": "Uruchom podstawowe ustawienia", + "core": "Ustawienia automatycznego uruchamiania Qortal Core", "qappNotification1": "Powiadomienia Q-App", "selectnode": "Proszę wybrać opcję", "arrr1": "Portfel ARRR nie został zainicjowany!", - "arrr2": "Przejdź do zakładki portfela i najpierw zainicjalizuj swój portfel arrr.", + "arrr2": "Przejdź do Portfeli i uzyskaj dostęp do portfela ARRR, aby najpierw zainicjować portfel.", "arrr3": "Potrzebujesz aktualizacji rdzenia!", - "arrr4": "Aby zapisać klucz prywatny swojego portfela arrr, potrzebujesz najpierw aktualizacji rdzenia!", + "arrr4": "Aby zapisać klucz prywatny swojego portfela ARRR, musisz najpierw zaktualizować Qortal Core!", "sync_indicator": "Wyłącz wyskakujące okienko wskaźnika synchronizacji" }, "appinfo": { @@ -284,7 +284,7 @@ "startminting": { "smchange1": "Nie można pobrać kont menniczych", "smchange2": "Nie udało się usunąć klucza", - "smchange3": "Nie udało się dodać klucza bicia", + "smchange3": "Nie udało się dodać klucza Minting. Jeśli klucz został właśnie utworzony, spróbuj poczekać kilka bloków i dodać go ponownie", "smchange4": "Nie można utworzyć klucza sponsorowania", "smchange5": "Tworzenie relacji", "smchange6": "Oczekiwanie na potwierdzenie na blockchain", @@ -507,7 +507,7 @@ "nchange23": "Cena sprzedaży", "nchange24": "Brak nazw do sprzedania", "nchange25": "Nazwa do sprzedania", - "nchange26": "Czy na pewno chcesz sprzedać tę nazwę?", + "nchange26": "Czy na pewno chcesz sprzedać tę nazwę? Jeśli nazwa zostanie zakupiona przez inne konto, będzie to poza Twoją kontrolą!", "nchange27": "Za tę cenę w QORT", "nchange28": "Po naciśnięciu potwierdzenia zostanie wysłane zapytanie o nazwę sprzedaży!", "nchange29": "Nazwa do anulowania", diff --git a/core/language/pt.json b/core/language/pt.json index fa6da6c8..e7fbdc0c 100644 --- a/core/language/pt.json +++ b/core/language/pt.json @@ -80,7 +80,7 @@ "tm32": "Esta conta não segue nenhum usuário", "tm33": "Menu da Aba Importar", "tm34": "Menu da guia Exportar", - "tm35": "Seu menu de guia existente será excluído e definido como menu de guia carregado.", + "tm35": "Seu menu de guias existente será excluído e definido como menu de guias importado.", "tm36": "Menu de abas restaurado com sucesso", "tm37": "Menu da guia salvo com sucesso como", "tm38": "MODO DEV", @@ -98,42 +98,42 @@ "youraccounts": "Minhas Contas", "clickto": "Clique em sua conta para fazer o login", "needcreate": "Você precisa criar ou salvar uma conta antes de fazer o login", - "upload": "Carregue seu backup do Qortal", + "upload": "Importe seu arquivo de backup Qortal", "howlogin": "Como você gostaria de fazer o login?", "seed": "SeedPhrase", "seedphrase": "seedphrase", "saved": "Conta Salva", - "qora": "Endereço seed do Qora", - "backup": "Backup da carteira do Qortal", - "decrypt": "Desencriptar Backup", + "qora": "Endereço seed do QORA", + "backup": "Arquivo de backup Qortal", + "decrypt": "Descriptografar arquivo de backup", "save": "Salvar neste Navegador", - "prepare": "Preparando sua Conta", - "areyousure": "Tem certeza que deseja excluir esta carteira das carteiras salvas?", + "prepare": "Preparando sua Conta...", + "areyousure": "Tem certeza de que deseja remover esta conta das contas salvas? (Se for removida e não existir nenhum arquivo de backup, a conta poderá ser perdida para sempre! Certifique-se de ter um arquivo de backup antes de fazer isso!)", "error1": "Backup tem que ser um JSON valido", "error2": "Login opcional não selecionado", - "createwelcome": "Bem-vindo ao Qortal, você vai achar que é semelhante ao de um jogo de RPG, você, como um mineirador na rede Qortal (se você escolher se tornar um) terá a chance de prosperar com sua conta, dando-lhe tanto mais da recompensa do bloco QORT e também maior influência sobre a rede em termos de votação sobre decisões para a plataforma.", + "createwelcome": "Bem-vindo ao Qortal! Seu futuro digital descentralizado espera por você! Somente no Qortal você tem controle absoluto sobre seus dados. Qortal fornece o nível básico de um mundo digital novo e totalmente controlado pelo usuário.", "createa": "A", "click": "Clique para ver a SeedPhrase", "confirmpass": "Confirme sua Senha", - "willbe": "Será gerado aleatoriamente em segundo plano. Este é usado como seu gerador de chaves privada para sua conta blockchain no Qortal.", + "willbe": "Será gerado aleatoriamente em segundo plano. Se você deseja VER a frase-semente, clique na 'frase-semente' destacada neste texto. Ele é usado como gerador de chave privada para sua conta blockchain no Qortal. Por segurança, por padrão, as frases-chave não são exibidas, a menos que sejam especificamente escolhidas para serem.", "clicknext": "Crie sua conta no Qortal clicando em PRÓXIMO abaixo.", - "ready": "Sua conta está pronta para ser criada. Ela será salva neste navegador. Se você não deseja que sua nova conta seja salva no seu navegador, você pode desmarcar a caixa abaixo. Você ainda poderá fazer o login com sua nova conta (após o login), usando seu arquivo de backup de carteira que você deve baixar assim que criar sua conta.", + "ready": "Sua conta agora está pronta para ser criada. Ele será salvo nesta cópia da UI do Qortal por padrão, em formato criptografado. Se não quiser que sua nova conta seja salva aqui, você pode desmarcar a caixa abaixo. Você ainda poderá fazer login com sua nova conta (após sair), usando o arquivo de backup da carteira que você DEVE baixar depois de criar sua conta.", "welmessage": "Bem-vindo ao Qortal", "pleaseenter": "Por favor coloque sua senha!", "notmatch": "Senhas não correspondem!", "lessthen8": "Sua senha é menor que 5 caracteres! Isso não é recomendado. Você pode continuar e ignorar este aviso.", "lessthen8-2": "Sua senha é menor que 5 caracteres!", - "entername": "Por favor, digite um nome!", - "downloaded": "Seu arquivo Wallet BackUp é baixado!", + "entername": "Por favor insira um nome de exibição!", + "downloaded": "Seu arquivo Qortal Backup foi salvo!", "loading": "Carregando, por favor espere...", "createdseed": "Sua Seedphrase Criada", "saveseed": "Salvar Seedphrase", - "savein": "Salvar no Navegador", + "savein": "Salvar nesta IU", "backup2": "Este arquivo é a única forma de acessar sua conta em um sistema que não o tem salvo no aplicativo/navegador. CERTIFIQUE-SE DE FAZER BACKUP DESTE ARQUIVO EM VÁRIOS LUGARES. O arquivo é criptografado com muita segurança e descriptografado com sua senha local que você criou na etapa anterior. Você pode salvá-lo em qualquer lugar com segurança, mas certifique-se de fazer isso em vários locais.", - "savewallet": "Salvar Arquivo de BackUp da Carteira", + "savewallet": "Salvar arquivo de backup Qortal", "created1": "Sua conta foi Criada", - "created2": "e será salva neste navegador.", - "downloadbackup": "Baixe o Arquivo BackUp da Carteira", + "created2": " e salvo criptografado nesta UI Qortal.", + "downloadbackup": "Salvar arquivo de backup Qortal", "passwordhint": "Uma senha deve ter pelo menos 5 caracteres.", "lp1": "Tela de bloqueio", "lp2": "Nenhuma senha de tela de bloqueio foi definida!", @@ -164,7 +164,7 @@ }, "fragfile": { "selectfile": "Selecione Arquivo", - "dragfile": "Arrastar e soltar backup aqui" + "dragfile": "Arraste e solte ou clique aqui para selecionar o arquivo de backup" }, "settings": { "generalinfo": "Informações gerais da conta", @@ -181,7 +181,7 @@ "notifications": "Notificações", "accountsecurity": "Segurança da Conta", "password": "Senha", - "download": "Baixar Arquivo BackUp", + "download": "Exportar/Salvar arquivo de backup", "choose": "Por favor, escolha uma senha para criptografar seu backup. (Essa pode ser a mesma que você fez login, ou outra diferente)", "playsound": "Reproduzir som", "shownotifications": "Mostrar notificações", @@ -192,8 +192,8 @@ "protocol": "Protocolo", "domain": "Domínio", "port": "Portar", - "import": "Importar Nós", - "export": "Exportar Nós", + "import": "Importar nós salvos", + "export": "Exportar Nós salvos", "deletecustomnode": "Remover todos os nós personalizados", "warning": "Seus nós existentes serão excluídos e do backup será criado.", "snack1": "Nós padrão excluídos e adicionados com sucesso", @@ -203,17 +203,17 @@ "snack5": "Nós importados com sucesso", "snack6": "Nó personalizado removido com sucesso", "snack7": "Nó personalizado editado com sucesso", - "exp1": "Exportar Chave Mestra Privada", + "exp1": "Exportar chave privada mestra (xpriv)", "exp2": "Exportar Chave Mestra", "exp3": "Exportar", - "exp4": "Por favor, escolha uma carteira para fazer backup da chave mestra privada.", - "core": "Iniciar configurações do núcleo", + "exp4": "Por favor, escolha uma carteira para fazer backup da chave privada mestra.", + "core": "Configurações de inicialização automática do Qortal Core", "qappNotification1": "Notificações de Q-App", "selectnode": "Por favor selecione uma opção", "arrr1": "Carteira ARRR não inicializada!", - "arrr2": "Por favor, vá para a aba carteira e inicialize sua carteira arrr primeiro.", + "arrr2": "Por favor, vá para a guia carteira e acesse a carteira ARRR para inicializar a carteira primeiro.", "arrr3": "Precisa de atualização principal!", - "arrr4": "Para salvar a chave privada da sua carteira arrr você precisa primeiro de uma atualização principal!", + "arrr4": "Para salvar a chave privada da sua carteira ARRR você deve primeiro atualizar o Qortal Core!", "sync_indicator": "Desativar pop-up do indicador de sincronização" }, "appinfo": { @@ -283,8 +283,8 @@ }, "startminting": { "smchange1": "Não é possível buscar contas de cunhagem", - "smchange2": "Falha ao remover a chave", - "smchange3": "Falha ao adicionar chave de cunhagem", + "smchange2": "Falha ao remover a chave Minting", + "smchange3": "Falha ao adicionar a chave Minting, se a chave acabou de ser criada, tente esperar alguns blocos e adicionar novamente", "smchange4": "Não é possível criar a chave de patrocínio", "smchange5": "Criando relacionamento", "smchange6": "Aguardando confirmação no blockchain", @@ -507,7 +507,7 @@ "nchange23": "Preço de venda", "nchange24": "Sem nomes para vender", "nchange25": "Nome para vender", - "nchange26": "Tem certeza que vende este nome ?", + "nchange26": "Tem certeza de que deseja vender este nome? Se o nome for adquirido por outra conta, os dados publicados por esse nome não poderão ser editados por você!", "nchange27": "Por este preço em QORT", "nchange28": "Ao clicar em confirmar, a solicitação do nome de venda será enviada!", "nchange29": "Nome para Cancelar", diff --git a/core/language/ro.json b/core/language/ro.json index d085487f..c234b51f 100644 --- a/core/language/ro.json +++ b/core/language/ro.json @@ -80,7 +80,7 @@ "tm32": "Acest cont nu urmărește niciun utilizator", "tm33": "Meniu Filă Import", "tm34": "Meniu File Export", - "tm35": "Meniul de file existent va fi șters și setat la meniul de file încărcat.", + "tm35": "Meniul de file existent va fi șters și setat la meniul de file importat.", "tm36": "Meniul Tab a fost restaurat cu succes", "tm37": "Meniul Tab a fost salvat cu succes ca", "tm38": "MOD DEV", @@ -98,42 +98,42 @@ "youraccounts": "Conturile tale", "clickto": "Fa click pe Contul tau pentru a te conecta cu el", "needcreate": "Trebuie sa iti creezi sau sa salvezi un cont inainte de a te conecta!", - "upload": "Urca copia de siguranta Qortal", + "upload": "Importați fișierul de rezervă Qortal", "howlogin": "Cum doresti sa te conectezi?", "seed": "frazainitiala", "seedphrase": "frazainitiala", "saved": "Cont salvat", - "qora": "Adresa initiala Qora", - "backup": "Copia de siguranta a portofelului Qortal", - "decrypt": "Decriptare copie de siguranta", + "qora": "Adresa initiala QORA", + "backup": "Fișier de rezervă Qortal", + "decrypt": "Decriptați fișierul de rezervă", "save": "Salveaza in acest browser.", "prepare": "Se pregateste Contul tau", - "areyousure": "Sunteti sigur ca doriti sa eliminati acest portofel din portofelele salvate?", + "areyousure": "Sigur doriți să eliminați acest cont din conturile salvate? (Dacă este eliminat și nu există niciun fișier de rezervă, contul poate fi pierdut pentru totdeauna! Asigurați-vă că aveți un fișier de rezervă înainte de a face acest lucru!)", "error1": "Backup-ul trebuie sa fie JSON valid", "error2": "Optiunea de conectare nu este selectata", - "createwelcome": "Bine ai venit la Qortal, vei descoperi ca este similar cu un joc RPG, tu, ca minter in reteaua Qortal (daca alegi sa devii unul), vei avea sansa de a-ti creste nivelul contului tau, oferindu-ti deopotiva o recompensa mai mare din blocul QORT, cat si o influenta mai mare asupra retelei in ceea ce priveste votul asupra deciziilor pentru platforma.", + "createwelcome": "Bun venit la Qortal! Viitorul tău digital descentralizat te așteaptă! Dvs. și numai dvs. aveți control deplin asupra datelor dvs. de pe Qortal. Qortal oferă infrastructura unei lumi digitale noi și complet controlate de utilizator.", "createa": "A", "click": "Da click pentru a vedea fraza initiala", "confirmpass": "Confirma Parola", - "willbe": "va fi generata aleatoriu in fundal. Aceasta este utilizata ca generator de cheie privata pentru contul tau blockchain din Qortal.", + "willbe": "va fi generat aleatoriu în fundal. Dacă doriți să VEZI fraza inițială, faceți clic pe „fraza inițială” evidențiată în acest text. Acesta este folosit ca generator de chei private pentru contul blockchain din Qortal. Pentru securitate, în mod implicit, frazele de bază nu sunt afișate decât dacă sunt alese în mod special.", "clicknext": "Creaza-ti contul Qortal apasand butonul INAINTE.", - "ready": "Contul dvs. este acum gata sa fie creat. Acesta va fi salvat in acest browser. Daca nu doriti ca noul dvs. cont sa fie salvat in browserul dvs., puteti debifa caseta de mai jos. Veti putea in continuare sa va conectati cu noul dvs. cont (dupa ce va deconectati), utilizand fisierul de backup al portofelului pe care TREBUIE sa il descarcati dupa ce va creati contul.", + "ready": "Contul dvs. este acum gata pentru a fi creat. Acesta va fi salvat în această copie a Qortal UI în mod implicit, în formă criptată. Dacă nu doriți ca noul dvs. cont să fie salvat aici, puteți debifa caseta de mai jos. Veți putea în continuare să vă conectați cu noul cont (după deconectare), folosind fișierul de rezervă al portofelului, pe care TREBUIE să-l descărcați după ce vă creați contul.", "welmessage": "Bine ai venit in Qortal", "pleaseenter": "Te rog introdu o parola!", "notmatch": "Parola nu corespunde!", "lessthen8": "Parola ta are mai putin de 5 caractere! Acest lucru nu este recomandat. Poti continua sa ignori acest avertisment.", "lessthen8-2": "Parola ta are mai putin de 5 caractere!", - "entername": "Te rog introdu un Nume!", - "downloaded": "Copia de siguranta a portofelului este descarcata!", + "entername": "Vă rugăm să introduceți un nume afișat!", + "downloaded": "Fișierul dvs. Qortal Backup a fost salvat!", "loading": "Se incarca. Va rugam asteptati...", "createdseed": "Fraza initiala personala creata", "saveseed": "Salveaza fraza initiala", - "savein": "Salveaza in browser", - "backup2": "Acest fisier este SINGURA modalitate de a-ti accesa contul pe un sistem care nu il are salvat in aplicatie/browser. ASIGURA-TE CA FACI O COPIE DE REZERVA A ACESTUI FISIER IN MAI MULTE LOCURI. Fisierul este criptat foarte sigur si decriptat cu parola locala pe care ai creat-o in pasul anterior. Il poti salva oriunde in siguranta, dar asigura-te ca faci acest lucru in mai multe locatii.", - "savewallet": "Salveaza copia de siguranta a Portofelului", + "savein": "Salvați în această interfață de utilizare", + "backup2": "Acest fișier este SINGURA modalitate (în mod implicit) de a vă accesa contul, cu excepția cazului în care este salvat în UI. ASIGURAȚI-VĂ CĂ FACEȚI BACKUP ACEST FIȘIER ÎN MULTE LOCURI. Fișierul este criptat foarte sigur și decriptat cu parola dvs. locală pe care ați creat-o la pasul anterior. Îl puteți salva oriunde în siguranță, dar asigurați-vă că faceți acest lucru în mai multe locații.", + "savewallet": "Salvați fișierul de rezervă Qortal", "created1": "Contul tau este acum creat", - "created2": "si va fi salvat in acest browser.", - "downloadbackup": "Descarca copia de siguranta a Portofelului", + "created2": " și salvat în această interfață de utilizare în formă criptată.", + "downloadbackup": "Salvați fișierul Qortal BackUp", "passwordhint": "O parola trebuie sa aiba cel putin 5 caractere.", "lp1": "Ecran de blocare", "lp2": "Nu este setată nicio parolă pentru ecranul de blocare!", @@ -163,8 +163,8 @@ "confirmlogout": "Esti sigur ca vrei sa te deconectezi?" }, "fragfile": { - "selectfile": "Selecteaza fisier", - "dragfile": "Trage si elibereaza fisierul de backup aici" + "selectfile": "Selectați fișierul de rezervă", + "dragfile": "Trageți și plasați sau faceți clic aici pentru a selecta fișierul de rezervă" }, "settings": { "generalinfo": "Informatii generale despre cont", @@ -181,7 +181,7 @@ "notifications": "Notificari", "accountsecurity": "Securitatea contului", "password": "Parola", - "download": "Descarca copia de siguranta", + "download": "Exportați/Salvați fișierul de rezervă Qortal", "choose": "Va rugam sa alegeti o parola cu care sa va criptati copia de rezerva. (Aceasta poate fi aceeasi cu cea cu care v-ati logat sau diferita)", "playsound": "Redare sunet", "shownotifications": "Arata notificarile", @@ -192,8 +192,8 @@ "protocol": "Protocol", "domain": "Domeniu", "port": "Port", - "import": "Import Noduri", - "export": "Export Noduri", + "import": "Import Noduri salvate", + "export": "Export Noduri salvate", "deletecustomnode": "Eliminati toate nodurile personalizate", "warning": "Nodurile dvs. existente vor fi sterse si din backup vor fi create noi.", "snack1": "Noduri standard au fost sterse si adaugate cu succes", @@ -203,17 +203,17 @@ "snack5": "Nodurile au fost importate cu succes", "snack6": "Nodul personalizat a fost eliminat cu succes", "snack7": "Nodul personalizat a fost editat cu succes", - "exp1": "Exportați cheia principală privată", + "exp1": "Exportați cheia privată principală (xpriv)", "exp2": "Exportați cheia principală", "exp3": "Export", "exp4": "Vă rugăm să alegeți un portofel pentru a face backup cheii master private.", - "core": "Porniți setările de bază", + "core": "Setări Qortal de pornire automată", "qappNotification1": "Notificări Q-App", "selectnode": "Vă rugăm să selectați o opțiune", "arrr1": "Portoletul ARRR nu este inițializat !", - "arrr2": "Vă rugăm să accesați fila Portofel și să inițializați mai întâi portofelul arrr.", + "arrr2": "Accesați „Portofele” și accesați portofelul ARRR pentru a inițializa mai întâi portofelul", "arrr3": "Am nevoie de actualizare de bază !", - "arrr4": "Pentru a salva cheia privată a portofelului dvs. arrr, aveți nevoie mai întâi de o actualizare de bază !", + "arrr4": "Pentru a salva cheia privată a portofelului dvs. ARRR, trebuie mai întâi să actualizați Qortal Core!", "sync_indicator": "Dezactivați fereastra pop-up indicator de sincronizare" }, "appinfo": { @@ -283,8 +283,8 @@ }, "startminting": { "smchange1": "Nu se pot prelua conturile de batere", - "smchange2": "Cheia nu a fost eliminata", - "smchange3": "Nu s-a putut adauga cheia de batere", + "smchange2": "Nu s-a putut elimina cheia Minting", + "smchange3": "Nu s-a putut adăuga cheia de batere, dacă cheia tocmai a fost creată, încercați să așteptați câteva blocuri și să adăugați din nou", "smchange4": "Nu se poate crea cheia de sponsorizare", "smchange5": "Crearea unei relatii", "smchange6": "Se asteapta confirmarea pe blockchain", @@ -507,7 +507,7 @@ "nchange23": "Preț de vânzare", "nchange24": "Fără nume de vândut", "nchange25": "Nume de vândut", - "nchange26": "Sunteți sigur că veți vinde acest nume?", + "nchange26": "Ești sigur că vrei să vinzi acest nume? Dacă un alt utilizator cumpără numele, toate datele publicate după nume nu vor putea fi editate de dvs.!", "nchange27": "Pentru acest preț în QORT", "nchange28": "La apăsarea confirmării, cererea de nume de vânzare va fi trimisă!", "nchange29": "Nume de anulat", diff --git a/core/language/rs.json b/core/language/rs.json index 0ed10053..6b4e65fa 100644 --- a/core/language/rs.json +++ b/core/language/rs.json @@ -80,7 +80,7 @@ "tm32": "Ovaj nalog ne prati nijednog korisnika", "tm33": "Meni kartice za uvoz", "tm34": "Izvoz meni kartice", - "tm35": "Vaš postojeći meni kartica će biti obrisan i postavljen na meni za otpremljene kartice.", + "tm35": "Vaš postojeći meni kartica će biti izbrisan i postavljen na uvezeni meni kartica.", "tm36": "Meni kartice je uspešno vraćen", "tm37": "Meni kartice je uspešno sačuvan kao", "tm38": "DEV MODE", @@ -98,26 +98,26 @@ "youraccounts": "Tvoji nalozi", "clickto": "Kliknite na nalog sa kojim želite da se prijavite", "needcreate": "Morate napraviti ili sačuvati nalog pre mogućnosti prijavljivanja!", - "upload": "Ubacite vašu rezervnu kopiju Qortala", + "upload": "Uvezite Qortal datoteku rezervne kopije", "howlogin": "Kako bi ste želeli da se prijavite?", "seed": "Semenska fraza", "seedphrase": "semenskafraza", "saved": "Sačuvani nalog", - "qora": "Seme Qora adrese", + "qora": "Seme QORA adrese", "backup": "Rezervna kopija Qortal novčanika", "decrypt": "Dešifrovanje rezervne kopije", "save": "Sačuvajte u ovom pretraživaču.", "prepare": "Vaš Nalog se priprema", - "areyousure": "Da li ste sigurni da želite da izbrišete ovaj novčanik sa liste sačuvanih novčanika?", + "areyousure": "Da li ste sigurni da želite da uklonite ovaj nalog sa sačuvanih naloga? (Ako se ukloni i ne postoji datoteka rezervne kopije, nalog bi mogao biti izgubljen zauvek! Uverite se da imate rezervnu datoteku pre nego što to uradite!)", "error1": "Rezervna kopija mora biti ispravan JSON", "error2": "Opcija za prijavljivanje nije izabrana", - "createwelcome": "Dobrodošli u Qortal, koji možete posmatrati kao RPG igru, gde ćete vi, kao minter na Qortal mreži (ako odlučite to postati) imati priliku da unapredite (izlevelujete) vaš nalog, i time steknete priliku da dobijate sve veću QORT nagradu po bloku, kao i veći uticaj na samoj platformi, kroz glasanje o raznim odlukama.", + "createwelcome": "Dobrodošli u Qortal! Vaša decentralizovana digitalna budućnost vas čeka! Na Qortal-u vi i samo vi imate apsolutnu kontrolu nad svojim podacima. Qortal obezbeđuje infrastrukturu novog i potpuno individualno kontrolisanog digitalnog sveta!", "createa": "A", "click": "Kliknite ovde da biste videli semensku frazu", "confirmpass": "Potvrdite Lozinku", - "willbe": "Biće nasumično generisano u pozadini. Ovo je generator ličnog ključa za vaš blockchain nalog u Qortalu.", + "willbe": "će se nasumično generisati u pozadini. Ako želite da POGLEDATE početnu frazu, kliknite na označenu 'seedphrase' u ovom tekstu. Ovo se koristi kao generator privatnih ključeva za vaš blockchain nalog u Kortalu. Zbog bezbednosti se podrazumevano, seedphrase ne prikazuju osim ako nije posebno izabrano", "clicknext": "Napravite vaš Qortal nalog klikom na dugme DALJE ispod.", - "ready": "Pravljenje vašeg naloga je spremno. Biće sačuvano u ovom pretraživaču. Ako ne želite da se vaš nov nalog sačuva u ovom pretraživaču, odčekirajte polje ispod. I dalje ćete moći da se prijavite sa vašim novim nalogom (posle odjavljivanja), korišćenjem datoteke sa rezervnom kopijom, koju MORATE skinuti čim napravite nalog.", + "ready": "Vaš nalog je sada spreman za kreiranje. Podrazumevano će biti sačuvan u ovoj kopiji Qortal korisničkog interfejsa, u šifrovanom obliku. Ako ne želite da vaš novi nalog bude sačuvan ovde, možete da opozovete izbor u polju za potvrdu ispod. I dalje ćete moći da se prijavite sa svojim novim nalogom (nakon odjavljivanja), koristeći rezervnu datoteku novčanika koju MORATE da preuzmete kada kreirate nalog.", "welmessage": "Dobrodošli u Qortal", "pleaseenter": "Molim vas ukucajte lozinku!", "notmatch": "Lozinke se ne podudaraju!", @@ -181,7 +181,7 @@ "notifications": "Notifikacije", "accountsecurity": "Bezbednost Naloga", "password": "Lozinka", - "download": "Skinite Datoteku Rezervne kopije", + "download": "Izvezi/Sačuvaj datoteku rezervne kopije", "choose": "Molim vas izaberite lozinku sa kojom ćete šifrovati rezervnu kopiju. (Ovo može biti ista lozinka sa kojom se prijavljujete, a može biti i različita)", "playsound": "Pustite Zvuk", "shownotifications": "Prikažite notifikacije", @@ -192,8 +192,8 @@ "protocol": "Protokol", "domain": "Domena", "port": "Port", - "import": "Uvoz Čvorova", - "export": "Izvoz Čvorova", + "import": "Uvoz sačuvane Čvorova", + "export": "Izvoz sačuvane Čvorova", "deletecustomnode": "Uklonite sve prilagođene čvorove", "warning": "Vaši postojeći čvorovi će biti izbrisani, a iz rezervne kopije biće stvoreni novi.", "snack1": "Uspešno su izbrisani i dodati standardni čvorovi", @@ -207,11 +207,11 @@ "exp2": "Izvezi glavni ključ", "exp3": "Izvoz", "exp4": "Molimo izaberite novčanik za rezervnu kopiju privatnog glavnog ključa.", - "core": "Pokreni podešavanja jezgra", + "core": "Qortal podešavanja automatskog pokretanja", "qappNotification1": "Obaveštenja o Q-App", "selectnode": "Izaberite opciju", "arrr1": "ARRR novčanik nije inicijalizovan!", - "arrr2": "Molim vas idite na karticu Novčanik i prvo inicijalizujte svoj arrr novčanik.", + "arrr2": "Idite na karticu 'Vallets' i pristupite ARRR novčaniku da biste prvo inicijalizovali novčanik.", "arrr3": "Potrebno je ažuriranje jezgra!", "arrr4": "Da biste sačuvali privatni ključ vašeg arrr novčanika, prvo vam je potrebno ažuriranje jezgra!", "sync_indicator": "Onemogući iskačući prozor indikatora sinhronizacije" @@ -283,8 +283,8 @@ }, "startminting": { "smchange1": "Nije moguće preuzeti naloge za kovanje", - "smchange2": "Uklanjanje ključa nije uspelo", - "smchange3": "Dodavanje ključa za kovanje nije uspelo", + "smchange2": "Nije uspelo uklanjanje ključa za kovanje", + "smchange3": "ako je ključ upravo kreiran, pokušajte da sačekate nekoliko blokova i ponovo dodate", "smchange4": "Nije moguće kreirati sponzorski ključ", "smchange5": "Stvaranje odnosa", "smchange6": "Čeka se potvrda na blokčejnu", @@ -507,7 +507,7 @@ "nchange23": "Cena prodaje", "nchange24": "Nema imena za prodaju", "nchange25": "Ime za prodaju", - "nchange26": "Da li ste sigurni da prodajete ovo ime?", + "nchange26": "Da li ste sigurni da želite da prodate ovo ime? Ako ime kupi drugi nalog, ono će biti van vaše kontrole!", "nchange27": "Za ovu cenu u KORT", "nchange28": "Pritiskom na potvrdu, zahtev za ime prodaje će biti poslat!", "nchange29": "Ime za otkazivanje", diff --git a/core/language/ru.json b/core/language/ru.json index 156aee90..747afb64 100644 --- a/core/language/ru.json +++ b/core/language/ru.json @@ -108,14 +108,14 @@ "decrypt": "Расшифровать резервную копию", "save": "Сохранить в приложении", "prepare": "Подготовка вашей учетной записи", - "areyousure": "Вы уверены, что хотите удалить этот кошелек из сохраненных кошельков?", + "areyousure": "Вы уверены, что хотите удалить эту учетную запись из сохраненных учетных записей? (Если удалить и файл резервной копии не существует, учетная запись может быть потеряна навсегда! Прежде чем делать это, убедитесь, что у вас есть файл резервной копии!)", "error1": "Резервная копия должна быть в формате JSON", "error2": "Вариант входа не выбран", - "createwelcome": "Добро пожаловать в Qortal! Это чем-то похоже на ролевую игру, в которой вы, как минтер в сети Qortal (если вы решите им стать), будете иметь возможность повысить уровень учетной записи, что повысит долю вашего вознаграждения за каждый блок QORT, а также даст вам больше влияния на сеть, посредством голосования по предложениям для платформы.", + "createwelcome": "Добро пожаловать в Qortal! Ваше децентрализованное цифровое будущее ждет вас! Только на Qortal вы имеете абсолютный контроль над своими данными. Qortal обеспечивает базовый уровень нового, полностью контролируемого пользователем цифрового мира.", "createa": "A", "click": "Нажмите, чтобы просмотреть seed-фразу", "confirmpass": "Подтвердите пароль", - "willbe": "Будет генерироваться случайным образом в фоновом режиме для использования в качестве генератора приватного ключа от вашей учетной записи в блокчейне Qortal.", + "willbe": "будет генерироваться случайным образом в фоновом режиме. Если вы хотите ПРОСМОТРЕТЬ исходную фразу, щелкните выделенную «начальную фразу» в этом тексте. Он используется в качестве генератора закрытых ключей для вашей учетной записи блокчейна в Qortal. В целях безопасности по умолчанию начальные фразы не отображаются, если это специально не выбрано.", "clicknext": "Создайте учетную запись Qortal, нажав кнопку ДАЛЕЕ ниже.", "ready": "Теперь ваша учетная запись готова к созданию. Она будет сохранена в этом приложении. Если вы не хотите, чтобы ваша новая учетная запись сохранялась в приложении, вы можете снять флажок ниже. Вы по-прежнему сможете войти в свою новую учетную запись (после выхода), используя файл резервной копии вашего кошелька, который вам НЕООБХОДИМО скачать после создания учетной записи.", "welmessage": "Добро пожаловать в Qortal", @@ -132,8 +132,8 @@ "backup2": "Этот файл является ЕДИНСТВЕННЫМ способом доступа к вашей учетной записи в системе, в которой он не сохранен в приложении/браузере. ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ ЭТОГО ФАЙЛА В НЕСКОЛЬКИХ МЕСТАХ. Файл очень надежно зашифрован и расшифровывается с помощью вашего локального пароля, который вы создали на предыдущем шаге. Вы можете безопасно сохранить его в любом месте, но не забудьте сделать это в нескольких местах.", "savewallet": "Сохранить файл резервной копии кошелька", "created1": "Ваша учетная запись создана", - "created2": "и будет сохранено в этом приложении.", - "downloadbackup": "Скачать файл резервной копии кошелька", + "created2": " и сохраняется в этом интерфейсе в зашифрованном виде", + "downloadbackup": "Сохранить файл резервной копии Qortal", "passwordhint": "Пароль должен быть не менее 5 символов.", "lp1": "Экран блокировки", "lp2": "Пароль блокировки экрана не установлен!", @@ -181,7 +181,7 @@ "notifications": "Уведомления", "accountsecurity": "Сгенерировать QR-код для входа", "password": "Пароль", - "download": "Загрузить файл резервной копии", + "download": "Экспортировать/сохранить файл резервной копии Qortal", "choose": "Пожалуйста, выберите пароль для шифрования вашей резервной копии. (Это может быть тот же пароль, с которым вы вошли в систему, или другой)", "playsound": "Воспроизвести звук", "shownotifications": "Показать уведомления", @@ -207,13 +207,13 @@ "exp2": "Экспорт мастер-ключа", "exp3": "Экспорт", "exp4": "Пожалуйста, выберите кошелек для резервного копирования приватного главного ключа.", - "core": "Начать основные настройки", + "core": "Настройки автозапуска Qortal", "qappNotification1": "Уведомления Q-App", "selectnode": "Пожалуйста, выберите вариант", "arrr1": "Кошелек ARRR не инициализирован!", - "arrr2": "Пожалуйста, перейдите на вкладку кошелька и сначала инициализируйте свой кошелек arrr.", + "arrr2": "Пожалуйста, перейдите на вкладку кошелька и получите доступ к кошельку ARRR, чтобы сначала инициализировать кошелек.", "arrr3": "Требуется обновление ядра!", - "arrr4": "Чтобы сохранить закрытый ключ вашего кошелька arrr, вам сначала необходимо обновить ядро!", + "arrr4": "Чтобы сохранить закрытый ключ вашего ARRR-кошелька, вам необходимо сначала обновить Qortal Core!", "sync_indicator": "Отключить всплывающее окно индикатора синхронизации" }, "appinfo": { @@ -284,7 +284,7 @@ "startminting": { "smchange1": "Не удается получить учетные записи минтинга", "smchange2": "Не удалось удалить ключ", - "smchange3": "Не удалось добавить ключ минтинга", + "smchange3": "Не удалось добавить ключ минтинга, если ключ был только что создан, попробуйте подождать несколько блоков и добавить еще раз.", "smchange4": "Не удается создать спонсорский ключ", "smchange5": "Создание отношений", "smchange6": "Ожидание подтверждения на блокчейне", @@ -507,7 +507,7 @@ "nchange23": "Цена продажи", "nchange24": "Нет имен для продажи", "nchange25": "Имя для продажи", - "nchange26": "Вы уверены, что продаете это имя?", + "nchange26": "Вы уверены, что хотите продать это имя? Если имя будет куплено другой учетной записью, это будет вне вашего контроля!", "nchange27": "По этой цене в QORT", "nchange28": "При нажатии подтверждения будет отправлен запрос на продажу имени!", "nchange29": "Имя для отмены", diff --git a/core/language/us.json b/core/language/us.json index 203007d9..0918d5c3 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -38,7 +38,7 @@ "qchat": "Q-CHAT", "groupmanagement": "GROUP MANAGEMENT", "puzzles": "PUZZLES", - "nodemanagement": "NODE MANAGEMENT", + "Nodemanagement": "Node MANAGEMENT", "trading": "TRADING", "groups": "GROUPS", "sm1": "NAMES", @@ -48,7 +48,7 @@ "tabmenu": { "tm1": "Minting Details", "tm2": "Become a Minter", - "tm3": "Sponsorship List", + "tm3": "Sponsorship", "tm4": "Wallets", "tm5": "Trade Portal", "tm6": "Auto Buy", @@ -92,13 +92,13 @@ "login": { "login": "Log In", "createaccount": "Create Account", - "name": "Display Name", + "name": "Name", "address": "Address", "password": "Password", "youraccounts": "Your accounts", "clickto": "Click account to login", "needcreate": "You need to create or save an account before you can log in!", - "upload": "Upload your Qortal backup file", + "upload": "Import your Qortal backup file", "howlogin": "How would you like to log in?", "seed": "Seedphrase", "seedphrase": "seedphrase", @@ -111,30 +111,30 @@ "areyousure": "Are you sure you want to remove this wallet from saved wallets? (If removed and no backup file exists, account could be lost forever! Ensure you have a backup file before doing this!)", "error1": "Backup file must be valid JSON", "error2": "Login option not selected", - "createwelcome": "Welcome to Qortal! Your decentralized digital future awaits you! On Qortal only you have absolute control over your data. Qortal provides the base level of a new, and fully user-controlled digital world.", + "createwelcome": "Welcome to Qortal! Your decentralized digital future awaits you! On Qortal, you and ONLY you have absolute control over your data. Qortal provides the base level of a new, and fully user-controlled digital world!", "createa": "A", "click": "Click to view seedphrase", "confirmpass": "Confirm Password", - "willbe": "will be randomly generated in the background. If you wish to VIEW the seedphrase, click the highlighted 'seedphrase' in this text. This is used as your private key generator for your blockchain account in Qortal. For security by default, seedphrases are not displayed unless specifically chosen to be.", + "willbe": "will be randomly generated in the background. If you wish to VIEW the seedphrase, click the word 'seedphrase' in this text. Seedphrases are used to generate the private key for your Qortal account. For security by default, seedphrases are NOT displayed unless specifically chosen.", "clicknext": "Create your Qortal account by clicking NEXT below.", - "ready": "Your account is now ready to be created. It will be saved within this copy of the Qortal UI by default, in encrypted form. If you do not want your new account to be saved herein, you may uncheck the box below. You will still be able to log in with your new account (after logging out), using your wallet backup file that you MUST download once you create your account.", + "ready": "Your account is now ready to be created. It will be SAVED AND ENCRYPTED within this copy of the Qortal UI by default. If you do NOT wish for it to be saved, UNCHECK the box below. You are always able to access your new account using the Qortal BACKUP FILE that MUST be SAVED upon account creation.", "welmessage": "Welcome to Qortal", "pleaseenter": "Please enter a Password!", "notmatch": "Oops! Passwords do not match! Try again!", - "lessthen8": "Your password is less than 5 characters! This is not recommended. Clicking continue will ignore this warning.", + "lessthen8": "Your password is less than 5 characters! This is not recommended. To continue anyway, click CONTINUE.", "lessthen8-2": "Your password is less than 5 characters!", "entername": "Please enter a Display Name!", - "downloaded": "Your Wallet Backup file was saved!", + "downloaded": "Your Qortal Backup File was saved!", "loading": "Loading, Please wait...", "createdseed": "Your created Seedphrase:", "saveseed": "Save Seedphrase", "savein": "Save in this UI", - "backup2": "This file is the ONLY way (by default) to access your account unless saved to the UI. BE SURE TO BACKUP THIS FILE IN MULTIPLE PLACES. The file is encrypted very securely and decrypted with your local password you created in the previous step. You can save it anywhere securely, but be sure to do that in multiple locations.", - "savewallet": "Save Wallet Backup File", + "backup2": "This file is the ONLY way (by default) to access your account (unless saved to the UI). BE SURE TO BACKUP THIS FILE IN MULTIPLE LOCATIONS. The file is ENCRYPTED very securely (and decrypted) with your local password created in the previous step. You can save the file anywhere securely, but be sure to do so in multiple places.", + "savewallet": "Save Qortal Backup File", "created1": "Your account is now created", "created2": " and saved in this UI in encrypted form.", - "downloadbackup": "Save Wallet BackUp File", - "passwordhint": "Password must be at least 5 characters.", + "downloadbackup": "Save Qortal Backup File", + "passwordhint": "Encryption password must be at least 5 characters.", "lp1": "Lock Screen", "lp2": "No screen lock password is set!", "lp3": "Please set one", @@ -163,8 +163,8 @@ "confirmlogout": "Are you sure you want to log out?" }, "fragfile": { - "selectfile": "Select backup file", - "dragfile": "Drag and drop or click here to select backup file" + "selectfile": "Select Backup File", + "dragfile": "Drag and drop or CLICK HERE to select Backup File" }, "settings": { "generalinfo": "General Account Info", @@ -174,42 +174,42 @@ "account": "Account", "security": "Security", "qr_login_menu_item": "QR Login", - "qr_login_description_1": "Scan this code to save your wallet on another device using the same password that you logged in with.", - "qr_login_description_2": "Choose a password which you will use to unlock your wallet on another device after scanning the QR code.", + "qr_login_description_1": "Scan this code to save your wallet on another device using the same password currently logged in with.", + "qr_login_description_2": "Choose a password to unlock your wallet on another device after scanning QR code.", "qr_login_button_1": "Show login QR code", "qr_login_button_2": "Generate login QR code", "notifications": "Notifications", "accountsecurity": "Account Security", "password": "Password", "download": "Export/Save Backup File", - "choose": "Please choose a password to encrypt your backup file. (This can be the same as the one you logged in with, or a new one.)", + "choose": "Please input a password to encrypt your backup file. (This can be the same as the one you logged in with, or a new one.)", "playsound": "Play Sound", "shownotifications": "Show Notifications", - "nodeurl": "Node Url", - "nodehint": "Select a node from the default list, or add a custom node to the list by clicking on the button below", - "addcustomnode": "Add Custom Node", + "Nodeurl": "Node Url", + "Nodehint": "Select a Node from the default list, or add a custom Node to the list by clicking on the button below", + "addcustomNode": "Add Custom Node", "addandsave": "Add and Save", "protocol": "Protocol", "domain": "Domain", "port": "Port", "import": "Import Saved Nodes", "export": "Export Saved Nodes", - "deletecustomnode": "Remove All Custom Nodes", - "warning": "Your existing nodes will be deleted and reset to default.", - "snack1": "Successfully deleted and added default nodes", - "snack2": "UI conected to node", - "snack3": "Successfully added and saved custom node", - "snack4": "Nodes successfully saved as", + "deletecustomNode": "REMOVE ALL Custom Nodes", + "warning": "Your Custom Nodes will be deleted and reset to default.", + "snack1": "Successfully deleted and added default Nodes", + "snack2": "UI conected to Node:", + "snack3": "Successfully ADDED and saved Custom Node (select from drop-down to use)", + "snack4": "Nodes successfully exported as:", "snack5": "Nodes successfully imported", - "snack6": "Successfully removed custom node", - "snack7": "Successfully edited custom node", + "snack6": "Successfully removed Custom Node", + "snack7": "Successfully edited Custom Node", "exp1": "Export Master Private Key (xpriv)", "exp2": "Export Master Key", "exp3": "Export", - "exp4": "Please choose a wallet to backup master private key.", + "exp4": "Please select a wallet to backup/export master private key.", "core": "Core auto-start settings", "qappNotification1": "Q-App Notifications", - "selectnode": "Please select an option", + "selectNode": "Please select an option", "arrr1": "ARRR Wallet Not Initialized!", "arrr2": "Please go to wallet tab and access ARRR wallet to initialize wallet first.", "arrr3": "Need Core Update !", @@ -276,22 +276,22 @@ "gchange23": "Your gif collection cannot contain two gifs with the same name!", "gchange24": "This collection name is already taken. Try another name!", "gchange25": "GIF (click to view)", - "gchange26": "A name is needed to access and send GIF files", + "gchange26": "Registered Name required to access and send GIF files", "gchange27": "The gif collection size is over 25mb! Please try again!", "gchange28": "Each gif in the collection cannot be over 0.7mb! Please try again!", "gchange29": "Filename" }, "startminting": { - "smchange1": "Cannot fetch minting accounts", - "smchange2": "Failed to remove minting key", - "smchange3": "Failed to add minting key, if key was just created try waiting a few blocks and adding again", - "smchange4": "Cannot create sponsorship key", + "smchange1": "Cannot fetch Minting Accounts", + "smchange2": "Failed to remove Minting Key", + "smchange3": "Failed to add Minting Key, if key was just created try waiting a few blocks and adding again", + "smchange4": "Cannot create Key (Keys can only be created once!)", "smchange5": "Creating relationship", "smchange6": "Awaiting confirmation on blockchain", - "smchange7": "Finishing up relationship", - "smchange8": "Adding minting key to node", + "smchange7": "Finishing up...", + "smchange8": "Adding Minting Key to Node", "smchange9": "Complete", - "smchange10": "Only 2 minting keys are allowed per node, you are attempting to assign 3 keys, please go to Node Management, and remove any unnecessary keys, thank you!" + "smchange10": "Only 2 Minting Keys are allowed per Node, you are attempting to assign 3 keys, please go to Node Management, and remove any unnecessary keys, thank you!" }, "mintingpage": { "mchange1": "General Minting Details", @@ -311,7 +311,7 @@ "mchange15": "Current Status", "mchange16": "Current Level", "mchange17": "Blocks To Next Level", - "mchange18": "If you continue minting 24/7 you will reach level", + "mchange18": "If you continue Minting 24/7 you will reach level", "mchange19": "Minting Rewards Info", "mchange20": "Current Tier", "mchange21": "Total Minters in The Tier", @@ -327,17 +327,17 @@ "mchange31": "Press for help", "mchange32": "Become A Minter", "mchange33": "Introduction", - "mchange34": "In Qortal, in order to become a minter and begin earning QORT rewards with your increase in Minter Level, you must first become ‘sponsored’. A sponsor in Qortal is any other minter of level 5 or higher, or a Qortal Founder. You will obtain a minting key from the sponsor, and use that key to get to level 1. Once you have reached level 1, you will be able to create your own minting key and start earning rewards for helping secure the Qortal Blockchain.", + "mchange34": "In Qortal, in order to become a Minter and begin earning QORT rewards with your increase in Minter Level, you must first obtain a tamporary Key called a 'Sponsorship Key'. A Sponsor in Qortal is any other minter of level 5 or higher, or a Qortal Founder. You will obtain a Minting Key from the Sponsor, and use that key to get to level 1. Once you have reached level 1, you will be able to create your own Minting Key and start earning rewards for helping secure the Qortal Blockchain.", "mchange35": "Sponsorship", - "mchange36": "Your sponsor will issue you a ‘Minting Key’ which you will use to add to your node, and begin minting (for no rewards until reaching level 1.) Once you reach level 1, you create/assign your own ‘Minting Key’ and begin earning rewards.", - "mchange37": "Simply reach out to a minter in Qortal who is high enough level to issue a minting key, obtain that key, then come back here and input the key to begin your minting journey!", + "mchange36": "Your Sponsor will issue you a ‘Sponsorship Key’ which you will use to add to your Node, and begin minting for no rewards (until reaching level 1.) Once you reach level 1, you create/assign your own ‘Minting Key’ and begin earning rewards.", + "mchange37": "Simply reach out to a Minter in Qortal who is high enough level to issue a Minting Key, obtain that key, then come back here and input the key to begin your minting journey!", "mchange38": "in" }, "becomeMinterPage": { "bchange7": "Enter Minting Key", "bchange8": "Input key from your sponsor here", "bchange10": "Current Sponsorship Status", - "bchange12": "Minting with sponsor's key", + "bchange12": "Minting with Sponsorship Key", "bchange13": "Blocks Remaining in Sponsorship Period", "bchange15": "Sponsorship Relationship", "bchange16": "Sponsor Account", @@ -440,17 +440,17 @@ "tchange31": "SOLD", "tchange32": "BOUGHT", "tchange33": "Average", - "tchange34": "Amount can not be 0", - "tchange35": "Price can not be 0", + "tchange34": "Amount cannot be 0", + "tchange35": "Price cannot be 0", "tchange36": "PENDING AUTO BUY", - "tchange37": "No auto buy order found!", + "tchange37": "No Auto Buy order found!", "tchange38": "ADD", "tchange39": "AUTO BUY ORDER", "tchange40": "Price", - "tchange41": "Successfully removed auto buy order!", + "tchange41": "Successfully removed Auto Buy order!", "tchange42": "MARKET OPEN SELL ORDERS", "tchange43": "MY BUY HISTORY", - "tchange44": "Successfully added auto buy order!", + "tchange44": "Successfully added Auto Buy order!", "tchange45": "AUTO BUY WITH", "tchange46": "AUTO BUY", "tchange47": "Sell for this price", @@ -458,8 +458,8 @@ "tchange49": "Price Chart" }, "rewardsharepage": { - "rchange1": "Rewardshares", - "rchange2": "Create reward share", + "rchange1": "Reward Shares", + "rchange2": "Create Reward Share", "rchange3": "Rewardshares Involving This Account", "rchange4": "Minting Account", "rchange5": "Share Percent", @@ -468,12 +468,12 @@ "rchange8": "Type", "rchange9": "Levels 1 - 4 can only create a Self-Share (minting) keys. Only Level 5 or above can create a Reward Share!", "rchange10": "Recipient's Public Key", - "rchange11": "Reward share percentage", - "rchange12": "Executing requested command", - "rchange13": "Adding minting account", + "rchange11": "Reward Share percentage", + "rchange12": "Executing requested command...", + "rchange13": "Adding Minting Account", "rchange14": "Add", - "rchange15": "Account is not involved in any reward shares", - "rchange16": "Own Rewardshare", + "rchange15": "Account is not involved in any Reward Shares", + "rchange16": "Create Minting Key", "rchange17": "Remove", "rchange18": "Cannot Create Multiple Reward Shares!", "rchange19": "Cannot Create Multiple Self Shares!", @@ -507,29 +507,29 @@ "nchange23": "Sell Price", "nchange24": "No Names To Sell", "nchange25": "Name To Sell", - "nchange26": "Are you sure you want to sell this name? If name is purchased by another account it will be out of your control!", + "nchange26": "Are you sure you want to sell this name? If Name is purchased by another account, all data Published by this Name will be out of your control!", "nchange27": "For this price in QORT", - "nchange28": "On pressing confirm, your name will be listed for sale!", + "nchange28": "On pressing confirm, your Name will be listed for sale!", "nchange29": "Name To Cancel", - "nchange30": "Are you sure to cancel the sell for this name?", - "nchange31": "On pressing confirm, the name sale will be canceled!", + "nchange30": "Are you sure to cancel the sell for this Name?", + "nchange31": "On pressing confirm, the Name Sale will be canceled!", "nchange32": "Sell Name Request Successful!", "nchange33": "Cancel Sell Name Request Successful!", "nchange34": "Buy Name Request Successful!", "nchange35": "YOU HAVE A NAME!", - "nchange36": "Only accounts with no registered name can buy a name.", + "nchange36": "Only accounts with no Registered Name can buy a Name.", "nchange37": "ATTENTION!", - "nchange38": "You not have enough QORT to buy this name.", - "nchange39": "Are you sure to buy this name?", - "nchange40": "On pressing confirm, the buy name request will be sent!", + "nchange38": "You not have enough QORT to buy this Name.", + "nchange39": "Are you sure to buy this Name?", + "nchange40": "On pressing confirm, the Buy Name request will be sent!", "nchange41": "Old Name", "nchange42": "New Name", "nchange43": "Are you sure to change this name?", "nchange44": "To the new name", - "nchange45": "On pressing confirm, the name update request will be sent!", + "nchange45": "On pressing confirm, the Update Name request will be sent!", "nchange46": "Name Sale History", "nchange47": "Name Update Successful!", - "nchange48": "Warning! If you update your name, you will forfeit the resources associated with the original name. In other words, you will lose ownership of the content under the original name in the QDN. Proceed with caution!" + "nchange48": "Warning! If you update your Name, you will forfeit the resources associated with the original Name. In other words, you will lose ownership of the content under the original Name on QDN. Proceed with caution!" }, "websitespage": { "schange1": "Browse Websites", @@ -538,7 +538,7 @@ "schange4": "Search Websites", "schange5": "Avatar", "schange6": "Details", - "schange7": "Published by", + "schange7": "Published by:", "schange8": "Actions", "schange9": "Websites", "schange10": "No websites available", @@ -549,14 +549,14 @@ "schange15": "Blocked Websites", "schange16": "You have not blocked any websites", "schange17": "Name Not Found!", - "schange18": "Relay mode is enabled. This means that your node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting", + "schange18": "Relay Mode is ENABLED. This means that your Node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting:", "schange19": "in", - "schange20": "Relay mode is disabled. You can enable it by setting", + "schange20": "Relay mode is DISABLED. You can enable it by setting:", "schange21": "Publish Website", - "schange22": "Error occurred when trying to follow this registered name. Please try again!", - "schange23": "Error occurred when trying to unfollow this registered name. Please try again!", - "schange24": "Error occurred when trying to block this registered name. Please try again!", - "schange25": "Error occurred when trying to unblock this registered name. Please try again!", + "schange22": "Error occurred when trying to follow this Registered Name. Please try again!", + "schange23": "Error occurred when trying to unfollow this Registered Name. Please try again!", + "schange24": "Error occurred when trying to block this Registered Name. Please try again!", + "schange25": "Error occurred when trying to unblock this Registered Name. Please try again!", "schange26": "Uncategorized", "schange27": "Size", "schange28": "Status", @@ -586,14 +586,14 @@ "schange15": "Blocked Q-Apps", "schange16": "You have not blocked any Q-Apps", "schange17": "Name Not Found!", - "schange18": "Relay mode is enabled. This means that your node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting", + "schange18": "Relay mode is enabled. This means that your Node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting", "schange19": "in", "schange20": "Relay mode is disabled. You can enable it by setting", "schange21": "Publish Q-App", - "schange22": "Error occurred when trying to follow this registered name. Please try again!", - "schange23": "Error occurred when trying to unfollow this registered name. Please try again!", - "schange24": "Error occurred when trying to block this registered name. Please try again!", - "schange25": "Error occurred when trying to unblock this registered name. Please try again!", + "schange22": "Error occurred when trying to follow this Registered Name. Please try again!", + "schange23": "Error occurred when trying to unfollow this Registered Name. Please try again!", + "schange24": "Error occurred when trying to block this Registered Name. Please try again!", + "schange25": "Error occurred when trying to unblock this Registered Name. Please try again!", "schange26": "Uncategorized", "schange27": "Size", "schange28": "Status", @@ -602,7 +602,7 @@ "schange31": "Block", "schange32": "Unblock", "schange33": "Name to search", - "schange34": "Name can not be empty!", + "schange34": "Name cannot be empty!", "schange35": "Search", "schange36": "Download", "schange37": "Downloaded", @@ -631,14 +631,14 @@ "schange15": "Blocked Q-Tubes", "schange16": "You have not blocked any Q-Tubes", "schange17": "Name Not Found!", - "schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting", + "schange18": "Relay Mode is ENABLED. This means that your Node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting:", "schange19": "in", - "schange20": "Relay mode is disabled. You can enable it by setting", + "schange20": "Relay mode is DISABLED. You can enable it by setting:", "schange21": "Publish Video", - "schange22": "Error occurred when trying to follow this registered name. Please try again!", - "schange23": "Error occurred when trying to unfollow this registered name. Please try again!", - "schange24": "Error occurred when trying to block this registered name. Please try again!", - "schange25": "Error occurred when trying to unblock this registered name. Please try again!", + "schange22": "Error occurred when trying to follow this Registered Name. Please try again!", + "schange23": "Error occurred when trying to unfollow this Registered Name. Please try again!", + "schange24": "Error occurred when trying to block this Registered Name. Please try again!", + "schange25": "Error occurred when trying to unblock this Registered Name. Please try again!", "schange26": "Uncategorized", "schange27": "Size", "schange28": "Status", @@ -661,7 +661,7 @@ "publishpage": { "pchange1": "Publish", "pchange2": "Update", - "pchange3": "Note: it is recommended that you set up port forwarding before hosting data, so that it can more easily be accessed by peers on the network.", + "pchange3": "Note: it is recommended that you set up Port Forwarding before hosting data, so that it can more easily be accessed by peers on the network.", "pchange4": "Select Name", "pchange5": "Title", "pchange6": "Description", @@ -672,11 +672,11 @@ "pchange11": "Publish", "pchange12": "Select zip file containing static content", "pchange13": "Local path to static files", - "pchange14": "Please select a registered name to publish data for", + "pchange14": "Please select a Registered Name to publish data for", "pchange15": "Please select a file to host", "pchange16": "Please select a zip file to host", "pchange17": "Please enter the directory path containing the static content", - "pchange18": "Please enter a service name", + "pchange18": "Please enter a Service Name", "pchange19": "Processing data... this can take some time...", "pchange20": "Error:", "pchange21": "Internal Server Error when publishing data", @@ -691,16 +691,16 @@ "bchange2": "Reload", "bchange3": "Back to list", "bchange4": "Delete", - "bchange5": "from node", + "bchange5": "From Node", "bchange6": "Your browser doesn't support iframes", "bchange7": "Follow", "bchange8": "Unfollow", "bchange9": "Block", "bchange10": "Unblock", - "bchange11": "Error occurred when trying to follow this registered name. Please try again!", - "bchange12": "Error occurred when trying to unfollow this registered name. Please try again!", - "bchange13": "Error occurred when trying to block this registered name. Please try again!", - "bchange14": "Error occurred when trying to unblock this registered name. Please try again!", + "bchange11": "Error occurred when trying to follow this Registered Name. Please try again!", + "bchange12": "Error occurred when trying to unfollow this Registered Name. Please try again!", + "bchange13": "Error occurred when trying to block this Registered Name. Please try again!", + "bchange14": "Error occurred when trying to unblock this Registered Name. Please try again!", "bchange15": "Can't delete data from followed names. Please unfollow first.", "bchange16": "Error occurred when trying to delete this resource. Please try again!", "bchange17": "User declined to share account details", @@ -744,25 +744,25 @@ }, "datapage": { "dchange1": "Data Management", - "dchange2": "Search in hosted data by this node", + "dchange2": "Search in hosted data by this Node", "dchange3": "Data to search", "dchange4": "Search", "dchange5": "Registered Name", "dchange6": "Service", "dchange7": "Identifier", "dchange8": "Actions", - "dchange9": "Data hosted by this node", + "dchange9": "Data hosted by this Node", "dchange10": "Data name can not be empty!", "dchange11": "Data not found!", - "dchange12": "Couldn't fetch hosted data list from node", - "dchange13": "This node isn't hosting any data", + "dchange12": "Couldn't fetch hosted data list from Node", + "dchange13": "This Node isn't hosting any data", "dchange14": "Unfollow", "dchange15": "Delete", "dchange16": "Block", "dchange17": "Unblock", - "dchange18": "Error occurred when trying to block this registered name. Please try again!", - "dchange19": "Error occurred when trying to unfollow this registered name. Please try again!", - "dchange20": "Error occurred when trying to unblock this registered name. Please try again!", + "dchange18": "Error occurred when trying to block this Registered Name. Please try again!", + "dchange19": "Error occurred when trying to unfollow this Registered Name. Please try again!", + "dchange20": "Error occurred when trying to unblock this Registered Name. Please try again!", "dchange21": "Error occurred when trying to delete this resource. Please try again!" }, "chatpage": { @@ -780,7 +780,7 @@ "cchange12": "Owner", "cchange13": "Action", "cchange14": "This account has not blocked any users.", - "cchange15": "No registered name", + "cchange15": "No Registered Name", "cchange16": "Successfully unblocked this user.", "cchange17": "Error occurred when trying to unblock this user. Please try again!", "cchange18": "unblock", @@ -792,7 +792,7 @@ "cchange24": "Maximum Characters per message is 255", "cchange25": "Edit Message", "cchange26": "File size exceeds 0.5 MB", - "cchange27": "A registered name is required to send images", + "cchange27": "A Registered Name is required to send images", "cchange28": "This file is not an image", "cchange29": "Maximum message size is 1000 bytes", "cchange30": "Uploading image. This may take up to one minute.", @@ -806,7 +806,7 @@ "cchange39": "Cannot send an encrypted message to this user since they do not have their publickey on chain.", "cchange40": "IMAGE (click to view)", "cchange41": "Your Balance Is Under 4 QORT", - "cchange42": "Out of the need to combat spam, accounts with under 4 QORT balance will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4 QORT in your account, Q-Chat messages will be instant and this dialog will not show. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!", + "cchange42": "Out of the need to combat spam, accounts with UNDER 4 QORT BALANCE will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4 QORT in your account, Q-Chat messages will be instant and this dialog will not show. It does NOT cost QORT to send messages. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!", "cchange43": "Tip QORT to", "cchange44": "SEND MESSAGE", "cchange45": "TIP USER", @@ -870,7 +870,7 @@ "bcchange1": "Block User", "bcchange2": "Successfully blocked this user!", "bcchange3": "Error occurred when trying to block this user. Please try again!", - "bcchange4": "No registered name", + "bcchange4": "No Registered Name", "bcchange5": "Block User Request", "bcchange6": "Are you sure to block this user?", "bcchange7": "MENU", @@ -966,7 +966,7 @@ "pchange16": "Guess incorrect!", "pchange17": "Reward claim submitted - check wallet for reward!" }, - "nodepage": { + "Nodepage": { "nchange1": "Node management for:", "nchange2": "Node has been online for:", "nchange3": "Node's minting accounts", @@ -979,8 +979,8 @@ "nchange10": "Recipient Account", "nchange11": "Action", "nchange12": "Remove", - "nchange13": "No minting accounts found for this node", - "nchange14": "Peers connected to this node", + "nchange13": "No minting accounts found for this Node", + "nchange14": "Peers connected to this Node", "nchange15": "Add peer", "nchange16": "Type the peer you wish to add's address below", "nchange17": "Peer Address", @@ -1021,7 +1021,7 @@ "apipage": { "achange1": "Add API key", "achange2": "API key", - "achange3": "Please enter the API key for this node. It can be found in a file called “apikey.txt“ in the directory where the core is installed. Alternatively, click Cancel to use the core with reduced functionality.", + "achange3": "Please enter the API key for this Node. It can be found in a file called “apikey.txt“ in the directory where the core is installed. Alternatively, click Cancel to use the core with reduced functionality.", "achange4": "Cancel", "achange5": "Add", "achange6": "Successfully added API Key", @@ -1041,8 +1041,8 @@ "groupdialog6": "On pressing confirm, the group creating request will be sent!", "rewarddialog1": "Would you like to create a reward share transaction, sharing", "rewarddialog2": "of your minting rewards with", - "rewarddialog3": "If yes, you will need to save the key below in order to mint. It can be supplied to any node in order to allow it to mint on your behalf.", - "rewarddialog4": "On pressing confirm, the reward share will be created, but you will still need to supply the above key to a node in order to mint with the account.", + "rewarddialog3": "If yes, you will need to save the key below in order to mint. It can be supplied to any Node in order to allow it to mint on your behalf.", + "rewarddialog4": "On pressing confirm, the reward share will be created, but you will still need to supply the above key to a Node in order to mint with the account.", "rewarddialog5": "You are removing a reward share transaction associated with account:", "rewarddialog6": "On pressing confirm, the reward share will be removed and the minting key will become invalid.", "deployAtdialog1": "You are deploying the AT", @@ -1083,7 +1083,7 @@ "exp2": "Account Balance", "exp3": "More Info", "exp4": "Address or Name not found!", - "exp5": "Note that registered names are case-sensitive.", + "exp5": "Note that Registered Names are case-sensitive.", "exp6": "Founder", "exp7": "Info", "exp8": "Show all buy trades", diff --git a/core/language/zhc.json b/core/language/zhc.json index 1b2500e6..2680840d 100644 --- a/core/language/zhc.json +++ b/core/language/zhc.json @@ -80,7 +80,7 @@ "tm32": "该帐户没有关注任何用户", "tm33": "导入选项卡菜单", "tm34": "导出选项卡菜单", - "tm35": "您现有的选项卡菜单将被删除并设置为上传的选项卡菜单。", + "tm35": "您现有的选项卡菜单将被删除并设置为导入的选项卡菜单。", "tm36": "选项卡菜单恢复成功", "tm37": "选项卡菜单成功另存为", "tm38": "开发模式", @@ -108,32 +108,32 @@ "decrypt": "正在解密钱包备份文件", "save": "保存钱包,以便下次登入.", "prepare": "正在加载你的钱包", - "areyousure": "你确定将此钱包在已保存钱包列表中删除吗?", + "areyousure": "您确定要从已保存的帐户中删除此帐户吗? (如果删除并且不存在备份文件,帐户可能会永远丢失!在执行此操作之前确保您有备份文件!", "error1": "备份文件必须为有效的JSON格式文件", "error2": "请选择登入方式", - "createwelcome": "欢迎来到Qortal,您会发现它类似于RPG 游戏,作为Qortal 网络上的铸币者(如果您选择成为其中的铸币者),您将有机会升级您的帐户,并随着等级提高而获得更多QORT 区块奖励以及参与平台上各种决策投票。", + "createwelcome": "欢迎来到Qortal! 您的去中心化数字未来正等待着您! 在 Qortal 上,只有您对您的数据拥有绝对的控制权。 Qortal 提供了一个新的、完全由用户控制的数字世界的基础水平。", "createa": "你的", "click": "点击查看助记词", "confirmpass": "确认密码", - "willbe": "将在后台随机生成。 这将用作您在Qortal 中的区块链帐户的私人密钥。", + "willbe": "将在后台随机生成。 如果您想查看种子短语,请单击本文中突出显示的“种子短语”。 这用作您在 Qortal 中的区块链帐户的私钥生成器。 为了安全起见,默认情况下,除非特别选择,否则不会显示助记词。", "clicknext": " ▼▼▼点击下一步创建你的Qortal账号▼▼▼", - "ready": "您的帐户即将创建成功, 它将保存在此浏览器中。 如果您不希望将新帐户保存在浏览器中,可以取消勾选下面的选项。 您仍可透过使用创建帐户时载的钱包备份文件进行的登入。", + "ready": "您的帐户现在已准备好创建。 默认情况下,它将以加密形式保存在 Qortal UI 的此副本中。 如果您不希望在此处保存您的新帐户,您可以取消选中下面的复选框。 您仍然可以使用新帐户登录(注销后),使用创建帐户后必须下载的钱包备份文件。", "welmessage": "欢迎来到Qortal", "pleaseenter": "请密码!", "notmatch": "密码不一致!", "lessthen8": "你的密码长度少于5位! 我们不建议使用,但你仍可继续使用此密码。", "lessthen8-2": "你的密码长度少于5位!", - "entername": "请输入一个代称", + "entername": "请输入显示名称!", "downloaded": "你的钱包备份文件已顺利下载!", "loading": "加载中,请耐心等候...", "createdseed": "你已创建的助记词", "saveseed": "保存助记词", "savein": "保存在UI上", - "backup2": "请小心保存钱包备份文件,并谨记之前设置好的密码。否则你将会失去这个钱包的所有控制权,请务必将备份文件放在不同的存储装置上", - "savewallet": "下载并保存钱包备份文件", + "backup2": "除非保存到 UI,否则此文件是访问您帐户的唯一方式(默认情况下)。 请务必在多个位置备份此文件。 该文件经过非常安全的加密,并使用您在上一步中创建的本地密码进行解密。 您可以将其安全地保存在任何地方,但请务必在多个位置执行此操作。", + "savewallet": "保存 Qortal 备份文件", "created1": "你的账号已创建成功", - "created2": "并会储存在UI上.", - "downloadbackup": "下载钱包备份文件", + "created2": "并以加密形式保存在此 UI 中。", + "downloadbackup": "保存 Qortal 备份文件", "passwordhint": "密码必须至少为5 个字符。", "lp1": "锁定屏幕", "lp2": "未设置锁屏密码!", @@ -164,7 +164,7 @@ }, "fragfile": { "selectfile": "选择文件", - "dragfile": "将备份文件拖到此处" + "dragfile": "拖放或单击此处选择备份文件" }, "settings": { "generalinfo": "一般钱包信息", @@ -181,7 +181,7 @@ "notifications": "通知", "accountsecurity": "钱包安全性", "password": "密码", - "download": "下载备份文件", + "download": "导出/保存 Qortal 备份文件", "choose": "请输入一组密码加密你的备份文件。(可使用你刚才登入时的相同密码或者不同的密码)", "playsound": "开启音效", "shownotifications": "显示通知", @@ -192,8 +192,8 @@ "protocol": "协议", "domain": "域名", "port": "端口", - "import": "导入节点", - "export": "导出节点", + "import": "导入已保存的节点", + "export": "导出保存的节点", "deletecustomnode": "删除所有自定义节点", "warning": "您现有的节点将被删除并从备份中创建新的。", "snack1": "成功删除和添加标准节点", @@ -203,17 +203,17 @@ "snack5": "节点成功导入", "snack6": "成功删除自定义节点", "snack7": "自定义节点编辑成功", - "exp1": "导出主密钥", + "exp1": "导出主私钥 (xpriv)", "exp2": "导出主密钥", "exp3": "导出", "exp4": "请选择一个钱包来备份私钥。", - "core": "开始核心设置", + "core": "Qortal Core 自动启动设置", "qappNotification1": "Q-App 通知", "selectnode": "请选择一个选项", "arrr1": "ARRR 钱包未初始化!", - "arrr2": "请先进入钱包选项卡并初始化您的arrr钱包。", + "arrr2": "请先进入“钱包”选项卡并访问 ARRR 钱包以初始化钱包。", "arrr3": "需要核心更新!", - "arrr4": "要保存你的 arr 钱包的私钥,你需要先进行核心更新!", + "arrr4": "要保存 ARRR 钱包的私钥,您必须首先更新 Qortal Core!", "sync_indicator": "禁用同步指示器弹出窗口" }, "appinfo": { @@ -283,8 +283,8 @@ }, "startminting": { "smchange1": "无法获取铸币帐户", - "smchange2": "无法移除密钥", - "smchange3": "添加铸币密钥失败", + "smchange2": "无法删除 Minting 密钥", + "smchange3": "无法添加 Minting key,如果刚刚创建 key,请尝试等待几个块并再次添加", "smchange4": "无法创建赞助密钥", "smchange5": "建立关系", "smchange6": "等待区块链确认", @@ -507,7 +507,7 @@ "nchange23": "卖出价", "nchange24": "没有名字可以卖", "nchange25": "出售名称", - "nchange26": "你确定要卖这个名字吗?", + "nchange26": "您确定要出售这个名字吗? 如果名称被其他帐户购买,则将不受您的控制!", "nchange27": "对于QORT 中的这个价格", "nchange28": "按下确认后,将发送销售名称请求!", "nchange29": "要取消的名称", diff --git a/core/language/zht.json b/core/language/zht.json index d84c73de..9073d7ff 100644 --- a/core/language/zht.json +++ b/core/language/zht.json @@ -80,7 +80,7 @@ "tm32": "該帳戶沒有關注任何用戶", "tm33": "導入選項卡菜單", "tm34": "導出選項卡菜單", - "tm35": "您現有的選項卡菜單將被刪除並設置為上傳的選項卡菜單。", + "tm35": "您现有的选项卡菜单将被删除并设置为导入的选项卡菜单。", "tm36": "選項卡菜單恢復成功", "tm37": "選項卡菜單成功另存為", "tm38": "開發模式", @@ -98,7 +98,7 @@ "youraccounts": "你的錢包", "clickto": "點擊你的錢包進行登錄", "needcreate": "你必須創建或保存錢包才能登入!", - "upload": "上傳你的Qortal錢包備份文件", + "upload": "匯入您的 Qortal 備份文件", "howlogin": "你想透過下列哪種方式登入?", "seed": "助記詞", "seedphrase": "助記詞", @@ -108,16 +108,16 @@ "decrypt": "正在解密錢包備份文件", "save": "保存錢包,以便下次登入.", "prepare": "正在加載你的錢包", - "areyousure": "你確定將此錢包在已保存錢包列表中刪除嗎?", + "areyousure": "您確定要從已儲存的帳戶中刪除此帳戶嗎? (如果刪除並且不存在備份文件,帳戶可能會永遠丟失!在執行此操作之前確保您有備份文件!)", "error1": "備份文件必須為有效的JSON格式文件", "error2": "請選擇登入方式", - "createwelcome": "歡迎來到 Qortal,您會發現它類似於 RPG 遊戲,作為 Qortal 網絡上的鑄幣者(如果您選擇成為其中的鑄幣者),您將有機會升級您的帳戶,並隨著等級提高而獲得更多 QORT 區塊獎勵以及參與平台上各種決策投票。", + "createwelcome": "歡迎來到Qortal! 您的去中心化數位未來正等著您! 在 Qortal 上,只有您對您的資料擁有絕對的控制權。 Qortal 提供了一個新的、完全由使用者控制的數位世界的基礎水準。", "createa": "你的", "click": "點擊查看助記詞", "confirmpass": "確認密碼", - "willbe": "將在後台隨機生成。 這將用作您在 Qortal 中的區塊鏈帳戶的私人密鑰。", + "willbe": "將在後台隨機產生。 如果您想查看種子短語,請點擊本文中突出顯示的「種子短語」。 這用作您在 Qortal 中的區塊鏈帳戶的私鑰產生器。 為了安全起見,預設情況下,除非特別選擇,否則不會顯示助記詞。", "clicknext": "▼▼▼點擊下一步創建你的Qortal賬號▼▼▼", - "ready": "您的帳戶即將創建成功, 它將保存在此瀏覽器中。 如果您不希望將新帳戶保存在瀏覽器中,可以取消勾選下面的選項。 您仍可透過使用創建帳戶時載的錢包備份文件進行的登入。", + "ready": "您的帳戶現在已準備好建立。 預設情況下,它將以加密形式保存在 Qortal UI 的此副本中。 如果您不希望在此處儲存您的新帳戶,您可以取消選取下面的複選框。 您仍然可以使用新帳戶登入(登出後),使用建立帳戶後必須下載的錢包備份檔案。", "welmessage": "歡迎來到 Qortal", "pleaseenter": "請密碼!", "notmatch": "密碼不一致!", @@ -129,11 +129,11 @@ "createdseed": "你已創建的助記詞", "saveseed": "保存助記詞", "savein": "保存在UI上", - "backup2": "請小心保存錢包備份文件,並謹記之前設置好的密碼。否則你將會失去這個錢包的所有控制權,請務必將備份文件放在不同的存儲裝置上", + "backup2": "除非儲存到 UI,否則此文件是存取您帳戶的唯一方式(預設)。 請務必在多個位置備份此文件。 該檔案經過非常安全的加密,並使用您在上一個步驟中建立的本機密碼進行解密。 您可以將其安全地保存在任何地方,但請務必在多個位置執行此操作。", "savewallet": "下載並保存錢包備份文件", "created1": "你的賬號已創建成功", - "created2": " 並會儲存在UI上.", - "downloadbackup": "下載錢包備份文件", + "created2": "並以加密形式儲存在此 UI 中。", + "downloadbackup": "保存 Qortal 備份文件", "passwordhint": "密碼必須至少為 5 個字符。", "lp1": "鎖定屏幕", "lp2": "未設置鎖屏密碼!", @@ -163,8 +163,8 @@ "confirmlogout": "你確定登出嗎?" }, "fragfile": { - "selectfile": "選擇文件", - "dragfile": "將備份文件拖到此處" + "selectfile": "選擇 Qortal 備份文件", + "dragfile": "拖放或點擊此處選擇備份文件" }, "settings": { "generalinfo": "一般錢包信息", @@ -192,8 +192,8 @@ "protocol": "協議", "domain": "域名", "port": "端口", - "import": "導入節點", - "export": "導出節點", + "import": "導入已儲存的節點", + "export": "導出已儲存的節點", "deletecustomnode": "刪除所有自定義節點", "warning": "您現有的節點將被刪除並從備份中創建新的。", "snack1": "成功刪除和添加標準節點", @@ -203,17 +203,17 @@ "snack5": "節點成功導入", "snack6": "成功刪除自訂節點", "snack7": "自訂節點編輯成功", - "exp1": "導出主密鑰", + "exp1": "匯出主私鑰 (xpriv)", "exp2": "導出主密鑰", "exp3": "導出", "exp4": "請選擇一個錢包來備份私鑰。", - "core": "開始核心設置", + "core": "Qortal Core 自動啟動設定", "qappNotification1": "Q-App 通知", "selectnode": "請選擇一個選項", "arrr1": "ARRR 錢包未初始化!", - "arrr2": "請先進入錢包標籤並初始化您的arrr錢包。", + "arrr2": "請先進入錢包並訪問 ARRR 錢包來初始化錢包", "arrr3": "需要核心更新!", - "arrr4": "要儲存你的 arr 錢包的私鑰,你需要先進行核心更新!", + "arrr4": "要保存 ARRR 錢包的私鑰,您必須先更新 Qortal Core!", "sync_indicator": "停用同步指示器彈出視窗" }, "appinfo": { @@ -283,8 +283,8 @@ }, "startminting": { "smchange1": "無法獲取鑄幣帳戶", - "smchange2": "無法移除密鑰", - "smchange3": "添加鑄幣密鑰失敗", + "smchange2": "無法刪除鑄造金鑰", + "smchange3": "無法添加鑄造密鑰,如果剛剛創建密鑰,請嘗試等待幾個塊並再次添加", "smchange4": "無法創建贊助密鑰", "smchange5": "建立關係", "smchange6": "等待區塊鏈確認", @@ -507,7 +507,7 @@ "nchange23": "賣出價", "nchange24": "沒有名字可以賣", "nchange25": "出售名稱", - "nchange26": "你確定要賣這個名字嗎?", + "nchange26": "您確定要出售這個名字嗎? 如果名稱被其他帳戶購買,則將不受您的控制!", "nchange27": "對於 QORT 中的這個價格", "nchange28": "按下確認後,將發送銷售名稱請求!", "nchange29": "要取消的名稱", From 5cb2d02063b4cba3469f3ebd82f375143c53af5d Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Fri, 10 May 2024 10:49:47 +0200 Subject: [PATCH 13/29] Fix text color, broken link and remove last tab --- core/src/components/show-plugin.js | 62 ++++++++++++++++++------------ core/src/styles/core-css.js | 1 + 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/core/src/components/show-plugin.js b/core/src/components/show-plugin.js index a5e965a9..8885a5fa 100644 --- a/core/src/components/show-plugin.js +++ b/core/src/components/show-plugin.js @@ -421,35 +421,46 @@ class ShowPlugin extends connect(store)(LitElement) { let iconId = '' this.tabs = this.tabs.filter((tab, tIndex) => tIndex !== index) - this.currentTab = this.tabs.length - 1; + this.currentTab = this.tabs.length - 1 const tabD = this.tabs.length - 1 - const plugObj = this.tabs[tabD].url - theId = this.tabs[tabD].id - tabId = 'tab-' + theId - frameId = 'frame-' + theId - plugId = 'plug-' + theId - iconId = 'icon-' + theId - var tabActive = this.shadowRoot.getElementById(tabId) - var frameActive = this.shadowRoot.getElementById(frameId) - var plugActive = this.shadowRoot.getElementById(plugId) - var iconActive = this.shadowRoot.getElementById(iconId) - - if (plugObj === undefined || '') { - tabActive.classList.add('active') - iconActive.classList.remove('iconInactive') - iconActive.classList.add('iconActive') - plugActive.classList.remove('hideIframe') - plugActive.classList.add('showIframe') + if (tabD < 0) { + const lengthOfTabs = this.tabs.length + this.addTab({ + url: '', + id: this.uid.rnd() + }) + this.currentTab = lengthOfTabs } else { - tabActive.classList.add('active') - iconActive.classList.remove('iconInactive') - iconActive.classList.add('iconActive') - frameActive.classList.remove('hideIframe') - frameActive.classList.add('showIframe') + const plugObj = this.tabs[tabD].url + theId = this.tabs[tabD].id + tabId = 'tab-' + theId + frameId = 'frame-' + theId + plugId = 'plug-' + theId + iconId = 'icon-' + theId + + var tabActive = this.shadowRoot.getElementById(tabId) + var frameActive = this.shadowRoot.getElementById(frameId) + var plugActive = this.shadowRoot.getElementById(plugId) + var iconActive = this.shadowRoot.getElementById(iconId) + + if (plugObj === undefined || '') { + tabActive.classList.add('active') + iconActive.classList.remove('iconInactive') + iconActive.classList.add('iconActive') + plugActive.classList.remove('hideIframe') + plugActive.classList.add('showIframe') + } else { + tabActive.classList.add('active') + iconActive.classList.remove('iconInactive') + iconActive.classList.add('iconActive') + frameActive.classList.remove('hideIframe') + frameActive.classList.add('showIframe') + } + + this.requestUpdate() } - this.requestUpdate() } else { // Remove tab from array this.tabs = this.tabs.filter((tab, tIndex) => tIndex !== index) @@ -457,6 +468,7 @@ class ShowPlugin extends connect(store)(LitElement) { if (this.tabs.length !== 0) { this.currentTab = 0 } + this.requestUpdate() } } @@ -1583,7 +1595,7 @@ class NavBar extends connect(store)(LitElement) { if (this.pluginType === 'overview-page') { this.pluginPage = 'overview-page/index.html' } else if (this.pluginType === 'minting') { - this.pluginPage = 'minting/index.html' + this.pluginPage = 'minting-info/index.html' } else if (this.pluginType === 'become-minter') { this.pluginPage = 'become-minter/index.html' } else if (this.pluginType === 'sponsorship-list') { diff --git a/core/src/styles/core-css.js b/core/src/styles/core-css.js index 400cc10e..ca5ebdfb 100644 --- a/core/src/styles/core-css.js +++ b/core/src/styles/core-css.js @@ -2497,6 +2497,7 @@ export const showPluginStyles = css` --mdc-theme-surface: var(--white); --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder); --mdc-text-field-outlined-hover-border-color: var(--txtfieldhoverborder); + --mdc-text-field-disabled-ink-color: var(--black); --mdc-text-field-label-ink-color: var(--black); --mdc-text-field-ink-color: var(--black); --mdc-select-ink-color: var(--black); From 3cc5d544a274e3675185617079a82eecb56a4707 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Fri, 10 May 2024 17:55:06 +0200 Subject: [PATCH 14/29] Add group avatar to chat select , fix typos in chat text editor, close edit and reply to on group change --- plugins/plugins/core/components/ChatPage.js | 20 +++++++--- plugins/plugins/core/components/ChatSelect.js | 40 +++++++++++++------ .../plugins/core/components/ChatTextEditor.js | 28 ++++++------- .../plugins/core/components/plugins-css.js | 6 +-- 4 files changed, 60 insertions(+), 34 deletions(-) diff --git a/plugins/plugins/core/components/ChatPage.js b/plugins/plugins/core/components/ChatPage.js index 3bb80f9c..030126b3 100644 --- a/plugins/plugins/core/components/ChatPage.js +++ b/plugins/plugins/core/components/ChatPage.js @@ -321,13 +321,13 @@ class ChatPage extends LitElement {

    ${this.repliedToMessageObj.senderName ? this.repliedToMessageObj.senderName : this.repliedToMessageObj.sender}

    ${this.repliedToMessageObj.version.toString() === '1' ? html` - ${this.repliedToMessageObj.message} + ${this.repliedToMessageObj.message} ` : '' } ${+this.repliedToMessageObj.version > 1 ? html` - ${unsafeHTML(generateHTML(this.repliedToMessageObj.message, [StarterKit, Underline, Highlight]))} + ${unsafeHTML(generateHTML(this.repliedToMessageObj.message, [StarterKit, Underline, Highlight]))} ` : '' } @@ -344,7 +344,7 @@ class ChatPage extends LitElement {

    ${translate("chatpage.cchange25")}

    - ${unsafeHTML(generateHTML(this.editedMessageObj.message, [StarterKit, Underline, Highlight]))} + ${unsafeHTML(generateHTML(this.editedMessageObj.message, [StarterKit, Underline, Highlight]))}
    this.closeEditMessageContainer()}>
    @@ -1366,11 +1366,23 @@ class ChatPage extends LitElement { shouldUpdate(changedProperties) { if (changedProperties.has('chatId')) { + if (this.repliedToMessageObj) { + this.closeRepliedToContainer() + return true + } + + if (this.editedMessageObj) { + this.closeEditMessageContainer() + return true + } + return true } + if (changedProperties.has('setActiveChatHeadUrl')) { return false } + if (changedProperties.has('setOpenPrivateMessage')) { return false } @@ -1666,8 +1678,6 @@ class ChatPage extends LitElement { let list = [...decodeMsgs] - - this.messagesRendered = { messages: list, type: 'old', diff --git a/plugins/plugins/core/components/ChatSelect.js b/plugins/plugins/core/components/ChatSelect.js index 2565fc52..7e175ddd 100644 --- a/plugins/plugins/core/components/ChatSelect.js +++ b/plugins/plugins/core/components/ChatSelect.js @@ -14,7 +14,9 @@ class ChatSelect extends LitElement { iconName: { type: String }, activeChatHeadUrl: { type: String }, isImageLoaded: { type: Boolean }, - setActiveChatHeadUrl: { attribute: false } + setActiveChatHeadUrl: { attribute: false }, + avatarImg: { type: String } + } } @@ -27,8 +29,7 @@ class ChatSelect extends LitElement { this.selectedAddress = {} this.config = { user: { - node: { - } + node: {} } } this.chatInfo = {} @@ -36,29 +37,44 @@ class ChatSelect extends LitElement { this.activeChatHeadUrl = '' this.isImageLoaded = false this.imageFetches = 0 + this.avatarImg = '' } render() { - let avatarImg = '' - let backupAvatarImg = '' + let groupString = 'Group_' + this.chatInfo.groupId + let groupAvatarString = 'qortal_group_avatar_' + this.chatInfo.groupId - if (this.chatInfo.name) { - 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 myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port + + if (groupString === 'Group_0') { + const avatarUrl = `/img/qgcgroup.png` + this.avatarImg = this.createImage(avatarUrl) + } else if (groupString === 'Group_1') { + const avatarUrl = `/img/qdcgroup.png` + this.avatarImg = this.createImage(avatarUrl) + } else if (this.chatInfo.name) { const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.name}/qortal_avatar?async=true` - avatarImg = this.createImage(avatarUrl) + this.avatarImg = this.createImage(avatarUrl) + } else if (this.chatInfo.ownerName) { + if (this.chatInfo.ownerName === undefined) { + // Nothing to do + } else { + const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.ownerName}/${groupAvatarString}?async=true` + this.avatarImg = this.createImage(avatarUrl) + } } return html`
  • this.getUrl(this.chatInfo.url)} class="clearfix ${this.activeChatHeadUrl === this.chatInfo.url ? 'active' : ''}"> - ${this.isImageLoaded ? html`${avatarImg}` : html``} + ${this.isImageLoaded ? html`${this.avatarImg}` : html``} ${!this.isImageLoaded && !this.chatInfo.name && !this.chatInfo.groupName ? html`account_circle` : html``} ${!this.isImageLoaded && this.chatInfo.name ? html`
    ${this.chatInfo.name.charAt(0)}
    @@ -70,7 +86,7 @@ class ChatSelect extends LitElement {
    ${this.chatInfo.groupName.charAt(0)}
    diff --git a/plugins/plugins/core/components/ChatTextEditor.js b/plugins/plugins/core/components/ChatTextEditor.js index c989c169..3d6d07d4 100644 --- a/plugins/plugins/core/components/ChatTextEditor.js +++ b/plugins/plugins/core/components/ChatTextEditor.js @@ -60,12 +60,12 @@ class ChatTextEditor extends LitElement { render() { return html` -
    -
    +
    +
    @@ -104,7 +104,7 @@ class ChatTextEditor extends LitElement {
    ${this.iframeId === "_chatEditorDOM" ? html` -
    +
    @@ -126,8 +126,8 @@ class ChatTextEditor extends LitElement { : '' }
    -
    -
    {this.preventUserSendingImage(e)}}> +
    +
    {this.preventUserSendingImage(e)}}>
    - +
    ${this.editedMessageObj ? - (html` -
    + html` +
    ${this.isLoading === false ? html` {this.sendMessageFunc(this.messageQueue)}}> @@ -162,11 +162,11 @@ class ChatTextEditor extends LitElement { ` }
    - `) : html` + ` : html`
    ${this.isLoading === false ? html` - send-icon {this.sendMessageFunc(this.messageQueue)}} /> + send-icon {this.sendMessageFunc(this.messageQueue)}}> ` : html` ` @@ -178,7 +178,7 @@ class ChatTextEditor extends LitElement { ${this.chatMessageSize >= 750 ? html`
    -
    +
    ${`Your message size is of ${this.chatMessageSize} bytes out of a maximum of 4000`}
    diff --git a/plugins/plugins/core/components/plugins-css.js b/plugins/plugins/core/components/plugins-css.js index ee320917..e4b00fb1 100644 --- a/plugins/plugins/core/components/plugins-css.js +++ b/plugins/plugins/core/components/plugins-css.js @@ -120,7 +120,7 @@ export const chatpageStyles = css` .message-size { font-family: Roboto, sans-serif; font-size: 12px; - color: black; + color: var(--black); } .lds-grid { @@ -508,7 +508,7 @@ export const chatpageStyles = css` .message-size { font-family: Roboto, sans-serif; font-size: 12px; - color: black; + color: var(--black); } .lds-grid { @@ -3529,7 +3529,7 @@ export const chatTextEditorStyles = css` .message-size { font-family: Roboto, sans-serif; font-size: 12px; - color: black; + color: var(--black); } .paperclip-icon { From 0b2bceb84294e02548d0f862a9d96bc8439cf1ec Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Fri, 10 May 2024 18:00:47 +0200 Subject: [PATCH 15/29] Remove use strict make api full esm compatible --- crypto/api.js | 18 +- crypto/api/PhraseWallet.js | 15 +- crypto/api/api.js | 10 +- crypto/api/bitcoin/AltcoinHDWallet.js | 1272 +++-- crypto/api/bitcoin/ecbn.js | 4978 ++++++++--------- crypto/api/bitcoin/jsbn.js | 3875 +++++++------ crypto/api/constants.js | 2 - crypto/api/createTransaction.js | 16 +- crypto/api/createWallet.js | 8 +- crypto/api/decryptStoredWallet.js | 10 +- crypto/api/deps/Base58.js | 171 +- crypto/api/deps/Base64.js | 19 +- crypto/api/deps/bcrypt.js | 2670 ++++----- crypto/api/deps/broken-ripemd160.js | 343 +- crypto/api/deps/deps.js | 5 +- crypto/api/deps/ed2curve.js | 476 +- crypto/api/deps/nacl-fast.js | 3947 +++++++------ crypto/api/deps/qora.js | 88 +- crypto/api/deps/ripemd160.js | 2 + crypto/api/deps/sha256.js | 245 +- crypto/api/deps/utils.js | 119 +- crypto/api/fetch-request.js | 2 +- crypto/api/kdf.js | 12 +- crypto/api/registerUsername.js | 2 +- crypto/api/storeWallet.js | 6 +- crypto/api/tradeRequest.js | 10 +- crypto/api/transactions/AirdropTransaction.js | 2 +- .../api/transactions/DeployAtTransaction.js | 4 +- crypto/api/transactions/PaymentTransaction.js | 2 +- .../api/transactions/PublicizeTransaction.js | 32 +- crypto/api/transactions/TransactionBase.js | 2 +- .../transactions/TransferPrivsTransaction.js | 4 +- crypto/api/transactions/arbitraryV3.js | 62 +- crypto/api/transactions/chat/ChatBase.js | 236 +- .../api/transactions/chat/ChatTransaction.js | 4 +- .../transactions/chat/GroupChatTransaction.js | 2 +- .../transactions/chat/decryptChatMessage.js | 2 +- .../groups/AddGroupAdminTransaction.js | 2 +- .../groups/CancelGroupBanTransaction.js | 2 +- .../groups/CancelGroupInviteTransaction.js | 2 +- .../groups/CreateGroupTransaction.js | 2 +- .../groups/GroupBanTransaction.js | 2 +- .../groups/GroupInviteTransaction.js | 2 +- .../groups/GroupKickTransaction.js | 2 +- .../groups/JoinGroupTransaction.js | 2 +- .../groups/LeaveGroupTransaction.js | 2 +- .../groups/RemoveGroupAdminTransaction.js | 2 +- .../groups/UpdateGroupTransaction.js | 2 +- .../transactions/names/BuyNameTransacion.js | 2 +- .../names/CancelSellNameTransacion.js | 2 +- .../names/RegisterNameTransaction.js | 2 +- .../transactions/names/SellNameTransacion.js | 2 +- .../names/UpdateNameTransaction.js | 2 +- .../polls/CreatePollTransaction.js | 6 +- .../polls/VoteOnPollTransaction.js | 4 +- .../api/transactions/registerName_dnsthing.js | 60 +- .../RemoveRewardShareTransaction.js | 4 +- .../reward-share/RewardShareTransaction.js | 4 +- crypto/api/utils/randomBase58Generator.js | 18 +- crypto/api/utils/stateAwait.js | 40 +- crypto/api/wallet/base58PublicKeyToAddress.js | 2 +- crypto/api/wallet/publicKeyToAddress.js | 14 +- crypto/api/wallet/validateAddress.js | 4 +- crypto/config.js | 2 +- 64 files changed, 9391 insertions(+), 9472 deletions(-) diff --git a/crypto/api.js b/crypto/api.js index e7ea9034..244be3a5 100644 --- a/crypto/api.js +++ b/crypto/api.js @@ -1,9 +1,9 @@ -import {Sha256} from 'asmcrypto.js' +import { Sha256 } from 'asmcrypto.js' import Base58 from './api/deps/Base58' import Base64 from './api/deps/Base64' -import {base58PublicKeyToAddress} from './api/wallet/base58PublicKeyToAddress' -import {validateAddress} from './api/wallet/validateAddress' -import {decryptChatMessage, decryptChatMessageBase64} from './api/transactions/chat/decryptChatMessage' +import { base58PublicKeyToAddress } from './api/wallet/base58PublicKeyToAddress' +import { validateAddress } from './api/wallet/validateAddress' +import { decryptChatMessage, decryptChatMessageBase64 } from './api/transactions/chat/decryptChatMessage' import _ from 'lodash' window.Sha256 = Sha256 @@ -15,8 +15,8 @@ window.validateAddress = validateAddress window.decryptChatMessage = decryptChatMessage window.decryptChatMessageBase64 = decryptChatMessageBase64 -export { initApi, store } from './api_deps.js' -export * from './api/deps/deps.js' -export * from './api/api.js' -export * from './api/registerUsername.js' -export { createWallet } from './api/createWallet.js' +export { initApi, store } from './api_deps' +export * from './api/deps/deps' +export * from './api/api' +export * from './api/registerUsername' +export { createWallet } from './api/createWallet' diff --git a/crypto/api/PhraseWallet.js b/crypto/api/PhraseWallet.js index bfe81999..8c7732cb 100644 --- a/crypto/api/PhraseWallet.js +++ b/crypto/api/PhraseWallet.js @@ -1,15 +1,12 @@ /* Copyright 2017-2018 @ irontiga and vbcs (original developer) */ -'use strict' -import Base58 from './deps/Base58.js' -import {Sha256, Sha512} from 'asmcrypto.js' -import nacl from './deps/nacl-fast.js' -import utils from './deps/utils.js' - -import {generateSaveWalletData} from './storeWallet.js' - -import publicKeyToAddress from './wallet/publicKeyToAddress.js' +import Base58 from './deps/Base58' +import { Sha256, Sha512 } from 'asmcrypto.js' +import nacl from './deps/nacl-fast' +import utils from './deps/utils' +import { generateSaveWalletData } from './storeWallet' +import publicKeyToAddress from './wallet/publicKeyToAddress' import AltcoinHDWallet from "./bitcoin/AltcoinHDWallet" export default class PhraseWallet { diff --git a/crypto/api/api.js b/crypto/api/api.js index 36a635cc..3c240b2e 100644 --- a/crypto/api/api.js +++ b/crypto/api/api.js @@ -1,5 +1,5 @@ -export { request } from './fetch-request.js' -export { transactionTypes as transactions } from './transactions/transactions.js' -export { processTransaction, processTransactionVersion2, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction, signArbitraryWithFeeTransaction } from './createTransaction.js' -export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest.js' -export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers.js' +export { request } from './fetch-request' +export { transactionTypes as transactions } from './transactions/transactions' +export { processTransaction, processTransactionVersion2, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction, signArbitraryWithFeeTransaction } from './createTransaction' +export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest' +export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers' diff --git a/crypto/api/bitcoin/AltcoinHDWallet.js b/crypto/api/bitcoin/AltcoinHDWallet.js index b7391b8a..a802382c 100644 --- a/crypto/api/bitcoin/AltcoinHDWallet.js +++ b/crypto/api/bitcoin/AltcoinHDWallet.js @@ -1,859 +1,845 @@ -'use strict'; -import Base58 from '../deps/Base58.js' -import {Sha256, Sha512} from 'asmcrypto.js' +import Base58 from '../deps/Base58' +import { Sha256, Sha512 } from 'asmcrypto.js' import jsSHA from 'jssha' -import RIPEMD160 from '../deps/ripemd160.js' -import utils from '../deps/utils.js' -import {BigInteger, EllipticCurve} from './ecbn.js' +import RIPEMD160 from '../deps/ripemd160' +import utils from '../deps/utils' +import { BigInteger, EllipticCurve } from './ecbn' export default class AltcoinHDWallet { - constructor(addressParams) { + constructor(addressParams) { - /** - * Seed - 32 bytes - */ + /** + * Seed - 32 bytes + */ - this.seed = new Uint8Array(32) + this.seed = new Uint8Array(32) - /** - * Version Bytes - 4 byte - */ + /** + * Version Bytes - 4 byte + */ - this.versionBytes = addressParams + this.versionBytes = addressParams - /** - * Depth - 1 byte - */ + /** + * Depth - 1 byte + */ - this.depth = 0 + this.depth = 0 - /** - * Parent Fingerprint - 4 bytes - */ + /** + * Parent Fingerprint - 4 bytes + */ - this.parentFingerprint = '0x00000000' // master key + this.parentFingerprint = '0x00000000' // master key - /** - * Child Index - 4 bytes - */ + /** + * Child Index - 4 bytes + */ - this.childIndex = '0x00000000' // master key + this.childIndex = '0x00000000' // master key - /** - * Chain Code - 32 bytes - */ + /** + * Chain Code - 32 bytes + */ - this.chainCode = new Uint8Array(32) + this.chainCode = new Uint8Array(32) - /** - * Key Data - 33 bytes - */ + /** + * Key Data - 33 bytes + */ - this.keyData = new Uint8Array(33) + this.keyData = new Uint8Array(33) - /** - * Seed Hash - 64 bytes - */ + /** + * Seed Hash - 64 bytes + */ - this.seedHash = new Uint8Array(64) + this.seedHash = new Uint8Array(64) - /** - * Private Key - 32 bytes - */ + /** + * Private Key - 32 bytes + */ - this.privateKey = new Uint8Array(32) + this.privateKey = new Uint8Array(32) - /** - * Public Key - 33 bytes (compressed) - */ + /** + * Public Key - 33 bytes (compressed) + */ - this.publicKey = new Uint8Array(33) + this.publicKey = new Uint8Array(33) - /** - * Public Key Hash160 (used to derive the parent fingerprint for derived) - */ + /** + * Public Key Hash160 (used to derive the parent fingerprint for derived) + */ - this.publicKeyHash = new Uint8Array(20) + this.publicKeyHash = new Uint8Array(20) - /** - * Master Private Key (Base58 encoded) - */ + /** + * Master Private Key (Base58 encoded) + */ - this.masterPrivateKey = '' + this.masterPrivateKey = '' - /** - * Master Public Key (Base58 encoded) - */ + /** + * Master Public Key (Base58 encoded) + */ - this.masterPublicKey = '' + this.masterPublicKey = '' - /** - * Testnet Master Private Key (Base58 encoded) - THIS IS TESTNET - */ + /** + * Testnet Master Private Key (Base58 encoded) - THIS IS TESTNET + */ - this._tMasterPrivateKey = '' + this._tMasterPrivateKey = '' - /** - * Testnet Master Public Key (Base58 encoded) - THIS IS TESTNET - */ + /** + * Testnet Master Public Key (Base58 encoded) - THIS IS TESTNET + */ - this._tmasterPublicKey = '' + this._tmasterPublicKey = '' - /** - * Child Keys Derivation from the Parent Keys - */ + /** + * Child Keys Derivation from the Parent Keys + */ - /** - * Child Private Key - 32 bytes - */ + /** + * Child Private Key - 32 bytes + */ - this.childPrivateKey = new Uint8Array(32) + this.childPrivateKey = new Uint8Array(32) - /** - * Child Chain Code - 32 bytes - */ + /** + * Child Chain Code - 32 bytes + */ - this.childChainCode = new Uint8Array(32) + this.childChainCode = new Uint8Array(32) - /** - * Child Public Key - 33 bytes (compressed) - */ + /** + * Child Public Key - 33 bytes (compressed) + */ - this.childPublicKey = new Uint8Array(33) + this.childPublicKey = new Uint8Array(33) - /** - * Child Public Key Hash160 (used to derive the parent fingerprint for derived) - */ + /** + * Child Public Key Hash160 (used to derive the parent fingerprint for derived) + */ - this.childPublicKeyHash = new Uint8Array(20) + this.childPublicKeyHash = new Uint8Array(20) - /** - * Extended Private Child Key - Base58 encoded - */ + /** + * Extended Private Child Key - Base58 encoded + */ - this.xPrivateChildKey = '' + this.xPrivateChildKey = '' - /** - * Extended Public Child Key - Base58 encoded - */ + /** + * Extended Public Child Key - Base58 encoded + */ - this.xPublicChildKey = '' + this.xPublicChildKey = '' - /** - * Grand Child Keys Derivation from the Child Keys - */ + /** + * Grand Child Keys Derivation from the Child Keys + */ - /** - * Grand Child Private Key - 32 bytes - */ + /** + * Grand Child Private Key - 32 bytes + */ - this.grandChildPrivateKey = new Uint8Array(32) + this.grandChildPrivateKey = new Uint8Array(32) - /** - * Grand Child Chain Code - 32 bytes - */ + /** + * Grand Child Chain Code - 32 bytes + */ - this.grandChildChainCode = new Uint8Array(32) + this.grandChildChainCode = new Uint8Array(32) - /** - * Grand Child Public Key - 33 bytes (compressed) - */ + /** + * Grand Child Public Key - 33 bytes (compressed) + */ - this.grandChildPublicKey = new Uint8Array(33) + this.grandChildPublicKey = new Uint8Array(33) - /** - * Grand Public Key Hash160 (used to derive the parent fingerprint for derived) - */ + /** + * Grand Public Key Hash160 (used to derive the parent fingerprint for derived) + */ - this.grandChildPublicKeyHash = new Uint8Array(20) + this.grandChildPublicKeyHash = new Uint8Array(20) - /** - * Extended Private Grand Child Key - Base58 encoded - */ + /** + * Extended Private Grand Child Key - Base58 encoded + */ - this.xPrivateGrandChildKey = '' + this.xPrivateGrandChildKey = '' - /** - * Extended Public Grand Child Key - Base58 encoded - */ + /** + * Extended Public Grand Child Key - Base58 encoded + */ - this.xPublicGrandChildKey = '' + this.xPublicGrandChildKey = '' - /** - * Litecoin Legacy Address - Derived from the Grand Child Public Key Hash - */ + /** + * Litecoin Legacy Address - Derived from the Grand Child Public Key Hash + */ - this.litecoinLegacyAddress = '' + this.litecoinLegacyAddress = '' - /** - * TESTNET Litecoin Legacy Address (Derived from the Grand Child Public Key Hash) - THIS IS TESTNET - */ + /** + * TESTNET Litecoin Legacy Address (Derived from the Grand Child Public Key Hash) - THIS IS TESTNET + */ - this._tlitecoinLegacyAddress = '' + this._tlitecoinLegacyAddress = '' - /** - * Wallet - Wallet Object (keys...) - */ + /** + * Wallet - Wallet Object (keys...) + */ - this.wallet = {} - } + this.wallet = {} + } - setSeed(seed) { - this.seed = seed - } + setSeed(seed) { + this.seed = seed + } - createWallet(seed, isBIP44, indicator = null) { + createWallet(seed, isBIP44, indicator = null) { - // Set Seeed - this.setSeed(seed) + // Set Seeed + this.setSeed(seed) - // Generate Seed Hash - this.generateSeedHash(this.seed, isBIP44, indicator) + // Generate Seed Hash + this.generateSeedHash(this.seed, isBIP44, indicator) - // Generate Private Key - this.generatePrivateKey(this.seedHash) + // Generate Private Key + this.generatePrivateKey(this.seedHash) - // Generate Chain Code - this.generateChainCode(this.seedHash) + // Generate Chain Code + this.generateChainCode(this.seedHash) - // Generate Public Key from Private Key - this.generatePublicKey(this.privateKey) + // Generate Public Key from Private Key + this.generatePublicKey(this.privateKey) - // Generate Mainnet Master Private Key - this.generateMainnetMasterPrivateKey() + // Generate Mainnet Master Private Key + this.generateMainnetMasterPrivateKey() - // Generate Mainnet Master Public Key - this.generateMainnetMasterPublicKey() + // Generate Mainnet Master Public Key + this.generateMainnetMasterPublicKey() - // Generate Testnet Master Private Key - this.generateTestnetMasterPrivateKey() + // Generate Testnet Master Private Key + this.generateTestnetMasterPrivateKey() - // Generate Testnet Master Public Key - this.generateTestnetMasterPublicKey() + // Generate Testnet Master Public Key + this.generateTestnetMasterPublicKey() - // Generate Child and Grand Child Keys - this.generateDerivedChildKeys() + // Generate Child and Grand Child Keys + this.generateDerivedChildKeys() - // Return Wallet Object Specification - return this.returnWallet() - } + // Return Wallet Object Specification + return this.returnWallet() + } - generateSeedHash(seed, isBIP44, indicator = null) { - let buffer + generateSeedHash(seed, isBIP44, indicator = null) { + let buffer - if (isBIP44) { - buffer = utils.appendBuffer(seed.reverse(), utils.int32ToBytes(indicator)) - } else { - if(indicator !== null) { - const indicatorString = utils.stringtoUTF8Array(indicator) - buffer = utils.appendBuffer(seed.reverse(), indicatorString) - } - else - { - buffer = seed.reverse() - } - } + if (isBIP44) { + buffer = utils.appendBuffer(seed.reverse(), utils.int32ToBytes(indicator)) + } else { + if (indicator !== null) { + const indicatorString = utils.stringtoUTF8Array(indicator) + buffer = utils.appendBuffer(seed.reverse(), indicatorString) + } + else { + buffer = seed.reverse() + } + } - const _reverseSeedHash = new Sha256().process(buffer).finish().result - this.seedHash = new Sha512().process(utils.appendBuffer(seed, _reverseSeedHash)).finish().result - } + const _reverseSeedHash = new Sha256().process(buffer).finish().result + this.seedHash = new Sha512().process(utils.appendBuffer(seed, _reverseSeedHash)).finish().result + } - generatePrivateKey(seedHash) { - const SECP256K1_CURVE_ORDER = new BigInteger("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141") + generatePrivateKey(seedHash) { + const SECP256K1_CURVE_ORDER = new BigInteger("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141") - const privateKeyHash = seedHash.slice(0, 32) + const privateKeyHash = seedHash.slice(0, 32) - this.seed58 = Base58.encode(privateKeyHash) + this.seed58 = Base58.encode(privateKeyHash) - const _privateKeyHash = [...privateKeyHash] - let privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKeyHash) + const _privateKeyHash = [...privateKeyHash] + let privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKeyHash) - const privateKey = (privateKeyBigInt.mod(SECP256K1_CURVE_ORDER.subtract(BigInteger.ONE))).add(BigInteger.ONE) - this.privateKey = privateKey.toByteArrayUnsigned() - } + const privateKey = (privateKeyBigInt.mod(SECP256K1_CURVE_ORDER.subtract(BigInteger.ONE))).add(BigInteger.ONE) + this.privateKey = privateKey.toByteArrayUnsigned() + } - generateChainCode(seedHash) { - this.chainCode = new Sha256().process(seedHash.slice(32, 64)).finish().result - } + generateChainCode(seedHash) { + this.chainCode = new Sha256().process(seedHash.slice(32, 64)).finish().result + } - generatePublicKey(privateKey) { - const _privateKey = [...privateKey] - const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) + generatePublicKey(privateKey) { + const _privateKey = [...privateKey] + const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) - const epCurve = EllipticCurve.getSECCurveByName("secp256k1") - const curvePoints = epCurve.getG().multiply(privateKeyBigInt) + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + const curvePoints = epCurve.getG().multiply(privateKeyBigInt) - const x = curvePoints.getX().toBigInteger() - const y = curvePoints.getY().toBigInteger() + const x = curvePoints.getX().toBigInteger() + const y = curvePoints.getY().toBigInteger() - /** - * Deriving Uncompressed Public Key (65 bytes) - * - * const publicKeyBytes = EllipticCurve.integerToBytes(x, 32) - * this.publicKey = publicKeyBytes.concat(EllipticCurve.integerToBytes(y, 32)) - * this.publicKey.unshift(0x04) // append point indicator - */ + /** + * Deriving Uncompressed Public Key (65 bytes) + * + * const publicKeyBytes = EllipticCurve.integerToBytes(x, 32) + * this.publicKey = publicKeyBytes.concat(EllipticCurve.integerToBytes(y, 32)) + * this.publicKey.unshift(0x04) // append point indicator + */ - // Compressed Public Key (33 bytes) - this.publicKey = EllipticCurve.integerToBytes(x, 32) + // Compressed Public Key (33 bytes) + this.publicKey = EllipticCurve.integerToBytes(x, 32) - if (y.isEven()) { - this.publicKey.unshift(0x02) // append point indicator - } else { - this.publicKey.unshift(0x03) // append point indicator - } + if (y.isEven()) { + this.publicKey.unshift(0x02) // append point indicator + } else { + this.publicKey.unshift(0x03) // append point indicator + } - // PublicKey Hash - const publicKeySHA256 = new Sha256().process(new Uint8Array(this.publicKey)).finish().result + // PublicKey Hash + const publicKeySHA256 = new Sha256().process(new Uint8Array(this.publicKey)).finish().result this.publicKeyHash = new RIPEMD160().update(Buffer.from(publicKeySHA256)).digest('hex') - } + } - generateMainnetMasterPrivateKey() { - // Serialization Variable - const s = [] + generateMainnetMasterPrivateKey() { + // Serialization Variable + const s = [] - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.private))) + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.private))) - // Append Depth - s.push(this.depth) + // Append Depth + s.push(this.depth) - // Append Parent Fingerprint - s.push(...(utils.int32ToBytes(this.parentFingerprint))) + // Append Parent Fingerprint + s.push(...(utils.int32ToBytes(this.parentFingerprint))) - // Append Child Number - s.push(...(utils.int32ToBytes(this.childIndex))) + // Append Child Number + s.push(...(utils.int32ToBytes(this.childIndex))) - // Append Chain Code - s.push(...this.chainCode) + // Append Chain Code + s.push(...this.chainCode) - // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) - s.push(0) + // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) + s.push(0) - //if the private key length is less than 32 let's add leading zeros - if(this.privateKey.length<32){ - for(let i=this.privateKey.length;i<32;i++){ - s.push(0) - } - } + //if the private key length is less than 32 let's add leading zeros + if (this.privateKey.length < 32) { + for (let i = this.privateKey.length; i < 32; i++) { + s.push(0) + } + } - // Append Private Key - s.push(...this.privateKey) + // Append Private Key + s.push(...this.privateKey) - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... - // Save to Private Key as Base58 encoded - this.masterPrivateKey = Base58.encode(s) - } + // Save to Private Key as Base58 encoded + this.masterPrivateKey = Base58.encode(s) + } - generateMainnetMasterPublicKey() { - // Serialization Variable - const s = [] + generateMainnetMasterPublicKey() { + // Serialization Variable + const s = [] - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.public))) + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.public))) - // Append Depth - s.push(this.depth) + // Append Depth + s.push(this.depth) - // Append Parent Fingerprint - s.push(...(utils.int32ToBytes(this.parentFingerprint))) + // Append Parent Fingerprint + s.push(...(utils.int32ToBytes(this.parentFingerprint))) - // Append Child Number - s.push(...(utils.int32ToBytes(this.childIndex))) + // Append Child Number + s.push(...(utils.int32ToBytes(this.childIndex))) - // Append Chain Code - s.push(...this.chainCode) + // Append Chain Code + s.push(...this.chainCode) - // Append Public Key - s.push(...this.publicKey) + // Append Public Key + s.push(...this.publicKey) - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... - // Save to Public Key as Base58 encoded - this.masterPublicKey = Base58.encode(s) - } + // Save to Public Key as Base58 encoded + this.masterPublicKey = Base58.encode(s) + } - generateTestnetMasterPrivateKey() { + generateTestnetMasterPrivateKey() { - // To be Used ONLY in Testnet... + // To be Used ONLY in Testnet... - // Serialization Variable - const s = [] + // Serialization Variable + const s = [] - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.testnet.private))) + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.testnet.private))) - // Append Depth - s.push(this.depth) + // Append Depth + s.push(this.depth) - // Append Parent Fingerprint - s.push(...(utils.int32ToBytes(this.parentFingerprint))) + // Append Parent Fingerprint + s.push(...(utils.int32ToBytes(this.parentFingerprint))) - // Append Child Number - s.push(...(utils.int32ToBytes(this.childIndex))) + // Append Child Number + s.push(...(utils.int32ToBytes(this.childIndex))) - // Append Chain Code - s.push(...this.chainCode) + // Append Chain Code + s.push(...this.chainCode) - // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) - s.push(0) + // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) + s.push(0) - // Append Private Key - s.push(...this.privateKey) + // Append Private Key + s.push(...this.privateKey) - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... - // Save to Private Key as Base58 encoded - this._tMasterPrivateKey = Base58.encode(s) - } + // Save to Private Key as Base58 encoded + this._tMasterPrivateKey = Base58.encode(s) + } - generateTestnetMasterPublicKey() { + generateTestnetMasterPublicKey() { - // To be Used ONLY in Testnet... + // To be Used ONLY in Testnet... - // Serialization Variable - const s = [] + // Serialization Variable + const s = [] - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.testnet.public))) + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.testnet.public))) - // Append Depth - s.push(this.depth) + // Append Depth + s.push(this.depth) - // Append Parent Fingerprint - s.push(...(utils.int32ToBytes(this.parentFingerprint))) + // Append Parent Fingerprint + s.push(...(utils.int32ToBytes(this.parentFingerprint))) - // Append Child Number - s.push(...(utils.int32ToBytes(this.childIndex))) + // Append Child Number + s.push(...(utils.int32ToBytes(this.childIndex))) - // Append Chain Code - s.push(...this.chainCode) + // Append Chain Code + s.push(...this.chainCode) - // Append Private Key - s.push(...this.publicKey) + // Append Private Key + s.push(...this.publicKey) - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... - // Save to Private Key as Base58 encoded - this._tmasterPublicKey = Base58.encode(s) - } + // Save to Private Key as Base58 encoded + this._tmasterPublicKey = Base58.encode(s) + } - generateDerivedChildKeys() { + generateDerivedChildKeys() { - // SPEC INFO: https://en.bitcoin.it/wiki/BIP_0032#Child_key_derivation_.28CKD.29_functions - // NOTE: will not be using some of derivations func as the value is known. (So I'd rather shove in the values and rewrite out the derivations later ?) + // SPEC INFO: https://en.bitcoin.it/wiki/BIP_0032#Child_key_derivation_.28CKD.29_functions + // NOTE: will not be using some of derivations func as the value is known. (So I'd rather shove in the values and rewrite out the derivations later ?) - // NOTE: I "re-wrote" and "reduplicate" the code for child and grandChild keys derivations inorder to get the child and grandchild from the child - // TODO: Make this more better in the future + // NOTE: I "re-wrote" and "reduplicate" the code for child and grandChild keys derivations inorder to get the child and grandchild from the child + // TODO: Make this more better in the future - const path = 'm/0/0' - // let p = path.split('/') + const path = 'm/0/0' + // let p = path.split('/') - // Get Public kEY - const derivePublicChildKey = () => { + // Get Public kEY + const derivePublicChildKey = () => { - const _privateKey = [...this.childPrivateKey] - const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) + const _privateKey = [...this.childPrivateKey] + const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) - const epCurve = EllipticCurve.getSECCurveByName("secp256k1") - const curvePoints = epCurve.getG().multiply(privateKeyBigInt) + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + const curvePoints = epCurve.getG().multiply(privateKeyBigInt) - const x = curvePoints.getX().toBigInteger() - const y = curvePoints.getY().toBigInteger() + const x = curvePoints.getX().toBigInteger() + const y = curvePoints.getY().toBigInteger() - // Compressed Public Key (33 bytes) - this.childPublicKey = EllipticCurve.integerToBytes(x, 32) + // Compressed Public Key (33 bytes) + this.childPublicKey = EllipticCurve.integerToBytes(x, 32) - if (y.isEven()) { + if (y.isEven()) { - this.childPublicKey.unshift(0x02) // append point indicator - } else { + this.childPublicKey.unshift(0x02) // append point indicator + } else { - this.childPublicKey.unshift(0x03) // append point indicator - } + this.childPublicKey.unshift(0x03) // append point indicator + } - // PublicKey Hash - const childPublicKeySHA256 = new Sha256().process(new Uint8Array(this.childPublicKey)).finish().result + // PublicKey Hash + const childPublicKeySHA256 = new Sha256().process(new Uint8Array(this.childPublicKey)).finish().result this.childPublicKeyHash = new RIPEMD160().update(Buffer.from(childPublicKeySHA256)).digest('hex') + // Call deriveExtendedPublicChildKey // WIll be hardcoding the values... + deriveExtendedPublicChildKey(1, 0) + } - // Call deriveExtendedPublicChildKey // WIll be hardcoding the values... - deriveExtendedPublicChildKey(1, 0) - } + const derivePrivateChildKey = (cI) => { - const derivePrivateChildKey = (cI) => { + let ib = [] + ib.push((cI >> 24) & 0xff) + ib.push((cI >> 16) & 0xff) + ib.push((cI >> 8) & 0xff) + ib.push(cI & 0xff) - let ib = [] - ib.push((cI >> 24) & 0xff) - ib.push((cI >> 16) & 0xff) - ib.push((cI >> 8) & 0xff) - ib.push(cI & 0xff) + const s = [...this.publicKey].concat(ib) - const s = [...this.publicKey].concat(ib) + const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.chainCode, format: "UINT8ARRAY" } }) + _hmacSha512.update(new Uint8Array(s)) - const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.chainCode, format: "UINT8ARRAY" } }) - _hmacSha512.update(new Uint8Array(s)) + const IL = BigInteger.fromByteArrayUnsigned([..._hmacSha512.getHMAC('UINT8ARRAY').slice(0, 32)]) + this.childChainCode = _hmacSha512.getHMAC('UINT8ARRAY').slice(32, 64) // IR according to the SPEC + + // SECP256k1 init + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + + const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.privateKey)).mod(epCurve.getN()) // parse256(IL) + kpar (mod n) ==> ki + this.childPrivateKey = ki.toByteArrayUnsigned() + + // Call deriveExtendedPrivateChildKey + deriveExtendedPrivateChildKey(1, 0) + } - const IL = BigInteger.fromByteArrayUnsigned([..._hmacSha512.getHMAC('UINT8ARRAY').slice(0, 32)]) - this.childChainCode = _hmacSha512.getHMAC('UINT8ARRAY').slice(32, 64) // IR according to the SPEC + const deriveExtendedPrivateChildKey = (i, childIndex) => { + + // Serialization Variable + const s = [] + + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.private))) + + // Append Depth (using the index as depth) + i = parseInt(i) + s.push(i) + + // Append Parent Fingerprint + s.push(...(this.publicKeyHash.slice(0, 4))) + + // Append Child Index + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) + + // Append Chain Code + s.push(...this.childChainCode) + + // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) + s.push(0) + + // Append Private Key + s.push(...this.childPrivateKey) + + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) + + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... + + // Save to Private Key as Base58 encoded + this.xPrivateChildKey = Base58.encode(s) + } + + const deriveExtendedPublicChildKey = (i, childIndex) => { + + // Serialization Variable + const s = [] + + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.public))) + + // Append Depth + i = parseInt(i) + s.push(i) + + // Append Parent Fingerprint + s.push(...(this.publicKeyHash.slice(0, 4))) + + // Append Child Index + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) + + // Append Chain Code + s.push(...this.childChainCode) + + // Append Public Key + s.push(...this.childPublicKey) + + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) + + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... - // SECP256k1 init - const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + // Save to Public Key as Base58 encoded + this.xPublicChildKey = Base58.encode(s) + } - const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.privateKey)).mod(epCurve.getN()) // parse256(IL) + kpar (mod n) ==> ki - this.childPrivateKey = ki.toByteArrayUnsigned() + /** + * GRAND CHILD KEYS + * + * NOTE: I know this is not the best way to generate this (even though it works the way it ought) + * Things to rewrite will be and not limited to deriving this through a for loop, removing hard code values, etc... + */ - // Call deriveExtendedPrivateChildKey - deriveExtendedPrivateChildKey(1, 0) - } + const derivePublicGrandChildKey = () => { + + const _privateKey = [...this.grandChildPrivateKey] + const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) - const deriveExtendedPrivateChildKey = (i, childIndex) => { + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + const curvePoints = epCurve.getG().multiply(privateKeyBigInt) - // Serialization Variable - const s = [] + const x = curvePoints.getX().toBigInteger() + const y = curvePoints.getY().toBigInteger() - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.private))) - - // Append Depth (using the index as depth) - i = parseInt(i) - s.push(i) - - // Append Parent Fingerprint - s.push(...(this.publicKeyHash.slice(0, 4))) - - // Append Child Index - s.push(childIndex >>> 24) - s.push((childIndex >>> 16) & 0xff) - s.push((childIndex >>> 8) & 0xff) - s.push(childIndex & 0xff) - - // Append Chain Code - s.push(...this.childChainCode) - - // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) - s.push(0) - - // Append Private Key - s.push(...this.childPrivateKey) - - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) - - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... - - // Save to Private Key as Base58 encoded - this.xPrivateChildKey = Base58.encode(s) - } - - const deriveExtendedPublicChildKey = (i, childIndex) => { - - // Serialization Variable - const s = [] - - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.public))) - - // Append Depth - i = parseInt(i) - s.push(i) - - // Append Parent Fingerprint - s.push(...(this.publicKeyHash.slice(0, 4))) - - // Append Child Index - s.push(childIndex >>> 24) - s.push((childIndex >>> 16) & 0xff) - s.push((childIndex >>> 8) & 0xff) - s.push(childIndex & 0xff) - - // Append Chain Code - s.push(...this.childChainCode) - - // Append Public Key - s.push(...this.childPublicKey) - - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) - - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... + // Compressed Public Key (33 bytes) + this.grandChildPublicKey = EllipticCurve.integerToBytes(x, 32) - // Save to Public Key as Base58 encoded - this.xPublicChildKey = Base58.encode(s) - } + if (y.isEven()) { + this.grandChildPublicKey.unshift(0x02) // append point indicator + } else { + this.grandChildPublicKey.unshift(0x03) // append point indicator + } - - /** - * GRAND CHILD KEYS - * - * NOTE: I know this is not the best way to generate this (even though it works the way it ought) - * Things to rewrite will be and not limited to deriving this through a for loop, removing hard code values, etc... - */ - - const derivePublicGrandChildKey = () => { - - const _privateKey = [...this.grandChildPrivateKey] - const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) - - - const epCurve = EllipticCurve.getSECCurveByName("secp256k1") - const curvePoints = epCurve.getG().multiply(privateKeyBigInt) - - const x = curvePoints.getX().toBigInteger() - const y = curvePoints.getY().toBigInteger() - - // Compressed Public Key (33 bytes) - this.grandChildPublicKey = EllipticCurve.integerToBytes(x, 32) - - - if (y.isEven()) { - this.grandChildPublicKey.unshift(0x02) // append point indicator - } else { - this.grandChildPublicKey.unshift(0x03) // append point indicator - } - - - // PublicKey Hash - const grandChildPublicKeySHA256 = new Sha256().process(new Uint8Array(this.grandChildPublicKey)).finish().result + // PublicKey Hash + const grandChildPublicKeySHA256 = new Sha256().process(new Uint8Array(this.grandChildPublicKey)).finish().result this.grandChildPublicKeyHash = new RIPEMD160().update(Buffer.from(grandChildPublicKeySHA256)).digest('hex') - // Call deriveExtendedPublicChildKey // WIll be hardcoding the values... - deriveExtendedPublicGrandChildKey(2, 0) + // Call deriveExtendedPublicChildKey // WIll be hardcoding the values... + deriveExtendedPublicGrandChildKey(2, 0) - /** - * Derive Litecoin Legacy Address - */ + /** + * Derive Litecoin Legacy Address + */ - // Append Address Prefix - let prefix = [this.versionBytes.mainnet.prefix] - if (2 == this.versionBytes.mainnet.prefix.length) { - prefix = [this.versionBytes.mainnet.prefix[0]] - prefix.push([this.versionBytes.mainnet.prefix[1]]) - } + // Append Address Prefix + let prefix = [this.versionBytes.mainnet.prefix] + if (2 == this.versionBytes.mainnet.prefix.length) { + prefix = [this.versionBytes.mainnet.prefix[0]] + prefix.push([this.versionBytes.mainnet.prefix[1]]) + } - const k = prefix.concat(...this.grandChildPublicKeyHash) + const k = prefix.concat(...this.grandChildPublicKeyHash) - // Derive Checksum - const _addressCheckSum = new Sha256().process(new Sha256().process(new Uint8Array(k)).finish().result).finish().result - const addressCheckSum = _addressCheckSum.slice(0, 4) + // Derive Checksum + const _addressCheckSum = new Sha256().process(new Sha256().process(new Uint8Array(k)).finish().result).finish().result + const addressCheckSum = _addressCheckSum.slice(0, 4) - // Append CheckSum - const _litecoinLegacyAddress = k.concat(...addressCheckSum) + // Append CheckSum + const _litecoinLegacyAddress = k.concat(...addressCheckSum) - // Convert to Base58 - this.litecoinLegacyAddress = Base58.encode(_litecoinLegacyAddress) + // Convert to Base58 + this.litecoinLegacyAddress = Base58.encode(_litecoinLegacyAddress) - /** - * Derive TESTNET Litecoin Legacy Address - */ + /** + * Derive TESTNET Litecoin Legacy Address + */ - // Append Version Byte - const tK = [this.versionBytes.testnet.prefix].concat(...this.grandChildPublicKeyHash) + // Append Version Byte + const tK = [this.versionBytes.testnet.prefix].concat(...this.grandChildPublicKeyHash) - // Derive Checksum - const _tAddressCheckSum = new Sha256().process(new Sha256().process(new Uint8Array(tK)).finish().result).finish().result - const tAddressCheckSum = _tAddressCheckSum.slice(0, 4) + // Derive Checksum + const _tAddressCheckSum = new Sha256().process(new Sha256().process(new Uint8Array(tK)).finish().result).finish().result + const tAddressCheckSum = _tAddressCheckSum.slice(0, 4) - // Append CheckSum - const _tlitecoinLegacyAddress = tK.concat(...tAddressCheckSum) + // Append CheckSum + const _tlitecoinLegacyAddress = tK.concat(...tAddressCheckSum) - // Convert to Base58 - this._tlitecoinLegacyAddress = Base58.encode(_tlitecoinLegacyAddress) - } + // Convert to Base58 + this._tlitecoinLegacyAddress = Base58.encode(_tlitecoinLegacyAddress) + } - const derivePrivateGrandChildKey = (cI, i) => { + const derivePrivateGrandChildKey = (cI, i) => { - let ib = [] - ib.push((cI >> 24) & 0xff) - ib.push((cI >> 16) & 0xff) - ib.push((cI >> 8) & 0xff) - ib.push(cI & 0xff) + let ib = [] + ib.push((cI >> 24) & 0xff) + ib.push((cI >> 16) & 0xff) + ib.push((cI >> 8) & 0xff) + ib.push(cI & 0xff) - const s = [...this.childPublicKey].concat(ib) + const s = [...this.childPublicKey].concat(ib) - const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.childChainCode, format: "UINT8ARRAY" } }) - _hmacSha512.update(new Uint8Array(s)) + const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.childChainCode, format: "UINT8ARRAY" } }) + _hmacSha512.update(new Uint8Array(s)) - const IL = BigInteger.fromByteArrayUnsigned([..._hmacSha512.getHMAC('UINT8ARRAY').slice(0, 32)]) - this.grandChildChainCode = _hmacSha512.getHMAC('UINT8ARRAY').slice(32, 64) // IR according to the SPEC + const IL = BigInteger.fromByteArrayUnsigned([..._hmacSha512.getHMAC('UINT8ARRAY').slice(0, 32)]) + this.grandChildChainCode = _hmacSha512.getHMAC('UINT8ARRAY').slice(32, 64) // IR according to the SPEC - // SECP256k1 init - const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + // SECP256k1 init + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") - const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.childPrivateKey)).mod(epCurve.getN()) // parse256(IL) + kpar (mod n) ==> ki - this.grandChildPrivateKey = ki.toByteArrayUnsigned() + const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.childPrivateKey)).mod(epCurve.getN()) // parse256(IL) + kpar (mod n) ==> ki + this.grandChildPrivateKey = ki.toByteArrayUnsigned() - // Call deriveExtendedPrivateChildKey - deriveExtendedPrivateGrandChildKey(2, 0) - } + // Call deriveExtendedPrivateChildKey + deriveExtendedPrivateGrandChildKey(2, 0) + } + + const deriveExtendedPrivateGrandChildKey = (i, childIndex) => { + + // Serialization Variable + const s = [] + + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.private))) + + // Append Depth (using the index as depth) + i = parseInt(i) + s.push(i) + + // Append Parent Fingerprint + s.push(...(this.childPublicKeyHash.slice(0, 4))) + + // Append Child Index + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) + + // Append Chain Code + s.push(...this.grandChildChainCode) + + // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) + s.push(0) + + // Append Private Key + s.push(...this.grandChildPrivateKey) + + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) + + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... + + // Save to Private Key as Base58 encoded + this.xPrivateGrandChildKey = Base58.encode(s) + } + + const deriveExtendedPublicGrandChildKey = (i, childIndex) => { + + // Serialization Variable + const s = [] + + // Append Version Byte + s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.public))) + + // Append Depth + i = parseInt(i) + s.push(i) + + // Append Parent Fingerprint + s.push(...(this.childPublicKeyHash.slice(0, 4))) + + // Append Child Index + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) + + // Append Chain Code + s.push(...this.grandChildChainCode) + + // Append Public Key + s.push(...this.grandChildPublicKey) + + // Generate CheckSum + const _s = new Uint8Array(s) + const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result + const checkSum = _checkSum.slice(0, 4) + + // Append CheckSum + s.push(...checkSum) // And this brings us to the end of the serialization... + + // Save to Public Key as Base58 encoded + this.xPublicGrandChildKey = Base58.encode(s) + } + + // Hard Code value.. + let childIndex = 0 + + // Call derivePrivateChildKey //Hard code value + derivePrivateChildKey(childIndex) + + // Call derivePublicChildKey + derivePublicChildKey() - const deriveExtendedPrivateGrandChildKey = (i, childIndex) => { + // Call derivePrivateGrandChildKey // Hard Code value... + derivePrivateGrandChildKey(0, 2) - // Serialization Variable - const s = [] + // Call derivePublicGrandChildKey + derivePublicGrandChildKey() + } - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.private))) + returnWallet() { - // Append Depth (using the index as depth) - i = parseInt(i) - s.push(i) + // Will be limiting the exported Wallet Object to just the Master keys and Legacy Addresses - // Append Parent Fingerprint - s.push(...(this.childPublicKeyHash.slice(0, 4))) + const wallet = { + derivedMasterPrivateKey: this.masterPrivateKey, + derivedMasterPublicKey: this.masterPublicKey, + _tDerivedMasterPrivateKey: this._tMasterPrivateKey, + _tDerivedmasterPublicKey: this._tmasterPublicKey, + seed58: this.seed58, + address: this.litecoinLegacyAddress, + _taddress: this._tlitecoinLegacyAddress + } - // Append Child Index - s.push(childIndex >>> 24) - s.push((childIndex >>> 16) & 0xff) - s.push((childIndex >>> 8) & 0xff) - s.push(childIndex & 0xff) - - // Append Chain Code - s.push(...this.grandChildChainCode) - - // Append 1 byte '0x00' (to make the key data 33 bytes, DO THIS ONLY FOR PRIVATE KEYS ) - s.push(0) - - // Append Private Key - s.push(...this.grandChildPrivateKey) - - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) - - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... - - // Save to Private Key as Base58 encoded - this.xPrivateGrandChildKey = Base58.encode(s) - } - - const deriveExtendedPublicGrandChildKey = (i, childIndex) => { - - // Serialization Variable - const s = [] - - // Append Version Byte - s.push(...(utils.int32ToBytes(this.versionBytes.mainnet.public))) - - // Append Depth - i = parseInt(i) - s.push(i) - - // Append Parent Fingerprint - s.push(...(this.childPublicKeyHash.slice(0, 4))) - - // Append Child Index - s.push(childIndex >>> 24) - s.push((childIndex >>> 16) & 0xff) - s.push((childIndex >>> 8) & 0xff) - s.push(childIndex & 0xff) - - // Append Chain Code - s.push(...this.grandChildChainCode) - - // Append Public Key - s.push(...this.grandChildPublicKey) - - // Generate CheckSum - const _s = new Uint8Array(s) - const _checkSum = new Sha256().process(new Sha256().process(_s).finish().result).finish().result - const checkSum = _checkSum.slice(0, 4) - - // Append CheckSum - s.push(...checkSum) // And this brings us to the end of the serialization... - - // Save to Public Key as Base58 encoded - this.xPublicGrandChildKey = Base58.encode(s) - } - - - - // Hard Code value.. - let childIndex = 0 - - // Call derivePrivateChildKey //Hard code value - derivePrivateChildKey(childIndex) - - // Call derivePublicChildKey - derivePublicChildKey() - - - // Call derivePrivateGrandChildKey // Hard Code value... - derivePrivateGrandChildKey(0, 2) - - // Call derivePublicGrandChildKey - derivePublicGrandChildKey() - } - - returnWallet() { - - // Will be limiting the exported Wallet Object to just the Master keys and Legacy Addresses - - const wallet = { - derivedMasterPrivateKey: this.masterPrivateKey, - derivedMasterPublicKey: this.masterPublicKey, - _tDerivedMasterPrivateKey: this._tMasterPrivateKey, - _tDerivedmasterPublicKey: this._tmasterPublicKey, - seed58: this.seed58, - // derivedPrivateChildKey: this.xPrivateChildKey, - // derivedPublicChildKey: this.xPublicChildKey, - // derivedPrivateGrandChildKey: this.xPrivateGrandChildKey, - // derivedPublicGrandChildKey: this.xPublicGrandChildKey, - address: this.litecoinLegacyAddress, - _taddress: this._tlitecoinLegacyAddress - } - - this.wallet = wallet - return wallet - } + this.wallet = wallet + return wallet + } } diff --git a/crypto/api/bitcoin/ecbn.js b/crypto/api/bitcoin/ecbn.js index 5c08091a..311cc2ef 100644 --- a/crypto/api/bitcoin/ecbn.js +++ b/crypto/api/bitcoin/ecbn.js @@ -6,1998 +6,1988 @@ */ (function () { - - - // Copyright (c) 2005 Tom Wu - // All Rights Reserved. - // See "LICENSE" for details. - - // Basic JavaScript BN library - subset useful for RSA encryption. - - // Bits per digit - var dbits; - - // JavaScript engine analysis - var canary = 0xdeadbeefcafe; - var j_lm = (canary & 0xffffff) == 0xefcafe; - - // (public) Constructor - function BigInteger(a, b, c) { - if (a != null) - if ('number' == typeof a) this.fromNumber(a, b, c); - else if (b == null && 'string' != typeof a) this.fromString(a, 256); - else this.fromString(a, b); - } - - // return new, unset BigInteger - function nbi() { - return new BigInteger(null); - } - - // am: Compute w_j += (x*this_i), propagate carries, - // c is initial carry, returns final carry. - // c < 3*dvalue, x < 2*dvalue, this_i < dvalue - // We need to select the fastest one that works in this environment. - - // am1: use a single mult and divide to get the high bits, - // max digit bits should be 26 because - // max internal value = 2*dvalue^2-2*dvalue (< 2^53) - function am1(i, x, w, j, c, n) { - while (--n >= 0) { - var v = x * this[i++] + w[j] + c; - c = Math.floor(v / 0x4000000); - w[j++] = v & 0x3ffffff; - } - return c; - } - // am2 avoids a big mult-and-extract completely. - // Max digit bits should be <= 30 because we do bitwise ops - // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) - function am2(i, x, w, j, c, n) { - var xl = x & 0x7fff, - xh = x >> 15; - while (--n >= 0) { - var l = this[i] & 0x7fff; - var h = this[i++] >> 15; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); - c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); - w[j++] = l & 0x3fffffff; - } - return c; - } - // Alternately, set max digit bits to 28 since some - // browsers slow down when dealing with 32-bit numbers. - function am3(i, x, w, j, c, n) { - var xl = x & 0x3fff, - xh = x >> 14; - while (--n >= 0) { - var l = this[i] & 0x3fff; - var h = this[i++] >> 14; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; - c = (l >> 28) + (m >> 14) + xh * h; - w[j++] = l & 0xfffffff; - } - return c; - } - var inBrowser = typeof navigator !== 'undefined'; - if (inBrowser && j_lm && navigator.appName == 'Microsoft Internet Explorer') { - BigInteger.prototype.am = am2; - dbits = 30; - } else if (inBrowser && j_lm && navigator.appName != 'Netscape') { - BigInteger.prototype.am = am1; - dbits = 26; - } else { - // Mozilla/Netscape seems to prefer am3 - BigInteger.prototype.am = am3; - dbits = 28; - } - - BigInteger.prototype.DB = dbits; - BigInteger.prototype.DM = (1 << dbits) - 1; - BigInteger.prototype.DV = 1 << dbits; - - var BI_FP = 52; - BigInteger.prototype.FV = Math.pow(2, BI_FP); - BigInteger.prototype.F1 = BI_FP - dbits; - BigInteger.prototype.F2 = 2 * dbits - BI_FP; - - // Digit conversions - var BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz'; - var BI_RC = new Array(); - var rr, vv; - rr = '0'.charCodeAt(0); - for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; - rr = 'a'.charCodeAt(0); - for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; - rr = 'A'.charCodeAt(0); - for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; - - function int2char(n) { - return BI_RM.charAt(n); - } - function intAt(s, i) { - var c = BI_RC[s.charCodeAt(i)]; - return c == null ? -1 : c; - } - - // (protected) copy this to r - function bnpCopyTo(r) { - for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; - r.t = this.t; - r.s = this.s; - } - - // (protected) set from integer value x, -DV <= x < DV - function bnpFromInt(x) { - this.t = 1; - this.s = x < 0 ? -1 : 0; - if (x > 0) this[0] = x; - else if (x < -1) this[0] = x + this.DV; - else this.t = 0; - } - - // return bigint initialized to value - function nbv(i) { - var r = nbi(); - r.fromInt(i); - return r; - } - - // (protected) set from string and radix - function bnpFromString(s, b) { - // Auto-detect string notations - if (!b && s.length >= 2 && s[0] === '0') { - var isDetected = true; - switch (s[1]) { - case 'x': // Hexadecimal notation - b = 16; - break; - case 'b': // Binary notation - b = 2; - break; - case 'o': // Octal notation - b = 8; - break; - default: - isDetected = false; - } - - // Remove the notation string if any has been detected - if (isDetected) { - s = s.substr(2); - } - } - - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 256) k = 8; - // byte array - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else { - this.fromRadix(s, b); - return; - } - this.t = 0; - this.s = 0; - var i = s.length, - mi = false, - sh = 0; - while (--i >= 0) { - var x = k == 8 ? s[i] & 0xff : intAt(s, i); - if (x < 0) { - if (s.charAt(i) == '-') mi = true; - continue; - } - mi = false; - if (sh == 0) this[this.t++] = x; - else if (sh + k > this.DB) { - this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; - this[this.t++] = x >> (this.DB - sh); - } else this[this.t - 1] |= x << sh; - sh += k; - if (sh >= this.DB) sh -= this.DB; - } - if (k == 8 && (s[0] & 0x80) != 0) { - this.s = -1; - if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; - } - this.clamp(); - if (mi) BigInteger.ZERO.subTo(this, this); - } - - // (protected) clamp off excess high words - function bnpClamp() { - var c = this.s & this.DM; - while (this.t > 0 && this[this.t - 1] == c) --this.t; - } - - // (public) return string representation in given radix - function bnToString(b) { - if (this.s < 0) return '-' + this.negate().toString(b); - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else return this.toRadix(b); - var km = (1 << k) - 1, - d, - m = false, - r = '', - i = this.t; - var p = this.DB - ((i * this.DB) % k); - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) > 0) { - m = true; - r = int2char(d); - } - while (i >= 0) { - if (p < k) { - d = (this[i] & ((1 << p) - 1)) << (k - p); - d |= this[--i] >> (p += this.DB - k); - } else { - d = (this[i] >> (p -= k)) & km; - if (p <= 0) { - p += this.DB; - --i; - } - } - if (d > 0) m = true; - if (m) r += int2char(d); - } - } - return m ? r : '0'; - } - - // (public) -this - function bnNegate() { - var r = nbi(); - BigInteger.ZERO.subTo(this, r); - return r; - } - - // (public) |this| - function bnAbs() { - return this.s < 0 ? this.negate() : this; - } - - // (public) return + if this > a, - if this < a, 0 if equal - function bnCompareTo(a) { - var r = this.s - a.s; - if (r != 0) return r; - var i = this.t; - r = i - a.t; - if (r != 0) return this.s < 0 ? -r : r; - while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; - return 0; - } - - // returns bit length of the integer x - function nbits(x) { - var r = 1, - t; - if ((t = x >>> 16) != 0) { - x = t; - r += 16; - } - if ((t = x >> 8) != 0) { - x = t; - r += 8; - } - if ((t = x >> 4) != 0) { - x = t; - r += 4; - } - if ((t = x >> 2) != 0) { - x = t; - r += 2; - } - if ((t = x >> 1) != 0) { - x = t; - r += 1; - } - return r; - } - - // (public) return the number of bits in "this" - function bnBitLength() { - if (this.t <= 0) return 0; - return ( - this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)) - ); - } - - // (protected) r = this << n*DB - function bnpDLShiftTo(n, r) { - var i; - for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; - for (i = n - 1; i >= 0; --i) r[i] = 0; - r.t = this.t + n; - r.s = this.s; - } - - // (protected) r = this >> n*DB - function bnpDRShiftTo(n, r) { - for (var i = n; i < this.t; ++i) r[i - n] = this[i]; - r.t = Math.max(this.t - n, 0); - r.s = this.s; - } - - // (protected) r = this << n - function bnpLShiftTo(n, r) { - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << cbs) - 1; - var ds = Math.floor(n / this.DB), - c = (this.s << bs) & this.DM, - i; - for (i = this.t - 1; i >= 0; --i) { - r[i + ds + 1] = (this[i] >> cbs) | c; - c = (this[i] & bm) << bs; - } - for (i = ds - 1; i >= 0; --i) r[i] = 0; - r[ds] = c; - r.t = this.t + ds + 1; - r.s = this.s; - r.clamp(); - } - - // (protected) r = this >> n - function bnpRShiftTo(n, r) { - r.s = this.s; - var ds = Math.floor(n / this.DB); - if (ds >= this.t) { - r.t = 0; - return; - } - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << bs) - 1; - r[0] = this[ds] >> bs; - for (var i = ds + 1; i < this.t; ++i) { - r[i - ds - 1] |= (this[i] & bm) << cbs; - r[i - ds] = this[i] >> bs; - } - if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; - r.t = this.t - ds; - r.clamp(); - } - - // (protected) r = this - a - function bnpSubTo(a, r) { - var i = 0, - c = 0, - m = Math.min(a.t, this.t); - while (i < m) { - c += this[i] - a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - if (a.t < this.t) { - c -= a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c -= a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c -= a.s; - } - r.s = c < 0 ? -1 : 0; - if (c < -1) r[i++] = this.DV + c; - else if (c > 0) r[i++] = c; - r.t = i; - r.clamp(); - } - - // (protected) r = this * a, r != this,a (HAC 14.12) - // "this" should be the larger one if appropriate. - function bnpMultiplyTo(a, r) { - var x = this.abs(), - y = a.abs(); - var i = x.t; - r.t = i + y.t; - while (--i >= 0) r[i] = 0; - for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); - r.s = 0; - r.clamp(); - if (this.s != a.s) BigInteger.ZERO.subTo(r, r); - } - - // (protected) r = this^2, r != this (HAC 14.16) - function bnpSquareTo(r) { - var x = this.abs(); - var i = (r.t = 2 * x.t); - while (--i >= 0) r[i] = 0; - for (i = 0; i < x.t - 1; ++i) { - var c = x.am(i, x[i], r, 2 * i, 0, 1); - if ( - (r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= - x.DV - ) { - r[i + x.t] -= x.DV; - r[i + x.t + 1] = 1; - } - } - if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); - r.s = 0; - r.clamp(); - } - - // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) - // r != q, this != m. q or r may be null. - function bnpDivRemTo(m, q, r) { - var pm = m.abs(); - if (pm.t <= 0) return; - var pt = this.abs(); - if (pt.t < pm.t) { - if (q != null) q.fromInt(0); - if (r != null) this.copyTo(r); - return; - } - if (r == null) r = nbi(); - var y = nbi(), - ts = this.s, - ms = m.s; - var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus - if (nsh > 0) { - pm.lShiftTo(nsh, y); - pt.lShiftTo(nsh, r); - } else { - pm.copyTo(y); - pt.copyTo(r); - } - var ys = y.t; - var y0 = y[ys - 1]; - if (y0 == 0) return; - var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); - var d1 = this.FV / yt, - d2 = (1 << this.F1) / yt, - e = 1 << this.F2; - var i = r.t, - j = i - ys, - t = q == null ? nbi() : q; - y.dlShiftTo(j, t); - if (r.compareTo(t) >= 0) { - r[r.t++] = 1; - r.subTo(t, r); - } - BigInteger.ONE.dlShiftTo(ys, t); - t.subTo(y, y); // "negative" y so we can replace sub with am later - while (y.t < ys) y[y.t++] = 0; - while (--j >= 0) { - // Estimate quotient digit - var qd = - r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); - if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { - // Try it out - y.dlShiftTo(j, t); - r.subTo(t, r); - while (r[i] < --qd) r.subTo(t, r); - } - } - if (q != null) { - r.drShiftTo(ys, q); - if (ts != ms) BigInteger.ZERO.subTo(q, q); - } - r.t = ys; - r.clamp(); - if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder - if (ts < 0) BigInteger.ZERO.subTo(r, r); - } - - // (public) this mod a - function bnMod(a) { - var r = nbi(); - this.abs().divRemTo(a, null, r); - if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); - return r; - } - - // Modular reduction using "classic" algorithm - function Classic(m) { - this.m = m; - } - function cConvert(x) { - if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); - else return x; - } - function cRevert(x) { - return x; - } - function cReduce(x) { - x.divRemTo(this.m, null, x); - } - function cMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); - } - function cSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); - } - - Classic.prototype.convert = cConvert; - Classic.prototype.revert = cRevert; - Classic.prototype.reduce = cReduce; - Classic.prototype.mulTo = cMulTo; - Classic.prototype.sqrTo = cSqrTo; - - // (protected) return "-1/this % 2^DB"; useful for Mont. reduction - // justification: - // xy == 1 (mod m) - // xy = 1+km - // xy(2-xy) = (1+km)(1-km) - // x[y(2-xy)] = 1-k^2m^2 - // x[y(2-xy)] == 1 (mod m^2) - // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 - // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. - // JS multiply "overflows" differently from C/C++, so care is needed here. - function bnpInvDigit() { - if (this.t < 1) return 0; - var x = this[0]; - if ((x & 1) == 0) return 0; - var y = x & 3; // y == 1/x mod 2^2 - y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 - y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 - y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 - // last step - calculate inverse mod DV directly; - // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints - y = (y * (2 - ((x * y) % this.DV))) % this.DV; // y == 1/x mod 2^dbits - // we really want the negative inverse, and -DV < y < DV - return y > 0 ? this.DV - y : -y; - } - - // Montgomery reduction - function Montgomery(m) { - this.m = m; - this.mp = m.invDigit(); - this.mpl = this.mp & 0x7fff; - this.mph = this.mp >> 15; - this.um = (1 << (m.DB - 15)) - 1; - this.mt2 = 2 * m.t; - } - - // xR mod m - function montConvert(x) { - var r = nbi(); - x.abs().dlShiftTo(this.m.t, r); - r.divRemTo(this.m, null, r); - if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); - return r; - } - - // x/R mod m - function montRevert(x) { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; - } - - // x = x/R mod m (HAC 14.32) - function montReduce(x) { - while ( - x.t <= this.mt2 // pad x so am has enough room later - ) - x[x.t++] = 0; - for (var i = 0; i < this.m.t; ++i) { - // faster way of calculating u0 = x[i]*mp mod DV - var j = x[i] & 0x7fff; - var u0 = - (j * this.mpl + - (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & - x.DM; - // use am to combine the multiply-shift-add into one call - j = i + this.m.t; - x[j] += this.m.am(0, u0, x, i, 0, this.m.t); - // propagate carry - while (x[j] >= x.DV) { - x[j] -= x.DV; - x[++j]++; - } - } - x.clamp(); - x.drShiftTo(this.m.t, x); - if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); - } - - // r = "x^2/R mod m"; x != r - function montSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); - } - - // r = "xy/R mod m"; x,y != r - function montMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); - } - - Montgomery.prototype.convert = montConvert; - Montgomery.prototype.revert = montRevert; - Montgomery.prototype.reduce = montReduce; - Montgomery.prototype.mulTo = montMulTo; - Montgomery.prototype.sqrTo = montSqrTo; - - // (protected) true iff this is even - function bnpIsEven() { - return (this.t > 0 ? this[0] & 1 : this.s) == 0; - } - - // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) - function bnpExp(e, z) { - if (e > 0xffffffff || e < 1) return BigInteger.ONE; - var r = nbi(), - r2 = nbi(), - g = z.convert(this), - i = nbits(e) - 1; - g.copyTo(r); - while (--i >= 0) { - z.sqrTo(r, r2); - if ((e & (1 << i)) > 0) z.mulTo(r2, g, r); - else { - var t = r; - r = r2; - r2 = t; - } - } - return z.revert(r); - } - - // (public) this^e % m, 0 <= e < 2^32 - function bnModPowInt(e, m) { - var z; - if (e < 256 || m.isEven()) z = new Classic(m); - else z = new Montgomery(m); - return this.exp(e, z); - } - - // protected - BigInteger.prototype.copyTo = bnpCopyTo; - BigInteger.prototype.fromInt = bnpFromInt; - BigInteger.prototype.fromString = bnpFromString; - BigInteger.prototype.clamp = bnpClamp; - BigInteger.prototype.dlShiftTo = bnpDLShiftTo; - BigInteger.prototype.drShiftTo = bnpDRShiftTo; - BigInteger.prototype.lShiftTo = bnpLShiftTo; - BigInteger.prototype.rShiftTo = bnpRShiftTo; - BigInteger.prototype.subTo = bnpSubTo; - BigInteger.prototype.multiplyTo = bnpMultiplyTo; - BigInteger.prototype.squareTo = bnpSquareTo; - BigInteger.prototype.divRemTo = bnpDivRemTo; - BigInteger.prototype.invDigit = bnpInvDigit; - BigInteger.prototype.isEven = bnpIsEven; - BigInteger.prototype.exp = bnpExp; - - // public - BigInteger.prototype.toString = bnToString; - BigInteger.prototype.negate = bnNegate; - BigInteger.prototype.abs = bnAbs; - BigInteger.prototype.compareTo = bnCompareTo; - BigInteger.prototype.bitLength = bnBitLength; - BigInteger.prototype.mod = bnMod; - BigInteger.prototype.modPowInt = bnModPowInt; - - // "constants" - BigInteger.ZERO = nbv(0); - BigInteger.ONE = nbv(1); - BigInteger.valueOf = nbv; - - // Copyright (c) 2005-2009 Tom Wu - // All Rights Reserved. - // See "LICENSE" for details. - - // Extended JavaScript BN functions, required for RSA private ops. - - // Version 1.1: new BigInteger("0", 10) returns "proper" zero - // Version 1.2: square() API, isProbablePrime fix - - // (public) - function bnClone() { - var r = nbi(); - this.copyTo(r); - return r; - } - - // (public) return value as integer - function bnIntValue() { - if (this.s < 0) { - if (this.t == 1) return this[0] - this.DV; - else if (this.t == 0) return -1; - } else if (this.t == 1) return this[0]; - else if (this.t == 0) return 0; - // assumes 16 < DB < 32 - return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; - } - - // (public) return value as byte - function bnByteValue() { - return this.t == 0 ? this.s : (this[0] << 24) >> 24; - } - - // (public) return value as short (assumes DB>=16) - function bnShortValue() { - return this.t == 0 ? this.s : (this[0] << 16) >> 16; - } - - // (protected) return x s.t. r^x < DV - function bnpChunkSize(r) { - return Math.floor((Math.LN2 * this.DB) / Math.log(r)); - } - - // (public) 0 if this == 0, 1 if this > 0 - function bnSigNum() { - if (this.s < 0) return -1; - else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; - else return 1; - } - - // (protected) convert to radix string - function bnpToRadix(b) { - if (b == null) b = 10; - if (this.signum() == 0 || b < 2 || b > 36) return '0'; - var cs = this.chunkSize(b); - var a = Math.pow(b, cs); - var d = nbv(a), - y = nbi(), - z = nbi(), - r = ''; - this.divRemTo(d, y, z); - while (y.signum() > 0) { - r = (a + z.intValue()).toString(b).substr(1) + r; - y.divRemTo(d, y, z); - } - return z.intValue().toString(b) + r; - } - - // (protected) convert from radix string - function bnpFromRadix(s, b) { - this.fromInt(0); - if (b == null) b = 10; - var cs = this.chunkSize(b); - var d = Math.pow(b, cs), - mi = false, - j = 0, - w = 0; - for (var i = 0; i < s.length; ++i) { - var x = intAt(s, i); - if (x < 0) { - if (s.charAt(i) == '-' && this.signum() == 0) mi = true; - continue; - } - w = b * w + x; - if (++j >= cs) { - this.dMultiply(d); - this.dAddOffset(w, 0); - j = 0; - w = 0; - } - } - if (j > 0) { - this.dMultiply(Math.pow(b, j)); - this.dAddOffset(w, 0); - } - if (mi) BigInteger.ZERO.subTo(this, this); - } - - // (protected) alternate constructor - function bnpFromNumber(a, b, c) { - if ('number' == typeof b) { - // new BigInteger(int,int,RNG) - if (a < 2) this.fromInt(1); - else { - this.fromNumber(a, c); - if (!this.testBit(a - 1)) - // force MSB set - this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); - if (this.isEven()) this.dAddOffset(1, 0); // force odd - while (!this.isProbablePrime(b)) { - this.dAddOffset(2, 0); - if (this.bitLength() > a) - this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); - } - } - } else { - // new BigInteger(int,RNG) - var x = new Array(), - t = a & 7; - x.length = (a >> 3) + 1; - b.nextBytes(x); - if (t > 0) x[0] &= (1 << t) - 1; - else x[0] = 0; - this.fromString(x, 256); - } - } - - // (public) convert to bigendian byte array - function bnToByteArray() { - var i = this.t, - r = new Array(); - r[0] = this.s; - var p = this.DB - ((i * this.DB) % 8), - d, - k = 0; - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) - r[k++] = d | (this.s << (this.DB - p)); - while (i >= 0) { - if (p < 8) { - d = (this[i] & ((1 << p) - 1)) << (8 - p); - d |= this[--i] >> (p += this.DB - 8); - } else { - d = (this[i] >> (p -= 8)) & 0xff; - if (p <= 0) { - p += this.DB; - --i; - } - } - if ((d & 0x80) != 0) d |= -256; - if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k; - if (k > 0 || d != this.s) r[k++] = d; - } - } - return r; - } - - function bnEquals(a) { - return this.compareTo(a) == 0; - } - function bnMin(a) { - return this.compareTo(a) < 0 ? this : a; - } - function bnMax(a) { - return this.compareTo(a) > 0 ? this : a; - } - - // (protected) r = this op a (bitwise) - function bnpBitwiseTo(a, op, r) { - var i, - f, - m = Math.min(a.t, this.t); - for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); - if (a.t < this.t) { - f = a.s & this.DM; - for (i = m; i < this.t; ++i) r[i] = op(this[i], f); - r.t = this.t; - } else { - f = this.s & this.DM; - for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); - r.t = a.t; - } - r.s = op(this.s, a.s); - r.clamp(); - } - - // (public) this & a - function op_and(x, y) { - return x & y; - } - function bnAnd(a) { - var r = nbi(); - this.bitwiseTo(a, op_and, r); - return r; - } - - // (public) this | a - function op_or(x, y) { - return x | y; - } - function bnOr(a) { - var r = nbi(); - this.bitwiseTo(a, op_or, r); - return r; - } - - // (public) this ^ a - function op_xor(x, y) { - return x ^ y; - } - function bnXor(a) { - var r = nbi(); - this.bitwiseTo(a, op_xor, r); - return r; - } - - // (public) this & ~a - function op_andnot(x, y) { - return x & ~y; - } - function bnAndNot(a) { - var r = nbi(); - this.bitwiseTo(a, op_andnot, r); - return r; - } - - // (public) ~this - function bnNot() { - var r = nbi(); - for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; - r.t = this.t; - r.s = ~this.s; - return r; - } - - // (public) this << n - function bnShiftLeft(n) { - var r = nbi(); - if (n < 0) this.rShiftTo(-n, r); - else this.lShiftTo(n, r); - return r; - } - - // (public) this >> n - function bnShiftRight(n) { - var r = nbi(); - if (n < 0) this.lShiftTo(-n, r); - else this.rShiftTo(n, r); - return r; - } - - // return index of lowest 1-bit in x, x < 2^31 - function lbit(x) { - if (x == 0) return -1; - var r = 0; - if ((x & 0xffff) == 0) { - x >>= 16; - r += 16; - } - if ((x & 0xff) == 0) { - x >>= 8; - r += 8; - } - if ((x & 0xf) == 0) { - x >>= 4; - r += 4; - } - if ((x & 3) == 0) { - x >>= 2; - r += 2; - } - if ((x & 1) == 0) ++r; - return r; - } - - // (public) returns index of lowest 1-bit (or -1 if none) - function bnGetLowestSetBit() { - for (var i = 0; i < this.t; ++i) - if (this[i] != 0) return i * this.DB + lbit(this[i]); - if (this.s < 0) return this.t * this.DB; - return -1; - } - - // return number of 1 bits in x - function cbit(x) { - var r = 0; - while (x != 0) { - x &= x - 1; - ++r; - } - return r; - } - - // (public) return number of set bits - function bnBitCount() { - var r = 0, - x = this.s & this.DM; - for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); - return r; - } - - // (public) true iff nth bit is set - function bnTestBit(n) { - var j = Math.floor(n / this.DB); - if (j >= this.t) return this.s != 0; - return (this[j] & (1 << n % this.DB)) != 0; - } - - // (protected) this op (1<>= this.DB; - } - if (a.t < this.t) { - c += a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c += a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += a.s; - } - r.s = c < 0 ? -1 : 0; - if (c > 0) r[i++] = c; - else if (c < -1) r[i++] = this.DV + c; - r.t = i; - r.clamp(); - } - - // (public) this + a - function bnAdd(a) { - var r = nbi(); - this.addTo(a, r); - return r; - } - - // (public) this - a - function bnSubtract(a) { - var r = nbi(); - this.subTo(a, r); - return r; - } - - // (public) this * a - function bnMultiply(a) { - var r = nbi(); - this.multiplyTo(a, r); - return r; - } - - // (public) this^2 - function bnSquare() { - var r = nbi(); - this.squareTo(r); - return r; - } - - // (public) this / a - function bnDivide(a) { - var r = nbi(); - this.divRemTo(a, r, null); - return r; - } - - // (public) this % a - function bnRemainder(a) { - var r = nbi(); - this.divRemTo(a, null, r); - return r; - } - - // (public) [this/a,this%a] - function bnDivideAndRemainder(a) { - var q = nbi(), - r = nbi(); - this.divRemTo(a, q, r); - return new Array(q, r); - } - - // (protected) this *= n, this >= 0, 1 < n < DV - function bnpDMultiply(n) { - this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); - ++this.t; - this.clamp(); - } - - // (protected) this += n << w words, this >= 0 - function bnpDAddOffset(n, w) { - if (n == 0) return; - while (this.t <= w) this[this.t++] = 0; - this[w] += n; - while (this[w] >= this.DV) { - this[w] -= this.DV; - if (++w >= this.t) this[this.t++] = 0; - ++this[w]; - } - } - - // A "null" reducer - function NullExp() { } - function nNop(x) { - return x; - } - function nMulTo(x, y, r) { - x.multiplyTo(y, r); - } - function nSqrTo(x, r) { - x.squareTo(r); - } - - NullExp.prototype.convert = nNop; - NullExp.prototype.revert = nNop; - NullExp.prototype.mulTo = nMulTo; - NullExp.prototype.sqrTo = nSqrTo; - - // (public) this^e - function bnPow(e) { - return this.exp(e, new NullExp()); - } - - // (protected) r = lower n words of "this * a", a.t <= n - // "this" should be the larger one if appropriate. - function bnpMultiplyLowerTo(a, n, r) { - var i = Math.min(this.t + a.t, n); - r.s = 0; // assumes a,this >= 0 - r.t = i; - while (i > 0) r[--i] = 0; - var j; - for (j = r.t - this.t; i < j; ++i) - r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); - for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); - r.clamp(); - } - - // (protected) r = "this * a" without lower n words, n > 0 - // "this" should be the larger one if appropriate. - function bnpMultiplyUpperTo(a, n, r) { - --n; - var i = (r.t = this.t + a.t - n); - r.s = 0; // assumes a,this >= 0 - while (--i >= 0) r[i] = 0; - for (i = Math.max(n - this.t, 0); i < a.t; ++i) - r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); - r.clamp(); - r.drShiftTo(1, r); - } - - // Barrett modular reduction - function Barrett(m) { - // setup Barrett - this.r2 = nbi(); - this.q3 = nbi(); - BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); - this.mu = this.r2.divide(m); - this.m = m; - } - - function barrettConvert(x) { - if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); - else if (x.compareTo(this.m) < 0) return x; - else { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; - } - } - - function barrettRevert(x) { - return x; - } - - // x = x mod m (HAC 14.42) - function barrettReduce(x) { - x.drShiftTo(this.m.t - 1, this.r2); - if (x.t > this.m.t + 1) { - x.t = this.m.t + 1; - x.clamp(); - } - this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); - this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); - while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); - x.subTo(this.r2, x); - while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); - } - - // r = x^2 mod m; x != r - function barrettSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); - } - - // r = x*y mod m; x,y != r - function barrettMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); - } - - Barrett.prototype.convert = barrettConvert; - Barrett.prototype.revert = barrettRevert; - Barrett.prototype.reduce = barrettReduce; - Barrett.prototype.mulTo = barrettMulTo; - Barrett.prototype.sqrTo = barrettSqrTo; - - // (public) this^e % m (HAC 14.85) - function bnModPow(e, m) { - var i = e.bitLength(), - k, - r = nbv(1), - z; - if (i <= 0) return r; - else if (i < 18) k = 1; - else if (i < 48) k = 3; - else if (i < 144) k = 4; - else if (i < 768) k = 5; - else k = 6; - if (i < 8) z = new Classic(m); - else if (m.isEven()) z = new Barrett(m); - else z = new Montgomery(m); - - // precomputation - var g = new Array(), - n = 3, - k1 = k - 1, - km = (1 << k) - 1; - g[1] = z.convert(this); - if (k > 1) { - var g2 = nbi(); - z.sqrTo(g[1], g2); - while (n <= km) { - g[n] = nbi(); - z.mulTo(g2, g[n - 2], g[n]); - n += 2; - } - } - - var j = e.t - 1, - w, - is1 = true, - r2 = nbi(), - t; - i = nbits(e[j]) - 1; - while (j >= 0) { - if (i >= k1) w = (e[j] >> (i - k1)) & km; - else { - w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); - if (j > 0) w |= e[j - 1] >> (this.DB + i - k1); - } - - n = k; - while ((w & 1) == 0) { - w >>= 1; - --n; - } - if ((i -= n) < 0) { - i += this.DB; - --j; - } - if (is1) { - // ret == 1, don't bother squaring or multiplying it - g[w].copyTo(r); - is1 = false; - } else { - while (n > 1) { - z.sqrTo(r, r2); - z.sqrTo(r2, r); - n -= 2; - } - if (n > 0) z.sqrTo(r, r2); - else { - t = r; - r = r2; - r2 = t; - } - z.mulTo(r2, g[w], r); - } - - while (j >= 0 && (e[j] & (1 << i)) == 0) { - z.sqrTo(r, r2); - t = r; - r = r2; - r2 = t; - if (--i < 0) { - i = this.DB - 1; - --j; - } - } - } - return z.revert(r); - } - - // (public) gcd(this,a) (HAC 14.54) - function bnGCD(a) { - var x = this.s < 0 ? this.negate() : this.clone(); - var y = a.s < 0 ? a.negate() : a.clone(); - if (x.compareTo(y) < 0) { - var t = x; - x = y; - y = t; - } - var i = x.getLowestSetBit(), - g = y.getLowestSetBit(); - if (g < 0) return x; - if (i < g) g = i; - if (g > 0) { - x.rShiftTo(g, x); - y.rShiftTo(g, y); - } - while (x.signum() > 0) { - if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); - if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); - if (x.compareTo(y) >= 0) { - x.subTo(y, x); - x.rShiftTo(1, x); - } else { - y.subTo(x, y); - y.rShiftTo(1, y); - } - } - if (g > 0) y.lShiftTo(g, y); - return y; - } - - // (protected) this % n, n < 2^26 - function bnpModInt(n) { - if (n <= 0) return 0; - var d = this.DV % n, - r = this.s < 0 ? n - 1 : 0; - if (this.t > 0) - if (d == 0) r = this[0] % n; - else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; - return r; - } - - // (public) 1/this % m (HAC 14.61) - function bnModInverse(m) { - var ac = m.isEven(); - if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; - var u = m.clone(), - v = this.clone(); - var a = nbv(1), - b = nbv(0), - c = nbv(0), - d = nbv(1); - while (u.signum() != 0) { - while (u.isEven()) { - u.rShiftTo(1, u); - if (ac) { - if (!a.isEven() || !b.isEven()) { - a.addTo(this, a); - b.subTo(m, b); - } - a.rShiftTo(1, a); - } else if (!b.isEven()) b.subTo(m, b); - b.rShiftTo(1, b); - } - while (v.isEven()) { - v.rShiftTo(1, v); - if (ac) { - if (!c.isEven() || !d.isEven()) { - c.addTo(this, c); - d.subTo(m, d); - } - c.rShiftTo(1, c); - } else if (!d.isEven()) d.subTo(m, d); - d.rShiftTo(1, d); - } - if (u.compareTo(v) >= 0) { - u.subTo(v, u); - if (ac) a.subTo(c, a); - b.subTo(d, b); - } else { - v.subTo(u, v); - if (ac) c.subTo(a, c); - d.subTo(b, d); - } - } - if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; - if (d.compareTo(m) >= 0) return d.subtract(m); - if (d.signum() < 0) d.addTo(m, d); - else return d; - if (d.signum() < 0) return d.add(m); - else return d; - } - - var lowprimes = [ - 2, - 3, - 5, - 7, - 11, - 13, - 17, - 19, - 23, - 29, - 31, - 37, - 41, - 43, - 47, - 53, - 59, - 61, - 67, - 71, - 73, - 79, - 83, - 89, - 97, - 101, - 103, - 107, - 109, - 113, - 127, - 131, - 137, - 139, - 149, - 151, - 157, - 163, - 167, - 173, - 179, - 181, - 191, - 193, - 197, - 199, - 211, - 223, - 227, - 229, - 233, - 239, - 241, - 251, - 257, - 263, - 269, - 271, - 277, - 281, - 283, - 293, - 307, - 311, - 313, - 317, - 331, - 337, - 347, - 349, - 353, - 359, - 367, - 373, - 379, - 383, - 389, - 397, - 401, - 409, - 419, - 421, - 431, - 433, - 439, - 443, - 449, - 457, - 461, - 463, - 467, - 479, - 487, - 491, - 499, - 503, - 509, - 521, - 523, - 541, - 547, - 557, - 563, - 569, - 571, - 577, - 587, - 593, - 599, - 601, - 607, - 613, - 617, - 619, - 631, - 641, - 643, - 647, - 653, - 659, - 661, - 673, - 677, - 683, - 691, - 701, - 709, - 719, - 727, - 733, - 739, - 743, - 751, - 757, - 761, - 769, - 773, - 787, - 797, - 809, - 811, - 821, - 823, - 827, - 829, - 839, - 853, - 857, - 859, - 863, - 877, - 881, - 883, - 887, - 907, - 911, - 919, - 929, - 937, - 941, - 947, - 953, - 967, - 971, - 977, - 983, - 991, - 997, - ]; - var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; - - // (public) test primality with certainty >= 1-.5^t - function bnIsProbablePrime(t) { - var i, - x = this.abs(); - if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { - for (i = 0; i < lowprimes.length; ++i) - if (x[0] == lowprimes[i]) return true; - return false; - } - if (x.isEven()) return false; - i = 1; - while (i < lowprimes.length) { - var m = lowprimes[i], - j = i + 1; - while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; - m = x.modInt(m); - while (i < j) if (m % lowprimes[i++] == 0) return false; - } - return x.millerRabin(t); - } - - // (protected) true if probably prime (HAC 4.24, Miller-Rabin) - function bnpMillerRabin(t) { - var n1 = this.subtract(BigInteger.ONE); - var k = n1.getLowestSetBit(); - if (k <= 0) return false; - var r = n1.shiftRight(k); - t = (t + 1) >> 1; - if (t > lowprimes.length) t = lowprimes.length; - var a = nbi(); - for (var i = 0; i < t; ++i) { - //Pick bases at random, instead of starting at 2 - a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); - var y = a.modPow(r, this); - if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { - var j = 1; - while (j++ < k && y.compareTo(n1) != 0) { - y = y.modPowInt(2, this); - if (y.compareTo(BigInteger.ONE) == 0) return false; - } - if (y.compareTo(n1) != 0) return false; - } - } - return true; - } - - // protected - BigInteger.prototype.chunkSize = bnpChunkSize; - BigInteger.prototype.toRadix = bnpToRadix; - BigInteger.prototype.fromRadix = bnpFromRadix; - BigInteger.prototype.fromNumber = bnpFromNumber; - BigInteger.prototype.bitwiseTo = bnpBitwiseTo; - BigInteger.prototype.changeBit = bnpChangeBit; - BigInteger.prototype.addTo = bnpAddTo; - BigInteger.prototype.dMultiply = bnpDMultiply; - BigInteger.prototype.dAddOffset = bnpDAddOffset; - BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; - BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; - BigInteger.prototype.modInt = bnpModInt; - BigInteger.prototype.millerRabin = bnpMillerRabin; - - // public - BigInteger.prototype.clone = bnClone; - BigInteger.prototype.intValue = bnIntValue; - BigInteger.prototype.byteValue = bnByteValue; - BigInteger.prototype.shortValue = bnShortValue; - BigInteger.prototype.signum = bnSigNum; - BigInteger.prototype.toByteArray = bnToByteArray; - BigInteger.prototype.equals = bnEquals; - BigInteger.prototype.min = bnMin; - BigInteger.prototype.max = bnMax; - BigInteger.prototype.and = bnAnd; - BigInteger.prototype.or = bnOr; - BigInteger.prototype.xor = bnXor; - BigInteger.prototype.andNot = bnAndNot; - BigInteger.prototype.not = bnNot; - BigInteger.prototype.shiftLeft = bnShiftLeft; - BigInteger.prototype.shiftRight = bnShiftRight; - BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; - BigInteger.prototype.bitCount = bnBitCount; - BigInteger.prototype.testBit = bnTestBit; - BigInteger.prototype.setBit = bnSetBit; - BigInteger.prototype.clearBit = bnClearBit; - BigInteger.prototype.flipBit = bnFlipBit; - BigInteger.prototype.add = bnAdd; - BigInteger.prototype.subtract = bnSubtract; - BigInteger.prototype.multiply = bnMultiply; - BigInteger.prototype.divide = bnDivide; - BigInteger.prototype.remainder = bnRemainder; - BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; - BigInteger.prototype.modPow = bnModPow; - BigInteger.prototype.modInverse = bnModInverse; - BigInteger.prototype.pow = bnPow; - BigInteger.prototype.gcd = bnGCD; - BigInteger.prototype.isProbablePrime = bnIsProbablePrime; - - // JSBN-specific extension - BigInteger.prototype.square = bnSquare; - - // Expose the Barrett function - BigInteger.prototype.Barrett = Barrett; - - // BigInteger interfaces not implemented in jsbn: - - // BigInteger(int signum, byte[] magnitude) - // double doubleValue() - // float floatValue() - // int hashCode() - // long longValue() - // static BigInteger valueOf(long val) - - // Imported from bitcoinjs-lib - - /** - * Turns a byte array into a big integer. - * - * This function will interpret a byte array as a big integer in big - * endian notation and ignore leading zeros. - */ - - BigInteger.fromByteArrayUnsigned = function (ba) { - - if (!ba.length) { - return new BigInteger.valueOf(0); - } else if (ba[0] & 0x80) { - // Prepend a zero so the BigInteger class doesn't mistake this - // for a negative integer. - return new BigInteger([0].concat(ba)); - } else { - return new BigInteger(ba); - } - }; - - /** - * Parse a signed big integer byte representation. - * - * For details on the format please see BigInteger.toByteArraySigned. - */ - - BigInteger.fromByteArraySigned = function (ba) { - // Check for negative value - if (ba[0] & 0x80) { - // Remove sign bit - ba[0] &= 0x7f; - - return BigInteger.fromByteArrayUnsigned(ba).negate(); - } else { - return BigInteger.fromByteArrayUnsigned(ba); - } - }; - - /** - * Returns a byte array representation of the big integer. - * - * This returns the absolute of the contained value in big endian - * form. A value of zero results in an empty array. - */ - - BigInteger.prototype.toByteArrayUnsigned = function () { - var ba = this.abs().toByteArray(); - - // Empty array, nothing to do - if (!ba.length) { - return ba; - } - - // remove leading 0 - if (ba[0] === 0) { - ba = ba.slice(1); - } - - // all values must be positive - for (var i = 0; i < ba.length; ++i) { - ba[i] = (ba[i] < 0) ? ba[i] + 256 : ba[i]; - } - - return ba; - }; - - /* - * Converts big integer to signed byte representation. - * - * The format for this value uses the most significant bit as a sign - * bit. If the most significant bit is already occupied by the - * absolute value, an extra byte is prepended and the sign bit is set - * there. - * - * Examples: - * - * 0 => 0x00 - * 1 => 0x01 - * -1 => 0x81 - * 127 => 0x7f - * -127 => 0xff - * 128 => 0x0080 - * -128 => 0x8080 - * 255 => 0x00ff - * -255 => 0x80ff - * 16300 => 0x3fac - * -16300 => 0xbfac - * 62300 => 0x00f35c - * -62300 => 0x80f35c - */ - - BigInteger.prototype.toByteArraySigned = function () { - var val = this.toByteArrayUnsigned(); - var neg = this.s < 0; - - // if the first bit is set, we always unshift - // either unshift 0x80 or 0x00 - if (val[0] & 0x80) { - val.unshift((neg) ? 0x80 : 0x00); - } - // if the first bit isn't set, set it if negative - else if (neg) { - val[0] |= 0x80; - } - - return val; - }; - - // Random number generator - requires a PRNG backend, e.g. prng4.js - - // For best results, put code like - // - // in your main HTML document. - - var rng_state; - var rng_pool; - var rng_pptr; - - // Mix in a 32-bit integer into the pool - function rng_seed_int(x) { - rng_pool[rng_pptr++] ^= x & 255; - rng_pool[rng_pptr++] ^= (x >> 8) & 255; - rng_pool[rng_pptr++] ^= (x >> 16) & 255; - rng_pool[rng_pptr++] ^= (x >> 24) & 255; - if (rng_pptr >= rng_psize) rng_pptr -= rng_psize; - } - - // Mix in the current time (w/milliseconds) into the pool - function rng_seed_time() { - rng_seed_int(new Date().getTime()); - } - - // Initialize the pool with junk if needed. - if (rng_pool == null) { - rng_pool = new Array(); - rng_pptr = 0; - var t; - if (typeof window !== 'undefined' && window.crypto) { - if (window.crypto.getRandomValues) { - // Use webcrypto if available - var ua = new Uint8Array(32); - window.crypto.getRandomValues(ua); - for (t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t]; - } else if ( - navigator.appName == 'Netscape' && - navigator.appVersion < '5' - ) { - // Extract entropy (256 bits) from NS4 RNG if available - var z = window.crypto.random(32); - for (t = 0; t < z.length; ++t) - rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; - } - } - while (rng_pptr < rng_psize) { - // extract some randomness from Math.random() - t = Math.floor(65536 * Math.random()); - rng_pool[rng_pptr++] = t >>> 8; - rng_pool[rng_pptr++] = t & 255; - } - rng_pptr = 0; - rng_seed_time(); - //rng_seed_int(window.screenX); - //rng_seed_int(window.screenY); - } - - function rng_get_byte() { - if (rng_state == null) { - rng_seed_time(); - rng_state = prng_newstate(); - rng_state.init(rng_pool); - for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) - rng_pool[rng_pptr] = 0; - rng_pptr = 0; - //rng_pool = null; - } - // TODO: allow reseeding after first request - return rng_state.next(); - } - - function rng_get_bytes(ba) { - var i; - for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); - } - - function SecureRandom() { } - - SecureRandom.prototype.nextBytes = rng_get_bytes; - - // prng4.js - uses Arcfour as a PRNG - - function Arcfour() { - this.i = 0; - this.j = 0; - this.S = new Array(); - } - - // Initialize arcfour context from key, an array of ints, each from [0..255] - function ARC4init(key) { - var i, j, t; - for (i = 0; i < 256; ++i) this.S[i] = i; - j = 0; - for (i = 0; i < 256; ++i) { - j = (j + this.S[i] + key[i % key.length]) & 255; - t = this.S[i]; - this.S[i] = this.S[j]; - this.S[j] = t; - } - this.i = 0; - this.j = 0; - } - - function ARC4next() { - var t; - this.i = (this.i + 1) & 255; - this.j = (this.j + this.S[this.i]) & 255; - t = this.S[this.i]; - this.S[this.i] = this.S[this.j]; - this.S[this.j] = t; - return this.S[(t + this.S[this.i]) & 255]; - } - - Arcfour.prototype.init = ARC4init; - Arcfour.prototype.next = ARC4next; - - // Plug in your RNG constructor here - function prng_newstate() { - return new Arcfour(); - } - - // Pool size must be a multiple of 4 and greater than 32. - // An array of bytes the size of the pool will be passed to init() - var rng_psize = 256; - - - - - /*! - * Basic Javascript Elliptic Curve implementation - * Ported loosely from BouncyCastle's Java EC code - * Only Fp curves implemented for now - * - * Copyright Tom Wu, bitaddress.org BSD License. - * http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE - */ - - // Constructor function of Global EllipticCurve object - var ec = function () { }; - - - // ---------------- - // ECFieldElementFp constructor - // q instanceof BigInteger - // x instanceof BigInteger - ec.FieldElementFp = function (q, x) { - this.x = x; - // TODO if(x.compareTo(q) >= 0) error - this.q = q; - }; - - ec.FieldElementFp.prototype.equals = function (other) { - if (other == this) return true; - return (this.q.equals(other.q) && this.x.equals(other.x)); - }; - - ec.FieldElementFp.prototype.toBigInteger = function () { - return this.x; - }; - - ec.FieldElementFp.prototype.negate = function () { - return new ec.FieldElementFp(this.q, this.x.negate().mod(this.q)); - }; - - ec.FieldElementFp.prototype.add = function (b) { - return new ec.FieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q)); - }; - - ec.FieldElementFp.prototype.subtract = function (b) { - return new ec.FieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q)); - }; - - ec.FieldElementFp.prototype.multiply = function (b) { - return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q)); - }; - - ec.FieldElementFp.prototype.square = function () { - return new ec.FieldElementFp(this.q, this.x.square().mod(this.q)); - }; - - ec.FieldElementFp.prototype.divide = function (b) { - return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q)); - }; - - ec.FieldElementFp.prototype.getByteLength = function () { - return Math.floor((this.toBigInteger().bitLength() + 7) / 8); - }; - - // D.1.4 91 + // Copyright (c) 2005 Tom Wu + // All Rights Reserved. + // See "LICENSE" for details. + + // Basic JavaScript BN library - subset useful for RSA encryption. + + // Bits per digit + var dbits; + + // JavaScript engine analysis + var canary = 0xdeadbeefcafe; + var j_lm = (canary & 0xffffff) == 0xefcafe; + + // (public) Constructor + function BigInteger(a, b, c) { + if (a != null) + if ('number' == typeof a) this.fromNumber(a, b, c); + else if (b == null && 'string' != typeof a) this.fromString(a, 256); + else this.fromString(a, b); + } + + // return new, unset BigInteger + function nbi() { + return new BigInteger(null); + } + + // am: Compute w_j += (x*this_i), propagate carries, + // c is initial carry, returns final carry. + // c < 3*dvalue, x < 2*dvalue, this_i < dvalue + // We need to select the fastest one that works in this environment. + + // am1: use a single mult and divide to get the high bits, + // max digit bits should be 26 because + // max internal value = 2*dvalue^2-2*dvalue (< 2^53) + function am1(i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this[i++] + w[j] + c; + c = Math.floor(v / 0x4000000); + w[j++] = v & 0x3ffffff; + } + return c; + } + // am2 avoids a big mult-and-extract completely. + // Max digit bits should be <= 30 because we do bitwise ops + // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) + function am2(i, x, w, j, c, n) { + var xl = x & 0x7fff, + xh = x >> 15; + while (--n >= 0) { + var l = this[i] & 0x7fff; + var h = this[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w[j++] = l & 0x3fffffff; + } + return c; + } + // Alternately, set max digit bits to 28 since some + // browsers slow down when dealing with 32-bit numbers. + function am3(i, x, w, j, c, n) { + var xl = x & 0x3fff, + xh = x >> 14; + while (--n >= 0) { + var l = this[i] & 0x3fff; + var h = this[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w[j++] = l & 0xfffffff; + } + return c; + } + var inBrowser = typeof navigator !== 'undefined'; + if (inBrowser && j_lm && navigator.appName == 'Microsoft Internet Explorer') { + BigInteger.prototype.am = am2; + dbits = 30; + } else if (inBrowser && j_lm && navigator.appName != 'Netscape') { + BigInteger.prototype.am = am1; + dbits = 26; + } else { + // Mozilla/Netscape seems to prefer am3 + BigInteger.prototype.am = am3; + dbits = 28; + } + + BigInteger.prototype.DB = dbits; + BigInteger.prototype.DM = (1 << dbits) - 1; + BigInteger.prototype.DV = 1 << dbits; + + var BI_FP = 52; + BigInteger.prototype.FV = Math.pow(2, BI_FP); + BigInteger.prototype.F1 = BI_FP - dbits; + BigInteger.prototype.F2 = 2 * dbits - BI_FP; + + // Digit conversions + var BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz'; + var BI_RC = new Array(); + var rr, vv; + rr = '0'.charCodeAt(0); + for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; + rr = 'a'.charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + rr = 'A'.charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + + function int2char(n) { + return BI_RM.charAt(n); + } + function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return c == null ? -1 : c; + } + + // (protected) copy this to r + function bnpCopyTo(r) { + for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; + r.t = this.t; + r.s = this.s; + } + + // (protected) set from integer value x, -DV <= x < DV + function bnpFromInt(x) { + this.t = 1; + this.s = x < 0 ? -1 : 0; + if (x > 0) this[0] = x; + else if (x < -1) this[0] = x + this.DV; + else this.t = 0; + } + + // return bigint initialized to value + function nbv(i) { + var r = nbi(); + r.fromInt(i); + return r; + } + + // (protected) set from string and radix + function bnpFromString(s, b) { + // Auto-detect string notations + if (!b && s.length >= 2 && s[0] === '0') { + var isDetected = true; + switch (s[1]) { + case 'x': // Hexadecimal notation + b = 16; + break; + case 'b': // Binary notation + b = 2; + break; + case 'o': // Octal notation + b = 8; + break; + default: + isDetected = false; + } + + // Remove the notation string if any has been detected + if (isDetected) { + s = s.substr(2); + } + } + + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 256) k = 8; + // byte array + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length, + mi = false, + sh = 0; + while (--i >= 0) { + var x = k == 8 ? s[i] & 0xff : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == '-') mi = true; + continue; + } + mi = false; + if (sh == 0) this[this.t++] = x; + else if (sh + k > this.DB) { + this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; + this[this.t++] = x >> (this.DB - sh); + } else this[this.t - 1] |= x << sh; + sh += k; + if (sh >= this.DB) sh -= this.DB; + } + if (k == 8 && (s[0] & 0x80) != 0) { + this.s = -1; + if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; + } + this.clamp(); + if (mi) BigInteger.ZERO.subTo(this, this); + } + + // (protected) clamp off excess high words + function bnpClamp() { + var c = this.s & this.DM; + while (this.t > 0 && this[this.t - 1] == c) --this.t; + } + + // (public) return string representation in given radix + function bnToString(b) { + if (this.s < 0) return '-' + this.negate().toString(b); + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else return this.toRadix(b); + var km = (1 << k) - 1, + d, + m = false, + r = '', + i = this.t; + var p = this.DB - ((i * this.DB) % k); + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this[i] & ((1 << p) - 1)) << (k - p); + d |= this[--i] >> (p += this.DB - k); + } else { + d = (this[i] >> (p -= k)) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) m = true; + if (m) r += int2char(d); + } + } + return m ? r : '0'; + } + + // (public) -this + function bnNegate() { + var r = nbi(); + BigInteger.ZERO.subTo(this, r); + return r; + } + + // (public) |this| + function bnAbs() { + return this.s < 0 ? this.negate() : this; + } + + // (public) return + if this > a, - if this < a, 0 if equal + function bnCompareTo(a) { + var r = this.s - a.s; + if (r != 0) return r; + var i = this.t; + r = i - a.t; + if (r != 0) return this.s < 0 ? -r : r; + while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; + return 0; + } + + // returns bit length of the integer x + function nbits(x) { + var r = 1, + t; + if ((t = x >>> 16) != 0) { + x = t; + r += 16; + } + if ((t = x >> 8) != 0) { + x = t; + r += 8; + } + if ((t = x >> 4) != 0) { + x = t; + r += 4; + } + if ((t = x >> 2) != 0) { + x = t; + r += 2; + } + if ((t = x >> 1) != 0) { + x = t; + r += 1; + } + return r; + } + + // (public) return the number of bits in "this" + function bnBitLength() { + if (this.t <= 0) return 0; + return ( + this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)) + ); + } + + // (protected) r = this << n*DB + function bnpDLShiftTo(n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; + for (i = n - 1; i >= 0; --i) r[i] = 0; + r.t = this.t + n; + r.s = this.s; + } + + // (protected) r = this >> n*DB + function bnpDRShiftTo(n, r) { + for (var i = n; i < this.t; ++i) r[i - n] = this[i]; + r.t = Math.max(this.t - n, 0); + r.s = this.s; + } + + // (protected) r = this << n + function bnpLShiftTo(n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB), + c = (this.s << bs) & this.DM, + i; + for (i = this.t - 1; i >= 0; --i) { + r[i + ds + 1] = (this[i] >> cbs) | c; + c = (this[i] & bm) << bs; + } + for (i = ds - 1; i >= 0; --i) r[i] = 0; + r[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); + } + + // (protected) r = this >> n + function bnpRShiftTo(n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r[0] = this[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r[i - ds - 1] |= (this[i] & bm) << cbs; + r[i - ds] = this[i] >> bs; + } + if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; + r.t = this.t - ds; + r.clamp(); + } + + // (protected) r = this - a + function bnpSubTo(a, r) { + var i = 0, + c = 0, + m = Math.min(a.t, this.t); + while (i < m) { + c += this[i] - a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c -= a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = c < 0 ? -1 : 0; + if (c < -1) r[i++] = this.DV + c; + else if (c > 0) r[i++] = c; + r.t = i; + r.clamp(); + } + + // (protected) r = this * a, r != this,a (HAC 14.12) + // "this" should be the larger one if appropriate. + function bnpMultiplyTo(a, r) { + var x = this.abs(), + y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) r[i] = 0; + for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); + r.s = 0; + r.clamp(); + if (this.s != a.s) BigInteger.ZERO.subTo(r, r); + } + + // (protected) r = this^2, r != this (HAC 14.16) + function bnpSquareTo(r) { + var x = this.abs(); + var i = (r.t = 2 * x.t); + while (--i >= 0) r[i] = 0; + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x[i], r, 2 * i, 0, 1); + if ( + (r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= + x.DV + ) { + r[i + x.t] -= x.DV; + r[i + x.t + 1] = 1; + } + } + if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); + r.s = 0; + r.clamp(); + } + + // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) + // r != q, this != m. q or r may be null. + function bnpDivRemTo(m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) return; + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) q.fromInt(0); + if (r != null) this.copyTo(r); + return; + } + if (r == null) r = nbi(); + var y = nbi(), + ts = this.s, + ms = m.s; + var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y[ys - 1]; + if (y0 == 0) return; + var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt, + d2 = (1 << this.F1) / yt, + e = 1 << this.F2; + var i = r.t, + j = i - ys, + t = q == null ? nbi() : q; + y.dlShiftTo(j, t); + if (r.compareTo(t) >= 0) { + r[r.t++] = 1; + r.subTo(t, r); + } + BigInteger.ONE.dlShiftTo(ys, t); + t.subTo(y, y); // "negative" y so we can replace sub with am later + while (y.t < ys) y[y.t++] = 0; + while (--j >= 0) { + // Estimate quotient digit + var qd = + r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { + // Try it out + y.dlShiftTo(j, t); + r.subTo(t, r); + while (r[i] < --qd) r.subTo(t, r); + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms) BigInteger.ZERO.subTo(q, q); + } + r.t = ys; + r.clamp(); + if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder + if (ts < 0) BigInteger.ZERO.subTo(r, r); + } + + // (public) this mod a + function bnMod(a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); + return r; + } + + // Modular reduction using "classic" algorithm + function Classic(m) { + this.m = m; + } + function cConvert(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); + else return x; + } + function cRevert(x) { + return x; + } + function cReduce(x) { + x.divRemTo(this.m, null, x); + } + function cMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + function cSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + + Classic.prototype.convert = cConvert; + Classic.prototype.revert = cRevert; + Classic.prototype.reduce = cReduce; + Classic.prototype.mulTo = cMulTo; + Classic.prototype.sqrTo = cSqrTo; + + // (protected) return "-1/this % 2^DB"; useful for Mont. reduction + // justification: + // xy == 1 (mod m) + // xy = 1+km + // xy(2-xy) = (1+km)(1-km) + // x[y(2-xy)] = 1-k^2m^2 + // x[y(2-xy)] == 1 (mod m^2) + // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 + // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. + // JS multiply "overflows" differently from C/C++, so care is needed here. + function bnpInvDigit() { + if (this.t < 1) return 0; + var x = this[0]; + if ((x & 1) == 0) return 0; + var y = x & 3; // y == 1/x mod 2^2 + y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 + y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 + y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 + // last step - calculate inverse mod DV directly; + // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints + y = (y * (2 - ((x * y) % this.DV))) % this.DV; // y == 1/x mod 2^dbits + // we really want the negative inverse, and -DV < y < DV + return y > 0 ? this.DV - y : -y; + } + + // Montgomery reduction + function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 0x7fff; + this.mph = this.mp >> 15; + this.um = (1 << (m.DB - 15)) - 1; + this.mt2 = 2 * m.t; + } + + // xR mod m + function montConvert(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); + return r; + } + + // x/R mod m + function montRevert(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + + // x = x/R mod m (HAC 14.32) + function montReduce(x) { + while ( + x.t <= this.mt2 // pad x so am has enough room later + ) + x[x.t++] = 0; + for (var i = 0; i < this.m.t; ++i) { + // faster way of calculating u0 = x[i]*mp mod DV + var j = x[i] & 0x7fff; + var u0 = + (j * this.mpl + + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & + x.DM; + // use am to combine the multiply-shift-add into one call + j = i + this.m.t; + x[j] += this.m.am(0, u0, x, i, 0, this.m.t); + // propagate carry + while (x[j] >= x.DV) { + x[j] -= x.DV; + x[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + + // r = "x^2/R mod m"; x != r + function montSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + + // r = "xy/R mod m"; x,y != r + function montMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + + Montgomery.prototype.convert = montConvert; + Montgomery.prototype.revert = montRevert; + Montgomery.prototype.reduce = montReduce; + Montgomery.prototype.mulTo = montMulTo; + Montgomery.prototype.sqrTo = montSqrTo; + + // (protected) true iff this is even + function bnpIsEven() { + return (this.t > 0 ? this[0] & 1 : this.s) == 0; + } + + // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) + function bnpExp(e, z) { + if (e > 0xffffffff || e < 1) return BigInteger.ONE; + var r = nbi(), + r2 = nbi(), + g = z.convert(this), + i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z.sqrTo(r, r2); + if ((e & (1 << i)) > 0) z.mulTo(r2, g, r); + else { + var t = r; + r = r2; + r2 = t; + } + } + return z.revert(r); + } + + // (public) this^e % m, 0 <= e < 2^32 + function bnModPowInt(e, m) { + var z; + if (e < 256 || m.isEven()) z = new Classic(m); + else z = new Montgomery(m); + return this.exp(e, z); + } + + // protected + BigInteger.prototype.copyTo = bnpCopyTo; + BigInteger.prototype.fromInt = bnpFromInt; + BigInteger.prototype.fromString = bnpFromString; + BigInteger.prototype.clamp = bnpClamp; + BigInteger.prototype.dlShiftTo = bnpDLShiftTo; + BigInteger.prototype.drShiftTo = bnpDRShiftTo; + BigInteger.prototype.lShiftTo = bnpLShiftTo; + BigInteger.prototype.rShiftTo = bnpRShiftTo; + BigInteger.prototype.subTo = bnpSubTo; + BigInteger.prototype.multiplyTo = bnpMultiplyTo; + BigInteger.prototype.squareTo = bnpSquareTo; + BigInteger.prototype.divRemTo = bnpDivRemTo; + BigInteger.prototype.invDigit = bnpInvDigit; + BigInteger.prototype.isEven = bnpIsEven; + BigInteger.prototype.exp = bnpExp; + + // public + BigInteger.prototype.toString = bnToString; + BigInteger.prototype.negate = bnNegate; + BigInteger.prototype.abs = bnAbs; + BigInteger.prototype.compareTo = bnCompareTo; + BigInteger.prototype.bitLength = bnBitLength; + BigInteger.prototype.mod = bnMod; + BigInteger.prototype.modPowInt = bnModPowInt; + + // "constants" + BigInteger.ZERO = nbv(0); + BigInteger.ONE = nbv(1); + BigInteger.valueOf = nbv; + + // Copyright (c) 2005-2009 Tom Wu + // All Rights Reserved. + // See "LICENSE" for details. + + // Extended JavaScript BN functions, required for RSA private ops. + + // Version 1.1: new BigInteger("0", 10) returns "proper" zero + // Version 1.2: square() API, isProbablePrime fix + + // (public) + function bnClone() { + var r = nbi(); + this.copyTo(r); + return r; + } + + // (public) return value as integer + function bnIntValue() { + if (this.s < 0) { + if (this.t == 1) return this[0] - this.DV; + else if (this.t == 0) return -1; + } else if (this.t == 1) return this[0]; + else if (this.t == 0) return 0; + // assumes 16 < DB < 32 + return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; + } + + // (public) return value as byte + function bnByteValue() { + return this.t == 0 ? this.s : (this[0] << 24) >> 24; + } + + // (public) return value as short (assumes DB>=16) + function bnShortValue() { + return this.t == 0 ? this.s : (this[0] << 16) >> 16; + } + + // (protected) return x s.t. r^x < DV + function bnpChunkSize(r) { + return Math.floor((Math.LN2 * this.DB) / Math.log(r)); + } + + // (public) 0 if this == 0, 1 if this > 0 + function bnSigNum() { + if (this.s < 0) return -1; + else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; + else return 1; + } + + // (protected) convert to radix string + function bnpToRadix(b) { + if (b == null) b = 10; + if (this.signum() == 0 || b < 2 || b > 36) return '0'; + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a), + y = nbi(), + z = nbi(), + r = ''; + this.divRemTo(d, y, z); + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z); + } + return z.intValue().toString(b) + r; + } + + // (protected) convert from radix string + function bnpFromRadix(s, b) { + this.fromInt(0); + if (b == null) b = 10; + var cs = this.chunkSize(b); + var d = Math.pow(b, cs), + mi = false, + j = 0, + w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == '-' && this.signum() == 0) mi = true; + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) BigInteger.ZERO.subTo(this, this); + } + + // (protected) alternate constructor + function bnpFromNumber(a, b, c) { + if ('number' == typeof b) { + // new BigInteger(int,int,RNG) + if (a < 2) this.fromInt(1); + else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) + // force MSB set + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + if (this.isEven()) this.dAddOffset(1, 0); // force odd + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) + this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); + } + } + } else { + // new BigInteger(int,RNG) + var x = new Array(), + t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) x[0] &= (1 << t) - 1; + else x[0] = 0; + this.fromString(x, 256); + } + } + + // (public) convert to bigendian byte array + function bnToByteArray() { + var i = this.t, + r = new Array(); + r[0] = this.s; + var p = this.DB - ((i * this.DB) % 8), + d, + k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) + r[k++] = d | (this.s << (this.DB - p)); + while (i >= 0) { + if (p < 8) { + d = (this[i] & ((1 << p) - 1)) << (8 - p); + d |= this[--i] >> (p += this.DB - 8); + } else { + d = (this[i] >> (p -= 8)) & 0xff; + if (p <= 0) { + p += this.DB; + --i; + } + } + if ((d & 0x80) != 0) d |= -256; + if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k; + if (k > 0 || d != this.s) r[k++] = d; + } + } + return r; + } + + function bnEquals(a) { + return this.compareTo(a) == 0; + } + function bnMin(a) { + return this.compareTo(a) < 0 ? this : a; + } + function bnMax(a) { + return this.compareTo(a) > 0 ? this : a; + } + + // (protected) r = this op a (bitwise) + function bnpBitwiseTo(a, op, r) { + var i, + f, + m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); + if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) r[i] = op(this[i], f); + r.t = this.t; + } else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); + r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); + } + + // (public) this & a + function op_and(x, y) { + return x & y; + } + function bnAnd(a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; + } + + // (public) this | a + function op_or(x, y) { + return x | y; + } + function bnOr(a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; + } + + // (public) this ^ a + function op_xor(x, y) { + return x ^ y; + } + function bnXor(a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; + } + + // (public) this & ~a + function op_andnot(x, y) { + return x & ~y; + } + function bnAndNot(a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; + } + + // (public) ~this + function bnNot() { + var r = nbi(); + for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; + r.t = this.t; + r.s = ~this.s; + return r; + } + + // (public) this << n + function bnShiftLeft(n) { + var r = nbi(); + if (n < 0) this.rShiftTo(-n, r); + else this.lShiftTo(n, r); + return r; + } + + // (public) this >> n + function bnShiftRight(n) { + var r = nbi(); + if (n < 0) this.lShiftTo(-n, r); + else this.rShiftTo(n, r); + return r; + } + + // return index of lowest 1-bit in x, x < 2^31 + function lbit(x) { + if (x == 0) return -1; + var r = 0; + if ((x & 0xffff) == 0) { + x >>= 16; + r += 16; + } + if ((x & 0xff) == 0) { + x >>= 8; + r += 8; + } + if ((x & 0xf) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) ++r; + return r; + } + + // (public) returns index of lowest 1-bit (or -1 if none) + function bnGetLowestSetBit() { + for (var i = 0; i < this.t; ++i) + if (this[i] != 0) return i * this.DB + lbit(this[i]); + if (this.s < 0) return this.t * this.DB; + return -1; + } + + // return number of 1 bits in x + function cbit(x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; + } + + // (public) return number of set bits + function bnBitCount() { + var r = 0, + x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); + return r; + } + + // (public) true iff nth bit is set + function bnTestBit(n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) return this.s != 0; + return (this[j] & (1 << n % this.DB)) != 0; + } + + // (protected) this op (1<>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c += a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = c < 0 ? -1 : 0; + if (c > 0) r[i++] = c; + else if (c < -1) r[i++] = this.DV + c; + r.t = i; + r.clamp(); + } + + // (public) this + a + function bnAdd(a) { + var r = nbi(); + this.addTo(a, r); + return r; + } + + // (public) this - a + function bnSubtract(a) { + var r = nbi(); + this.subTo(a, r); + return r; + } + + // (public) this * a + function bnMultiply(a) { + var r = nbi(); + this.multiplyTo(a, r); + return r; + } + + // (public) this^2 + function bnSquare() { + var r = nbi(); + this.squareTo(r); + return r; + } + + // (public) this / a + function bnDivide(a) { + var r = nbi(); + this.divRemTo(a, r, null); + return r; + } + + // (public) this % a + function bnRemainder(a) { + var r = nbi(); + this.divRemTo(a, null, r); + return r; + } + + // (public) [this/a,this%a] + function bnDivideAndRemainder(a) { + var q = nbi(), + r = nbi(); + this.divRemTo(a, q, r); + return new Array(q, r); + } + + // (protected) this *= n, this >= 0, 1 < n < DV + function bnpDMultiply(n) { + this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); + } + + // (protected) this += n << w words, this >= 0 + function bnpDAddOffset(n, w) { + if (n == 0) return; + while (this.t <= w) this[this.t++] = 0; + this[w] += n; + while (this[w] >= this.DV) { + this[w] -= this.DV; + if (++w >= this.t) this[this.t++] = 0; + ++this[w]; + } + } + + // A "null" reducer + function NullExp() { } + function nNop(x) { + return x; + } + function nMulTo(x, y, r) { + x.multiplyTo(y, r); + } + function nSqrTo(x, r) { + x.squareTo(r); + } + + NullExp.prototype.convert = nNop; + NullExp.prototype.revert = nNop; + NullExp.prototype.mulTo = nMulTo; + NullExp.prototype.sqrTo = nSqrTo; + + // (public) this^e + function bnPow(e) { + return this.exp(e, new NullExp()); + } + + // (protected) r = lower n words of "this * a", a.t <= n + // "this" should be the larger one if appropriate. + function bnpMultiplyLowerTo(a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; // assumes a,this >= 0 + r.t = i; + while (i > 0) r[--i] = 0; + var j; + for (j = r.t - this.t; i < j; ++i) + r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); + for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); + r.clamp(); + } + + // (protected) r = "this * a" without lower n words, n > 0 + // "this" should be the larger one if appropriate. + function bnpMultiplyUpperTo(a, n, r) { + --n; + var i = (r.t = this.t + a.t - n); + r.s = 0; // assumes a,this >= 0 + while (--i >= 0) r[i] = 0; + for (i = Math.max(n - this.t, 0); i < a.t; ++i) + r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); + r.clamp(); + r.drShiftTo(1, r); + } + + // Barrett modular reduction + function Barrett(m) { + // setup Barrett + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + this.m = m; + } + + function barrettConvert(x) { + if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); + else if (x.compareTo(this.m) < 0) return x; + else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + } + + function barrettRevert(x) { + return x; + } + + // x = x mod m (HAC 14.42) + function barrettReduce(x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); + x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + + // r = x^2 mod m; x != r + function barrettSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + + // r = x*y mod m; x,y != r + function barrettMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + + Barrett.prototype.convert = barrettConvert; + Barrett.prototype.revert = barrettRevert; + Barrett.prototype.reduce = barrettReduce; + Barrett.prototype.mulTo = barrettMulTo; + Barrett.prototype.sqrTo = barrettSqrTo; + + // (public) this^e % m (HAC 14.85) + function bnModPow(e, m) { + var i = e.bitLength(), + k, + r = nbv(1), + z; + if (i <= 0) return r; + else if (i < 18) k = 1; + else if (i < 48) k = 3; + else if (i < 144) k = 4; + else if (i < 768) k = 5; + else k = 6; + if (i < 8) z = new Classic(m); + else if (m.isEven()) z = new Barrett(m); + else z = new Montgomery(m); + + // precomputation + var g = new Array(), + n = 3, + k1 = k - 1, + km = (1 << k) - 1; + g[1] = z.convert(this); + if (k > 1) { + var g2 = nbi(); + z.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + + var j = e.t - 1, + w, + is1 = true, + r2 = nbi(), + t; + i = nbits(e[j]) - 1; + while (j >= 0) { + if (i >= k1) w = (e[j] >> (i - k1)) & km; + else { + w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); + if (j > 0) w |= e[j - 1] >> (this.DB + i - k1); + } + + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { + // ret == 1, don't bother squaring or multiplying it + g[w].copyTo(r); + is1 = false; + } else { + while (n > 1) { + z.sqrTo(r, r2); + z.sqrTo(r2, r); + n -= 2; + } + if (n > 0) z.sqrTo(r, r2); + else { + t = r; + r = r2; + r2 = t; + } + z.mulTo(r2, g[w], r); + } + + while (j >= 0 && (e[j] & (1 << i)) == 0) { + z.sqrTo(r, r2); + t = r; + r = r2; + r2 = t; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z.revert(r); + } + + // (public) gcd(this,a) (HAC 14.54) + function bnGCD(a) { + var x = this.s < 0 ? this.negate() : this.clone(); + var y = a.s < 0 ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(), + g = y.getLowestSetBit(); + if (g < 0) return x; + if (i < g) g = i; + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); + if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) y.lShiftTo(g, y); + return y; + } + + // (protected) this % n, n < 2^26 + function bnpModInt(n) { + if (n <= 0) return 0; + var d = this.DV % n, + r = this.s < 0 ? n - 1 : 0; + if (this.t > 0) + if (d == 0) r = this[0] % n; + else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; + return r; + } + + // (public) 1/this % m (HAC 14.61) + function bnModInverse(m) { + var ac = m.isEven(); + if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; + var u = m.clone(), + v = this.clone(); + var a = nbv(1), + b = nbv(0), + c = nbv(0), + d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } else if (!b.isEven()) b.subTo(m, b); + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } else if (!d.isEven()) d.subTo(m, d); + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) a.subTo(c, a); + b.subTo(d, b); + } else { + v.subTo(u, v); + if (ac) c.subTo(a, c); + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; + if (d.compareTo(m) >= 0) return d.subtract(m); + if (d.signum() < 0) d.addTo(m, d); + else return d; + if (d.signum() < 0) return d.add(m); + else return d; + } + + var lowprimes = [ + 2, + 3, + 5, + 7, + 11, + 13, + 17, + 19, + 23, + 29, + 31, + 37, + 41, + 43, + 47, + 53, + 59, + 61, + 67, + 71, + 73, + 79, + 83, + 89, + 97, + 101, + 103, + 107, + 109, + 113, + 127, + 131, + 137, + 139, + 149, + 151, + 157, + 163, + 167, + 173, + 179, + 181, + 191, + 193, + 197, + 199, + 211, + 223, + 227, + 229, + 233, + 239, + 241, + 251, + 257, + 263, + 269, + 271, + 277, + 281, + 283, + 293, + 307, + 311, + 313, + 317, + 331, + 337, + 347, + 349, + 353, + 359, + 367, + 373, + 379, + 383, + 389, + 397, + 401, + 409, + 419, + 421, + 431, + 433, + 439, + 443, + 449, + 457, + 461, + 463, + 467, + 479, + 487, + 491, + 499, + 503, + 509, + 521, + 523, + 541, + 547, + 557, + 563, + 569, + 571, + 577, + 587, + 593, + 599, + 601, + 607, + 613, + 617, + 619, + 631, + 641, + 643, + 647, + 653, + 659, + 661, + 673, + 677, + 683, + 691, + 701, + 709, + 719, + 727, + 733, + 739, + 743, + 751, + 757, + 761, + 769, + 773, + 787, + 797, + 809, + 811, + 821, + 823, + 827, + 829, + 839, + 853, + 857, + 859, + 863, + 877, + 881, + 883, + 887, + 907, + 911, + 919, + 929, + 937, + 941, + 947, + 953, + 967, + 971, + 977, + 983, + 991, + 997, + ]; + var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + + // (public) test primality with certainty >= 1-.5^t + function bnIsProbablePrime(t) { + var i, + x = this.abs(); + if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) + if (x[0] == lowprimes[i]) return true; + return false; + } + if (x.isEven()) return false; + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i], + j = i + 1; + while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; + m = x.modInt(m); + while (i < j) if (m % lowprimes[i++] == 0) return false; + } + return x.millerRabin(t); + } + + // (protected) true if probably prime (HAC 4.24, Miller-Rabin) + function bnpMillerRabin(t) { + var n1 = this.subtract(BigInteger.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) return false; + var r = n1.shiftRight(k); + t = (t + 1) >> 1; + if (t > lowprimes.length) t = lowprimes.length; + var a = nbi(); + for (var i = 0; i < t; ++i) { + //Pick bases at random, instead of starting at 2 + a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger.ONE) == 0) return false; + } + if (y.compareTo(n1) != 0) return false; + } + } + return true; + } + + // protected + BigInteger.prototype.chunkSize = bnpChunkSize; + BigInteger.prototype.toRadix = bnpToRadix; + BigInteger.prototype.fromRadix = bnpFromRadix; + BigInteger.prototype.fromNumber = bnpFromNumber; + BigInteger.prototype.bitwiseTo = bnpBitwiseTo; + BigInteger.prototype.changeBit = bnpChangeBit; + BigInteger.prototype.addTo = bnpAddTo; + BigInteger.prototype.dMultiply = bnpDMultiply; + BigInteger.prototype.dAddOffset = bnpDAddOffset; + BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; + BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; + BigInteger.prototype.modInt = bnpModInt; + BigInteger.prototype.millerRabin = bnpMillerRabin; + + // public + BigInteger.prototype.clone = bnClone; + BigInteger.prototype.intValue = bnIntValue; + BigInteger.prototype.byteValue = bnByteValue; + BigInteger.prototype.shortValue = bnShortValue; + BigInteger.prototype.signum = bnSigNum; + BigInteger.prototype.toByteArray = bnToByteArray; + BigInteger.prototype.equals = bnEquals; + BigInteger.prototype.min = bnMin; + BigInteger.prototype.max = bnMax; + BigInteger.prototype.and = bnAnd; + BigInteger.prototype.or = bnOr; + BigInteger.prototype.xor = bnXor; + BigInteger.prototype.andNot = bnAndNot; + BigInteger.prototype.not = bnNot; + BigInteger.prototype.shiftLeft = bnShiftLeft; + BigInteger.prototype.shiftRight = bnShiftRight; + BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; + BigInteger.prototype.bitCount = bnBitCount; + BigInteger.prototype.testBit = bnTestBit; + BigInteger.prototype.setBit = bnSetBit; + BigInteger.prototype.clearBit = bnClearBit; + BigInteger.prototype.flipBit = bnFlipBit; + BigInteger.prototype.add = bnAdd; + BigInteger.prototype.subtract = bnSubtract; + BigInteger.prototype.multiply = bnMultiply; + BigInteger.prototype.divide = bnDivide; + BigInteger.prototype.remainder = bnRemainder; + BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; + BigInteger.prototype.modPow = bnModPow; + BigInteger.prototype.modInverse = bnModInverse; + BigInteger.prototype.pow = bnPow; + BigInteger.prototype.gcd = bnGCD; + BigInteger.prototype.isProbablePrime = bnIsProbablePrime; + + // JSBN-specific extension + BigInteger.prototype.square = bnSquare; + + // Expose the Barrett function + BigInteger.prototype.Barrett = Barrett; + + // BigInteger interfaces not implemented in jsbn: + + // BigInteger(int signum, byte[] magnitude) + // double doubleValue() + // float floatValue() + // int hashCode() + // long longValue() + // static BigInteger valueOf(long val) + + // Imported from bitcoinjs-lib + + /** + * Turns a byte array into a big integer. + * + * This function will interpret a byte array as a big integer in big + * endian notation and ignore leading zeros. + */ + + BigInteger.fromByteArrayUnsigned = function (ba) { + + if (!ba.length) { + return new BigInteger.valueOf(0); + } else if (ba[0] & 0x80) { + // Prepend a zero so the BigInteger class doesn't mistake this + // for a negative integer. + return new BigInteger([0].concat(ba)); + } else { + return new BigInteger(ba); + } + }; + + /** + * Parse a signed big integer byte representation. + * + * For details on the format please see BigInteger.toByteArraySigned. + */ + + BigInteger.fromByteArraySigned = function (ba) { + // Check for negative value + if (ba[0] & 0x80) { + // Remove sign bit + ba[0] &= 0x7f; + + return BigInteger.fromByteArrayUnsigned(ba).negate(); + } else { + return BigInteger.fromByteArrayUnsigned(ba); + } + }; + + /** + * Returns a byte array representation of the big integer. + * + * This returns the absolute of the contained value in big endian + * form. A value of zero results in an empty array. + */ + + BigInteger.prototype.toByteArrayUnsigned = function () { + var ba = this.abs().toByteArray(); + + // Empty array, nothing to do + if (!ba.length) { + return ba; + } + + // remove leading 0 + if (ba[0] === 0) { + ba = ba.slice(1); + } + + // all values must be positive + for (var i = 0; i < ba.length; ++i) { + ba[i] = (ba[i] < 0) ? ba[i] + 256 : ba[i]; + } + + return ba; + }; + + /* + * Converts big integer to signed byte representation. + * + * The format for this value uses the most significant bit as a sign + * bit. If the most significant bit is already occupied by the + * absolute value, an extra byte is prepended and the sign bit is set + * there. + * + * Examples: + * + * 0 => 0x00 + * 1 => 0x01 + * -1 => 0x81 + * 127 => 0x7f + * -127 => 0xff + * 128 => 0x0080 + * -128 => 0x8080 + * 255 => 0x00ff + * -255 => 0x80ff + * 16300 => 0x3fac + * -16300 => 0xbfac + * 62300 => 0x00f35c + * -62300 => 0x80f35c + */ + + BigInteger.prototype.toByteArraySigned = function () { + var val = this.toByteArrayUnsigned(); + var neg = this.s < 0; + + // if the first bit is set, we always unshift + // either unshift 0x80 or 0x00 + if (val[0] & 0x80) { + val.unshift((neg) ? 0x80 : 0x00); + } + // if the first bit isn't set, set it if negative + else if (neg) { + val[0] |= 0x80; + } + + return val; + }; + + // Random number generator - requires a PRNG backend, e.g. prng4.js + + // For best results, put code like + // + // in your main HTML document. + + var rng_state; + var rng_pool; + var rng_pptr; + + // Mix in a 32-bit integer into the pool + function rng_seed_int(x) { + rng_pool[rng_pptr++] ^= x & 255; + rng_pool[rng_pptr++] ^= (x >> 8) & 255; + rng_pool[rng_pptr++] ^= (x >> 16) & 255; + rng_pool[rng_pptr++] ^= (x >> 24) & 255; + if (rng_pptr >= rng_psize) rng_pptr -= rng_psize; + } + + // Mix in the current time (w/milliseconds) into the pool + function rng_seed_time() { + rng_seed_int(new Date().getTime()); + } + + // Initialize the pool with junk if needed. + if (rng_pool == null) { + rng_pool = new Array(); + rng_pptr = 0; + var t; + if (typeof window !== 'undefined' && window.crypto) { + if (window.crypto.getRandomValues) { + // Use webcrypto if available + var ua = new Uint8Array(32); + window.crypto.getRandomValues(ua); + for (t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t]; + } else if ( + navigator.appName == 'Netscape' && + navigator.appVersion < '5' + ) { + // Extract entropy (256 bits) from NS4 RNG if available + var z = window.crypto.random(32); + for (t = 0; t < z.length; ++t) + rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; + } + } + while (rng_pptr < rng_psize) { + // extract some randomness from Math.random() + t = Math.floor(65536 * Math.random()); + rng_pool[rng_pptr++] = t >>> 8; + rng_pool[rng_pptr++] = t & 255; + } + rng_pptr = 0; + rng_seed_time(); + } + + function rng_get_byte() { + if (rng_state == null) { + rng_seed_time(); + rng_state = prng_newstate(); + rng_state.init(rng_pool); + for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) + rng_pool[rng_pptr] = 0; + rng_pptr = 0; + } + // TODO: allow reseeding after first request + return rng_state.next(); + } + + function rng_get_bytes(ba) { + var i; + for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); + } + + function SecureRandom() { } + + SecureRandom.prototype.nextBytes = rng_get_bytes; + + // prng4.js - uses Arcfour as a PRNG + function Arcfour() { + this.i = 0; + this.j = 0; + this.S = new Array(); + } + + // Initialize arcfour context from key, an array of ints, each from [0..255] + function ARC4init(key) { + var i, j, t; + for (i = 0; i < 256; ++i) this.S[i] = i; + j = 0; + for (i = 0; i < 256; ++i) { + j = (j + this.S[i] + key[i % key.length]) & 255; + t = this.S[i]; + this.S[i] = this.S[j]; + this.S[j] = t; + } + this.i = 0; + this.j = 0; + } + + function ARC4next() { + var t; + this.i = (this.i + 1) & 255; + this.j = (this.j + this.S[this.i]) & 255; + t = this.S[this.i]; + this.S[this.i] = this.S[this.j]; + this.S[this.j] = t; + return this.S[(t + this.S[this.i]) & 255]; + } + + Arcfour.prototype.init = ARC4init; + Arcfour.prototype.next = ARC4next; + + // Plug in your RNG constructor here + function prng_newstate() { + return new Arcfour(); + } + + // Pool size must be a multiple of 4 and greater than 32. + // An array of bytes the size of the pool will be passed to init() + var rng_psize = 256; + + /*! + * Basic Javascript Elliptic Curve implementation + * Ported loosely from BouncyCastle's Java EC code + * Only Fp curves implemented for now + * + * Copyright Tom Wu, bitaddress.org BSD License. + * http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE + */ + + // Constructor function of Global EllipticCurve object + var ec = function () { }; + + // ---------------- + // ECFieldElementFp constructor + // q instanceof BigInteger + // x instanceof BigInteger + ec.FieldElementFp = function (q, x) { + this.x = x; + // TODO if(x.compareTo(q) >= 0) error + this.q = q; + }; + + ec.FieldElementFp.prototype.equals = function (other) { + if (other == this) return true; + return (this.q.equals(other.q) && this.x.equals(other.x)); + }; + + ec.FieldElementFp.prototype.toBigInteger = function () { + return this.x; + }; + + ec.FieldElementFp.prototype.negate = function () { + return new ec.FieldElementFp(this.q, this.x.negate().mod(this.q)); + }; + + ec.FieldElementFp.prototype.add = function (b) { + return new ec.FieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q)); + }; + + ec.FieldElementFp.prototype.subtract = function (b) { + return new ec.FieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q)); + }; + + ec.FieldElementFp.prototype.multiply = function (b) { + return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q)); + }; + + ec.FieldElementFp.prototype.square = function () { + return new ec.FieldElementFp(this.q, this.x.square().mod(this.q)); + }; + + ec.FieldElementFp.prototype.divide = function (b) { + return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q)); + }; + + ec.FieldElementFp.prototype.getByteLength = function () { + return Math.floor((this.toBigInteger().bitLength() + 7) / 8); + }; + + // D.1.4 91 /** * return a sqrt root - the routine verifies that the calculation * returns the right value - if none exists it returns null. @@ -2005,530 +1995,526 @@ * Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) * Ported to JavaScript by bitaddress.org */ - ec.FieldElementFp.prototype.sqrt = function () { - if (!this.q.testBit(0)) throw new Error("even value of q"); + ec.FieldElementFp.prototype.sqrt = function () { + if (!this.q.testBit(0)) throw new Error("even value of q"); - // p mod 4 == 3 - if (this.q.testBit(1)) { - // z = g^(u+1) + p, p = 4u + 3 - var z = new ec.FieldElementFp(this.q, this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE), this.q)); - return z.square().equals(this) ? z : null; - } + // p mod 4 == 3 + if (this.q.testBit(1)) { + // z = g^(u+1) + p, p = 4u + 3 + var z = new ec.FieldElementFp(this.q, this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE), this.q)); + return z.square().equals(this) ? z : null; + } - // p mod 4 == 1 - var qMinusOne = this.q.subtract(BigInteger.ONE); - var legendreExponent = qMinusOne.shiftRight(1); - if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE))) return null; - var u = qMinusOne.shiftRight(2); - var k = u.shiftLeft(1).add(BigInteger.ONE); - var Q = this.x; - var fourQ = Q.shiftLeft(2).mod(this.q); - var U, V; + // p mod 4 == 1 + var qMinusOne = this.q.subtract(BigInteger.ONE); + var legendreExponent = qMinusOne.shiftRight(1); + if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE))) return null; + var u = qMinusOne.shiftRight(2); + var k = u.shiftLeft(1).add(BigInteger.ONE); + var Q = this.x; + var fourQ = Q.shiftLeft(2).mod(this.q); + var U, V; - do { - var rand = new SecureRandom(); - var P; - do { - P = new BigInteger(this.q.bitLength(), rand); - } - while (P.compareTo(this.q) >= 0 || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne))); + do { + var rand = new SecureRandom(); + var P; + do { + P = new BigInteger(this.q.bitLength(), rand); + } + while (P.compareTo(this.q) >= 0 || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne))); - var result = ec.FieldElementFp.fastLucasSequence(this.q, P, Q, k); + var result = ec.FieldElementFp.fastLucasSequence(this.q, P, Q, k); - U = result[0]; - V = result[1]; - if (V.multiply(V).mod(this.q).equals(fourQ)) { - // Integer division by 2, mod q - if (V.testBit(0)) { - V = V.add(this.q); - } - V = V.shiftRight(1); - return new ec.FieldElementFp(this.q, V); - } - } - while (U.equals(BigInteger.ONE) || U.equals(qMinusOne)); + U = result[0]; + V = result[1]; + if (V.multiply(V).mod(this.q).equals(fourQ)) { + // Integer division by 2, mod q + if (V.testBit(0)) { + V = V.add(this.q); + } + V = V.shiftRight(1); + return new ec.FieldElementFp(this.q, V); + } + } + while (U.equals(BigInteger.ONE) || U.equals(qMinusOne)); - return null; - }; + return null; + }; /* * Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) * Ported to JavaScript by bitaddress.org */ - ec.FieldElementFp.fastLucasSequence = function (p, P, Q, k) { - // TODO Research and apply "common-multiplicand multiplication here" + ec.FieldElementFp.fastLucasSequence = function (p, P, Q, k) { + // TODO Research and apply "common-multiplicand multiplication here" - var n = k.bitLength(); - var s = k.getLowestSetBit(); - var Uh = BigInteger.ONE; - var Vl = BigInteger.TWO; - var Vh = P; - var Ql = BigInteger.ONE; - var Qh = BigInteger.ONE; + var n = k.bitLength(); + var s = k.getLowestSetBit(); + var Uh = BigInteger.ONE; + var Vl = BigInteger.TWO; + var Vh = P; + var Ql = BigInteger.ONE; + var Qh = BigInteger.ONE; - for (var j = n - 1; j >= s + 1; --j) { - Ql = Ql.multiply(Qh).mod(p); - if (k.testBit(j)) { - Qh = Ql.multiply(Q).mod(p); - Uh = Uh.multiply(Vh).mod(p); - Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); - Vh = Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p); - } - else { - Qh = Ql; - Uh = Uh.multiply(Vl).subtract(Ql).mod(p); - Vh = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); - Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p); - } - } + for (var j = n - 1; j >= s + 1; --j) { + Ql = Ql.multiply(Qh).mod(p); + if (k.testBit(j)) { + Qh = Ql.multiply(Q).mod(p); + Uh = Uh.multiply(Vh).mod(p); + Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); + Vh = Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p); + } + else { + Qh = Ql; + Uh = Uh.multiply(Vl).subtract(Ql).mod(p); + Vh = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); + Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p); + } + } - Ql = Ql.multiply(Qh).mod(p); - Qh = Ql.multiply(Q).mod(p); - Uh = Uh.multiply(Vl).subtract(Ql).mod(p); - Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); - Ql = Ql.multiply(Qh).mod(p); + Ql = Ql.multiply(Qh).mod(p); + Qh = Ql.multiply(Q).mod(p); + Uh = Uh.multiply(Vl).subtract(Ql).mod(p); + Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); + Ql = Ql.multiply(Qh).mod(p); - for (var j = 1; j <= s; ++j) { - Uh = Uh.multiply(Vl).mod(p); - Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p); - Ql = Ql.multiply(Ql).mod(p); - } + for (var j = 1; j <= s; ++j) { + Uh = Uh.multiply(Vl).mod(p); + Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p); + Ql = Ql.multiply(Ql).mod(p); + } - return [Uh, Vl]; - }; + return [Uh, Vl]; + }; - // ---------------- - // ECPointFp constructor - ec.PointFp = function (curve, x, y, z, compressed) { - this.curve = curve; - this.x = x; - this.y = y; - // Projective coordinates: either zinv == null or z * zinv == 1 - // z and zinv are just BigIntegers, not fieldElements - if (z == null) { - this.z = BigInteger.ONE; - } - else { - this.z = z; - } - this.zinv = null; - // compression flag - this.compressed = !!compressed; - }; + // ---------------- + // ECPointFp constructor + ec.PointFp = function (curve, x, y, z, compressed) { + this.curve = curve; + this.x = x; + this.y = y; + // Projective coordinates: either zinv == null or z * zinv == 1 + // z and zinv are just BigIntegers, not fieldElements + if (z == null) { + this.z = BigInteger.ONE; + } + else { + this.z = z; + } + this.zinv = null; + // compression flag + this.compressed = !!compressed; + }; - ec.PointFp.prototype.getX = function () { - if (this.zinv == null) { - this.zinv = this.z.modInverse(this.curve.q); - } - var r = this.x.toBigInteger().multiply(this.zinv); - this.curve.reduce(r); - return this.curve.fromBigInteger(r); - }; + ec.PointFp.prototype.getX = function () { + if (this.zinv == null) { + this.zinv = this.z.modInverse(this.curve.q); + } + var r = this.x.toBigInteger().multiply(this.zinv); + this.curve.reduce(r); + return this.curve.fromBigInteger(r); + }; - ec.PointFp.prototype.getY = function () { - if (this.zinv == null) { - this.zinv = this.z.modInverse(this.curve.q); - } - var r = this.y.toBigInteger().multiply(this.zinv); - this.curve.reduce(r); - return this.curve.fromBigInteger(r); - }; + ec.PointFp.prototype.getY = function () { + if (this.zinv == null) { + this.zinv = this.z.modInverse(this.curve.q); + } + var r = this.y.toBigInteger().multiply(this.zinv); + this.curve.reduce(r); + return this.curve.fromBigInteger(r); + }; - ec.PointFp.prototype.equals = function (other) { - if (other == this) return true; - if (this.isInfinity()) return other.isInfinity(); - if (other.isInfinity()) return this.isInfinity(); - var u, v; - // u = Y2 * Z1 - Y1 * Z2 - u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q); - if (!u.equals(BigInteger.ZERO)) return false; - // v = X2 * Z1 - X1 * Z2 - v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q); - return v.equals(BigInteger.ZERO); - }; + ec.PointFp.prototype.equals = function (other) { + if (other == this) return true; + if (this.isInfinity()) return other.isInfinity(); + if (other.isInfinity()) return this.isInfinity(); + var u, v; + // u = Y2 * Z1 - Y1 * Z2 + u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q); + if (!u.equals(BigInteger.ZERO)) return false; + // v = X2 * Z1 - X1 * Z2 + v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q); + return v.equals(BigInteger.ZERO); + }; - ec.PointFp.prototype.isInfinity = function () { - if ((this.x == null) && (this.y == null)) return true; - return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO); - }; + ec.PointFp.prototype.isInfinity = function () { + if ((this.x == null) && (this.y == null)) return true; + return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO); + }; - ec.PointFp.prototype.negate = function () { - return new ec.PointFp(this.curve, this.x, this.y.negate(), this.z); - }; + ec.PointFp.prototype.negate = function () { + return new ec.PointFp(this.curve, this.x, this.y.negate(), this.z); + }; - ec.PointFp.prototype.add = function (b) { - if (this.isInfinity()) return b; - if (b.isInfinity()) return this; + ec.PointFp.prototype.add = function (b) { + if (this.isInfinity()) return b; + if (b.isInfinity()) return this; - // u = Y2 * Z1 - Y1 * Z2 - var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q); - // v = X2 * Z1 - X1 * Z2 - var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q); + // u = Y2 * Z1 - Y1 * Z2 + var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q); + // v = X2 * Z1 - X1 * Z2 + var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q); - if (BigInteger.ZERO.equals(v)) { - if (BigInteger.ZERO.equals(u)) { - return this.twice(); // this == b, so double - } - return this.curve.getInfinity(); // this = -b, so infinity - } + if (BigInteger.ZERO.equals(v)) { + if (BigInteger.ZERO.equals(u)) { + return this.twice(); // this == b, so double + } + return this.curve.getInfinity(); // this = -b, so infinity + } - var THREE = new BigInteger("3"); - var x1 = this.x.toBigInteger(); - var y1 = this.y.toBigInteger(); - var x2 = b.x.toBigInteger(); - var y2 = b.y.toBigInteger(); + var THREE = new BigInteger("3"); + var x1 = this.x.toBigInteger(); + var y1 = this.y.toBigInteger(); + var x2 = b.x.toBigInteger(); + var y2 = b.y.toBigInteger(); - var v2 = v.square(); - var v3 = v2.multiply(v); - var x1v2 = x1.multiply(v2); - var zu2 = u.square().multiply(this.z); + var v2 = v.square(); + var v3 = v2.multiply(v); + var x1v2 = x1.multiply(v2); + var zu2 = u.square().multiply(this.z); - // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3) - var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q); - // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3 - var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q); - // z3 = v^3 * z1 * z2 - var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q); + // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3) + var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q); + // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3 + var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q); + // z3 = v^3 * z1 * z2 + var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q); - return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); - }; + return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); + }; - ec.PointFp.prototype.twice = function () { - if (this.isInfinity()) return this; - if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity(); + ec.PointFp.prototype.twice = function () { + if (this.isInfinity()) return this; + if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity(); - // TODO: optimized handling of constants - var THREE = new BigInteger("3"); - var x1 = this.x.toBigInteger(); - var y1 = this.y.toBigInteger(); + // TODO: optimized handling of constants + var THREE = new BigInteger("3"); + var x1 = this.x.toBigInteger(); + var y1 = this.y.toBigInteger(); - var y1z1 = y1.multiply(this.z); - var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q); - var a = this.curve.a.toBigInteger(); + var y1z1 = y1.multiply(this.z); + var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q); + var a = this.curve.a.toBigInteger(); - // w = 3 * x1^2 + a * z1^2 - var w = x1.square().multiply(THREE); - if (!BigInteger.ZERO.equals(a)) { - w = w.add(this.z.square().multiply(a)); - } - w = w.mod(this.curve.q); - //this.curve.reduce(w); - // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1) - var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q); - // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3 - var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q); - // z3 = 8 * (y1 * z1)^3 - var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q); + // w = 3 * x1^2 + a * z1^2 + var w = x1.square().multiply(THREE); + if (!BigInteger.ZERO.equals(a)) { + w = w.add(this.z.square().multiply(a)); + } + w = w.mod(this.curve.q); + //this.curve.reduce(w); + // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1) + var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q); + // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3 + var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q); + // z3 = 8 * (y1 * z1)^3 + var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q); - return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); - }; + return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); + }; - // Simple NAF (Non-Adjacent Form) multiplication algorithm - // TODO: modularize the multiplication algorithm - ec.PointFp.prototype.multiply = function (k) { - if (this.isInfinity()) return this; - if (k.signum() == 0) return this.curve.getInfinity(); + // Simple NAF (Non-Adjacent Form) multiplication algorithm + // TODO: modularize the multiplication algorithm + ec.PointFp.prototype.multiply = function (k) { + if (this.isInfinity()) return this; + if (k.signum() == 0) return this.curve.getInfinity(); - var e = k; - var h = e.multiply(new BigInteger("3")); + var e = k; + var h = e.multiply(new BigInteger("3")); - var neg = this.negate(); - var R = this; + var neg = this.negate(); + var R = this; - var i; - for (i = h.bitLength() - 2; i > 0; --i) { - R = R.twice(); + var i; + for (i = h.bitLength() - 2; i > 0; --i) { + R = R.twice(); - var hBit = h.testBit(i); - var eBit = e.testBit(i); + var hBit = h.testBit(i); + var eBit = e.testBit(i); - if (hBit != eBit) { - R = R.add(hBit ? this : neg); - } - } + if (hBit != eBit) { + R = R.add(hBit ? this : neg); + } + } - return R; - }; + return R; + }; - // Compute this*j + x*k (simultaneous multiplication) - ec.PointFp.prototype.multiplyTwo = function (j, x, k) { - var i; - if (j.bitLength() > k.bitLength()) - i = j.bitLength() - 1; - else - i = k.bitLength() - 1; + // Compute this*j + x*k (simultaneous multiplication) + ec.PointFp.prototype.multiplyTwo = function (j, x, k) { + var i; + if (j.bitLength() > k.bitLength()) + i = j.bitLength() - 1; + else + i = k.bitLength() - 1; - var R = this.curve.getInfinity(); - var both = this.add(x); - while (i >= 0) { - R = R.twice(); - if (j.testBit(i)) { - if (k.testBit(i)) { - R = R.add(both); - } - else { - R = R.add(this); - } - } - else { - if (k.testBit(i)) { - R = R.add(x); - } - } - --i; - } + var R = this.curve.getInfinity(); + var both = this.add(x); + while (i >= 0) { + R = R.twice(); + if (j.testBit(i)) { + if (k.testBit(i)) { + R = R.add(both); + } + else { + R = R.add(this); + } + } + else { + if (k.testBit(i)) { + R = R.add(x); + } + } + --i; + } - return R; - }; + return R; + }; - // patched by bitaddress.org and Casascius for use with Bitcoin.ECKey - // patched by coretechs to support compressed public keys - ec.PointFp.prototype.getEncoded = function (compressed) { - var x = this.getX().toBigInteger(); - var y = this.getY().toBigInteger(); - var len = 32; // integerToBytes will zero pad if integer is less than 32 bytes. 32 bytes length is required by the Bitcoin protocol. - var enc = ec.integerToBytes(x, len); + // patched by bitaddress.org and Casascius for use with Bitcoin.ECKey + // patched by coretechs to support compressed public keys + ec.PointFp.prototype.getEncoded = function (compressed) { + var x = this.getX().toBigInteger(); + var y = this.getY().toBigInteger(); + var len = 32; // integerToBytes will zero pad if integer is less than 32 bytes. 32 bytes length is required by the Bitcoin protocol. + var enc = ec.integerToBytes(x, len); - // when compressed prepend byte depending if y point is even or odd - if (compressed) { - if (y.isEven()) { - enc.unshift(0x02); - } - else { - enc.unshift(0x03); - } - } - else { - enc.unshift(0x04); - enc = enc.concat(ec.integerToBytes(y, len)); // uncompressed public key appends the bytes of the y point - } - return enc; - }; + // when compressed prepend byte depending if y point is even or odd + if (compressed) { + if (y.isEven()) { + enc.unshift(0x02); + } + else { + enc.unshift(0x03); + } + } + else { + enc.unshift(0x04); + enc = enc.concat(ec.integerToBytes(y, len)); // uncompressed public key appends the bytes of the y point + } + return enc; + }; - ec.PointFp.decodeFrom = function (curve, enc) { - var type = enc[0]; - var dataLen = enc.length - 1; + ec.PointFp.decodeFrom = function (curve, enc) { + var type = enc[0]; + var dataLen = enc.length - 1; - // Extract x and y as byte arrays - var xBa = enc.slice(1, 1 + dataLen / 2); - var yBa = enc.slice(1 + dataLen / 2, 1 + dataLen); + // Extract x and y as byte arrays + var xBa = enc.slice(1, 1 + dataLen / 2); + var yBa = enc.slice(1 + dataLen / 2, 1 + dataLen); - // Prepend zero byte to prevent interpretation as negative integer - xBa.unshift(0); - yBa.unshift(0); + // Prepend zero byte to prevent interpretation as negative integer + xBa.unshift(0); + yBa.unshift(0); - // Convert to BigIntegers - var x = new BigInteger(xBa); - var y = new BigInteger(yBa); + // Convert to BigIntegers + var x = new BigInteger(xBa); + var y = new BigInteger(yBa); - // Return point - return new ec.PointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y)); - }; + // Return point + return new ec.PointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y)); + }; - ec.PointFp.prototype.add2D = function (b) { - if (this.isInfinity()) return b; - if (b.isInfinity()) return this; + ec.PointFp.prototype.add2D = function (b) { + if (this.isInfinity()) return b; + if (b.isInfinity()) return this; - if (this.x.equals(b.x)) { - if (this.y.equals(b.y)) { - // this = b, i.e. this must be doubled - return this.twice(); - } - // this = -b, i.e. the result is the point at infinity - return this.curve.getInfinity(); - } + if (this.x.equals(b.x)) { + if (this.y.equals(b.y)) { + // this = b, i.e. this must be doubled + return this.twice(); + } + // this = -b, i.e. the result is the point at infinity + return this.curve.getInfinity(); + } - var x_x = b.x.subtract(this.x); - var y_y = b.y.subtract(this.y); - var gamma = y_y.divide(x_x); + var x_x = b.x.subtract(this.x); + var y_y = b.y.subtract(this.y); + var gamma = y_y.divide(x_x); - var x3 = gamma.square().subtract(this.x).subtract(b.x); - var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y); + var x3 = gamma.square().subtract(this.x).subtract(b.x); + var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y); - return new ec.PointFp(this.curve, x3, y3); - }; + return new ec.PointFp(this.curve, x3, y3); + }; - ec.PointFp.prototype.twice2D = function () { - if (this.isInfinity()) return this; - if (this.y.toBigInteger().signum() == 0) { - // if y1 == 0, then (x1, y1) == (x1, -y1) - // and hence this = -this and thus 2(x1, y1) == infinity - return this.curve.getInfinity(); - } + ec.PointFp.prototype.twice2D = function () { + if (this.isInfinity()) return this; + if (this.y.toBigInteger().signum() == 0) { + // if y1 == 0, then (x1, y1) == (x1, -y1) + // and hence this = -this and thus 2(x1, y1) == infinity + return this.curve.getInfinity(); + } - var TWO = this.curve.fromBigInteger(BigInteger.valueOf(2)); - var THREE = this.curve.fromBigInteger(BigInteger.valueOf(3)); - var gamma = this.x.square().multiply(THREE).add(this.curve.a).divide(this.y.multiply(TWO)); + var TWO = this.curve.fromBigInteger(BigInteger.valueOf(2)); + var THREE = this.curve.fromBigInteger(BigInteger.valueOf(3)); + var gamma = this.x.square().multiply(THREE).add(this.curve.a).divide(this.y.multiply(TWO)); - var x3 = gamma.square().subtract(this.x.multiply(TWO)); - var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y); + var x3 = gamma.square().subtract(this.x.multiply(TWO)); + var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y); - return new ec.PointFp(this.curve, x3, y3); - }; + return new ec.PointFp(this.curve, x3, y3); + }; - ec.PointFp.prototype.multiply2D = function (k) { - if (this.isInfinity()) return this; - if (k.signum() == 0) return this.curve.getInfinity(); + ec.PointFp.prototype.multiply2D = function (k) { + if (this.isInfinity()) return this; + if (k.signum() == 0) return this.curve.getInfinity(); - var e = k; - var h = e.multiply(new BigInteger("3")); + var e = k; + var h = e.multiply(new BigInteger("3")); - var neg = this.negate(); - var R = this; + var neg = this.negate(); + var R = this; - var i; - for (i = h.bitLength() - 2; i > 0; --i) { - R = R.twice(); + var i; + for (i = h.bitLength() - 2; i > 0; --i) { + R = R.twice(); - var hBit = h.testBit(i); - var eBit = e.testBit(i); + var hBit = h.testBit(i); + var eBit = e.testBit(i); - if (hBit != eBit) { - R = R.add2D(hBit ? this : neg); - } - } + if (hBit != eBit) { + R = R.add2D(hBit ? this : neg); + } + } - return R; - }; + return R; + }; + ec.PointFp.prototype.isOnCurve = function () { + var x = this.getX().toBigInteger(); + var y = this.getY().toBigInteger(); + var a = this.curve.getA().toBigInteger(); + var b = this.curve.getB().toBigInteger(); + var n = this.curve.getQ(); + var lhs = y.multiply(y).mod(n); + var rhs = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(n); + return lhs.equals(rhs); + }; - ec.PointFp.prototype.isOnCurve = function () { - var x = this.getX().toBigInteger(); - var y = this.getY().toBigInteger(); - var a = this.curve.getA().toBigInteger(); - var b = this.curve.getB().toBigInteger(); - var n = this.curve.getQ(); - var lhs = y.multiply(y).mod(n); - var rhs = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(n); - return lhs.equals(rhs); - }; - - ec.PointFp.prototype.toString = function () { - return '(' + this.getX().toBigInteger().toString() + ',' + this.getY().toBigInteger().toString() + ')'; - }; + ec.PointFp.prototype.toString = function () { + return '(' + this.getX().toBigInteger().toString() + ',' + this.getY().toBigInteger().toString() + ')'; + }; /** * Validate an elliptic curve point. * * See SEC 1, section 3.2.2.1: Elliptic Curve Public Key Validation Primitive */ - ec.PointFp.prototype.validate = function () { - var n = this.curve.getQ(); + ec.PointFp.prototype.validate = function () { + var n = this.curve.getQ(); - // Check Q != O - if (this.isInfinity()) { - throw new Error("Point is at infinity."); - } + // Check Q != O + if (this.isInfinity()) { + throw new Error("Point is at infinity."); + } - // Check coordinate bounds - var x = this.getX().toBigInteger(); - var y = this.getY().toBigInteger(); - if (x.compareTo(BigInteger.ONE) < 0 || x.compareTo(n.subtract(BigInteger.ONE)) > 0) { - throw new Error('x coordinate out of bounds'); - } - if (y.compareTo(BigInteger.ONE) < 0 || y.compareTo(n.subtract(BigInteger.ONE)) > 0) { - throw new Error('y coordinate out of bounds'); - } + // Check coordinate bounds + var x = this.getX().toBigInteger(); + var y = this.getY().toBigInteger(); + if (x.compareTo(BigInteger.ONE) < 0 || x.compareTo(n.subtract(BigInteger.ONE)) > 0) { + throw new Error('x coordinate out of bounds'); + } + if (y.compareTo(BigInteger.ONE) < 0 || y.compareTo(n.subtract(BigInteger.ONE)) > 0) { + throw new Error('y coordinate out of bounds'); + } - // Check y^2 = x^3 + ax + b (mod n) - if (!this.isOnCurve()) { - throw new Error("Point is not on the curve."); - } + // Check y^2 = x^3 + ax + b (mod n) + if (!this.isOnCurve()) { + throw new Error("Point is not on the curve."); + } - // Check nQ = 0 (Q is a scalar multiple of G) - if (this.multiply(n).isInfinity()) { - // TODO: This check doesn't work - fix. - throw new Error("Point is not a scalar multiple of G."); - } + // Check nQ = 0 (Q is a scalar multiple of G) + if (this.multiply(n).isInfinity()) { + // TODO: This check doesn't work - fix. + throw new Error("Point is not a scalar multiple of G."); + } - return true; - }; + return true; + }; + // ---------------- + // ECCurveFp constructor + ec.CurveFp = function (q, a, b) { + this.q = q; + this.a = this.fromBigInteger(a); + this.b = this.fromBigInteger(b); + this.infinity = new ec.PointFp(this, null, null); + this.reducer = new Barrett(this.q); + } + ec.CurveFp.prototype.getQ = function () { + return this.q; + }; + ec.CurveFp.prototype.getA = function () { + return this.a; + }; - // ---------------- - // ECCurveFp constructor - ec.CurveFp = function (q, a, b) { - this.q = q; - this.a = this.fromBigInteger(a); - this.b = this.fromBigInteger(b); - this.infinity = new ec.PointFp(this, null, null); - this.reducer = new Barrett(this.q); - } + ec.CurveFp.prototype.getB = function () { + return this.b; + }; - ec.CurveFp.prototype.getQ = function () { - return this.q; - }; + ec.CurveFp.prototype.equals = function (other) { + if (other == this) return true; + return (this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b)); + }; - ec.CurveFp.prototype.getA = function () { - return this.a; - }; + ec.CurveFp.prototype.getInfinity = function () { + return this.infinity; + }; - ec.CurveFp.prototype.getB = function () { - return this.b; - }; + ec.CurveFp.prototype.fromBigInteger = function (x) { + return new ec.FieldElementFp(this.q, x); + }; - ec.CurveFp.prototype.equals = function (other) { - if (other == this) return true; - return (this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b)); - }; + ec.CurveFp.prototype.reduce = function (x) { + this.reducer.reduce(x); + }; - ec.CurveFp.prototype.getInfinity = function () { - return this.infinity; - }; + // for now, work with hex strings because they're easier in JS + // compressed support added by bitaddress.org + ec.CurveFp.prototype.decodePointHex = function (s) { + var firstByte = parseInt(s.substr(0, 2), 16); + switch (firstByte) { // first byte + case 0: + return this.infinity; + case 2: // compressed + case 3: // compressed + var yTilde = firstByte & 1; + var xHex = s.substr(2, s.length - 2); + var X1 = new BigInteger(xHex, 16); + return this.decompressPoint(yTilde, X1); + case 4: // uncompressed + case 6: // hybrid + case 7: // hybrid + var len = (s.length - 2) / 2; + var xHex = s.substr(2, len); + var yHex = s.substr(len + 2, len); - ec.CurveFp.prototype.fromBigInteger = function (x) { - return new ec.FieldElementFp(this.q, x); - }; + return new ec.PointFp(this, + this.fromBigInteger(new BigInteger(xHex, 16)), + this.fromBigInteger(new BigInteger(yHex, 16))); - ec.CurveFp.prototype.reduce = function (x) { - this.reducer.reduce(x); - }; + default: // unsupported + return null; + } + }; - // for now, work with hex strings because they're easier in JS - // compressed support added by bitaddress.org - ec.CurveFp.prototype.decodePointHex = function (s) { - var firstByte = parseInt(s.substr(0, 2), 16); - switch (firstByte) { // first byte - case 0: - return this.infinity; - case 2: // compressed - case 3: // compressed - var yTilde = firstByte & 1; - var xHex = s.substr(2, s.length - 2); - var X1 = new BigInteger(xHex, 16); - return this.decompressPoint(yTilde, X1); - case 4: // uncompressed - case 6: // hybrid - case 7: // hybrid - var len = (s.length - 2) / 2; - var xHex = s.substr(2, len); - var yHex = s.substr(len + 2, len); - - return new ec.PointFp(this, - this.fromBigInteger(new BigInteger(xHex, 16)), - this.fromBigInteger(new BigInteger(yHex, 16))); - - default: // unsupported - return null; - } - }; - - ec.CurveFp.prototype.encodePointHex = function (p) { - if (p.isInfinity()) return "00"; - var xHex = p.getX().toBigInteger().toString(16); - var yHex = p.getY().toBigInteger().toString(16); - var oLen = this.getQ().toString(16).length; - if ((oLen % 2) != 0) oLen++; - while (xHex.length < oLen) { - xHex = "0" + xHex; - } - while (yHex.length < oLen) { - yHex = "0" + yHex; - } - return "04" + xHex + yHex; - }; + ec.CurveFp.prototype.encodePointHex = function (p) { + if (p.isInfinity()) return "00"; + var xHex = p.getX().toBigInteger().toString(16); + var yHex = p.getY().toBigInteger().toString(16); + var oLen = this.getQ().toString(16).length; + if ((oLen % 2) != 0) oLen++; + while (xHex.length < oLen) { + xHex = "0" + xHex; + } + while (yHex.length < oLen) { + yHex = "0" + yHex; + } + return "04" + xHex + yHex; + }; /* * Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) @@ -2537,84 +2523,84 @@ * Number yTilde * BigInteger X1 */ - ec.CurveFp.prototype.decompressPoint = function (yTilde, X1) { - var x = this.fromBigInteger(X1); - var alpha = x.multiply(x.square().add(this.getA())).add(this.getB()); - var beta = alpha.sqrt(); - // if we can't find a sqrt we haven't got a point on the curve - run! - if (beta == null) throw new Error("Invalid point compression"); - var betaValue = beta.toBigInteger(); - var bit0 = betaValue.testBit(0) ? 1 : 0; - if (bit0 != yTilde) { - // Use the other root - beta = this.fromBigInteger(this.getQ().subtract(betaValue)); - } - return new ec.PointFp(this, x, beta, null, true); - }; + ec.CurveFp.prototype.decompressPoint = function (yTilde, X1) { + var x = this.fromBigInteger(X1); + var alpha = x.multiply(x.square().add(this.getA())).add(this.getB()); + var beta = alpha.sqrt(); + // if we can't find a sqrt we haven't got a point on the curve - run! + if (beta == null) throw new Error("Invalid point compression"); + var betaValue = beta.toBigInteger(); + var bit0 = betaValue.testBit(0) ? 1 : 0; + if (bit0 != yTilde) { + // Use the other root + beta = this.fromBigInteger(this.getQ().subtract(betaValue)); + } + return new ec.PointFp(this, x, beta, null, true); + }; - ec.fromHex = function (s) { return new BigInteger(s, 16); }; + ec.fromHex = function (s) { return new BigInteger(s, 16); }; - ec.integerToBytes = function (i, len) { - var bytes = i.toByteArrayUnsigned(); - if (len < bytes.length) { - bytes = bytes.slice(bytes.length - len); - } else while (len > bytes.length) { - bytes.unshift(0); - } - return bytes; - }; + ec.integerToBytes = function (i, len) { + var bytes = i.toByteArrayUnsigned(); + if (len < bytes.length) { + bytes = bytes.slice(bytes.length - len); + } else while (len > bytes.length) { + bytes.unshift(0); + } + return bytes; + }; - // Named EC curves - // ---------------- - // X9ECParameters constructor - ec.X9Parameters = function (curve, g, n, h) { - this.curve = curve; - this.g = g; - this.n = n; - this.h = h; - } - ec.X9Parameters.prototype.getCurve = function () { return this.curve; }; - ec.X9Parameters.prototype.getG = function () { return this.g; }; - ec.X9Parameters.prototype.getN = function () { return this.n; }; - ec.X9Parameters.prototype.getH = function () { return this.h; }; + // Named EC curves + // ---------------- + // X9ECParameters constructor + ec.X9Parameters = function (curve, g, n, h) { + this.curve = curve; + this.g = g; + this.n = n; + this.h = h; + } + ec.X9Parameters.prototype.getCurve = function () { return this.curve; }; + ec.X9Parameters.prototype.getG = function () { return this.g; }; + ec.X9Parameters.prototype.getN = function () { return this.n; }; + ec.X9Parameters.prototype.getH = function () { return this.h; }; - // secp256k1 is the Curve used by Bitcoin - ec.secNamedCurves = { - // used by Bitcoin - "secp256k1": function () { - // p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1 - var p = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"); - var a = BigInteger.ZERO; - var b = ec.fromHex("7"); - var n = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"); - var h = BigInteger.ONE; - var curve = new ec.CurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798" - + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"); - return new ec.X9Parameters(curve, G, n, h); - } - }; + // secp256k1 is the Curve used by Bitcoin + ec.secNamedCurves = { + // used by Bitcoin + "secp256k1": function () { + // p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1 + var p = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"); + var a = BigInteger.ZERO; + var b = ec.fromHex("7"); + var n = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"); + var h = BigInteger.ONE; + var curve = new ec.CurveFp(p, a, b); + var G = curve.decodePointHex("04" + + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798" + + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"); + return new ec.X9Parameters(curve, G, n, h); + } + }; - // secp256k1 called by Bitcoin's ECKEY - ec.getSECCurveByName = function (name) { - if (ec.secNamedCurves[name] == undefined) return null; - return ec.secNamedCurves[name](); - } + // secp256k1 called by Bitcoin's ECKEY + ec.getSECCurveByName = function (name) { + if (ec.secNamedCurves[name] == undefined) return null; + return ec.secNamedCurves[name](); + } - if (typeof exports !== 'undefined') { - exports = module.exports = { - default: ec, - EllipticCurve: ec, - BigInteger: BigInteger - }; - } else { - this.ecbn = { - EllipticCurve: ec, - BigInteger: BigInteger - }; - } + if (typeof exports !== 'undefined') { + exports = module.exports = { + default: ec, + EllipticCurve: ec, + BigInteger: BigInteger + }; + } else { + this.ecbn = { + EllipticCurve: ec, + BigInteger: BigInteger + }; + } -}).call(this); \ No newline at end of file +}).call(this); diff --git a/crypto/api/bitcoin/jsbn.js b/crypto/api/bitcoin/jsbn.js index 0e306853..e3c323bd 100644 --- a/crypto/api/bitcoin/jsbn.js +++ b/crypto/api/bitcoin/jsbn.js @@ -1,1940 +1,1937 @@ (function () { - // Copyright (c) 2005 Tom Wu - // All Rights Reserved. - // See "LICENSE" for details. - - // Basic JavaScript BN library - subset useful for RSA encryption. - - // Bits per digit - var dbits; - - // JavaScript engine analysis - var canary = 0xdeadbeefcafe; - var j_lm = (canary & 0xffffff) == 0xefcafe; - - // (public) Constructor - function BigInteger(a, b, c) { - if (a != null) - if ('number' == typeof a) this.fromNumber(a, b, c); - else if (b == null && 'string' != typeof a) this.fromString(a, 256); - else this.fromString(a, b); - } - - // return new, unset BigInteger - function nbi() { - return new BigInteger(null); - } - - // am: Compute w_j += (x*this_i), propagate carries, - // c is initial carry, returns final carry. - // c < 3*dvalue, x < 2*dvalue, this_i < dvalue - // We need to select the fastest one that works in this environment. - - // am1: use a single mult and divide to get the high bits, - // max digit bits should be 26 because - // max internal value = 2*dvalue^2-2*dvalue (< 2^53) - function am1(i, x, w, j, c, n) { - while (--n >= 0) { - var v = x * this[i++] + w[j] + c; - c = Math.floor(v / 0x4000000); - w[j++] = v & 0x3ffffff; - } - return c; - } - // am2 avoids a big mult-and-extract completely. - // Max digit bits should be <= 30 because we do bitwise ops - // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) - function am2(i, x, w, j, c, n) { - var xl = x & 0x7fff, - xh = x >> 15; - while (--n >= 0) { - var l = this[i] & 0x7fff; - var h = this[i++] >> 15; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); - c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); - w[j++] = l & 0x3fffffff; - } - return c; - } - // Alternately, set max digit bits to 28 since some - // browsers slow down when dealing with 32-bit numbers. - function am3(i, x, w, j, c, n) { - var xl = x & 0x3fff, - xh = x >> 14; - while (--n >= 0) { - var l = this[i] & 0x3fff; - var h = this[i++] >> 14; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; - c = (l >> 28) + (m >> 14) + xh * h; - w[j++] = l & 0xfffffff; - } - return c; - } - var inBrowser = typeof navigator !== 'undefined'; - if (inBrowser && j_lm && navigator.appName == 'Microsoft Internet Explorer') { - BigInteger.prototype.am = am2; - dbits = 30; - } else if (inBrowser && j_lm && navigator.appName != 'Netscape') { - BigInteger.prototype.am = am1; - dbits = 26; - } else { - // Mozilla/Netscape seems to prefer am3 - BigInteger.prototype.am = am3; - dbits = 28; - } - - BigInteger.prototype.DB = dbits; - BigInteger.prototype.DM = (1 << dbits) - 1; - BigInteger.prototype.DV = 1 << dbits; - - var BI_FP = 52; - BigInteger.prototype.FV = Math.pow(2, BI_FP); - BigInteger.prototype.F1 = BI_FP - dbits; - BigInteger.prototype.F2 = 2 * dbits - BI_FP; - - // Digit conversions - var BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz'; - var BI_RC = new Array(); - var rr, vv; - rr = '0'.charCodeAt(0); - for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; - rr = 'a'.charCodeAt(0); - for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; - rr = 'A'.charCodeAt(0); - for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; - - function int2char(n) { - return BI_RM.charAt(n); - } - function intAt(s, i) { - var c = BI_RC[s.charCodeAt(i)]; - return c == null ? -1 : c; - } - - // (protected) copy this to r - function bnpCopyTo(r) { - for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; - r.t = this.t; - r.s = this.s; - } - - // (protected) set from integer value x, -DV <= x < DV - function bnpFromInt(x) { - this.t = 1; - this.s = x < 0 ? -1 : 0; - if (x > 0) this[0] = x; - else if (x < -1) this[0] = x + this.DV; - else this.t = 0; - } - - // return bigint initialized to value - function nbv(i) { - var r = nbi(); - r.fromInt(i); - return r; - } - - // (protected) set from string and radix - function bnpFromString(s, b) { - // Auto-detect string notations - if (!b && s.length >= 2 && s[0] === '0') { - var isDetected = true; - switch (s[1]) { - case 'x': // Hexadecimal notation - b = 16; - break; - case 'b': // Binary notation - b = 2; - break; - case 'o': // Octal notation - b = 8; - break; - default: - isDetected = false; - } - - // Remove the notation string if any has been detected - if (isDetected) { - s = s.substr(2); - } - } - - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 256) k = 8; - // byte array - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else { - this.fromRadix(s, b); - return; - } - this.t = 0; - this.s = 0; - var i = s.length, - mi = false, - sh = 0; - while (--i >= 0) { - var x = k == 8 ? s[i] & 0xff : intAt(s, i); - if (x < 0) { - if (s.charAt(i) == '-') mi = true; - continue; - } - mi = false; - if (sh == 0) this[this.t++] = x; - else if (sh + k > this.DB) { - this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; - this[this.t++] = x >> (this.DB - sh); - } else this[this.t - 1] |= x << sh; - sh += k; - if (sh >= this.DB) sh -= this.DB; - } - if (k == 8 && (s[0] & 0x80) != 0) { - this.s = -1; - if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; - } - this.clamp(); - if (mi) BigInteger.ZERO.subTo(this, this); - } - - // (protected) clamp off excess high words - function bnpClamp() { - var c = this.s & this.DM; - while (this.t > 0 && this[this.t - 1] == c) --this.t; - } - - // (public) return string representation in given radix - function bnToString(b) { - if (this.s < 0) return '-' + this.negate().toString(b); - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else return this.toRadix(b); - var km = (1 << k) - 1, - d, - m = false, - r = '', - i = this.t; - var p = this.DB - ((i * this.DB) % k); - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) > 0) { - m = true; - r = int2char(d); - } - while (i >= 0) { - if (p < k) { - d = (this[i] & ((1 << p) - 1)) << (k - p); - d |= this[--i] >> (p += this.DB - k); - } else { - d = (this[i] >> (p -= k)) & km; - if (p <= 0) { - p += this.DB; - --i; - } - } - if (d > 0) m = true; - if (m) r += int2char(d); - } - } - return m ? r : '0'; - } - - // (public) -this - function bnNegate() { - var r = nbi(); - BigInteger.ZERO.subTo(this, r); - return r; - } - - // (public) |this| - function bnAbs() { - return this.s < 0 ? this.negate() : this; - } - - // (public) return + if this > a, - if this < a, 0 if equal - function bnCompareTo(a) { - var r = this.s - a.s; - if (r != 0) return r; - var i = this.t; - r = i - a.t; - if (r != 0) return this.s < 0 ? -r : r; - while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; - return 0; - } - - // returns bit length of the integer x - function nbits(x) { - var r = 1, - t; - if ((t = x >>> 16) != 0) { - x = t; - r += 16; - } - if ((t = x >> 8) != 0) { - x = t; - r += 8; - } - if ((t = x >> 4) != 0) { - x = t; - r += 4; - } - if ((t = x >> 2) != 0) { - x = t; - r += 2; - } - if ((t = x >> 1) != 0) { - x = t; - r += 1; - } - return r; - } - - // (public) return the number of bits in "this" - function bnBitLength() { - if (this.t <= 0) return 0; - return ( - this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)) - ); - } - - // (protected) r = this << n*DB - function bnpDLShiftTo(n, r) { - var i; - for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; - for (i = n - 1; i >= 0; --i) r[i] = 0; - r.t = this.t + n; - r.s = this.s; - } - - // (protected) r = this >> n*DB - function bnpDRShiftTo(n, r) { - for (var i = n; i < this.t; ++i) r[i - n] = this[i]; - r.t = Math.max(this.t - n, 0); - r.s = this.s; - } - - // (protected) r = this << n - function bnpLShiftTo(n, r) { - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << cbs) - 1; - var ds = Math.floor(n / this.DB), - c = (this.s << bs) & this.DM, - i; - for (i = this.t - 1; i >= 0; --i) { - r[i + ds + 1] = (this[i] >> cbs) | c; - c = (this[i] & bm) << bs; - } - for (i = ds - 1; i >= 0; --i) r[i] = 0; - r[ds] = c; - r.t = this.t + ds + 1; - r.s = this.s; - r.clamp(); - } - - // (protected) r = this >> n - function bnpRShiftTo(n, r) { - r.s = this.s; - var ds = Math.floor(n / this.DB); - if (ds >= this.t) { - r.t = 0; - return; - } - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << bs) - 1; - r[0] = this[ds] >> bs; - for (var i = ds + 1; i < this.t; ++i) { - r[i - ds - 1] |= (this[i] & bm) << cbs; - r[i - ds] = this[i] >> bs; - } - if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; - r.t = this.t - ds; - r.clamp(); - } - - // (protected) r = this - a - function bnpSubTo(a, r) { - var i = 0, - c = 0, - m = Math.min(a.t, this.t); - while (i < m) { - c += this[i] - a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - if (a.t < this.t) { - c -= a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c -= a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c -= a.s; - } - r.s = c < 0 ? -1 : 0; - if (c < -1) r[i++] = this.DV + c; - else if (c > 0) r[i++] = c; - r.t = i; - r.clamp(); - } - - // (protected) r = this * a, r != this,a (HAC 14.12) - // "this" should be the larger one if appropriate. - function bnpMultiplyTo(a, r) { - var x = this.abs(), - y = a.abs(); - var i = x.t; - r.t = i + y.t; - while (--i >= 0) r[i] = 0; - for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); - r.s = 0; - r.clamp(); - if (this.s != a.s) BigInteger.ZERO.subTo(r, r); - } - - // (protected) r = this^2, r != this (HAC 14.16) - function bnpSquareTo(r) { - var x = this.abs(); - var i = (r.t = 2 * x.t); - while (--i >= 0) r[i] = 0; - for (i = 0; i < x.t - 1; ++i) { - var c = x.am(i, x[i], r, 2 * i, 0, 1); - if ( - (r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= - x.DV - ) { - r[i + x.t] -= x.DV; - r[i + x.t + 1] = 1; - } - } - if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); - r.s = 0; - r.clamp(); - } - - // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) - // r != q, this != m. q or r may be null. - function bnpDivRemTo(m, q, r) { - var pm = m.abs(); - if (pm.t <= 0) return; - var pt = this.abs(); - if (pt.t < pm.t) { - if (q != null) q.fromInt(0); - if (r != null) this.copyTo(r); - return; - } - if (r == null) r = nbi(); - var y = nbi(), - ts = this.s, - ms = m.s; - var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus - if (nsh > 0) { - pm.lShiftTo(nsh, y); - pt.lShiftTo(nsh, r); - } else { - pm.copyTo(y); - pt.copyTo(r); - } - var ys = y.t; - var y0 = y[ys - 1]; - if (y0 == 0) return; - var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); - var d1 = this.FV / yt, - d2 = (1 << this.F1) / yt, - e = 1 << this.F2; - var i = r.t, - j = i - ys, - t = q == null ? nbi() : q; - y.dlShiftTo(j, t); - if (r.compareTo(t) >= 0) { - r[r.t++] = 1; - r.subTo(t, r); - } - BigInteger.ONE.dlShiftTo(ys, t); - t.subTo(y, y); // "negative" y so we can replace sub with am later - while (y.t < ys) y[y.t++] = 0; - while (--j >= 0) { - // Estimate quotient digit - var qd = - r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); - if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { - // Try it out - y.dlShiftTo(j, t); - r.subTo(t, r); - while (r[i] < --qd) r.subTo(t, r); - } - } - if (q != null) { - r.drShiftTo(ys, q); - if (ts != ms) BigInteger.ZERO.subTo(q, q); - } - r.t = ys; - r.clamp(); - if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder - if (ts < 0) BigInteger.ZERO.subTo(r, r); - } - - // (public) this mod a - function bnMod(a) { - var r = nbi(); - this.abs().divRemTo(a, null, r); - if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); - return r; - } - - // Modular reduction using "classic" algorithm - function Classic(m) { - this.m = m; - } - function cConvert(x) { - if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); - else return x; - } - function cRevert(x) { - return x; - } - function cReduce(x) { - x.divRemTo(this.m, null, x); - } - function cMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); - } - function cSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); - } - - Classic.prototype.convert = cConvert; - Classic.prototype.revert = cRevert; - Classic.prototype.reduce = cReduce; - Classic.prototype.mulTo = cMulTo; - Classic.prototype.sqrTo = cSqrTo; - - // (protected) return "-1/this % 2^DB"; useful for Mont. reduction - // justification: - // xy == 1 (mod m) - // xy = 1+km - // xy(2-xy) = (1+km)(1-km) - // x[y(2-xy)] = 1-k^2m^2 - // x[y(2-xy)] == 1 (mod m^2) - // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 - // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. - // JS multiply "overflows" differently from C/C++, so care is needed here. - function bnpInvDigit() { - if (this.t < 1) return 0; - var x = this[0]; - if ((x & 1) == 0) return 0; - var y = x & 3; // y == 1/x mod 2^2 - y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 - y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 - y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 - // last step - calculate inverse mod DV directly; - // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints - y = (y * (2 - ((x * y) % this.DV))) % this.DV; // y == 1/x mod 2^dbits - // we really want the negative inverse, and -DV < y < DV - return y > 0 ? this.DV - y : -y; - } - - // Montgomery reduction - function Montgomery(m) { - this.m = m; - this.mp = m.invDigit(); - this.mpl = this.mp & 0x7fff; - this.mph = this.mp >> 15; - this.um = (1 << (m.DB - 15)) - 1; - this.mt2 = 2 * m.t; - } - - // xR mod m - function montConvert(x) { - var r = nbi(); - x.abs().dlShiftTo(this.m.t, r); - r.divRemTo(this.m, null, r); - if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); - return r; - } - - // x/R mod m - function montRevert(x) { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; - } - - // x = x/R mod m (HAC 14.32) - function montReduce(x) { - while ( - x.t <= this.mt2 // pad x so am has enough room later - ) - x[x.t++] = 0; - for (var i = 0; i < this.m.t; ++i) { - // faster way of calculating u0 = x[i]*mp mod DV - var j = x[i] & 0x7fff; - var u0 = - (j * this.mpl + - (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & - x.DM; - // use am to combine the multiply-shift-add into one call - j = i + this.m.t; - x[j] += this.m.am(0, u0, x, i, 0, this.m.t); - // propagate carry - while (x[j] >= x.DV) { - x[j] -= x.DV; - x[++j]++; - } - } - x.clamp(); - x.drShiftTo(this.m.t, x); - if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); - } - - // r = "x^2/R mod m"; x != r - function montSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); - } - - // r = "xy/R mod m"; x,y != r - function montMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); - } - - Montgomery.prototype.convert = montConvert; - Montgomery.prototype.revert = montRevert; - Montgomery.prototype.reduce = montReduce; - Montgomery.prototype.mulTo = montMulTo; - Montgomery.prototype.sqrTo = montSqrTo; - - // (protected) true iff this is even - function bnpIsEven() { - return (this.t > 0 ? this[0] & 1 : this.s) == 0; - } - - // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) - function bnpExp(e, z) { - if (e > 0xffffffff || e < 1) return BigInteger.ONE; - var r = nbi(), - r2 = nbi(), - g = z.convert(this), - i = nbits(e) - 1; - g.copyTo(r); - while (--i >= 0) { - z.sqrTo(r, r2); - if ((e & (1 << i)) > 0) z.mulTo(r2, g, r); - else { - var t = r; - r = r2; - r2 = t; - } - } - return z.revert(r); - } - - // (public) this^e % m, 0 <= e < 2^32 - function bnModPowInt(e, m) { - var z; - if (e < 256 || m.isEven()) z = new Classic(m); - else z = new Montgomery(m); - return this.exp(e, z); - } - - // protected - BigInteger.prototype.copyTo = bnpCopyTo; - BigInteger.prototype.fromInt = bnpFromInt; - BigInteger.prototype.fromString = bnpFromString; - BigInteger.prototype.clamp = bnpClamp; - BigInteger.prototype.dlShiftTo = bnpDLShiftTo; - BigInteger.prototype.drShiftTo = bnpDRShiftTo; - BigInteger.prototype.lShiftTo = bnpLShiftTo; - BigInteger.prototype.rShiftTo = bnpRShiftTo; - BigInteger.prototype.subTo = bnpSubTo; - BigInteger.prototype.multiplyTo = bnpMultiplyTo; - BigInteger.prototype.squareTo = bnpSquareTo; - BigInteger.prototype.divRemTo = bnpDivRemTo; - BigInteger.prototype.invDigit = bnpInvDigit; - BigInteger.prototype.isEven = bnpIsEven; - BigInteger.prototype.exp = bnpExp; - - // public - BigInteger.prototype.toString = bnToString; - BigInteger.prototype.negate = bnNegate; - BigInteger.prototype.abs = bnAbs; - BigInteger.prototype.compareTo = bnCompareTo; - BigInteger.prototype.bitLength = bnBitLength; - BigInteger.prototype.mod = bnMod; - BigInteger.prototype.modPowInt = bnModPowInt; - - // "constants" - BigInteger.ZERO = nbv(0); - BigInteger.ONE = nbv(1); - BigInteger.valueOf = nbv; - - // Copyright (c) 2005-2009 Tom Wu - // All Rights Reserved. - // See "LICENSE" for details. - - // Extended JavaScript BN functions, required for RSA private ops. - - // Version 1.1: new BigInteger("0", 10) returns "proper" zero - // Version 1.2: square() API, isProbablePrime fix - - // (public) - function bnClone() { - var r = nbi(); - this.copyTo(r); - return r; - } - - // (public) return value as integer - function bnIntValue() { - if (this.s < 0) { - if (this.t == 1) return this[0] - this.DV; - else if (this.t == 0) return -1; - } else if (this.t == 1) return this[0]; - else if (this.t == 0) return 0; - // assumes 16 < DB < 32 - return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; - } - - // (public) return value as byte - function bnByteValue() { - return this.t == 0 ? this.s : (this[0] << 24) >> 24; - } - - // (public) return value as short (assumes DB>=16) - function bnShortValue() { - return this.t == 0 ? this.s : (this[0] << 16) >> 16; - } - - // (protected) return x s.t. r^x < DV - function bnpChunkSize(r) { - return Math.floor((Math.LN2 * this.DB) / Math.log(r)); - } - - // (public) 0 if this == 0, 1 if this > 0 - function bnSigNum() { - if (this.s < 0) return -1; - else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; - else return 1; - } - - // (protected) convert to radix string - function bnpToRadix(b) { - if (b == null) b = 10; - if (this.signum() == 0 || b < 2 || b > 36) return '0'; - var cs = this.chunkSize(b); - var a = Math.pow(b, cs); - var d = nbv(a), - y = nbi(), - z = nbi(), - r = ''; - this.divRemTo(d, y, z); - while (y.signum() > 0) { - r = (a + z.intValue()).toString(b).substr(1) + r; - y.divRemTo(d, y, z); - } - return z.intValue().toString(b) + r; - } - - // (protected) convert from radix string - function bnpFromRadix(s, b) { - this.fromInt(0); - if (b == null) b = 10; - var cs = this.chunkSize(b); - var d = Math.pow(b, cs), - mi = false, - j = 0, - w = 0; - for (var i = 0; i < s.length; ++i) { - var x = intAt(s, i); - if (x < 0) { - if (s.charAt(i) == '-' && this.signum() == 0) mi = true; - continue; - } - w = b * w + x; - if (++j >= cs) { - this.dMultiply(d); - this.dAddOffset(w, 0); - j = 0; - w = 0; - } - } - if (j > 0) { - this.dMultiply(Math.pow(b, j)); - this.dAddOffset(w, 0); - } - if (mi) BigInteger.ZERO.subTo(this, this); - } - - // (protected) alternate constructor - function bnpFromNumber(a, b, c) { - if ('number' == typeof b) { - // new BigInteger(int,int,RNG) - if (a < 2) this.fromInt(1); - else { - this.fromNumber(a, c); - if (!this.testBit(a - 1)) - // force MSB set - this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); - if (this.isEven()) this.dAddOffset(1, 0); // force odd - while (!this.isProbablePrime(b)) { - this.dAddOffset(2, 0); - if (this.bitLength() > a) - this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); - } - } - } else { - // new BigInteger(int,RNG) - var x = new Array(), - t = a & 7; - x.length = (a >> 3) + 1; - b.nextBytes(x); - if (t > 0) x[0] &= (1 << t) - 1; - else x[0] = 0; - this.fromString(x, 256); - } - } - - // (public) convert to bigendian byte array - function bnToByteArray() { - var i = this.t, - r = new Array(); - r[0] = this.s; - var p = this.DB - ((i * this.DB) % 8), - d, - k = 0; - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) - r[k++] = d | (this.s << (this.DB - p)); - while (i >= 0) { - if (p < 8) { - d = (this[i] & ((1 << p) - 1)) << (8 - p); - d |= this[--i] >> (p += this.DB - 8); - } else { - d = (this[i] >> (p -= 8)) & 0xff; - if (p <= 0) { - p += this.DB; - --i; - } - } - if ((d & 0x80) != 0) d |= -256; - if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k; - if (k > 0 || d != this.s) r[k++] = d; - } - } - return r; - } - - function bnEquals(a) { - return this.compareTo(a) == 0; - } - function bnMin(a) { - return this.compareTo(a) < 0 ? this : a; - } - function bnMax(a) { - return this.compareTo(a) > 0 ? this : a; - } - - // (protected) r = this op a (bitwise) - function bnpBitwiseTo(a, op, r) { - var i, - f, - m = Math.min(a.t, this.t); - for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); - if (a.t < this.t) { - f = a.s & this.DM; - for (i = m; i < this.t; ++i) r[i] = op(this[i], f); - r.t = this.t; - } else { - f = this.s & this.DM; - for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); - r.t = a.t; - } - r.s = op(this.s, a.s); - r.clamp(); - } - - // (public) this & a - function op_and(x, y) { - return x & y; - } - function bnAnd(a) { - var r = nbi(); - this.bitwiseTo(a, op_and, r); - return r; - } - - // (public) this | a - function op_or(x, y) { - return x | y; - } - function bnOr(a) { - var r = nbi(); - this.bitwiseTo(a, op_or, r); - return r; - } - - // (public) this ^ a - function op_xor(x, y) { - return x ^ y; - } - function bnXor(a) { - var r = nbi(); - this.bitwiseTo(a, op_xor, r); - return r; - } - - // (public) this & ~a - function op_andnot(x, y) { - return x & ~y; - } - function bnAndNot(a) { - var r = nbi(); - this.bitwiseTo(a, op_andnot, r); - return r; - } - - // (public) ~this - function bnNot() { - var r = nbi(); - for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; - r.t = this.t; - r.s = ~this.s; - return r; - } - - // (public) this << n - function bnShiftLeft(n) { - var r = nbi(); - if (n < 0) this.rShiftTo(-n, r); - else this.lShiftTo(n, r); - return r; - } - - // (public) this >> n - function bnShiftRight(n) { - var r = nbi(); - if (n < 0) this.lShiftTo(-n, r); - else this.rShiftTo(n, r); - return r; - } - - // return index of lowest 1-bit in x, x < 2^31 - function lbit(x) { - if (x == 0) return -1; - var r = 0; - if ((x & 0xffff) == 0) { - x >>= 16; - r += 16; - } - if ((x & 0xff) == 0) { - x >>= 8; - r += 8; - } - if ((x & 0xf) == 0) { - x >>= 4; - r += 4; - } - if ((x & 3) == 0) { - x >>= 2; - r += 2; - } - if ((x & 1) == 0) ++r; - return r; - } - - // (public) returns index of lowest 1-bit (or -1 if none) - function bnGetLowestSetBit() { - for (var i = 0; i < this.t; ++i) - if (this[i] != 0) return i * this.DB + lbit(this[i]); - if (this.s < 0) return this.t * this.DB; - return -1; - } - - // return number of 1 bits in x - function cbit(x) { - var r = 0; - while (x != 0) { - x &= x - 1; - ++r; - } - return r; - } - - // (public) return number of set bits - function bnBitCount() { - var r = 0, - x = this.s & this.DM; - for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); - return r; - } - - // (public) true iff nth bit is set - function bnTestBit(n) { - var j = Math.floor(n / this.DB); - if (j >= this.t) return this.s != 0; - return (this[j] & (1 << n % this.DB)) != 0; - } - - // (protected) this op (1<>= this.DB; - } - if (a.t < this.t) { - c += a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c += a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += a.s; - } - r.s = c < 0 ? -1 : 0; - if (c > 0) r[i++] = c; - else if (c < -1) r[i++] = this.DV + c; - r.t = i; - r.clamp(); - } - - // (public) this + a - function bnAdd(a) { - var r = nbi(); - this.addTo(a, r); - return r; - } - - // (public) this - a - function bnSubtract(a) { - var r = nbi(); - this.subTo(a, r); - return r; - } - - // (public) this * a - function bnMultiply(a) { - var r = nbi(); - this.multiplyTo(a, r); - return r; - } - - // (public) this^2 - function bnSquare() { - var r = nbi(); - this.squareTo(r); - return r; - } - - // (public) this / a - function bnDivide(a) { - var r = nbi(); - this.divRemTo(a, r, null); - return r; - } - - // (public) this % a - function bnRemainder(a) { - var r = nbi(); - this.divRemTo(a, null, r); - return r; - } - - // (public) [this/a,this%a] - function bnDivideAndRemainder(a) { - var q = nbi(), - r = nbi(); - this.divRemTo(a, q, r); - return new Array(q, r); - } - - // (protected) this *= n, this >= 0, 1 < n < DV - function bnpDMultiply(n) { - this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); - ++this.t; - this.clamp(); - } - - // (protected) this += n << w words, this >= 0 - function bnpDAddOffset(n, w) { - if (n == 0) return; - while (this.t <= w) this[this.t++] = 0; - this[w] += n; - while (this[w] >= this.DV) { - this[w] -= this.DV; - if (++w >= this.t) this[this.t++] = 0; - ++this[w]; - } - } - - // A "null" reducer - function NullExp() { } - function nNop(x) { - return x; - } - function nMulTo(x, y, r) { - x.multiplyTo(y, r); - } - function nSqrTo(x, r) { - x.squareTo(r); - } - - NullExp.prototype.convert = nNop; - NullExp.prototype.revert = nNop; - NullExp.prototype.mulTo = nMulTo; - NullExp.prototype.sqrTo = nSqrTo; - - // (public) this^e - function bnPow(e) { - return this.exp(e, new NullExp()); - } - - // (protected) r = lower n words of "this * a", a.t <= n - // "this" should be the larger one if appropriate. - function bnpMultiplyLowerTo(a, n, r) { - var i = Math.min(this.t + a.t, n); - r.s = 0; // assumes a,this >= 0 - r.t = i; - while (i > 0) r[--i] = 0; - var j; - for (j = r.t - this.t; i < j; ++i) - r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); - for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); - r.clamp(); - } - - // (protected) r = "this * a" without lower n words, n > 0 - // "this" should be the larger one if appropriate. - function bnpMultiplyUpperTo(a, n, r) { - --n; - var i = (r.t = this.t + a.t - n); - r.s = 0; // assumes a,this >= 0 - while (--i >= 0) r[i] = 0; - for (i = Math.max(n - this.t, 0); i < a.t; ++i) - r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); - r.clamp(); - r.drShiftTo(1, r); - } - - // Barrett modular reduction - function Barrett(m) { - // setup Barrett - this.r2 = nbi(); - this.q3 = nbi(); - BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); - this.mu = this.r2.divide(m); - this.m = m; - } - - function barrettConvert(x) { - if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); - else if (x.compareTo(this.m) < 0) return x; - else { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; - } - } - - function barrettRevert(x) { - return x; - } - - // x = x mod m (HAC 14.42) - function barrettReduce(x) { - x.drShiftTo(this.m.t - 1, this.r2); - if (x.t > this.m.t + 1) { - x.t = this.m.t + 1; - x.clamp(); - } - this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); - this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); - while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); - x.subTo(this.r2, x); - while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); - } - - // r = x^2 mod m; x != r - function barrettSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); - } - - // r = x*y mod m; x,y != r - function barrettMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); - } - - Barrett.prototype.convert = barrettConvert; - Barrett.prototype.revert = barrettRevert; - Barrett.prototype.reduce = barrettReduce; - Barrett.prototype.mulTo = barrettMulTo; - Barrett.prototype.sqrTo = barrettSqrTo; - - // (public) this^e % m (HAC 14.85) - function bnModPow(e, m) { - var i = e.bitLength(), - k, - r = nbv(1), - z; - if (i <= 0) return r; - else if (i < 18) k = 1; - else if (i < 48) k = 3; - else if (i < 144) k = 4; - else if (i < 768) k = 5; - else k = 6; - if (i < 8) z = new Classic(m); - else if (m.isEven()) z = new Barrett(m); - else z = new Montgomery(m); - - // precomputation - var g = new Array(), - n = 3, - k1 = k - 1, - km = (1 << k) - 1; - g[1] = z.convert(this); - if (k > 1) { - var g2 = nbi(); - z.sqrTo(g[1], g2); - while (n <= km) { - g[n] = nbi(); - z.mulTo(g2, g[n - 2], g[n]); - n += 2; - } - } - - var j = e.t - 1, - w, - is1 = true, - r2 = nbi(), - t; - i = nbits(e[j]) - 1; - while (j >= 0) { - if (i >= k1) w = (e[j] >> (i - k1)) & km; - else { - w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); - if (j > 0) w |= e[j - 1] >> (this.DB + i - k1); - } - - n = k; - while ((w & 1) == 0) { - w >>= 1; - --n; - } - if ((i -= n) < 0) { - i += this.DB; - --j; - } - if (is1) { - // ret == 1, don't bother squaring or multiplying it - g[w].copyTo(r); - is1 = false; - } else { - while (n > 1) { - z.sqrTo(r, r2); - z.sqrTo(r2, r); - n -= 2; - } - if (n > 0) z.sqrTo(r, r2); - else { - t = r; - r = r2; - r2 = t; - } - z.mulTo(r2, g[w], r); - } - - while (j >= 0 && (e[j] & (1 << i)) == 0) { - z.sqrTo(r, r2); - t = r; - r = r2; - r2 = t; - if (--i < 0) { - i = this.DB - 1; - --j; - } - } - } - return z.revert(r); - } - - // (public) gcd(this,a) (HAC 14.54) - function bnGCD(a) { - var x = this.s < 0 ? this.negate() : this.clone(); - var y = a.s < 0 ? a.negate() : a.clone(); - if (x.compareTo(y) < 0) { - var t = x; - x = y; - y = t; - } - var i = x.getLowestSetBit(), - g = y.getLowestSetBit(); - if (g < 0) return x; - if (i < g) g = i; - if (g > 0) { - x.rShiftTo(g, x); - y.rShiftTo(g, y); - } - while (x.signum() > 0) { - if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); - if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); - if (x.compareTo(y) >= 0) { - x.subTo(y, x); - x.rShiftTo(1, x); - } else { - y.subTo(x, y); - y.rShiftTo(1, y); - } - } - if (g > 0) y.lShiftTo(g, y); - return y; - } - - // (protected) this % n, n < 2^26 - function bnpModInt(n) { - if (n <= 0) return 0; - var d = this.DV % n, - r = this.s < 0 ? n - 1 : 0; - if (this.t > 0) - if (d == 0) r = this[0] % n; - else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; - return r; - } - - // (public) 1/this % m (HAC 14.61) - function bnModInverse(m) { - var ac = m.isEven(); - if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; - var u = m.clone(), - v = this.clone(); - var a = nbv(1), - b = nbv(0), - c = nbv(0), - d = nbv(1); - while (u.signum() != 0) { - while (u.isEven()) { - u.rShiftTo(1, u); - if (ac) { - if (!a.isEven() || !b.isEven()) { - a.addTo(this, a); - b.subTo(m, b); - } - a.rShiftTo(1, a); - } else if (!b.isEven()) b.subTo(m, b); - b.rShiftTo(1, b); - } - while (v.isEven()) { - v.rShiftTo(1, v); - if (ac) { - if (!c.isEven() || !d.isEven()) { - c.addTo(this, c); - d.subTo(m, d); - } - c.rShiftTo(1, c); - } else if (!d.isEven()) d.subTo(m, d); - d.rShiftTo(1, d); - } - if (u.compareTo(v) >= 0) { - u.subTo(v, u); - if (ac) a.subTo(c, a); - b.subTo(d, b); - } else { - v.subTo(u, v); - if (ac) c.subTo(a, c); - d.subTo(b, d); - } - } - if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; - if (d.compareTo(m) >= 0) return d.subtract(m); - if (d.signum() < 0) d.addTo(m, d); - else return d; - if (d.signum() < 0) return d.add(m); - else return d; - } - - var lowprimes = [ - 2, - 3, - 5, - 7, - 11, - 13, - 17, - 19, - 23, - 29, - 31, - 37, - 41, - 43, - 47, - 53, - 59, - 61, - 67, - 71, - 73, - 79, - 83, - 89, - 97, - 101, - 103, - 107, - 109, - 113, - 127, - 131, - 137, - 139, - 149, - 151, - 157, - 163, - 167, - 173, - 179, - 181, - 191, - 193, - 197, - 199, - 211, - 223, - 227, - 229, - 233, - 239, - 241, - 251, - 257, - 263, - 269, - 271, - 277, - 281, - 283, - 293, - 307, - 311, - 313, - 317, - 331, - 337, - 347, - 349, - 353, - 359, - 367, - 373, - 379, - 383, - 389, - 397, - 401, - 409, - 419, - 421, - 431, - 433, - 439, - 443, - 449, - 457, - 461, - 463, - 467, - 479, - 487, - 491, - 499, - 503, - 509, - 521, - 523, - 541, - 547, - 557, - 563, - 569, - 571, - 577, - 587, - 593, - 599, - 601, - 607, - 613, - 617, - 619, - 631, - 641, - 643, - 647, - 653, - 659, - 661, - 673, - 677, - 683, - 691, - 701, - 709, - 719, - 727, - 733, - 739, - 743, - 751, - 757, - 761, - 769, - 773, - 787, - 797, - 809, - 811, - 821, - 823, - 827, - 829, - 839, - 853, - 857, - 859, - 863, - 877, - 881, - 883, - 887, - 907, - 911, - 919, - 929, - 937, - 941, - 947, - 953, - 967, - 971, - 977, - 983, - 991, - 997, - ]; - var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; - - // (public) test primality with certainty >= 1-.5^t - function bnIsProbablePrime(t) { - var i, - x = this.abs(); - if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { - for (i = 0; i < lowprimes.length; ++i) - if (x[0] == lowprimes[i]) return true; - return false; - } - if (x.isEven()) return false; - i = 1; - while (i < lowprimes.length) { - var m = lowprimes[i], - j = i + 1; - while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; - m = x.modInt(m); - while (i < j) if (m % lowprimes[i++] == 0) return false; - } - return x.millerRabin(t); - } - - // (protected) true if probably prime (HAC 4.24, Miller-Rabin) - function bnpMillerRabin(t) { - var n1 = this.subtract(BigInteger.ONE); - var k = n1.getLowestSetBit(); - if (k <= 0) return false; - var r = n1.shiftRight(k); - t = (t + 1) >> 1; - if (t > lowprimes.length) t = lowprimes.length; - var a = nbi(); - for (var i = 0; i < t; ++i) { - //Pick bases at random, instead of starting at 2 - a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); - var y = a.modPow(r, this); - if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { - var j = 1; - while (j++ < k && y.compareTo(n1) != 0) { - y = y.modPowInt(2, this); - if (y.compareTo(BigInteger.ONE) == 0) return false; - } - if (y.compareTo(n1) != 0) return false; - } - } - return true; - } - - // protected - BigInteger.prototype.chunkSize = bnpChunkSize; - BigInteger.prototype.toRadix = bnpToRadix; - BigInteger.prototype.fromRadix = bnpFromRadix; - BigInteger.prototype.fromNumber = bnpFromNumber; - BigInteger.prototype.bitwiseTo = bnpBitwiseTo; - BigInteger.prototype.changeBit = bnpChangeBit; - BigInteger.prototype.addTo = bnpAddTo; - BigInteger.prototype.dMultiply = bnpDMultiply; - BigInteger.prototype.dAddOffset = bnpDAddOffset; - BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; - BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; - BigInteger.prototype.modInt = bnpModInt; - BigInteger.prototype.millerRabin = bnpMillerRabin; - - // public - BigInteger.prototype.clone = bnClone; - BigInteger.prototype.intValue = bnIntValue; - BigInteger.prototype.byteValue = bnByteValue; - BigInteger.prototype.shortValue = bnShortValue; - BigInteger.prototype.signum = bnSigNum; - BigInteger.prototype.toByteArray = bnToByteArray; - BigInteger.prototype.equals = bnEquals; - BigInteger.prototype.min = bnMin; - BigInteger.prototype.max = bnMax; - BigInteger.prototype.and = bnAnd; - BigInteger.prototype.or = bnOr; - BigInteger.prototype.xor = bnXor; - BigInteger.prototype.andNot = bnAndNot; - BigInteger.prototype.not = bnNot; - BigInteger.prototype.shiftLeft = bnShiftLeft; - BigInteger.prototype.shiftRight = bnShiftRight; - BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; - BigInteger.prototype.bitCount = bnBitCount; - BigInteger.prototype.testBit = bnTestBit; - BigInteger.prototype.setBit = bnSetBit; - BigInteger.prototype.clearBit = bnClearBit; - BigInteger.prototype.flipBit = bnFlipBit; - BigInteger.prototype.add = bnAdd; - BigInteger.prototype.subtract = bnSubtract; - BigInteger.prototype.multiply = bnMultiply; - BigInteger.prototype.divide = bnDivide; - BigInteger.prototype.remainder = bnRemainder; - BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; - BigInteger.prototype.modPow = bnModPow; - BigInteger.prototype.modInverse = bnModInverse; - BigInteger.prototype.pow = bnPow; - BigInteger.prototype.gcd = bnGCD; - BigInteger.prototype.isProbablePrime = bnIsProbablePrime; - - // JSBN-specific extension - BigInteger.prototype.square = bnSquare; - - // Expose the Barrett function - BigInteger.prototype.Barrett = Barrett; - - // BigInteger interfaces not implemented in jsbn: - - // BigInteger(int signum, byte[] magnitude) - // double doubleValue() - // float floatValue() - // int hashCode() - // long longValue() - // static BigInteger valueOf(long val) - - // Imported from bitcoinjs-lib - - /** - * Turns a byte array into a big integer. - * - * This function will interpret a byte array as a big integer in big - * endian notation and ignore leading zeros. - */ - - BigInteger.fromByteArrayUnsigned = function (ba) { - - if (!ba.length) { - return new BigInteger.valueOf(0); - } else if (ba[0] & 0x80) { - // Prepend a zero so the BigInteger class doesn't mistake this - // for a negative integer. - return new BigInteger([0].concat(ba)); - } else { - return new BigInteger(ba); - } - }; - - /** - * Parse a signed big integer byte representation. - * - * For details on the format please see BigInteger.toByteArraySigned. - */ - - BigInteger.fromByteArraySigned = function (ba) { - // Check for negative value - if (ba[0] & 0x80) { - // Remove sign bit - ba[0] &= 0x7f; - - return BigInteger.fromByteArrayUnsigned(ba).negate(); - } else { - return BigInteger.fromByteArrayUnsigned(ba); - } - }; - - /** - * Returns a byte array representation of the big integer. - * - * This returns the absolute of the contained value in big endian - * form. A value of zero results in an empty array. - */ - - BigInteger.prototype.toByteArrayUnsigned = function () { - var ba = this.abs().toByteArray(); - - // Empty array, nothing to do - if (!ba.length) { - return ba; - } - - // remove leading 0 - if (ba[0] === 0) { - ba = ba.slice(1); - } - - // all values must be positive - for (var i = 0; i < ba.length; ++i) { - ba[i] = (ba[i] < 0) ? ba[i] + 256 : ba[i]; - } - - return ba; - }; - - /* - * Converts big integer to signed byte representation. - * - * The format for this value uses the most significant bit as a sign - * bit. If the most significant bit is already occupied by the - * absolute value, an extra byte is prepended and the sign bit is set - * there. - * - * Examples: - * - * 0 => 0x00 - * 1 => 0x01 - * -1 => 0x81 - * 127 => 0x7f - * -127 => 0xff - * 128 => 0x0080 - * -128 => 0x8080 - * 255 => 0x00ff - * -255 => 0x80ff - * 16300 => 0x3fac - * -16300 => 0xbfac - * 62300 => 0x00f35c - * -62300 => 0x80f35c - */ - - BigInteger.prototype.toByteArraySigned = function () { - var val = this.toByteArrayUnsigned(); - var neg = this.s < 0; - - // if the first bit is set, we always unshift - // either unshift 0x80 or 0x00 - if (val[0] & 0x80) { - val.unshift((neg) ? 0x80 : 0x00); - } - // if the first bit isn't set, set it if negative - else if (neg) { - val[0] |= 0x80; - } - - return val; - }; - - // Random number generator - requires a PRNG backend, e.g. prng4.js - - // For best results, put code like - // - // in your main HTML document. - - var rng_state; - var rng_pool; - var rng_pptr; - - // Mix in a 32-bit integer into the pool - function rng_seed_int(x) { - rng_pool[rng_pptr++] ^= x & 255; - rng_pool[rng_pptr++] ^= (x >> 8) & 255; - rng_pool[rng_pptr++] ^= (x >> 16) & 255; - rng_pool[rng_pptr++] ^= (x >> 24) & 255; - if (rng_pptr >= rng_psize) rng_pptr -= rng_psize; - } - - // Mix in the current time (w/milliseconds) into the pool - function rng_seed_time() { - rng_seed_int(new Date().getTime()); - } - - // Initialize the pool with junk if needed. - if (rng_pool == null) { - rng_pool = new Array(); - rng_pptr = 0; - var t; - if (typeof window !== 'undefined' && window.crypto) { - if (window.crypto.getRandomValues) { - // Use webcrypto if available - var ua = new Uint8Array(32); - window.crypto.getRandomValues(ua); - for (t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t]; - } else if ( - navigator.appName == 'Netscape' && - navigator.appVersion < '5' - ) { - // Extract entropy (256 bits) from NS4 RNG if available - var z = window.crypto.random(32); - for (t = 0; t < z.length; ++t) - rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; - } - } - while (rng_pptr < rng_psize) { - // extract some randomness from Math.random() - t = Math.floor(65536 * Math.random()); - rng_pool[rng_pptr++] = t >>> 8; - rng_pool[rng_pptr++] = t & 255; - } - rng_pptr = 0; - rng_seed_time(); - //rng_seed_int(window.screenX); - //rng_seed_int(window.screenY); - } - - function rng_get_byte() { - if (rng_state == null) { - rng_seed_time(); - rng_state = prng_newstate(); - rng_state.init(rng_pool); - for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) - rng_pool[rng_pptr] = 0; - rng_pptr = 0; - //rng_pool = null; - } - // TODO: allow reseeding after first request - return rng_state.next(); - } - - function rng_get_bytes(ba) { - var i; - for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); - } - - function SecureRandom() { } - - SecureRandom.prototype.nextBytes = rng_get_bytes; - - // prng4.js - uses Arcfour as a PRNG - - function Arcfour() { - this.i = 0; - this.j = 0; - this.S = new Array(); - } - - // Initialize arcfour context from key, an array of ints, each from [0..255] - function ARC4init(key) { - var i, j, t; - for (i = 0; i < 256; ++i) this.S[i] = i; - j = 0; - for (i = 0; i < 256; ++i) { - j = (j + this.S[i] + key[i % key.length]) & 255; - t = this.S[i]; - this.S[i] = this.S[j]; - this.S[j] = t; - } - this.i = 0; - this.j = 0; - } - - function ARC4next() { - var t; - this.i = (this.i + 1) & 255; - this.j = (this.j + this.S[this.i]) & 255; - t = this.S[this.i]; - this.S[this.i] = this.S[this.j]; - this.S[this.j] = t; - return this.S[(t + this.S[this.i]) & 255]; - } - - Arcfour.prototype.init = ARC4init; - Arcfour.prototype.next = ARC4next; - - // Plug in your RNG constructor here - function prng_newstate() { - return new Arcfour(); - } - - // Pool size must be a multiple of 4 and greater than 32. - // An array of bytes the size of the pool will be passed to init() - var rng_psize = 256; - - if (typeof exports !== 'undefined') { - exports = module.exports = { - default: BigInteger, - BigInteger: BigInteger, - SecureRandom: SecureRandom, - }; - } else { - this.jsbn = { - BigInteger: BigInteger, - SecureRandom: SecureRandom, - }; - } -}.call(this)); \ No newline at end of file + // Copyright (c) 2005 Tom Wu + // All Rights Reserved. + // See "LICENSE" for details. + + // Basic JavaScript BN library - subset useful for RSA encryption. + + // Bits per digit + var dbits; + + // JavaScript engine analysis + var canary = 0xdeadbeefcafe; + var j_lm = (canary & 0xffffff) == 0xefcafe; + + // (public) Constructor + function BigInteger(a, b, c) { + if (a != null) + if ('number' == typeof a) this.fromNumber(a, b, c); + else if (b == null && 'string' != typeof a) this.fromString(a, 256); + else this.fromString(a, b); + } + + // return new, unset BigInteger + function nbi() { + return new BigInteger(null); + } + + // am: Compute w_j += (x*this_i), propagate carries, + // c is initial carry, returns final carry. + // c < 3*dvalue, x < 2*dvalue, this_i < dvalue + // We need to select the fastest one that works in this environment. + + // am1: use a single mult and divide to get the high bits, + // max digit bits should be 26 because + // max internal value = 2*dvalue^2-2*dvalue (< 2^53) + function am1(i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this[i++] + w[j] + c; + c = Math.floor(v / 0x4000000); + w[j++] = v & 0x3ffffff; + } + return c; + } + // am2 avoids a big mult-and-extract completely. + // Max digit bits should be <= 30 because we do bitwise ops + // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) + function am2(i, x, w, j, c, n) { + var xl = x & 0x7fff, + xh = x >> 15; + while (--n >= 0) { + var l = this[i] & 0x7fff; + var h = this[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w[j++] = l & 0x3fffffff; + } + return c; + } + // Alternately, set max digit bits to 28 since some + // browsers slow down when dealing with 32-bit numbers. + function am3(i, x, w, j, c, n) { + var xl = x & 0x3fff, + xh = x >> 14; + while (--n >= 0) { + var l = this[i] & 0x3fff; + var h = this[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w[j++] = l & 0xfffffff; + } + return c; + } + var inBrowser = typeof navigator !== 'undefined'; + if (inBrowser && j_lm && navigator.appName == 'Microsoft Internet Explorer') { + BigInteger.prototype.am = am2; + dbits = 30; + } else if (inBrowser && j_lm && navigator.appName != 'Netscape') { + BigInteger.prototype.am = am1; + dbits = 26; + } else { + // Mozilla/Netscape seems to prefer am3 + BigInteger.prototype.am = am3; + dbits = 28; + } + + BigInteger.prototype.DB = dbits; + BigInteger.prototype.DM = (1 << dbits) - 1; + BigInteger.prototype.DV = 1 << dbits; + + var BI_FP = 52; + BigInteger.prototype.FV = Math.pow(2, BI_FP); + BigInteger.prototype.F1 = BI_FP - dbits; + BigInteger.prototype.F2 = 2 * dbits - BI_FP; + + // Digit conversions + var BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz'; + var BI_RC = new Array(); + var rr, vv; + rr = '0'.charCodeAt(0); + for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; + rr = 'a'.charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + rr = 'A'.charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + + function int2char(n) { + return BI_RM.charAt(n); + } + function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return c == null ? -1 : c; + } + + // (protected) copy this to r + function bnpCopyTo(r) { + for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; + r.t = this.t; + r.s = this.s; + } + + // (protected) set from integer value x, -DV <= x < DV + function bnpFromInt(x) { + this.t = 1; + this.s = x < 0 ? -1 : 0; + if (x > 0) this[0] = x; + else if (x < -1) this[0] = x + this.DV; + else this.t = 0; + } + + // return bigint initialized to value + function nbv(i) { + var r = nbi(); + r.fromInt(i); + return r; + } + + // (protected) set from string and radix + function bnpFromString(s, b) { + // Auto-detect string notations + if (!b && s.length >= 2 && s[0] === '0') { + var isDetected = true; + switch (s[1]) { + case 'x': // Hexadecimal notation + b = 16; + break; + case 'b': // Binary notation + b = 2; + break; + case 'o': // Octal notation + b = 8; + break; + default: + isDetected = false; + } + + // Remove the notation string if any has been detected + if (isDetected) { + s = s.substr(2); + } + } + + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 256) k = 8; + // byte array + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length, + mi = false, + sh = 0; + while (--i >= 0) { + var x = k == 8 ? s[i] & 0xff : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == '-') mi = true; + continue; + } + mi = false; + if (sh == 0) this[this.t++] = x; + else if (sh + k > this.DB) { + this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; + this[this.t++] = x >> (this.DB - sh); + } else this[this.t - 1] |= x << sh; + sh += k; + if (sh >= this.DB) sh -= this.DB; + } + if (k == 8 && (s[0] & 0x80) != 0) { + this.s = -1; + if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; + } + this.clamp(); + if (mi) BigInteger.ZERO.subTo(this, this); + } + + // (protected) clamp off excess high words + function bnpClamp() { + var c = this.s & this.DM; + while (this.t > 0 && this[this.t - 1] == c) --this.t; + } + + // (public) return string representation in given radix + function bnToString(b) { + if (this.s < 0) return '-' + this.negate().toString(b); + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else return this.toRadix(b); + var km = (1 << k) - 1, + d, + m = false, + r = '', + i = this.t; + var p = this.DB - ((i * this.DB) % k); + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this[i] & ((1 << p) - 1)) << (k - p); + d |= this[--i] >> (p += this.DB - k); + } else { + d = (this[i] >> (p -= k)) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) m = true; + if (m) r += int2char(d); + } + } + return m ? r : '0'; + } + + // (public) -this + function bnNegate() { + var r = nbi(); + BigInteger.ZERO.subTo(this, r); + return r; + } + + // (public) |this| + function bnAbs() { + return this.s < 0 ? this.negate() : this; + } + + // (public) return + if this > a, - if this < a, 0 if equal + function bnCompareTo(a) { + var r = this.s - a.s; + if (r != 0) return r; + var i = this.t; + r = i - a.t; + if (r != 0) return this.s < 0 ? -r : r; + while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; + return 0; + } + + // returns bit length of the integer x + function nbits(x) { + var r = 1, + t; + if ((t = x >>> 16) != 0) { + x = t; + r += 16; + } + if ((t = x >> 8) != 0) { + x = t; + r += 8; + } + if ((t = x >> 4) != 0) { + x = t; + r += 4; + } + if ((t = x >> 2) != 0) { + x = t; + r += 2; + } + if ((t = x >> 1) != 0) { + x = t; + r += 1; + } + return r; + } + + // (public) return the number of bits in "this" + function bnBitLength() { + if (this.t <= 0) return 0; + return ( + this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)) + ); + } + + // (protected) r = this << n*DB + function bnpDLShiftTo(n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; + for (i = n - 1; i >= 0; --i) r[i] = 0; + r.t = this.t + n; + r.s = this.s; + } + + // (protected) r = this >> n*DB + function bnpDRShiftTo(n, r) { + for (var i = n; i < this.t; ++i) r[i - n] = this[i]; + r.t = Math.max(this.t - n, 0); + r.s = this.s; + } + + // (protected) r = this << n + function bnpLShiftTo(n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB), + c = (this.s << bs) & this.DM, + i; + for (i = this.t - 1; i >= 0; --i) { + r[i + ds + 1] = (this[i] >> cbs) | c; + c = (this[i] & bm) << bs; + } + for (i = ds - 1; i >= 0; --i) r[i] = 0; + r[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); + } + + // (protected) r = this >> n + function bnpRShiftTo(n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r[0] = this[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r[i - ds - 1] |= (this[i] & bm) << cbs; + r[i - ds] = this[i] >> bs; + } + if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; + r.t = this.t - ds; + r.clamp(); + } + + // (protected) r = this - a + function bnpSubTo(a, r) { + var i = 0, + c = 0, + m = Math.min(a.t, this.t); + while (i < m) { + c += this[i] - a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c -= a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = c < 0 ? -1 : 0; + if (c < -1) r[i++] = this.DV + c; + else if (c > 0) r[i++] = c; + r.t = i; + r.clamp(); + } + + // (protected) r = this * a, r != this,a (HAC 14.12) + // "this" should be the larger one if appropriate. + function bnpMultiplyTo(a, r) { + var x = this.abs(), + y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) r[i] = 0; + for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); + r.s = 0; + r.clamp(); + if (this.s != a.s) BigInteger.ZERO.subTo(r, r); + } + + // (protected) r = this^2, r != this (HAC 14.16) + function bnpSquareTo(r) { + var x = this.abs(); + var i = (r.t = 2 * x.t); + while (--i >= 0) r[i] = 0; + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x[i], r, 2 * i, 0, 1); + if ( + (r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= + x.DV + ) { + r[i + x.t] -= x.DV; + r[i + x.t + 1] = 1; + } + } + if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); + r.s = 0; + r.clamp(); + } + + // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) + // r != q, this != m. q or r may be null. + function bnpDivRemTo(m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) return; + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) q.fromInt(0); + if (r != null) this.copyTo(r); + return; + } + if (r == null) r = nbi(); + var y = nbi(), + ts = this.s, + ms = m.s; + var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y[ys - 1]; + if (y0 == 0) return; + var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt, + d2 = (1 << this.F1) / yt, + e = 1 << this.F2; + var i = r.t, + j = i - ys, + t = q == null ? nbi() : q; + y.dlShiftTo(j, t); + if (r.compareTo(t) >= 0) { + r[r.t++] = 1; + r.subTo(t, r); + } + BigInteger.ONE.dlShiftTo(ys, t); + t.subTo(y, y); // "negative" y so we can replace sub with am later + while (y.t < ys) y[y.t++] = 0; + while (--j >= 0) { + // Estimate quotient digit + var qd = + r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { + // Try it out + y.dlShiftTo(j, t); + r.subTo(t, r); + while (r[i] < --qd) r.subTo(t, r); + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms) BigInteger.ZERO.subTo(q, q); + } + r.t = ys; + r.clamp(); + if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder + if (ts < 0) BigInteger.ZERO.subTo(r, r); + } + + // (public) this mod a + function bnMod(a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); + return r; + } + + // Modular reduction using "classic" algorithm + function Classic(m) { + this.m = m; + } + function cConvert(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); + else return x; + } + function cRevert(x) { + return x; + } + function cReduce(x) { + x.divRemTo(this.m, null, x); + } + function cMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + function cSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + + Classic.prototype.convert = cConvert; + Classic.prototype.revert = cRevert; + Classic.prototype.reduce = cReduce; + Classic.prototype.mulTo = cMulTo; + Classic.prototype.sqrTo = cSqrTo; + + // (protected) return "-1/this % 2^DB"; useful for Mont. reduction + // justification: + // xy == 1 (mod m) + // xy = 1+km + // xy(2-xy) = (1+km)(1-km) + // x[y(2-xy)] = 1-k^2m^2 + // x[y(2-xy)] == 1 (mod m^2) + // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 + // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. + // JS multiply "overflows" differently from C/C++, so care is needed here. + function bnpInvDigit() { + if (this.t < 1) return 0; + var x = this[0]; + if ((x & 1) == 0) return 0; + var y = x & 3; // y == 1/x mod 2^2 + y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 + y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 + y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 + // last step - calculate inverse mod DV directly; + // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints + y = (y * (2 - ((x * y) % this.DV))) % this.DV; // y == 1/x mod 2^dbits + // we really want the negative inverse, and -DV < y < DV + return y > 0 ? this.DV - y : -y; + } + + // Montgomery reduction + function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 0x7fff; + this.mph = this.mp >> 15; + this.um = (1 << (m.DB - 15)) - 1; + this.mt2 = 2 * m.t; + } + + // xR mod m + function montConvert(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); + return r; + } + + // x/R mod m + function montRevert(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + + // x = x/R mod m (HAC 14.32) + function montReduce(x) { + while ( + x.t <= this.mt2 // pad x so am has enough room later + ) + x[x.t++] = 0; + for (var i = 0; i < this.m.t; ++i) { + // faster way of calculating u0 = x[i]*mp mod DV + var j = x[i] & 0x7fff; + var u0 = + (j * this.mpl + + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & + x.DM; + // use am to combine the multiply-shift-add into one call + j = i + this.m.t; + x[j] += this.m.am(0, u0, x, i, 0, this.m.t); + // propagate carry + while (x[j] >= x.DV) { + x[j] -= x.DV; + x[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + + // r = "x^2/R mod m"; x != r + function montSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + + // r = "xy/R mod m"; x,y != r + function montMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + + Montgomery.prototype.convert = montConvert; + Montgomery.prototype.revert = montRevert; + Montgomery.prototype.reduce = montReduce; + Montgomery.prototype.mulTo = montMulTo; + Montgomery.prototype.sqrTo = montSqrTo; + + // (protected) true iff this is even + function bnpIsEven() { + return (this.t > 0 ? this[0] & 1 : this.s) == 0; + } + + // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) + function bnpExp(e, z) { + if (e > 0xffffffff || e < 1) return BigInteger.ONE; + var r = nbi(), + r2 = nbi(), + g = z.convert(this), + i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z.sqrTo(r, r2); + if ((e & (1 << i)) > 0) z.mulTo(r2, g, r); + else { + var t = r; + r = r2; + r2 = t; + } + } + return z.revert(r); + } + + // (public) this^e % m, 0 <= e < 2^32 + function bnModPowInt(e, m) { + var z; + if (e < 256 || m.isEven()) z = new Classic(m); + else z = new Montgomery(m); + return this.exp(e, z); + } + + // protected + BigInteger.prototype.copyTo = bnpCopyTo; + BigInteger.prototype.fromInt = bnpFromInt; + BigInteger.prototype.fromString = bnpFromString; + BigInteger.prototype.clamp = bnpClamp; + BigInteger.prototype.dlShiftTo = bnpDLShiftTo; + BigInteger.prototype.drShiftTo = bnpDRShiftTo; + BigInteger.prototype.lShiftTo = bnpLShiftTo; + BigInteger.prototype.rShiftTo = bnpRShiftTo; + BigInteger.prototype.subTo = bnpSubTo; + BigInteger.prototype.multiplyTo = bnpMultiplyTo; + BigInteger.prototype.squareTo = bnpSquareTo; + BigInteger.prototype.divRemTo = bnpDivRemTo; + BigInteger.prototype.invDigit = bnpInvDigit; + BigInteger.prototype.isEven = bnpIsEven; + BigInteger.prototype.exp = bnpExp; + + // public + BigInteger.prototype.toString = bnToString; + BigInteger.prototype.negate = bnNegate; + BigInteger.prototype.abs = bnAbs; + BigInteger.prototype.compareTo = bnCompareTo; + BigInteger.prototype.bitLength = bnBitLength; + BigInteger.prototype.mod = bnMod; + BigInteger.prototype.modPowInt = bnModPowInt; + + // "constants" + BigInteger.ZERO = nbv(0); + BigInteger.ONE = nbv(1); + BigInteger.valueOf = nbv; + + // Copyright (c) 2005-2009 Tom Wu + // All Rights Reserved. + // See "LICENSE" for details. + + // Extended JavaScript BN functions, required for RSA private ops. + + // Version 1.1: new BigInteger("0", 10) returns "proper" zero + // Version 1.2: square() API, isProbablePrime fix + + // (public) + function bnClone() { + var r = nbi(); + this.copyTo(r); + return r; + } + + // (public) return value as integer + function bnIntValue() { + if (this.s < 0) { + if (this.t == 1) return this[0] - this.DV; + else if (this.t == 0) return -1; + } else if (this.t == 1) return this[0]; + else if (this.t == 0) return 0; + // assumes 16 < DB < 32 + return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; + } + + // (public) return value as byte + function bnByteValue() { + return this.t == 0 ? this.s : (this[0] << 24) >> 24; + } + + // (public) return value as short (assumes DB>=16) + function bnShortValue() { + return this.t == 0 ? this.s : (this[0] << 16) >> 16; + } + + // (protected) return x s.t. r^x < DV + function bnpChunkSize(r) { + return Math.floor((Math.LN2 * this.DB) / Math.log(r)); + } + + // (public) 0 if this == 0, 1 if this > 0 + function bnSigNum() { + if (this.s < 0) return -1; + else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; + else return 1; + } + + // (protected) convert to radix string + function bnpToRadix(b) { + if (b == null) b = 10; + if (this.signum() == 0 || b < 2 || b > 36) return '0'; + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a), + y = nbi(), + z = nbi(), + r = ''; + this.divRemTo(d, y, z); + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z); + } + return z.intValue().toString(b) + r; + } + + // (protected) convert from radix string + function bnpFromRadix(s, b) { + this.fromInt(0); + if (b == null) b = 10; + var cs = this.chunkSize(b); + var d = Math.pow(b, cs), + mi = false, + j = 0, + w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == '-' && this.signum() == 0) mi = true; + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) BigInteger.ZERO.subTo(this, this); + } + + // (protected) alternate constructor + function bnpFromNumber(a, b, c) { + if ('number' == typeof b) { + // new BigInteger(int,int,RNG) + if (a < 2) this.fromInt(1); + else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) + // force MSB set + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + if (this.isEven()) this.dAddOffset(1, 0); // force odd + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) + this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); + } + } + } else { + // new BigInteger(int,RNG) + var x = new Array(), + t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) x[0] &= (1 << t) - 1; + else x[0] = 0; + this.fromString(x, 256); + } + } + + // (public) convert to bigendian byte array + function bnToByteArray() { + var i = this.t, + r = new Array(); + r[0] = this.s; + var p = this.DB - ((i * this.DB) % 8), + d, + k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) + r[k++] = d | (this.s << (this.DB - p)); + while (i >= 0) { + if (p < 8) { + d = (this[i] & ((1 << p) - 1)) << (8 - p); + d |= this[--i] >> (p += this.DB - 8); + } else { + d = (this[i] >> (p -= 8)) & 0xff; + if (p <= 0) { + p += this.DB; + --i; + } + } + if ((d & 0x80) != 0) d |= -256; + if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k; + if (k > 0 || d != this.s) r[k++] = d; + } + } + return r; + } + + function bnEquals(a) { + return this.compareTo(a) == 0; + } + function bnMin(a) { + return this.compareTo(a) < 0 ? this : a; + } + function bnMax(a) { + return this.compareTo(a) > 0 ? this : a; + } + + // (protected) r = this op a (bitwise) + function bnpBitwiseTo(a, op, r) { + var i, + f, + m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); + if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) r[i] = op(this[i], f); + r.t = this.t; + } else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); + r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); + } + + // (public) this & a + function op_and(x, y) { + return x & y; + } + function bnAnd(a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; + } + + // (public) this | a + function op_or(x, y) { + return x | y; + } + function bnOr(a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; + } + + // (public) this ^ a + function op_xor(x, y) { + return x ^ y; + } + function bnXor(a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; + } + + // (public) this & ~a + function op_andnot(x, y) { + return x & ~y; + } + function bnAndNot(a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; + } + + // (public) ~this + function bnNot() { + var r = nbi(); + for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; + r.t = this.t; + r.s = ~this.s; + return r; + } + + // (public) this << n + function bnShiftLeft(n) { + var r = nbi(); + if (n < 0) this.rShiftTo(-n, r); + else this.lShiftTo(n, r); + return r; + } + + // (public) this >> n + function bnShiftRight(n) { + var r = nbi(); + if (n < 0) this.lShiftTo(-n, r); + else this.rShiftTo(n, r); + return r; + } + + // return index of lowest 1-bit in x, x < 2^31 + function lbit(x) { + if (x == 0) return -1; + var r = 0; + if ((x & 0xffff) == 0) { + x >>= 16; + r += 16; + } + if ((x & 0xff) == 0) { + x >>= 8; + r += 8; + } + if ((x & 0xf) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) ++r; + return r; + } + + // (public) returns index of lowest 1-bit (or -1 if none) + function bnGetLowestSetBit() { + for (var i = 0; i < this.t; ++i) + if (this[i] != 0) return i * this.DB + lbit(this[i]); + if (this.s < 0) return this.t * this.DB; + return -1; + } + + // return number of 1 bits in x + function cbit(x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; + } + + // (public) return number of set bits + function bnBitCount() { + var r = 0, + x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); + return r; + } + + // (public) true iff nth bit is set + function bnTestBit(n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) return this.s != 0; + return (this[j] & (1 << n % this.DB)) != 0; + } + + // (protected) this op (1<>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c += a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = c < 0 ? -1 : 0; + if (c > 0) r[i++] = c; + else if (c < -1) r[i++] = this.DV + c; + r.t = i; + r.clamp(); + } + + // (public) this + a + function bnAdd(a) { + var r = nbi(); + this.addTo(a, r); + return r; + } + + // (public) this - a + function bnSubtract(a) { + var r = nbi(); + this.subTo(a, r); + return r; + } + + // (public) this * a + function bnMultiply(a) { + var r = nbi(); + this.multiplyTo(a, r); + return r; + } + + // (public) this^2 + function bnSquare() { + var r = nbi(); + this.squareTo(r); + return r; + } + + // (public) this / a + function bnDivide(a) { + var r = nbi(); + this.divRemTo(a, r, null); + return r; + } + + // (public) this % a + function bnRemainder(a) { + var r = nbi(); + this.divRemTo(a, null, r); + return r; + } + + // (public) [this/a,this%a] + function bnDivideAndRemainder(a) { + var q = nbi(), + r = nbi(); + this.divRemTo(a, q, r); + return new Array(q, r); + } + + // (protected) this *= n, this >= 0, 1 < n < DV + function bnpDMultiply(n) { + this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); + } + + // (protected) this += n << w words, this >= 0 + function bnpDAddOffset(n, w) { + if (n == 0) return; + while (this.t <= w) this[this.t++] = 0; + this[w] += n; + while (this[w] >= this.DV) { + this[w] -= this.DV; + if (++w >= this.t) this[this.t++] = 0; + ++this[w]; + } + } + + // A "null" reducer + function NullExp() { } + function nNop(x) { + return x; + } + function nMulTo(x, y, r) { + x.multiplyTo(y, r); + } + function nSqrTo(x, r) { + x.squareTo(r); + } + + NullExp.prototype.convert = nNop; + NullExp.prototype.revert = nNop; + NullExp.prototype.mulTo = nMulTo; + NullExp.prototype.sqrTo = nSqrTo; + + // (public) this^e + function bnPow(e) { + return this.exp(e, new NullExp()); + } + + // (protected) r = lower n words of "this * a", a.t <= n + // "this" should be the larger one if appropriate. + function bnpMultiplyLowerTo(a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; // assumes a,this >= 0 + r.t = i; + while (i > 0) r[--i] = 0; + var j; + for (j = r.t - this.t; i < j; ++i) + r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); + for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); + r.clamp(); + } + + // (protected) r = "this * a" without lower n words, n > 0 + // "this" should be the larger one if appropriate. + function bnpMultiplyUpperTo(a, n, r) { + --n; + var i = (r.t = this.t + a.t - n); + r.s = 0; // assumes a,this >= 0 + while (--i >= 0) r[i] = 0; + for (i = Math.max(n - this.t, 0); i < a.t; ++i) + r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); + r.clamp(); + r.drShiftTo(1, r); + } + + // Barrett modular reduction + function Barrett(m) { + // setup Barrett + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + this.m = m; + } + + function barrettConvert(x) { + if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); + else if (x.compareTo(this.m) < 0) return x; + else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + } + + function barrettRevert(x) { + return x; + } + + // x = x mod m (HAC 14.42) + function barrettReduce(x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); + x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + + // r = x^2 mod m; x != r + function barrettSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + + // r = x*y mod m; x,y != r + function barrettMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + + Barrett.prototype.convert = barrettConvert; + Barrett.prototype.revert = barrettRevert; + Barrett.prototype.reduce = barrettReduce; + Barrett.prototype.mulTo = barrettMulTo; + Barrett.prototype.sqrTo = barrettSqrTo; + + // (public) this^e % m (HAC 14.85) + function bnModPow(e, m) { + var i = e.bitLength(), + k, + r = nbv(1), + z; + if (i <= 0) return r; + else if (i < 18) k = 1; + else if (i < 48) k = 3; + else if (i < 144) k = 4; + else if (i < 768) k = 5; + else k = 6; + if (i < 8) z = new Classic(m); + else if (m.isEven()) z = new Barrett(m); + else z = new Montgomery(m); + + // precomputation + var g = new Array(), + n = 3, + k1 = k - 1, + km = (1 << k) - 1; + g[1] = z.convert(this); + if (k > 1) { + var g2 = nbi(); + z.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + + var j = e.t - 1, + w, + is1 = true, + r2 = nbi(), + t; + i = nbits(e[j]) - 1; + while (j >= 0) { + if (i >= k1) w = (e[j] >> (i - k1)) & km; + else { + w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); + if (j > 0) w |= e[j - 1] >> (this.DB + i - k1); + } + + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { + // ret == 1, don't bother squaring or multiplying it + g[w].copyTo(r); + is1 = false; + } else { + while (n > 1) { + z.sqrTo(r, r2); + z.sqrTo(r2, r); + n -= 2; + } + if (n > 0) z.sqrTo(r, r2); + else { + t = r; + r = r2; + r2 = t; + } + z.mulTo(r2, g[w], r); + } + + while (j >= 0 && (e[j] & (1 << i)) == 0) { + z.sqrTo(r, r2); + t = r; + r = r2; + r2 = t; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z.revert(r); + } + + // (public) gcd(this,a) (HAC 14.54) + function bnGCD(a) { + var x = this.s < 0 ? this.negate() : this.clone(); + var y = a.s < 0 ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(), + g = y.getLowestSetBit(); + if (g < 0) return x; + if (i < g) g = i; + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); + if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) y.lShiftTo(g, y); + return y; + } + + // (protected) this % n, n < 2^26 + function bnpModInt(n) { + if (n <= 0) return 0; + var d = this.DV % n, + r = this.s < 0 ? n - 1 : 0; + if (this.t > 0) + if (d == 0) r = this[0] % n; + else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; + return r; + } + + // (public) 1/this % m (HAC 14.61) + function bnModInverse(m) { + var ac = m.isEven(); + if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; + var u = m.clone(), + v = this.clone(); + var a = nbv(1), + b = nbv(0), + c = nbv(0), + d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } else if (!b.isEven()) b.subTo(m, b); + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } else if (!d.isEven()) d.subTo(m, d); + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) a.subTo(c, a); + b.subTo(d, b); + } else { + v.subTo(u, v); + if (ac) c.subTo(a, c); + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; + if (d.compareTo(m) >= 0) return d.subtract(m); + if (d.signum() < 0) d.addTo(m, d); + else return d; + if (d.signum() < 0) return d.add(m); + else return d; + } + + var lowprimes = [ + 2, + 3, + 5, + 7, + 11, + 13, + 17, + 19, + 23, + 29, + 31, + 37, + 41, + 43, + 47, + 53, + 59, + 61, + 67, + 71, + 73, + 79, + 83, + 89, + 97, + 101, + 103, + 107, + 109, + 113, + 127, + 131, + 137, + 139, + 149, + 151, + 157, + 163, + 167, + 173, + 179, + 181, + 191, + 193, + 197, + 199, + 211, + 223, + 227, + 229, + 233, + 239, + 241, + 251, + 257, + 263, + 269, + 271, + 277, + 281, + 283, + 293, + 307, + 311, + 313, + 317, + 331, + 337, + 347, + 349, + 353, + 359, + 367, + 373, + 379, + 383, + 389, + 397, + 401, + 409, + 419, + 421, + 431, + 433, + 439, + 443, + 449, + 457, + 461, + 463, + 467, + 479, + 487, + 491, + 499, + 503, + 509, + 521, + 523, + 541, + 547, + 557, + 563, + 569, + 571, + 577, + 587, + 593, + 599, + 601, + 607, + 613, + 617, + 619, + 631, + 641, + 643, + 647, + 653, + 659, + 661, + 673, + 677, + 683, + 691, + 701, + 709, + 719, + 727, + 733, + 739, + 743, + 751, + 757, + 761, + 769, + 773, + 787, + 797, + 809, + 811, + 821, + 823, + 827, + 829, + 839, + 853, + 857, + 859, + 863, + 877, + 881, + 883, + 887, + 907, + 911, + 919, + 929, + 937, + 941, + 947, + 953, + 967, + 971, + 977, + 983, + 991, + 997, + ]; + var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + + // (public) test primality with certainty >= 1-.5^t + function bnIsProbablePrime(t) { + var i, + x = this.abs(); + if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) + if (x[0] == lowprimes[i]) return true; + return false; + } + if (x.isEven()) return false; + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i], + j = i + 1; + while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; + m = x.modInt(m); + while (i < j) if (m % lowprimes[i++] == 0) return false; + } + return x.millerRabin(t); + } + + // (protected) true if probably prime (HAC 4.24, Miller-Rabin) + function bnpMillerRabin(t) { + var n1 = this.subtract(BigInteger.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) return false; + var r = n1.shiftRight(k); + t = (t + 1) >> 1; + if (t > lowprimes.length) t = lowprimes.length; + var a = nbi(); + for (var i = 0; i < t; ++i) { + //Pick bases at random, instead of starting at 2 + a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger.ONE) == 0) return false; + } + if (y.compareTo(n1) != 0) return false; + } + } + return true; + } + + // protected + BigInteger.prototype.chunkSize = bnpChunkSize; + BigInteger.prototype.toRadix = bnpToRadix; + BigInteger.prototype.fromRadix = bnpFromRadix; + BigInteger.prototype.fromNumber = bnpFromNumber; + BigInteger.prototype.bitwiseTo = bnpBitwiseTo; + BigInteger.prototype.changeBit = bnpChangeBit; + BigInteger.prototype.addTo = bnpAddTo; + BigInteger.prototype.dMultiply = bnpDMultiply; + BigInteger.prototype.dAddOffset = bnpDAddOffset; + BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; + BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; + BigInteger.prototype.modInt = bnpModInt; + BigInteger.prototype.millerRabin = bnpMillerRabin; + + // public + BigInteger.prototype.clone = bnClone; + BigInteger.prototype.intValue = bnIntValue; + BigInteger.prototype.byteValue = bnByteValue; + BigInteger.prototype.shortValue = bnShortValue; + BigInteger.prototype.signum = bnSigNum; + BigInteger.prototype.toByteArray = bnToByteArray; + BigInteger.prototype.equals = bnEquals; + BigInteger.prototype.min = bnMin; + BigInteger.prototype.max = bnMax; + BigInteger.prototype.and = bnAnd; + BigInteger.prototype.or = bnOr; + BigInteger.prototype.xor = bnXor; + BigInteger.prototype.andNot = bnAndNot; + BigInteger.prototype.not = bnNot; + BigInteger.prototype.shiftLeft = bnShiftLeft; + BigInteger.prototype.shiftRight = bnShiftRight; + BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; + BigInteger.prototype.bitCount = bnBitCount; + BigInteger.prototype.testBit = bnTestBit; + BigInteger.prototype.setBit = bnSetBit; + BigInteger.prototype.clearBit = bnClearBit; + BigInteger.prototype.flipBit = bnFlipBit; + BigInteger.prototype.add = bnAdd; + BigInteger.prototype.subtract = bnSubtract; + BigInteger.prototype.multiply = bnMultiply; + BigInteger.prototype.divide = bnDivide; + BigInteger.prototype.remainder = bnRemainder; + BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; + BigInteger.prototype.modPow = bnModPow; + BigInteger.prototype.modInverse = bnModInverse; + BigInteger.prototype.pow = bnPow; + BigInteger.prototype.gcd = bnGCD; + BigInteger.prototype.isProbablePrime = bnIsProbablePrime; + + // JSBN-specific extension + BigInteger.prototype.square = bnSquare; + + // Expose the Barrett function + BigInteger.prototype.Barrett = Barrett; + + // BigInteger interfaces not implemented in jsbn: + + // BigInteger(int signum, byte[] magnitude) + // double doubleValue() + // float floatValue() + // int hashCode() + // long longValue() + // static BigInteger valueOf(long val) + + // Imported from bitcoinjs-lib + + /** + * Turns a byte array into a big integer. + * + * This function will interpret a byte array as a big integer in big + * endian notation and ignore leading zeros. + */ + + BigInteger.fromByteArrayUnsigned = function (ba) { + + if (!ba.length) { + return new BigInteger.valueOf(0); + } else if (ba[0] & 0x80) { + // Prepend a zero so the BigInteger class doesn't mistake this + // for a negative integer. + return new BigInteger([0].concat(ba)); + } else { + return new BigInteger(ba); + } + }; + + /** + * Parse a signed big integer byte representation. + * + * For details on the format please see BigInteger.toByteArraySigned. + */ + + BigInteger.fromByteArraySigned = function (ba) { + // Check for negative value + if (ba[0] & 0x80) { + // Remove sign bit + ba[0] &= 0x7f; + + return BigInteger.fromByteArrayUnsigned(ba).negate(); + } else { + return BigInteger.fromByteArrayUnsigned(ba); + } + }; + + /** + * Returns a byte array representation of the big integer. + * + * This returns the absolute of the contained value in big endian + * form. A value of zero results in an empty array. + */ + + BigInteger.prototype.toByteArrayUnsigned = function () { + var ba = this.abs().toByteArray(); + + // Empty array, nothing to do + if (!ba.length) { + return ba; + } + + // remove leading 0 + if (ba[0] === 0) { + ba = ba.slice(1); + } + + // all values must be positive + for (var i = 0; i < ba.length; ++i) { + ba[i] = (ba[i] < 0) ? ba[i] + 256 : ba[i]; + } + + return ba; + }; + + /* + * Converts big integer to signed byte representation. + * + * The format for this value uses the most significant bit as a sign + * bit. If the most significant bit is already occupied by the + * absolute value, an extra byte is prepended and the sign bit is set + * there. + * + * Examples: + * + * 0 => 0x00 + * 1 => 0x01 + * -1 => 0x81 + * 127 => 0x7f + * -127 => 0xff + * 128 => 0x0080 + * -128 => 0x8080 + * 255 => 0x00ff + * -255 => 0x80ff + * 16300 => 0x3fac + * -16300 => 0xbfac + * 62300 => 0x00f35c + * -62300 => 0x80f35c + */ + + BigInteger.prototype.toByteArraySigned = function () { + var val = this.toByteArrayUnsigned(); + var neg = this.s < 0; + + // if the first bit is set, we always unshift + // either unshift 0x80 or 0x00 + if (val[0] & 0x80) { + val.unshift((neg) ? 0x80 : 0x00); + } + // if the first bit isn't set, set it if negative + else if (neg) { + val[0] |= 0x80; + } + + return val; + }; + + // Random number generator - requires a PRNG backend, e.g. prng4.js + + // For best results, put code like + // + // in your main HTML document. + + var rng_state; + var rng_pool; + var rng_pptr; + + // Mix in a 32-bit integer into the pool + function rng_seed_int(x) { + rng_pool[rng_pptr++] ^= x & 255; + rng_pool[rng_pptr++] ^= (x >> 8) & 255; + rng_pool[rng_pptr++] ^= (x >> 16) & 255; + rng_pool[rng_pptr++] ^= (x >> 24) & 255; + if (rng_pptr >= rng_psize) rng_pptr -= rng_psize; + } + + // Mix in the current time (w/milliseconds) into the pool + function rng_seed_time() { + rng_seed_int(new Date().getTime()); + } + + // Initialize the pool with junk if needed. + if (rng_pool == null) { + rng_pool = new Array(); + rng_pptr = 0; + var t; + if (typeof window !== 'undefined' && window.crypto) { + if (window.crypto.getRandomValues) { + // Use webcrypto if available + var ua = new Uint8Array(32); + window.crypto.getRandomValues(ua); + for (t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t]; + } else if ( + navigator.appName == 'Netscape' && + navigator.appVersion < '5' + ) { + // Extract entropy (256 bits) from NS4 RNG if available + var z = window.crypto.random(32); + for (t = 0; t < z.length; ++t) + rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; + } + } + while (rng_pptr < rng_psize) { + // extract some randomness from Math.random() + t = Math.floor(65536 * Math.random()); + rng_pool[rng_pptr++] = t >>> 8; + rng_pool[rng_pptr++] = t & 255; + } + rng_pptr = 0; + rng_seed_time(); + } + + function rng_get_byte() { + if (rng_state == null) { + rng_seed_time(); + rng_state = prng_newstate(); + rng_state.init(rng_pool); + for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) + rng_pool[rng_pptr] = 0; + rng_pptr = 0; + } + // TODO: allow reseeding after first request + return rng_state.next(); + } + + function rng_get_bytes(ba) { + var i; + for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); + } + + function SecureRandom() { } + + SecureRandom.prototype.nextBytes = rng_get_bytes; + + // prng4.js - uses Arcfour as a PRNG + + function Arcfour() { + this.i = 0; + this.j = 0; + this.S = new Array(); + } + + // Initialize arcfour context from key, an array of ints, each from [0..255] + function ARC4init(key) { + var i, j, t; + for (i = 0; i < 256; ++i) this.S[i] = i; + j = 0; + for (i = 0; i < 256; ++i) { + j = (j + this.S[i] + key[i % key.length]) & 255; + t = this.S[i]; + this.S[i] = this.S[j]; + this.S[j] = t; + } + this.i = 0; + this.j = 0; + } + + function ARC4next() { + var t; + this.i = (this.i + 1) & 255; + this.j = (this.j + this.S[this.i]) & 255; + t = this.S[this.i]; + this.S[this.i] = this.S[this.j]; + this.S[this.j] = t; + return this.S[(t + this.S[this.i]) & 255]; + } + + Arcfour.prototype.init = ARC4init; + Arcfour.prototype.next = ARC4next; + + // Plug in your RNG constructor here + function prng_newstate() { + return new Arcfour(); + } + + // Pool size must be a multiple of 4 and greater than 32. + // An array of bytes the size of the pool will be passed to init() + var rng_psize = 256; + + if (typeof exports !== 'undefined') { + exports = module.exports = { + default: BigInteger, + BigInteger: BigInteger, + SecureRandom: SecureRandom, + }; + } else { + this.jsbn = { + BigInteger: BigInteger, + SecureRandom: SecureRandom, + }; + } +}.call(this)); diff --git a/crypto/api/constants.js b/crypto/api/constants.js index c59f0faa..ebd180d3 100644 --- a/crypto/api/constants.js +++ b/crypto/api/constants.js @@ -1,5 +1,3 @@ -'use strict' - // Qortal TX types const TX_TYPES = { 1: "Genesis", diff --git a/crypto/api/createTransaction.js b/crypto/api/createTransaction.js index 3d9c19d9..c8b35543 100644 --- a/crypto/api/createTransaction.js +++ b/crypto/api/createTransaction.js @@ -1,9 +1,9 @@ -import {transactionTypes as transactions} from './transactions/transactions.js' -import Base58 from './deps/Base58.js' -import {request} from './fetch-request' -import signChat from './transactions/chat/signChat.js' -import signArbitrary from './transactions/arbitrary/signArbitrary.js' -import signArbitraryWithFee from './transactions/arbitrary/signArbitraryWithFee.js' +import { transactionTypes as transactions } from './transactions/transactions' +import Base58 from './deps/Base58' +import { request } from './fetch-request' +import signChat from './transactions/chat/signChat' +import signArbitrary from './transactions/arbitrary/signArbitrary' +import signArbitraryWithFee from './transactions/arbitrary/signArbitraryWithFee' export const createTransaction = (type, keyPair, params) => { const tx = new transactions[type]() @@ -31,8 +31,8 @@ export const signArbitraryTransaction = (arbitraryBytesBase58, arbitraryBytesFor return signArbitrary(arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) } -export const signArbitraryWithFeeTransaction = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, keyPair) => { - return signArbitraryWithFee(arbitraryBytesBase58, arbitraryBytesForSigningBase58, keyPair) +export const signArbitraryWithFeeTransaction = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, keyPair) => { + return signArbitraryWithFee(arbitraryBytesBase58, arbitraryBytesForSigningBase58, keyPair) } // Process Transactions diff --git a/crypto/api/createWallet.js b/crypto/api/createWallet.js index 1b05c93c..c9057af9 100644 --- a/crypto/api/createWallet.js +++ b/crypto/api/createWallet.js @@ -1,7 +1,7 @@ -import {kdf} from './kdf.js' -import PhraseWallet from './PhraseWallet.js' -import Base58 from './deps/Base58.js' -import {decryptStoredWallet} from './decryptStoredWallet.js' +import { kdf } from './kdf' +import PhraseWallet from './PhraseWallet' +import Base58 from './deps/Base58' +import { decryptStoredWallet } from './decryptStoredWallet' export const createWallet = async (sourceType, source, statusUpdateFn) => { let version, seed diff --git a/crypto/api/decryptStoredWallet.js b/crypto/api/decryptStoredWallet.js index ec8c8281..8fab5092 100644 --- a/crypto/api/decryptStoredWallet.js +++ b/crypto/api/decryptStoredWallet.js @@ -1,10 +1,10 @@ -import Base58 from './deps/Base58.js' -import {kdf} from './kdf.js' -import {AES_CBC, HmacSha512} from 'asmcrypto.js' -import {get, registerTranslateConfig} from '../../core/translate' +import Base58 from './deps/Base58' +import { kdf } from './kdf' +import { AES_CBC, HmacSha512 } from 'asmcrypto.js' +import { get, registerTranslateConfig } from '../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) export const decryptStoredWallet = async (password, wallet, statusFn = () => { }) => { diff --git a/crypto/api/deps/Base58.js b/crypto/api/deps/Base58.js index c0caaca4..b5ac86ae 100644 --- a/crypto/api/deps/Base58.js +++ b/crypto/api/deps/Base58.js @@ -1,10 +1,6 @@ // Generated by CoffeeScript 1.8.0 // == Changed for ES6 modules == // -//(function() { -//var ALPHABET, ALPHABET_MAP, Base58, i; - -//const Base58 = (typeof module !== "undefined" && module !== null ? module.exports : void 0) || (window.Base58 = {}); const Base58 = {}; const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; @@ -14,95 +10,92 @@ const ALPHABET_MAP = {}; let i = 0; while (i < ALPHABET.length) { -ALPHABET_MAP[ALPHABET.charAt(i)] = i; -i++; + ALPHABET_MAP[ALPHABET.charAt(i)] = i; + i++; } -Base58.encode = function(buffer) { -buffer = new Uint8Array(buffer); -var carry, digits, j; -if (buffer.length === 0) { - return ""; -} -i = void 0; -j = void 0; -digits = [0]; -i = 0; -while (i < buffer.length) { - j = 0; - while (j < digits.length) { - digits[j] <<= 8; - j++; - } - digits[0] += buffer[i]; - carry = 0; - j = 0; - while (j < digits.length) { - digits[j] += carry; - carry = (digits[j] / 58) | 0; - digits[j] %= 58; - ++j; - } - while (carry) { - digits.push(carry % 58); - carry = (carry / 58) | 0; - } - i++; -} -i = 0; -while (buffer[i] === 0 && i < buffer.length - 1) { - digits.push(0); - i++; -} -return digits.reverse().map(function(digit) { - return ALPHABET[digit]; -}).join(""); +Base58.encode = function (buffer) { + buffer = new Uint8Array(buffer); + var carry, digits, j; + if (buffer.length === 0) { + return ""; + } + i = void 0; + j = void 0; + digits = [0]; + i = 0; + while (i < buffer.length) { + j = 0; + while (j < digits.length) { + digits[j] <<= 8; + j++; + } + digits[0] += buffer[i]; + carry = 0; + j = 0; + while (j < digits.length) { + digits[j] += carry; + carry = (digits[j] / 58) | 0; + digits[j] %= 58; + ++j; + } + while (carry) { + digits.push(carry % 58); + carry = (carry / 58) | 0; + } + i++; + } + i = 0; + while (buffer[i] === 0 && i < buffer.length - 1) { + digits.push(0); + i++; + } + return digits.reverse().map(function (digit) { + return ALPHABET[digit]; + }).join(""); }; -Base58.decode = function(string) { -var bytes, c, carry, j; -if (string.length === 0) { - return new (typeof Uint8Array !== "undefined" && Uint8Array !== null ? Uint8Array : Buffer)(0); -} -i = void 0; -j = void 0; -bytes = [0]; -i = 0; -while (i < string.length) { - c = string[i]; - if (!(c in ALPHABET_MAP)) { - throw "Base58.decode received unacceptable input. Character '" + c + "' is not in the Base58 alphabet."; - } - j = 0; - while (j < bytes.length) { - bytes[j] *= 58; - j++; - } - bytes[0] += ALPHABET_MAP[c]; - carry = 0; - j = 0; - while (j < bytes.length) { - bytes[j] += carry; - carry = bytes[j] >> 8; - bytes[j] &= 0xff; - ++j; - } - while (carry) { - bytes.push(carry & 0xff); - carry >>= 8; - } - i++; -} -i = 0; -while (string[i] === "1" && i < string.length - 1) { - bytes.push(0); - i++; -} -return new (typeof Uint8Array !== "undefined" && Uint8Array !== null ? Uint8Array : Buffer)(bytes.reverse()); +Base58.decode = function (string) { + var bytes, c, carry, j; + if (string.length === 0) { + return new (typeof Uint8Array !== "undefined" && Uint8Array !== null ? Uint8Array : Buffer)(0); + } + i = void 0; + j = void 0; + bytes = [0]; + i = 0; + while (i < string.length) { + c = string[i]; + if (!(c in ALPHABET_MAP)) { + throw "Base58.decode received unacceptable input. Character '" + c + "' is not in the Base58 alphabet."; + } + j = 0; + while (j < bytes.length) { + bytes[j] *= 58; + j++; + } + bytes[0] += ALPHABET_MAP[c]; + carry = 0; + j = 0; + while (j < bytes.length) { + bytes[j] += carry; + carry = bytes[j] >> 8; + bytes[j] &= 0xff; + ++j; + } + while (carry) { + bytes.push(carry & 0xff); + carry >>= 8; + } + i++; + } + i = 0; + while (string[i] === "1" && i < string.length - 1) { + bytes.push(0); + i++; + } + return new (typeof Uint8Array !== "undefined" && Uint8Array !== null ? Uint8Array : Buffer)(bytes.reverse()); }; - // == Changed for ES6 modules == // -//}).call(this); - -export default Base58; \ No newline at end of file +export default Base58; diff --git a/crypto/api/deps/Base64.js b/crypto/api/deps/Base64.js index 1697dd6a..b97b3848 100644 --- a/crypto/api/deps/Base64.js +++ b/crypto/api/deps/Base64.js @@ -1,23 +1,18 @@ const Base64 = {}; - - Base64.decode = function (string) { - const binaryString = atob(string); - const binaryLength = binaryString.length; - const bytes = new Uint8Array(binaryLength); + 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); - } + for (let i = 0; i < binaryLength; i++) { + bytes[i] = binaryString.charCodeAt(i); + } - const decoder = new TextDecoder(); + const decoder = new TextDecoder(); return decoder.decode(bytes); }; - - - export default Base64; diff --git a/crypto/api/deps/bcrypt.js b/crypto/api/deps/bcrypt.js index b067a2fa..ce9e3ce9 100644 --- a/crypto/api/deps/bcrypt.js +++ b/crypto/api/deps/bcrypt.js @@ -31,1349 +31,1351 @@ * Released under the Apache License, Version 2.0 * see: https://github.com/dcodeIO/bcrypt.js for details */ -(function(global, factory) { +(function (global, factory) { /* AMD */ if (typeof define === 'function' && define["amd"]) - define([], factory); + define([], factory); /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"]) - module["exports"] = factory(); + module["exports"] = factory(); /* Global */ else - (global["dcodeIO"] = global["dcodeIO"] || {})["bcrypt"] = factory(); + (global["dcodeIO"] = global["dcodeIO"] || {})["bcrypt"] = factory(); -}(this, function() { - "use strict"; +}(this, function () { + // == Changed for ESM support == // + // "use strict"; - /** - * bcrypt namespace. - * @type {Object.} - */ - var bcrypt = {}; + /** + * bcrypt namespace. + * @type {Object.} + */ + var bcrypt = {}; - /** - * The random implementation to use as a fallback. - * @type {?function(number):!Array.} - * @inner - */ - var randomFallback = null; + /** + * The random implementation to use as a fallback. + * @type {?function(number):!Array.} + * @inner + */ + var randomFallback = null; - /** - * Generates cryptographically secure random bytes. - * @function - * @param {number} len Bytes length - * @returns {!Array.} Random bytes - * @throws {Error} If no random implementation is available - * @inner - */ - function random(len) { + /** + * Generates cryptographically secure random bytes. + * @function + * @param {number} len Bytes length + * @returns {!Array.} Random bytes + * @throws {Error} If no random implementation is available + * @inner + */ + function random(len) { /* node */ if (typeof module !== 'undefined' && module && module['exports']) - try { - return require("crypto")['randomBytes'](len); - } catch (e) {} + try { + return require("crypto")['randomBytes'](len); + } catch (e) { } /* WCA */ try { - var a; (self['crypto']||self['msCrypto'])['getRandomValues'](a = new Uint32Array(len)); - return Array.prototype.slice.call(a); - } catch (e) {} + var a; (self['crypto'] || self['msCrypto'])['getRandomValues'](a = new Uint32Array(len)); + return Array.prototype.slice.call(a); + } catch (e) { } /* fallback */ if (!randomFallback) - throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative"); - return randomFallback(len); - } - - // Test if any secure randomness source is available - var randomAvailable = false; - try { - random(1); - randomAvailable = true; - } catch (e) {} - - // Default fallback, if any - randomFallback = null; - /** - * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto - * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it - * is seeded properly! - * @param {?function(number):!Array.} random Function taking the number of bytes to generate as its - * sole argument, returning the corresponding array of cryptographically secure random byte values. - * @see http://nodejs.org/api/crypto.html - * @see http://www.w3.org/TR/WebCryptoAPI/ - */ - bcrypt.setRandomFallback = function(random) { - randomFallback = random; - }; - - /** - * Synchronously generates a salt. - * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted - * @param {number=} seed_length Not supported. - * @returns {string} Resulting salt - * @throws {Error} If a random fallback is required but not set - * @expose - */ - bcrypt.genSaltSync = function(rounds, seed_length) { - rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof rounds !== 'number') - throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length)); - if (rounds < 4) - rounds = 4; - else if (rounds > 31) - rounds = 31; - var salt = []; - salt.push("$2a$"); - if (rounds < 10) - salt.push("0"); - salt.push(rounds.toString()); - salt.push('$'); - salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw - return salt.join(''); - }; - - /** - * Asynchronously generates a salt. - * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted - * @param {(number|function(Error, string=))=} seed_length Not supported. - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - * @expose - */ - bcrypt.genSalt = function(rounds, seed_length, callback) { - if (typeof seed_length === 'function') - callback = seed_length, - seed_length = undefined; // Not supported. - if (typeof rounds === 'function') - callback = rounds, - rounds = undefined; - if (typeof rounds === 'undefined') - rounds = GENSALT_DEFAULT_LOG2_ROUNDS; - else if (typeof rounds !== 'number') - throw Error("illegal arguments: "+(typeof rounds)); - - function _async(callback) { - nextTick(function() { // Pretty thin, but salting is fast enough - try { - callback(null, bcrypt.genSaltSync(rounds)); - } catch (err) { - callback(err); - } - }); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); - }; - - /** - * Synchronously generates a hash for the given string. - * @param {string} s String to hash - * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 - * @returns {string} Resulting hash - * @expose - */ - bcrypt.hashSync = function(s, salt) { - if (typeof salt === 'undefined') - salt = GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof salt === 'number') - salt = bcrypt.genSaltSync(salt); - if (typeof s !== 'string' || typeof salt !== 'string') - throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)); - return _hash(s, salt); - }; - - /** - * Asynchronously generates a hash for the given string. - * @param {string} s String to hash - * @param {number|string} salt Salt length to generate or salt to use - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash - * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed - * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - * @expose - */ - bcrypt.hash = function(s, salt, callback, progressCallback) { - - function _async(callback) { - if (typeof s === 'string' && typeof salt === 'number') - bcrypt.genSalt(salt, function(err, salt) { - _hash(s, salt, callback, progressCallback); - }); - else if (typeof s === 'string' && typeof salt === 'string') - _hash(s, salt, callback, progressCallback); - else - nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)))); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); - }; - - /** - * Compares two strings of the same length in constant time. - * @param {string} known Must be of the correct length - * @param {string} unknown Must be the same length as `known` - * @returns {boolean} - * @inner - */ - function safeStringCompare(known, unknown) { - var right = 0, - wrong = 0; - for (var i=0, k=known.length; i} UTF8 bytes - * @inner - */ - function stringToBytes(str) { - var out = [], - i = 0; - utfx.encodeUTF16toUTF8(function() { - if (i >= str.length) return null; - return str.charCodeAt(i++); - }, function(b) { - out.push(b); - }); - return out; - } - - // A base64 implementation for the bcrypt algorithm. This is partly non-standard. - - /** - * bcrypt's own non-standard base64 dictionary. - * @type {!Array.} - * @const - * @inner - **/ - var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(''); - - /** - * @type {!Array.} - * @const - * @inner - **/ - var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, - 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, - -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1]; - - /** - * @type {!function(...number):string} - * @inner - */ - var stringFromCharCode = String.fromCharCode; - - /** - * Encodes a byte array to base64 with up to len bytes of input. - * @param {!Array.} b Byte array - * @param {number} len Maximum input length - * @returns {string} - * @inner - */ - function base64_encode(b, len) { - var off = 0, - rs = [], - c1, c2; - if (len <= 0 || len > b.length) - throw Error("Illegal len: "+len); - while (off < len) { - c1 = b[off++] & 0xff; - rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); - c1 = (c1 & 0x03) << 4; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 4) & 0x0f; - rs.push(BASE64_CODE[c1 & 0x3f]); - c1 = (c2 & 0x0f) << 2; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 6) & 0x03; - rs.push(BASE64_CODE[c1 & 0x3f]); - rs.push(BASE64_CODE[c2 & 0x3f]); - } - return rs.join(''); - } - - /** - * Decodes a base64 encoded string to up to len bytes of output. - * @param {string} s String to decode - * @param {number} len Maximum output length - * @returns {!Array.} - * @inner - */ - function base64_decode(s, len) { - var off = 0, - slen = s.length, - olen = 0, - rs = [], - c1, c2, c3, c4, o, code; - if (len <= 0) - throw Error("Illegal len: "+len); - while (off < slen - 1 && olen < len) { - code = s.charCodeAt(off++); - c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - code = s.charCodeAt(off++); - c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c1 == -1 || c2 == -1) - break; - o = (c1 << 2) >>> 0; - o |= (c2 & 0x30) >> 4; - rs.push(stringFromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c3 == -1) - break; - o = ((c2 & 0x0f) << 4) >>> 0; - o |= (c3 & 0x3c) >> 2; - rs.push(stringFromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - o = ((c3 & 0x03) << 6) >>> 0; - o |= c4; - rs.push(stringFromCharCode(o)); - ++olen; - } - var res = []; - for (off = 0; off - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/utfx for details - */ - var utfx = function() { - "use strict"; - - /** - * utfx namespace. - * @inner - * @type {!Object.} - */ - var utfx = {}; - - /** - * Maximum valid code point. - * @type {number} - * @const - */ - utfx.MAX_CODEPOINT = 0x10FFFF; - - /** - * Encodes UTF8 code points to UTF8 bytes. - * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point - * respectively `null` if there are no more code points left or a single numeric code point. - * @param {!function(number)} dst Bytes destination as a function successively called with the next byte - */ - utfx.encodeUTF8 = function(src, dst) { - var cp = null; - if (typeof src === 'number') - cp = src, - src = function() { return null; }; - while (cp !== null || (cp = src()) !== null) { - if (cp < 0x80) - dst(cp&0x7F); - else if (cp < 0x800) - dst(((cp>>6)&0x1F)|0xC0), - dst((cp&0x3F)|0x80); - else if (cp < 0x10000) - dst(((cp>>12)&0x0F)|0xE0), - dst(((cp>>6)&0x3F)|0x80), - dst((cp&0x3F)|0x80); - else - dst(((cp>>18)&0x07)|0xF0), - dst(((cp>>12)&0x3F)|0x80), - dst(((cp>>6)&0x3F)|0x80), - dst((cp&0x3F)|0x80); - cp = null; - } - }; - - /** - * Decodes UTF8 bytes to UTF8 code points. - * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there - * are no more bytes left. - * @param {!function(number)} dst Code points destination as a function successively called with each decoded code point. - * @throws {RangeError} If a starting byte is invalid in UTF8 - * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the - * remaining bytes. - */ - utfx.decodeUTF8 = function(src, dst) { - var a, b, c, d, fail = function(b) { - b = b.slice(0, b.indexOf(null)); - var err = Error(b.toString()); - err.name = "TruncatedError"; - err['bytes'] = b; - throw err; - }; - while ((a = src()) !== null) { - if ((a&0x80) === 0) - dst(a); - else if ((a&0xE0) === 0xC0) - ((b = src()) === null) && fail([a, b]), - dst(((a&0x1F)<<6) | (b&0x3F)); - else if ((a&0xF0) === 0xE0) - ((b=src()) === null || (c=src()) === null) && fail([a, b, c]), - dst(((a&0x0F)<<12) | ((b&0x3F)<<6) | (c&0x3F)); - else if ((a&0xF8) === 0xF0) - ((b=src()) === null || (c=src()) === null || (d=src()) === null) && fail([a, b, c ,d]), - dst(((a&0x07)<<18) | ((b&0x3F)<<12) | ((c&0x3F)<<6) | (d&0x3F)); - else throw RangeError("Illegal starting byte: "+a); - } - }; - - /** - * Converts UTF16 characters to UTF8 code points. - * @param {!function():number|null} src Characters source as a function returning the next char code respectively - * `null` if there are no more characters left. - * @param {!function(number)} dst Code points destination as a function successively called with each converted code - * point. - */ - utfx.UTF16toUTF8 = function(src, dst) { - var c1, c2 = null; - while (true) { - if ((c1 = c2 !== null ? c2 : src()) === null) - break; - if (c1 >= 0xD800 && c1 <= 0xDFFF) { - if ((c2 = src()) !== null) { - if (c2 >= 0xDC00 && c2 <= 0xDFFF) { - dst((c1-0xD800)*0x400+c2-0xDC00+0x10000); - c2 = null; continue; - } - } - } - dst(c1); - } - if (false) dst(c2); - }; - - /** - * Converts UTF8 code points to UTF16 characters. - * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point - * respectively `null` if there are no more code points left or a single numeric code point. - * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. - * @throws {RangeError} If a code point is out of range - */ - utfx.UTF8toUTF16 = function(src, dst) { - var cp = null; - if (typeof src === 'number') - cp = src, src = function() { return null; }; - while (cp !== null || (cp = src()) !== null) { - if (cp <= 0xFFFF) - dst(cp); - else - cp -= 0x10000, - dst((cp>>10)+0xD800), - dst((cp%0x400)+0xDC00); - cp = null; - } - }; - - /** - * Converts and encodes UTF16 characters to UTF8 bytes. - * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null` - * if there are no more characters left. - * @param {!function(number)} dst Bytes destination as a function successively called with the next byte. - */ - utfx.encodeUTF16toUTF8 = function(src, dst) { - utfx.UTF16toUTF8(src, function(cp) { - utfx.encodeUTF8(cp, dst); - }); - }; - - /** - * Decodes and converts UTF8 bytes to UTF16 characters. - * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there - * are no more bytes left. - * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. - * @throws {RangeError} If a starting byte is invalid in UTF8 - * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes. - */ - utfx.decodeUTF8toUTF16 = function(src, dst) { - utfx.decodeUTF8(src, function(cp) { - utfx.UTF8toUTF16(cp, dst); - }); - }; - - /** - * Calculates the byte length of an UTF8 code point. - * @param {number} cp UTF8 code point - * @returns {number} Byte length - */ - utfx.calculateCodePoint = function(cp) { - return (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; - }; - - /** - * Calculates the number of UTF8 bytes required to store UTF8 code points. - * @param {(!function():number|null)} src Code points source as a function returning the next code point respectively - * `null` if there are no more code points left. - * @returns {number} The number of UTF8 bytes required - */ - utfx.calculateUTF8 = function(src) { - var cp, l=0; - while ((cp = src()) !== null) - l += utfx.calculateCodePoint(cp); - return l; - }; - - /** - * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes. - * @param {(!function():number|null)} src Characters source as a function returning the next char code respectively - * `null` if there are no more characters left. - * @returns {!Array.} The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1. - */ - utfx.calculateUTF16asUTF8 = function(src) { - var n=0, l=0; - utfx.UTF16toUTF8(src, function(cp) { - ++n; l += utfx.calculateCodePoint(cp); - }); - return [n,l]; - }; - - return utfx; - }(); - - Date.now = Date.now || function() { return +new Date; }; - - /** - * @type {number} - * @const - * @inner - */ - var BCRYPT_SALT_LEN = 16; - - /** - * @type {number} - * @const - * @inner - */ - var GENSALT_DEFAULT_LOG2_ROUNDS = 10; - - /** - * @type {number} - * @const - * @inner - */ - var BLOWFISH_NUM_ROUNDS = 16; - - /** - * @type {number} - * @const - * @inner - */ - var MAX_EXECUTION_TIME = 100; - - /** - * @type {Array.} - * @const - * @inner - */ - var P_ORIG = [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, - 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, - 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, - 0xb5470917, 0x9216d5d9, 0x8979fb1b - ]; - - /** - * @type {Array.} - * @const - * @inner - */ - var S_ORIG = [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, - 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, - 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, - 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, - 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, - 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, - 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, - 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, - 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, - 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, - 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, - 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, - 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, - 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, - 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, - 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, - 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, - 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, - 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, - 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, - 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, - 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, - 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, - 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, - 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, - 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, - 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, - 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, - 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, - 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, - 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, - 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, - 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, - 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, - 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, - 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, - 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, - 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, - 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, - 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, - 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, - 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, - 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, - 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, - 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, - 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, - 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, - 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, - 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, - 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, - 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, - 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, - 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, - 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, - 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, - 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, - 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, - 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, - 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, - 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, - 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, - 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, - 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, - 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, - 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, - 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, - 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, - 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, - 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, - 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, - 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, - 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, - 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, - 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, - 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, - 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, - 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, - 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, - 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, - 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, - 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, - 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, - 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, - 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, - 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, - 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, - 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, - 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, - 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, - 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, - 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, - 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, - 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, - 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, - 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, - 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, - 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, - 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, - 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, - 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, - 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, - 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, - 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, - 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, - 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, - 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, - 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, - 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, - 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, - 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, - 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, - 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, - 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, - 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, - 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, - 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, - 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, - 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, - 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, - 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, - 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, - 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, - 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, - 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, - 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, - 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, - 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, - 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, - 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, - 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, - 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, - 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, - 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, - 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, - 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, - 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, - 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, - 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, - 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, - 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, - 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, - 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, - 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, - 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, - 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, - 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, - 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, - 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, - 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, - 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, - 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, - 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, - 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, - 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, - 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, - 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, - 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, - 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, - 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, - 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, - 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, - 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, - 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, - 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, - 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, - 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, - 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, - 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, - 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, - 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, - 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, - 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, - 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, - 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, - 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, - 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, - 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, - 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - ]; - - /** - * @type {Array.} - * @const - * @inner - */ - var C_ORIG = [ - 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, - 0x6f756274 - ]; - - /** - * @param {Array.} lr - * @param {number} off - * @param {Array.} P - * @param {Array.} S - * @returns {Array.} - * @inner - */ - function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt - var n, - l = lr[off], - r = lr[off + 1]; - - l ^= P[0]; - - /* - for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;) - // Feistel substitution on left word - n = S[l >>> 24], - n += S[0x100 | ((l >> 16) & 0xff)], - n ^= S[0x200 | ((l >> 8) & 0xff)], - n += S[0x300 | (l & 0xff)], - r ^= n ^ P[++i], - // Feistel substitution on right word - n = S[r >>> 24], - n += S[0x100 | ((r >> 16) & 0xff)], - n ^= S[0x200 | ((r >> 8) & 0xff)], - n += S[0x300 | (r & 0xff)], - l ^= n ^ P[++i]; - */ - - //The following is an unrolled version of the above loop. - //Iteration 0 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[1]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[2]; - //Iteration 1 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[3]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[4]; - //Iteration 2 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[5]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[6]; - //Iteration 3 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[7]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[8]; - //Iteration 4 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[9]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[10]; - //Iteration 5 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[11]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[12]; - //Iteration 6 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[13]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[14]; - //Iteration 7 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[15]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[16]; - - lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; - lr[off + 1] = l; - return lr; - } - - /** - * @param {Array.} data - * @param {number} offp - * @returns {{key: number, offp: number}} - * @inner - */ - function _streamtoword(data, offp) { - for (var i = 0, word = 0; i < 4; ++i) - word = (word << 8) | (data[offp] & 0xff), - offp = (offp + 1) % data.length; - return { key: word, offp: offp }; - } - - /** - * @param {Array.} key - * @param {Array.} P - * @param {Array.} S - * @inner - */ - function _key(key, P, S) { - var offset = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offset), - offset = sw.offp, - P[i] = P[i] ^ sw.key; - for (i = 0; i < plen; i += 2) - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; - } - - /** - * Expensive key schedule Blowfish. - * @param {Array.} data - * @param {Array.} key - * @param {Array.} P - * @param {Array.} S - * @inner - */ - function _ekskey(data, key, P, S) { - var offp = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offp), - offp = sw.offp, - P[i] = P[i] ^ sw.key; - offp = 0; - for (i = 0; i < plen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; - } - - /** - * Internaly crypts a string. - * @param {Array.} b Bytes to crypt - * @param {Array.} salt Salt bytes to use - * @param {number} rounds Number of rounds - * @param {function(Error, Array.=)=} callback Callback receiving the error, if any, and the resulting bytes. If - * omitted, the operation will be performed synchronously. - * @param {function(number)=} progressCallback Callback called with the current progress - * @returns {!Array.|undefined} Resulting bytes if callback has been omitted, otherwise `undefined` - * @inner - */ - function _crypt(b, salt, rounds, callback, progressCallback) { - var cdata = C_ORIG.slice(), - clen = cdata.length, - err; - - // Validate - if (rounds < 4 || rounds > 31) { - err = Error("Illegal number of rounds (4-31): "+rounds); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - if (salt.length !== BCRYPT_SALT_LEN) { - err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - rounds = (1 << rounds) >>> 0; - - var P, S, i = 0, j; - - //Use typed arrays when available - huge speedup! - if (Int32Array) { - P = new Int32Array(P_ORIG); - S = new Int32Array(S_ORIG); - } else { - P = P_ORIG.slice(); - S = S_ORIG.slice(); - } - - _ekskey(salt, b, P, S); - - /** - * Calcualtes the next round. - * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` - * @inner - */ - function next() { - if (progressCallback) - progressCallback(i / rounds); - if (i < rounds) { - var start = Date.now(); - for (; i < rounds;) { - i = i + 1; - _key(b, P, S); - _key(salt, P, S); - if (Date.now() - start > MAX_EXECUTION_TIME) - break; - } - } else { - for (i = 0; i < 64; i++) - for (j = 0; j < (clen >> 1); j++) - _encipher(cdata, j << 1, P, S); - var ret = []; - for (i = 0; i < clen; i++) - ret.push(((cdata[i] >> 24) & 0xff) >>> 0), - ret.push(((cdata[i] >> 16) & 0xff) >>> 0), - ret.push(((cdata[i] >> 8) & 0xff) >>> 0), - ret.push((cdata[i] & 0xff) >>> 0); - if (callback) { - callback(null, ret); - return; - } else - return ret; - } - if (callback) - nextTick(next); - } - - // Async - if (typeof callback !== 'undefined') { - next(); - - // Sync - } else { - var res; - while (true) - if (typeof(res = next()) !== 'undefined') - return res || []; - } - } - - /** - * Internally hashes a string. - * @param {string} s String to hash - * @param {?string} salt Salt to use, actually never null - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, - * hashing is perormed synchronously. - * @param {function(number)=} progressCallback Callback called with the current progress - * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` - * @inner - */ - function _hash(s, salt, callback, progressCallback) { - var err; - if (typeof s !== 'string' || typeof salt !== 'string') { - err = Error("Invalid string / salt: Not a string"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - - // Validate the salt - var minor, offset; - if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') { - err = Error("Invalid salt version: "+salt.substring(0,2)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - if (salt.charAt(2) === '$') - minor = String.fromCharCode(0), - offset = 3; - else { - minor = salt.charAt(2); - if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') { - err = Error("Invalid salt revision: "+salt.substring(2,4)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - offset = 4; - } - - // Extract number of rounds - if (salt.charAt(offset + 2) > '$') { - err = Error("Missing salt rounds"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, - r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), - rounds = r1 + r2, - real_salt = salt.substring(offset + 3, offset + 25); - s += minor >= 'a' ? "\x00" : ""; - - var passwordb = stringToBytes(s), - saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); - - /** - * Finishes hashing. - * @param {Array.} bytes Byte array - * @returns {string} - * @inner - */ - function finish(bytes) { - var res = []; - res.push("$2"); - if (minor >= 'a') - res.push(minor); - res.push("$"); - if (rounds < 10) - res.push("0"); - res.push(rounds.toString()); - res.push("$"); - res.push(base64_encode(saltb, saltb.length)); - res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); - return res.join(''); - } - - // Sync - if (typeof callback == 'undefined') - return finish(_crypt(passwordb, saltb, rounds)); - - // Async - else { - _crypt(passwordb, saltb, rounds, function(err, bytes) { - if (err) - callback(err, null); - else - callback(null, finish(bytes)); - }, progressCallback); - } - } - - /** - * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. - * @function - * @param {!Array.} b Byte array - * @param {number} len Maximum input length - * @returns {string} - * @expose - */ - bcrypt.encodeBase64 = base64_encode; - - /** - * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. - * @function - * @param {string} s String to decode - * @param {number} len Maximum output length - * @returns {!Array.} - * @expose - */ - bcrypt.decodeBase64 = base64_decode; - - return bcrypt; + throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative"); + return randomFallback(len); + } + + // Test if any secure randomness source is available + var randomAvailable = false; + try { + random(1); + randomAvailable = true; + } catch (e) { } + + // Default fallback, if any + randomFallback = null; + /** + * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto + * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it + * is seeded properly! + * @param {?function(number):!Array.} random Function taking the number of bytes to generate as its + * sole argument, returning the corresponding array of cryptographically secure random byte values. + * @see http://nodejs.org/api/crypto.html + * @see http://www.w3.org/TR/WebCryptoAPI/ + */ + bcrypt.setRandomFallback = function (random) { + randomFallback = random; + }; + + /** + * Synchronously generates a salt. + * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted + * @param {number=} seed_length Not supported. + * @returns {string} Resulting salt + * @throws {Error} If a random fallback is required but not set + * @expose + */ + bcrypt.genSaltSync = function (rounds, seed_length) { + rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; + if (typeof rounds !== 'number') + throw Error("Illegal arguments: " + (typeof rounds) + ", " + (typeof seed_length)); + if (rounds < 4) + rounds = 4; + else if (rounds > 31) + rounds = 31; + var salt = []; + salt.push("$2a$"); + if (rounds < 10) + salt.push("0"); + salt.push(rounds.toString()); + salt.push('$'); + salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw + return salt.join(''); + }; + + /** + * Asynchronously generates a salt. + * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted + * @param {(number|function(Error, string=))=} seed_length Not supported. + * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt + * @returns {!Promise} If `callback` has been omitted + * @throws {Error} If `callback` is present but not a function + * @expose + */ + bcrypt.genSalt = function (rounds, seed_length, callback) { + if (typeof seed_length === 'function') + callback = seed_length, + seed_length = undefined; // Not supported. + if (typeof rounds === 'function') + callback = rounds, + rounds = undefined; + if (typeof rounds === 'undefined') + rounds = GENSALT_DEFAULT_LOG2_ROUNDS; + else if (typeof rounds !== 'number') + throw Error("illegal arguments: " + (typeof rounds)); + + function _async(callback) { + nextTick(function () { // Pretty thin, but salting is fast enough + try { + callback(null, bcrypt.genSaltSync(rounds)); + } catch (err) { + callback(err); + } + }); + } + + if (callback) { + if (typeof callback !== 'function') + throw Error("Illegal callback: " + typeof (callback)); + _async(callback); + } else + return new Promise(function (resolve, reject) { + _async(function (err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); + }; + + /** + * Synchronously generates a hash for the given string. + * @param {string} s String to hash + * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 + * @returns {string} Resulting hash + * @expose + */ + bcrypt.hashSync = function (s, salt) { + if (typeof salt === 'undefined') + salt = GENSALT_DEFAULT_LOG2_ROUNDS; + if (typeof salt === 'number') + salt = bcrypt.genSaltSync(salt); + if (typeof s !== 'string' || typeof salt !== 'string') + throw Error("Illegal arguments: " + (typeof s) + ', ' + (typeof salt)); + return _hash(s, salt); + }; + + /** + * Asynchronously generates a hash for the given string. + * @param {string} s String to hash + * @param {number|string} salt Salt length to generate or salt to use + * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash + * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed + * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. + * @returns {!Promise} If `callback` has been omitted + * @throws {Error} If `callback` is present but not a function + * @expose + */ + bcrypt.hash = function (s, salt, callback, progressCallback) { + + function _async(callback) { + if (typeof s === 'string' && typeof salt === 'number') + bcrypt.genSalt(salt, function (err, salt) { + _hash(s, salt, callback, progressCallback); + }); + else if (typeof s === 'string' && typeof salt === 'string') + _hash(s, salt, callback, progressCallback); + else + nextTick(callback.bind(this, Error("Illegal arguments: " + (typeof s) + ', ' + (typeof salt)))); + } + + if (callback) { + if (typeof callback !== 'function') + throw Error("Illegal callback: " + typeof (callback)); + _async(callback); + } else + return new Promise(function (resolve, reject) { + _async(function (err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); + }; + + /** + * Compares two strings of the same length in constant time. + * @param {string} known Must be of the correct length + * @param {string} unknown Must be the same length as `known` + * @returns {boolean} + * @inner + */ + function safeStringCompare(known, unknown) { + var right = 0, + wrong = 0; + for (var i = 0, k = known.length; i < k; ++i) { + if (known.charCodeAt(i) === unknown.charCodeAt(i)) + ++right; + else + ++wrong; + } + // Prevent removal of unused variables (never true, actually) + if (right < 0) + return false; + return wrong === 0; + } + + /** + * Synchronously tests a string against a hash. + * @param {string} s String to compare + * @param {string} hash Hash to test against + * @returns {boolean} true if matching, otherwise false + * @throws {Error} If an argument is illegal + * @expose + */ + bcrypt.compareSync = function (s, hash) { + if (typeof s !== "string" || typeof hash !== "string") + throw Error("Illegal arguments: " + (typeof s) + ', ' + (typeof hash)); + if (hash.length !== 60) + return false; + return safeStringCompare(bcrypt.hashSync(s, hash.substr(0, hash.length - 31)), hash); + }; + + /** + * Asynchronously compares the given data against the given hash. + * @param {string} s Data to compare + * @param {string} hash Data to be compared to + * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result + * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed + * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. + * @returns {!Promise} If `callback` has been omitted + * @throws {Error} If `callback` is present but not a function + * @expose + */ + bcrypt.compare = function (s, hash, callback, progressCallback) { + + function _async(callback) { + if (typeof s !== "string" || typeof hash !== "string") { + nextTick(callback.bind(this, Error("Illegal arguments: " + (typeof s) + ', ' + (typeof hash)))); + return; + } + if (hash.length !== 60) { + nextTick(callback.bind(this, null, false)); + return; + } + bcrypt.hash(s, hash.substr(0, 29), function (err, comp) { + if (err) + callback(err); + else + callback(null, safeStringCompare(comp, hash)); + }, progressCallback); + } + + if (callback) { + if (typeof callback !== 'function') + throw Error("Illegal callback: " + typeof (callback)); + _async(callback); + } else + return new Promise(function (resolve, reject) { + _async(function (err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); + }; + + /** + * Gets the number of rounds used to encrypt the specified hash. + * @param {string} hash Hash to extract the used number of rounds from + * @returns {number} Number of rounds used + * @throws {Error} If `hash` is not a string + * @expose + */ + bcrypt.getRounds = function (hash) { + if (typeof hash !== "string") + throw Error("Illegal arguments: " + (typeof hash)); + return parseInt(hash.split("$")[2], 10); + }; + + /** + * Gets the salt portion from a hash. Does not validate the hash. + * @param {string} hash Hash to extract the salt from + * @returns {string} Extracted salt part + * @throws {Error} If `hash` is not a string or otherwise invalid + * @expose + */ + bcrypt.getSalt = function (hash) { + if (typeof hash !== 'string') + throw Error("Illegal arguments: " + (typeof hash)); + if (hash.length !== 60) + throw Error("Illegal hash length: " + hash.length + " != 60"); + return hash.substring(0, 29); + }; + + /** + * Continues with the callback on the next tick. + * @function + * @param {function(...[*])} callback Callback to execute + * @inner + */ + var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function' + ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick) + : setTimeout; + + /** + * Converts a JavaScript string to UTF8 bytes. + * @param {string} str String + * @returns {!Array.} UTF8 bytes + * @inner + */ + function stringToBytes(str) { + var out = [], + i = 0; + utfx.encodeUTF16toUTF8(function () { + if (i >= str.length) return null; + return str.charCodeAt(i++); + }, function (b) { + out.push(b); + }); + return out; + } + + // A base64 implementation for the bcrypt algorithm. This is partly non-standard. + + /** + * bcrypt's own non-standard base64 dictionary. + * @type {!Array.} + * @const + * @inner + **/ + var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(''); + + /** + * @type {!Array.} + * @const + * @inner + **/ + var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, + 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, + -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1]; + + /** + * @type {!function(...number):string} + * @inner + */ + var stringFromCharCode = String.fromCharCode; + + /** + * Encodes a byte array to base64 with up to len bytes of input. + * @param {!Array.} b Byte array + * @param {number} len Maximum input length + * @returns {string} + * @inner + */ + function base64_encode(b, len) { + var off = 0, + rs = [], + c1, c2; + if (len <= 0 || len > b.length) + throw Error("Illegal len: " + len); + while (off < len) { + c1 = b[off++] & 0xff; + rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.push(BASE64_CODE[c1 & 0x3f]); + break; + } + c2 = b[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.push(BASE64_CODE[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.push(BASE64_CODE[c1 & 0x3f]); + break; + } + c2 = b[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.push(BASE64_CODE[c1 & 0x3f]); + rs.push(BASE64_CODE[c2 & 0x3f]); + } + return rs.join(''); + } + + /** + * Decodes a base64 encoded string to up to len bytes of output. + * @param {string} s String to decode + * @param {number} len Maximum output length + * @returns {!Array.} + * @inner + */ + function base64_decode(s, len) { + var off = 0, + slen = s.length, + olen = 0, + rs = [], + c1, c2, c3, c4, o, code; + if (len <= 0) + throw Error("Illegal len: " + len); + while (off < slen - 1 && olen < len) { + code = s.charCodeAt(off++); + c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + code = s.charCodeAt(off++); + c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + if (c1 == -1 || c2 == -1) + break; + o = (c1 << 2) >>> 0; + o |= (c2 & 0x30) >> 4; + rs.push(stringFromCharCode(o)); + if (++olen >= len || off >= slen) + break; + code = s.charCodeAt(off++); + c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + if (c3 == -1) + break; + o = ((c2 & 0x0f) << 4) >>> 0; + o |= (c3 & 0x3c) >> 2; + rs.push(stringFromCharCode(o)); + if (++olen >= len || off >= slen) + break; + code = s.charCodeAt(off++); + c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + o = ((c3 & 0x03) << 6) >>> 0; + o |= c4; + rs.push(stringFromCharCode(o)); + ++olen; + } + var res = []; + for (off = 0; off < olen; off++) + res.push(rs[off].charCodeAt(0)); + return res; + } + + /** + * utfx-embeddable (c) 2014 Daniel Wirtz + * Released under the Apache License, Version 2.0 + * see: https://github.com/dcodeIO/utfx for details + */ + var utfx = function () { + // == Changed for ESM support == // + // "use strict"; + + /** + * utfx namespace. + * @inner + * @type {!Object.} + */ + var utfx = {}; + + /** + * Maximum valid code point. + * @type {number} + * @const + */ + utfx.MAX_CODEPOINT = 0x10FFFF; + + /** + * Encodes UTF8 code points to UTF8 bytes. + * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point + * respectively `null` if there are no more code points left or a single numeric code point. + * @param {!function(number)} dst Bytes destination as a function successively called with the next byte + */ + utfx.encodeUTF8 = function (src, dst) { + var cp = null; + if (typeof src === 'number') + cp = src, + src = function () { return null; }; + while (cp !== null || (cp = src()) !== null) { + if (cp < 0x80) + dst(cp & 0x7F); + else if (cp < 0x800) + dst(((cp >> 6) & 0x1F) | 0xC0), + dst((cp & 0x3F) | 0x80); + else if (cp < 0x10000) + dst(((cp >> 12) & 0x0F) | 0xE0), + dst(((cp >> 6) & 0x3F) | 0x80), + dst((cp & 0x3F) | 0x80); + else + dst(((cp >> 18) & 0x07) | 0xF0), + dst(((cp >> 12) & 0x3F) | 0x80), + dst(((cp >> 6) & 0x3F) | 0x80), + dst((cp & 0x3F) | 0x80); + cp = null; + } + }; + + /** + * Decodes UTF8 bytes to UTF8 code points. + * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there + * are no more bytes left. + * @param {!function(number)} dst Code points destination as a function successively called with each decoded code point. + * @throws {RangeError} If a starting byte is invalid in UTF8 + * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the + * remaining bytes. + */ + utfx.decodeUTF8 = function (src, dst) { + var a, b, c, d, fail = function (b) { + b = b.slice(0, b.indexOf(null)); + var err = Error(b.toString()); + err.name = "TruncatedError"; + err['bytes'] = b; + throw err; + }; + while ((a = src()) !== null) { + if ((a & 0x80) === 0) + dst(a); + else if ((a & 0xE0) === 0xC0) + ((b = src()) === null) && fail([a, b]), + dst(((a & 0x1F) << 6) | (b & 0x3F)); + else if ((a & 0xF0) === 0xE0) + ((b = src()) === null || (c = src()) === null) && fail([a, b, c]), + dst(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F)); + else if ((a & 0xF8) === 0xF0) + ((b = src()) === null || (c = src()) === null || (d = src()) === null) && fail([a, b, c, d]), + dst(((a & 0x07) << 18) | ((b & 0x3F) << 12) | ((c & 0x3F) << 6) | (d & 0x3F)); + else throw RangeError("Illegal starting byte: " + a); + } + }; + + /** + * Converts UTF16 characters to UTF8 code points. + * @param {!function():number|null} src Characters source as a function returning the next char code respectively + * `null` if there are no more characters left. + * @param {!function(number)} dst Code points destination as a function successively called with each converted code + * point. + */ + utfx.UTF16toUTF8 = function (src, dst) { + var c1, c2 = null; + while (true) { + if ((c1 = c2 !== null ? c2 : src()) === null) + break; + if (c1 >= 0xD800 && c1 <= 0xDFFF) { + if ((c2 = src()) !== null) { + if (c2 >= 0xDC00 && c2 <= 0xDFFF) { + dst((c1 - 0xD800) * 0x400 + c2 - 0xDC00 + 0x10000); + c2 = null; continue; + } + } + } + dst(c1); + } + if (false) dst(c2); + }; + + /** + * Converts UTF8 code points to UTF16 characters. + * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point + * respectively `null` if there are no more code points left or a single numeric code point. + * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. + * @throws {RangeError} If a code point is out of range + */ + utfx.UTF8toUTF16 = function (src, dst) { + var cp = null; + if (typeof src === 'number') + cp = src, src = function () { return null; }; + while (cp !== null || (cp = src()) !== null) { + if (cp <= 0xFFFF) + dst(cp); + else + cp -= 0x10000, + dst((cp >> 10) + 0xD800), + dst((cp % 0x400) + 0xDC00); + cp = null; + } + }; + + /** + * Converts and encodes UTF16 characters to UTF8 bytes. + * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null` + * if there are no more characters left. + * @param {!function(number)} dst Bytes destination as a function successively called with the next byte. + */ + utfx.encodeUTF16toUTF8 = function (src, dst) { + utfx.UTF16toUTF8(src, function (cp) { + utfx.encodeUTF8(cp, dst); + }); + }; + + /** + * Decodes and converts UTF8 bytes to UTF16 characters. + * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there + * are no more bytes left. + * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. + * @throws {RangeError} If a starting byte is invalid in UTF8 + * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes. + */ + utfx.decodeUTF8toUTF16 = function (src, dst) { + utfx.decodeUTF8(src, function (cp) { + utfx.UTF8toUTF16(cp, dst); + }); + }; + + /** + * Calculates the byte length of an UTF8 code point. + * @param {number} cp UTF8 code point + * @returns {number} Byte length + */ + utfx.calculateCodePoint = function (cp) { + return (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; + }; + + /** + * Calculates the number of UTF8 bytes required to store UTF8 code points. + * @param {(!function():number|null)} src Code points source as a function returning the next code point respectively + * `null` if there are no more code points left. + * @returns {number} The number of UTF8 bytes required + */ + utfx.calculateUTF8 = function (src) { + var cp, l = 0; + while ((cp = src()) !== null) + l += utfx.calculateCodePoint(cp); + return l; + }; + + /** + * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes. + * @param {(!function():number|null)} src Characters source as a function returning the next char code respectively + * `null` if there are no more characters left. + * @returns {!Array.} The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1. + */ + utfx.calculateUTF16asUTF8 = function (src) { + var n = 0, l = 0; + utfx.UTF16toUTF8(src, function (cp) { + ++n; l += utfx.calculateCodePoint(cp); + }); + return [n, l]; + }; + + return utfx; + }(); + + Date.now = Date.now || function () { return +new Date; }; + + /** + * @type {number} + * @const + * @inner + */ + var BCRYPT_SALT_LEN = 16; + + /** + * @type {number} + * @const + * @inner + */ + var GENSALT_DEFAULT_LOG2_ROUNDS = 10; + + /** + * @type {number} + * @const + * @inner + */ + var BLOWFISH_NUM_ROUNDS = 16; + + /** + * @type {number} + * @const + * @inner + */ + var MAX_EXECUTION_TIME = 100; + + /** + * @type {Array.} + * @const + * @inner + */ + var P_ORIG = [ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, + 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, + 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, + 0xb5470917, 0x9216d5d9, 0x8979fb1b + ]; + + /** + * @type {Array.} + * @const + * @inner + */ + var S_ORIG = [ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, + 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, + 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, + 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, + 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, + 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, + 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, + 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, + 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, + 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, + 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, + 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, + 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, + 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, + 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, + 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, + 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, + 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, + 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, + 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, + 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, + 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, + 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, + 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, + 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, + 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, + 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, + 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, + 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, + 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, + 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, + 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, + 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, + 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, + 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, + 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, + 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, + 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, + 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, + 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, + 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, + 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, + 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, + 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, + 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, + 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, + 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, + 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, + 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, + 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, + 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, + 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, + 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, + 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, + 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, + 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, + 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, + 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, + 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, + 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, + 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, + 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, + 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, + 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, + 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, + 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, + 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, + 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, + 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, + 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, + 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, + 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, + 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, + 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, + 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, + 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, + 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, + 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, + 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, + 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, + 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, + 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, + 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, + 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, + 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, + 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, + 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, + 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, + 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, + 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, + 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, + 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, + 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, + 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, + 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, + 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, + 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, + 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, + 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, + 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, + 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, + 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, + 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, + 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, + 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, + 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, + 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, + 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, + 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, + 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, + 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, + 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, + 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, + 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, + 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, + 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, + 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, + 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, + 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, + 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, + 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, + 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, + 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, + 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, + 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, + 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, + 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, + 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, + 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, + 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, + 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, + 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, + 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, + 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, + 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, + 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, + 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, + 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, + 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, + 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, + 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, + 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, + 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, + 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, + 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, + 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, + 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, + 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, + 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, + 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ]; + + /** + * @type {Array.} + * @const + * @inner + */ + var C_ORIG = [ + 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, + 0x6f756274 + ]; + + /** + * @param {Array.} lr + * @param {number} off + * @param {Array.} P + * @param {Array.} S + * @returns {Array.} + * @inner + */ + function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt + var n, + l = lr[off], + r = lr[off + 1]; + + l ^= P[0]; + + /* + for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;) + // Feistel substitution on left word + n = S[l >>> 24], + n += S[0x100 | ((l >> 16) & 0xff)], + n ^= S[0x200 | ((l >> 8) & 0xff)], + n += S[0x300 | (l & 0xff)], + r ^= n ^ P[++i], + // Feistel substitution on right word + n = S[r >>> 24], + n += S[0x100 | ((r >> 16) & 0xff)], + n ^= S[0x200 | ((r >> 8) & 0xff)], + n += S[0x300 | (r & 0xff)], + l ^= n ^ P[++i]; + */ + + //The following is an unrolled version of the above loop. + //Iteration 0 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[1]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[2]; + //Iteration 1 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[3]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[4]; + //Iteration 2 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[5]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[6]; + //Iteration 3 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[7]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[8]; + //Iteration 4 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[9]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[10]; + //Iteration 5 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[11]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[12]; + //Iteration 6 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[13]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[14]; + //Iteration 7 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[15]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[16]; + + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + return lr; + } + + /** + * @param {Array.} data + * @param {number} offp + * @returns {{key: number, offp: number}} + * @inner + */ + function _streamtoword(data, offp) { + for (var i = 0, word = 0; i < 4; ++i) + word = (word << 8) | (data[offp] & 0xff), + offp = (offp + 1) % data.length; + return { key: word, offp: offp }; + } + + /** + * @param {Array.} key + * @param {Array.} P + * @param {Array.} S + * @inner + */ + function _key(key, P, S) { + var offset = 0, + lr = [0, 0], + plen = P.length, + slen = S.length, + sw; + for (var i = 0; i < plen; i++) + sw = _streamtoword(key, offset), + offset = sw.offp, + P[i] = P[i] ^ sw.key; + for (i = 0; i < plen; i += 2) + lr = _encipher(lr, 0, P, S), + P[i] = lr[0], + P[i + 1] = lr[1]; + for (i = 0; i < slen; i += 2) + lr = _encipher(lr, 0, P, S), + S[i] = lr[0], + S[i + 1] = lr[1]; + } + + /** + * Expensive key schedule Blowfish. + * @param {Array.} data + * @param {Array.} key + * @param {Array.} P + * @param {Array.} S + * @inner + */ + function _ekskey(data, key, P, S) { + var offp = 0, + lr = [0, 0], + plen = P.length, + slen = S.length, + sw; + for (var i = 0; i < plen; i++) + sw = _streamtoword(key, offp), + offp = sw.offp, + P[i] = P[i] ^ sw.key; + offp = 0; + for (i = 0; i < plen; i += 2) + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[0] ^= sw.key, + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[1] ^= sw.key, + lr = _encipher(lr, 0, P, S), + P[i] = lr[0], + P[i + 1] = lr[1]; + for (i = 0; i < slen; i += 2) + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[0] ^= sw.key, + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[1] ^= sw.key, + lr = _encipher(lr, 0, P, S), + S[i] = lr[0], + S[i + 1] = lr[1]; + } + + /** + * Internaly crypts a string. + * @param {Array.} b Bytes to crypt + * @param {Array.} salt Salt bytes to use + * @param {number} rounds Number of rounds + * @param {function(Error, Array.=)=} callback Callback receiving the error, if any, and the resulting bytes. If + * omitted, the operation will be performed synchronously. + * @param {function(number)=} progressCallback Callback called with the current progress + * @returns {!Array.|undefined} Resulting bytes if callback has been omitted, otherwise `undefined` + * @inner + */ + function _crypt(b, salt, rounds, callback, progressCallback) { + var cdata = C_ORIG.slice(), + clen = cdata.length, + err; + + // Validate + if (rounds < 4 || rounds > 31) { + err = Error("Illegal number of rounds (4-31): " + rounds); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + if (salt.length !== BCRYPT_SALT_LEN) { + err = Error("Illegal salt length: " + salt.length + " != " + BCRYPT_SALT_LEN); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + rounds = (1 << rounds) >>> 0; + + var P, S, i = 0, j; + + //Use typed arrays when available - huge speedup! + if (Int32Array) { + P = new Int32Array(P_ORIG); + S = new Int32Array(S_ORIG); + } else { + P = P_ORIG.slice(); + S = S_ORIG.slice(); + } + + _ekskey(salt, b, P, S); + + /** + * Calcualtes the next round. + * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` + * @inner + */ + function next() { + if (progressCallback) + progressCallback(i / rounds); + if (i < rounds) { + var start = Date.now(); + for (; i < rounds;) { + i = i + 1; + _key(b, P, S); + _key(salt, P, S); + if (Date.now() - start > MAX_EXECUTION_TIME) + break; + } + } else { + for (i = 0; i < 64; i++) + for (j = 0; j < (clen >> 1); j++) + _encipher(cdata, j << 1, P, S); + var ret = []; + for (i = 0; i < clen; i++) + ret.push(((cdata[i] >> 24) & 0xff) >>> 0), + ret.push(((cdata[i] >> 16) & 0xff) >>> 0), + ret.push(((cdata[i] >> 8) & 0xff) >>> 0), + ret.push((cdata[i] & 0xff) >>> 0); + if (callback) { + callback(null, ret); + return; + } else + return ret; + } + if (callback) + nextTick(next); + } + + // Async + if (typeof callback !== 'undefined') { + next(); + + // Sync + } else { + var res; + while (true) + if (typeof (res = next()) !== 'undefined') + return res || []; + } + } + + /** + * Internally hashes a string. + * @param {string} s String to hash + * @param {?string} salt Salt to use, actually never null + * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, + * hashing is perormed synchronously. + * @param {function(number)=} progressCallback Callback called with the current progress + * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` + * @inner + */ + function _hash(s, salt, callback, progressCallback) { + var err; + if (typeof s !== 'string' || typeof salt !== 'string') { + err = Error("Invalid string / salt: Not a string"); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } + else + throw err; + } + + // Validate the salt + var minor, offset; + if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') { + err = Error("Invalid salt version: " + salt.substring(0, 2)); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } + else + throw err; + } + if (salt.charAt(2) === '$') + minor = String.fromCharCode(0), + offset = 3; + else { + minor = salt.charAt(2); + if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') { + err = Error("Invalid salt revision: " + salt.substring(2, 4)); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + offset = 4; + } + + // Extract number of rounds + if (salt.charAt(offset + 2) > '$') { + err = Error("Missing salt rounds"); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, + r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), + rounds = r1 + r2, + real_salt = salt.substring(offset + 3, offset + 25); + s += minor >= 'a' ? "\x00" : ""; + + var passwordb = stringToBytes(s), + saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); + + /** + * Finishes hashing. + * @param {Array.} bytes Byte array + * @returns {string} + * @inner + */ + function finish(bytes) { + var res = []; + res.push("$2"); + if (minor >= 'a') + res.push(minor); + res.push("$"); + if (rounds < 10) + res.push("0"); + res.push(rounds.toString()); + res.push("$"); + res.push(base64_encode(saltb, saltb.length)); + res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); + return res.join(''); + } + + // Sync + if (typeof callback == 'undefined') + return finish(_crypt(passwordb, saltb, rounds)); + + // Async + else { + _crypt(passwordb, saltb, rounds, function (err, bytes) { + if (err) + callback(err, null); + else + callback(null, finish(bytes)); + }, progressCallback); + } + } + + /** + * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. + * @function + * @param {!Array.} b Byte array + * @param {number} len Maximum input length + * @returns {string} + * @expose + */ + bcrypt.encodeBase64 = base64_encode; + + /** + * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. + * @function + * @param {string} s String to decode + * @param {number} len Maximum output length + * @returns {!Array.} + * @expose + */ + bcrypt.decodeBase64 = base64_decode; + + return bcrypt; })); diff --git a/crypto/api/deps/broken-ripemd160.js b/crypto/api/deps/broken-ripemd160.js index 9045ef21..1f266194 100644 --- a/crypto/api/deps/broken-ripemd160.js +++ b/crypto/api/deps/broken-ripemd160.js @@ -1,180 +1,179 @@ // "Generated from Java with JSweet 1.0.0 - http://www.jsweet.org"; // BAD IMPLEMENTATION. BROKEN, BUT MUST KEEP CAUSE OF NETWORK -//const RIPEMD160 = (function () { // == Convert to ES6 module for export == // const RIPEMD160 = (function () { - function RIPEMD160() { - this.MDbuf = []; - this.MDbuf[0] = 1732584193; - this.MDbuf[1] = -271733879; - this.MDbuf[2] = -1732584194; - this.MDbuf[3] = 271733878; - this.MDbuf[4] = -1009589776; - this.working = new Int32Array(16); + function RIPEMD160() { + this.MDbuf = []; + this.MDbuf[0] = 1732584193; + this.MDbuf[1] = -271733879; + this.MDbuf[2] = -1732584194; + this.MDbuf[3] = 271733878; + this.MDbuf[4] = -1009589776; + this.working = new Int32Array(16); - this.working_ptr = 0; - this.msglen = 0; - } - RIPEMD160.prototype.reset = function () { - this.MDbuf = []; - this.MDbuf[0] = 1732584193; - this.MDbuf[1] = -271733879; - this.MDbuf[2] = -1732584194; - this.MDbuf[3] = 271733878; - this.MDbuf[4] = -1009589776; - this.working = new Int32Array(16); - this.working_ptr = 0; - this.msglen = 0; - }; - RIPEMD160.prototype.compress = function (X) { - var index = 0; - var a; - var b; - var c; - var d; - var e; - var A; - var B; - var C; - var D; - var E; - var temp; - var s; - A = a = this.MDbuf[0]; - B = b = this.MDbuf[1]; - C = c = this.MDbuf[2]; - D = d = this.MDbuf[3]; - E = e = this.MDbuf[4]; - for (; index < 16; index++) { - temp = a + (b ^ c ^ d) + X[RIPEMD160.IndexArray[0][index]]; - a = e; - e = d; - d = (c << 10) | (c >>> 22); - c = b; - s = RIPEMD160.ArgArray[0][index]; - b = ((temp << s) | (temp >>> (32 - s))) + a; - temp = A + (B ^ (C | ~D)) + X[RIPEMD160.IndexArray[1][index]] + 1352829926; - A = E; - E = D; - D = (C << 10) | (C >>> 22); - C = B; - s = RIPEMD160.ArgArray[1][index]; - B = ((temp << s) | (temp >>> (32 - s))) + A; - } - for (; index < 32; index++) { - temp = a + ((b & c) | (~b & d)) + X[RIPEMD160.IndexArray[0][index]] + 1518500249; - a = e; - e = d; - d = (c << 10) | (c >>> 22); - c = b; - s = RIPEMD160.ArgArray[0][index]; - b = ((temp << s) | (temp >>> (32 - s))) + a; - temp = A + ((B & D) | (C & ~D)) + X[RIPEMD160.IndexArray[1][index]] + 1548603684; - A = E; - E = D; - D = (C << 10) | (C >>> 22); - C = B; - s = RIPEMD160.ArgArray[1][index]; - B = ((temp << s) | (temp >>> (32 - s))) + A; - } - for (; index < 48; index++) { - temp = a + ((b | ~c) ^ d) + X[RIPEMD160.IndexArray[0][index]] + 1859775393; - a = e; - e = d; - d = (c << 10) | (c >>> 22); - c = b; - s = RIPEMD160.ArgArray[0][index]; - b = ((temp << s) | (temp >>> (32 - s))) + a; - temp = A + ((B | ~C) ^ D) + X[RIPEMD160.IndexArray[1][index]] + 1836072691; - A = E; - E = D; - D = (C << 10) | (C >>> 22); - C = B; - s = RIPEMD160.ArgArray[1][index]; - B = ((temp << s) | (temp >>> (32 - s))) + A; - } - for (; index < 64; index++) { - temp = a + ((b & d) | (c & ~d)) + X[RIPEMD160.IndexArray[0][index]] + -1894007588; - a = e; - e = d; - d = (c << 10) | (c >>> 22); - c = b; - s = RIPEMD160.ArgArray[0][index]; - b = ((temp << s) | (temp >>> (32 - s))) + a; - temp = A + ((B & C) | (~B & D)) + X[RIPEMD160.IndexArray[1][index]] + 2053994217; - A = E; - E = D; - D = (C << 10) | (C >>> 22); - C = B; - s = RIPEMD160.ArgArray[1][index]; - B = ((temp << s) | (temp >>> (32 - s))) + A; - } - for (; index < 80; index++) { - temp = a + (b ^ (c | ~d)) + X[RIPEMD160.IndexArray[0][index]] + -1454113458; - a = e; - e = d; - d = (c << 10) | (c >>> 22); - c = b; - s = RIPEMD160.ArgArray[0][index]; - b = ((temp << s) | (temp >>> (32 - s))) + a; - temp = A + (B ^ C ^ D) + X[RIPEMD160.IndexArray[1][index]]; - A = E; - E = D; - D = (C << 10) | (C >>> 22); - C = B; - s = RIPEMD160.ArgArray[1][index]; - B = ((temp << s) | (temp >>> (32 - s))) + A; - } - D += c + this.MDbuf[1]; - this.MDbuf[1] = this.MDbuf[2] + d + E; - this.MDbuf[2] = this.MDbuf[3] + e + A; - this.MDbuf[3] = this.MDbuf[4] + a + B; - this.MDbuf[4] = this.MDbuf[0] + b + C; - this.MDbuf[0] = D; - }; - RIPEMD160.prototype.MDfinish = function (array, lswlen, mswlen) { - var X = array; - X[(lswlen >> 2) & 15] ^= 1 << (((lswlen & 3) << 3) + 7); - if (((lswlen & 63) > 55)) { - this.compress(X); - for (var i = 0; i < 14; i++) { - X[i] = 0; - } - } - X[14] = lswlen << 3; - X[15] = (lswlen >> 29) | (mswlen << 3); - this.compress(X); - }; - RIPEMD160.prototype.update = function (input) { - for (var i = 0; i < input.length; i++) { - this.working[this.working_ptr >> 2] ^= input[i] << ((this.working_ptr & 3) << 3); - this.working_ptr++; - if ((this.working_ptr == 64)) { - this.compress(this.working); - for (var j = 0; j < 16; j++) { - this.working[j] = 0; - } - this.working_ptr = 0; - } - } - this.msglen += input.length; - }; - RIPEMD160.prototype.digestBin = function () { - this.MDfinish(this.working, this.msglen, 0); - //var res = new Int8Array(); - var res = []; - for (var i = 0; i < 20; i++) { - res[i] = ((this.MDbuf[i >> 2] >>> ((i & 3) << 3)) & 255); - } - return new Uint8Array(res); - }; - RIPEMD160.prototype.digest = function (input) { - this.update(new Int8Array(input)); - return this.digestBin(); - }; - RIPEMD160.ArgArray = [[11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]]; - RIPEMD160.IndexArray = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]]; - return RIPEMD160; + this.working_ptr = 0; + this.msglen = 0; + } + RIPEMD160.prototype.reset = function () { + this.MDbuf = []; + this.MDbuf[0] = 1732584193; + this.MDbuf[1] = -271733879; + this.MDbuf[2] = -1732584194; + this.MDbuf[3] = 271733878; + this.MDbuf[4] = -1009589776; + this.working = new Int32Array(16); + this.working_ptr = 0; + this.msglen = 0; + }; + RIPEMD160.prototype.compress = function (X) { + var index = 0; + var a; + var b; + var c; + var d; + var e; + var A; + var B; + var C; + var D; + var E; + var temp; + var s; + A = a = this.MDbuf[0]; + B = b = this.MDbuf[1]; + C = c = this.MDbuf[2]; + D = d = this.MDbuf[3]; + E = e = this.MDbuf[4]; + for (; index < 16; index++) { + temp = a + (b ^ c ^ d) + X[RIPEMD160.IndexArray[0][index]]; + a = e; + e = d; + d = (c << 10) | (c >>> 22); + c = b; + s = RIPEMD160.ArgArray[0][index]; + b = ((temp << s) | (temp >>> (32 - s))) + a; + temp = A + (B ^ (C | ~D)) + X[RIPEMD160.IndexArray[1][index]] + 1352829926; + A = E; + E = D; + D = (C << 10) | (C >>> 22); + C = B; + s = RIPEMD160.ArgArray[1][index]; + B = ((temp << s) | (temp >>> (32 - s))) + A; + } + for (; index < 32; index++) { + temp = a + ((b & c) | (~b & d)) + X[RIPEMD160.IndexArray[0][index]] + 1518500249; + a = e; + e = d; + d = (c << 10) | (c >>> 22); + c = b; + s = RIPEMD160.ArgArray[0][index]; + b = ((temp << s) | (temp >>> (32 - s))) + a; + temp = A + ((B & D) | (C & ~D)) + X[RIPEMD160.IndexArray[1][index]] + 1548603684; + A = E; + E = D; + D = (C << 10) | (C >>> 22); + C = B; + s = RIPEMD160.ArgArray[1][index]; + B = ((temp << s) | (temp >>> (32 - s))) + A; + } + for (; index < 48; index++) { + temp = a + ((b | ~c) ^ d) + X[RIPEMD160.IndexArray[0][index]] + 1859775393; + a = e; + e = d; + d = (c << 10) | (c >>> 22); + c = b; + s = RIPEMD160.ArgArray[0][index]; + b = ((temp << s) | (temp >>> (32 - s))) + a; + temp = A + ((B | ~C) ^ D) + X[RIPEMD160.IndexArray[1][index]] + 1836072691; + A = E; + E = D; + D = (C << 10) | (C >>> 22); + C = B; + s = RIPEMD160.ArgArray[1][index]; + B = ((temp << s) | (temp >>> (32 - s))) + A; + } + for (; index < 64; index++) { + temp = a + ((b & d) | (c & ~d)) + X[RIPEMD160.IndexArray[0][index]] + -1894007588; + a = e; + e = d; + d = (c << 10) | (c >>> 22); + c = b; + s = RIPEMD160.ArgArray[0][index]; + b = ((temp << s) | (temp >>> (32 - s))) + a; + temp = A + ((B & C) | (~B & D)) + X[RIPEMD160.IndexArray[1][index]] + 2053994217; + A = E; + E = D; + D = (C << 10) | (C >>> 22); + C = B; + s = RIPEMD160.ArgArray[1][index]; + B = ((temp << s) | (temp >>> (32 - s))) + A; + } + for (; index < 80; index++) { + temp = a + (b ^ (c | ~d)) + X[RIPEMD160.IndexArray[0][index]] + -1454113458; + a = e; + e = d; + d = (c << 10) | (c >>> 22); + c = b; + s = RIPEMD160.ArgArray[0][index]; + b = ((temp << s) | (temp >>> (32 - s))) + a; + temp = A + (B ^ C ^ D) + X[RIPEMD160.IndexArray[1][index]]; + A = E; + E = D; + D = (C << 10) | (C >>> 22); + C = B; + s = RIPEMD160.ArgArray[1][index]; + B = ((temp << s) | (temp >>> (32 - s))) + A; + } + D += c + this.MDbuf[1]; + this.MDbuf[1] = this.MDbuf[2] + d + E; + this.MDbuf[2] = this.MDbuf[3] + e + A; + this.MDbuf[3] = this.MDbuf[4] + a + B; + this.MDbuf[4] = this.MDbuf[0] + b + C; + this.MDbuf[0] = D; + }; + RIPEMD160.prototype.MDfinish = function (array, lswlen, mswlen) { + var X = array; + X[(lswlen >> 2) & 15] ^= 1 << (((lswlen & 3) << 3) + 7); + if (((lswlen & 63) > 55)) { + this.compress(X); + for (var i = 0; i < 14; i++) { + X[i] = 0; + } + } + X[14] = lswlen << 3; + X[15] = (lswlen >> 29) | (mswlen << 3); + this.compress(X); + }; + RIPEMD160.prototype.update = function (input) { + for (var i = 0; i < input.length; i++) { + this.working[this.working_ptr >> 2] ^= input[i] << ((this.working_ptr & 3) << 3); + this.working_ptr++; + if ((this.working_ptr == 64)) { + this.compress(this.working); + for (var j = 0; j < 16; j++) { + this.working[j] = 0; + } + this.working_ptr = 0; + } + } + this.msglen += input.length; + }; + RIPEMD160.prototype.digestBin = function () { + this.MDfinish(this.working, this.msglen, 0); + //var res = new Int8Array(); + var res = []; + for (var i = 0; i < 20; i++) { + res[i] = ((this.MDbuf[i >> 2] >>> ((i & 3) << 3)) & 255); + } + return new Uint8Array(res); + }; + RIPEMD160.prototype.digest = function (input) { + this.update(new Int8Array(input)); + return this.digestBin(); + }; + RIPEMD160.ArgArray = [[11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]]; + RIPEMD160.IndexArray = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]]; + return RIPEMD160; })(); export default RIPEMD160 diff --git a/crypto/api/deps/deps.js b/crypto/api/deps/deps.js index 48eb8130..331f6ad0 100644 --- a/crypto/api/deps/deps.js +++ b/crypto/api/deps/deps.js @@ -1,3 +1,2 @@ -export { default as Base58 } from './Base58.js' - -export { default as utils } from './utils.js' +export { default as Base58 } from './Base58' +export { default as utils } from './utils' diff --git a/crypto/api/deps/ed2curve.js b/crypto/api/deps/ed2curve.js index e7ede3d0..1fcabdea 100644 --- a/crypto/api/deps/ed2curve.js +++ b/crypto/api/deps/ed2curve.js @@ -10,255 +10,239 @@ Change to es6 import/export */ -import nacl from './nacl-fast.js' +import nacl from './nacl-fast' -// (function(root, f) { -// 'use strict'; -// if (typeof module !== 'undefined' && module.exports) module.exports = f(require('tweetnacl')); -// else root.ed2curve = f(root.nacl); -// }(this, function(nacl) { -// 'use strict'; -// if (!nacl) throw new Error('tweetnacl not loaded'); +// -- Operations copied from TweetNaCl.js. -- - // -- Operations copied from TweetNaCl.js. -- +var gf = function (init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; +}; - var gf = function(init) { - var i, r = new Float64Array(16); - if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; - return r; - }; +var gf0 = gf(), + gf1 = gf([1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); - var gf0 = gf(), - gf1 = gf([1]), - D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), - I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); - - function car25519(o) { - var c; - var i; - for (i = 0; i < 16; i++) { - o[i] += 65536; - c = Math.floor(o[i] / 65536); - o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); - o[i] -= (c * 65536); - } - } - - function sel25519(p, q, b) { - var t, c = ~(b-1); - for (var i = 0; i < 16; i++) { - t = c & (p[i] ^ q[i]); - p[i] ^= t; - q[i] ^= t; - } - } - - function unpack25519(o, n) { - var i; - for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); - o[15] &= 0x7fff; - } - - // addition - function A(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; - } - - // subtraction - function Z(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; - } - - // multiplication - function M(o, a, b) { - var i, j, t = new Float64Array(31); - for (i = 0; i < 31; i++) t[i] = 0; - for (i = 0; i < 16; i++) { - for (j = 0; j < 16; j++) { - t[i+j] += a[i] * b[j]; - } - } - for (i = 0; i < 15; i++) { - t[i] += 38 * t[i+16]; - } - for (i = 0; i < 16; i++) o[i] = t[i]; - car25519(o); - car25519(o); - } - - // squaring - function S(o, a) { - M(o, a, a); - } - - // inversion - function inv25519(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 253; a >= 0; a--) { - S(c, c); - if(a !== 2 && a !== 4) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; - } - - function pack25519(o, n) { - var i, j, b; - var m = gf(), t = gf(); - for (i = 0; i < 16; i++) t[i] = n[i]; - car25519(t); - car25519(t); - car25519(t); - for (j = 0; j < 2; j++) { - m[0] = t[0] - 0xffed; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); - m[i-1] &= 0xffff; - } - m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); - b = (m[15]>>16) & 1; - m[14] &= 0xffff; - sel25519(t, m, 1-b); - } - for (i = 0; i < 16; i++) { - o[2*i] = t[i] & 0xff; - o[2*i+1] = t[i] >> 8; - } - } - - function par25519(a) { - var d = new Uint8Array(32); - pack25519(d, a); - return d[0] & 1; - } - - function vn(x, xi, y, yi, n) { - var i, d = 0; - for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; - return (1 & ((d - 1) >>> 8)) - 1; - } - - function crypto_verify_32(x, xi, y, yi) { - return vn(x, xi, y, yi, 32); - } - - function neq25519(a, b) { - var c = new Uint8Array(32), d = new Uint8Array(32); - pack25519(c, a); - pack25519(d, b); - return crypto_verify_32(c, 0, d, 0); - } - - function pow2523(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 250; a >= 0; a--) { - S(c, c); - if (a !== 1) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; - } - - function set25519(r, a) { - var i; - for (i = 0; i < 16; i++) r[i] = a[i] | 0; - } - - function unpackneg(r, p) { - var t = gf(), chk = gf(), num = gf(), - den = gf(), den2 = gf(), den4 = gf(), - den6 = gf(); - - set25519(r[2], gf1); - unpack25519(r[1], p); - S(num, r[1]); - M(den, num, D); - Z(num, num, r[2]); - A(den, r[2], den); - - S(den2, den); - S(den4, den2); - M(den6, den4, den2); - M(t, den6, num); - M(t, t, den); - - pow2523(t, t); - M(t, t, num); - M(t, t, den); - M(t, t, den); - M(r[0], t, den); - - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) M(r[0], r[0], I); - - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) return -1; - - if (par25519(r[0]) === (p[31] >> 7)) Z(r[0], gf0, r[0]); - - M(r[3], r[0], r[1]); - return 0; - } - - // ---- - - // Converts Ed25519 public key to Curve25519 public key. - // montgomeryX = (edwardsY + 1)*inverse(1 - edwardsY) mod p - function convertPublicKey(pk) { - var z = new Uint8Array(32), - q = [gf(), gf(), gf(), gf()], - a = gf(), b = gf(); - - if (unpackneg(q, pk)) return null; // reject invalid key - - var y = q[1]; - - A(a, gf1, y); - Z(b, gf1, y); - inv25519(b, b); - M(a, a, b); - - pack25519(z, a); - return z; - } - - // Converts Ed25519 secret key to Curve25519 secret key. - function convertSecretKey(sk) { - var d = new Uint8Array(64), o = new Uint8Array(32), i; - nacl.lowlevel.crypto_hash(d, sk, 32); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; - for (i = 0; i < 32; i++) o[i] = d[i]; - for (i = 0; i < 64; i++) d[i] = 0; - return o; - } - - function convertKeyPair(edKeyPair) { - var publicKey = convertPublicKey(edKeyPair.publicKey); - if (!publicKey) return null; - return { - publicKey: publicKey, - secretKey: convertSecretKey(edKeyPair.secretKey) - }; - } - -// return { -// convertPublicKey: convertPublicKey, -// convertSecretKey: convertSecretKey, -// convertKeyPair: convertKeyPair, -// }; - -export default { - convertPublicKey: convertPublicKey, - convertSecretKey: convertSecretKey, - convertKeyPair: convertKeyPair, +function car25519(o) { + var c; + var i; + for (i = 0; i < 16; i++) { + o[i] += 65536; + c = Math.floor(o[i] / 65536); + o[(i + 1) * (i < 15 ? 1 : 0)] += c - 1 + 37 * (c - 1) * (i === 15 ? 1 : 0); + o[i] -= (c * 65536); + } } -// })); +function sel25519(p, q, b) { + var t, c = ~(b - 1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8); + o[15] &= 0x7fff; +} + +// addition +function A(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] + b[i]) | 0; +} + +// subtraction +function Z(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] - b[i]) | 0; +} + +// multiplication +function M(o, a, b) { + var i, j, t = new Float64Array(31); + for (i = 0; i < 31; i++) t[i] = 0; + for (i = 0; i < 16; i++) { + for (j = 0; j < 16; j++) { + t[i + j] += a[i] * b[j]; + } + } + for (i = 0; i < 15; i++) { + t[i] += 38 * t[i + 16]; + } + for (i = 0; i < 16; i++) o[i] = t[i]; + car25519(o); + car25519(o); +} + +// squaring +function S(o, a) { + M(o, a, a); +} + +// inversion +function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if (a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1); + m[i - 1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1); + b = (m[15] >> 16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1 - b); + } + for (i = 0; i < 16; i++) { + o[2 * i] = t[i] & 0xff; + o[2 * i + 1] = t[i] >> 8; + } +} + +function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; +} + +function vn(x, xi, y, yi, n) { + var i, d = 0; + for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; + return (1 & ((d - 1) >>> 8)) - 1; +} + +function crypto_verify_32(x, xi, y, yi) { + return vn(x, xi, y, yi, 32); +} + +function neq25519(a, b) { + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); +} + +function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if (a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i] | 0; +} + +function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); + + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) === (p[31] >> 7)) Z(r[0], gf0, r[0]); + + M(r[3], r[0], r[1]); + return 0; +} + +// ---- + +// Converts Ed25519 public key to Curve25519 public key. +// montgomeryX = (edwardsY + 1)*inverse(1 - edwardsY) mod p +function convertPublicKey(pk) { + var z = new Uint8Array(32), + q = [gf(), gf(), gf(), gf()], + a = gf(), b = gf(); + + if (unpackneg(q, pk)) return null; // reject invalid key + + var y = q[1]; + + A(a, gf1, y); + Z(b, gf1, y); + inv25519(b, b); + M(a, a, b); + + pack25519(z, a); + return z; +} + +// Converts Ed25519 secret key to Curve25519 secret key. +function convertSecretKey(sk) { + var d = new Uint8Array(64), o = new Uint8Array(32), i; + nacl.lowlevel.crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + for (i = 0; i < 32; i++) o[i] = d[i]; + for (i = 0; i < 64; i++) d[i] = 0; + return o; +} + +function convertKeyPair(edKeyPair) { + var publicKey = convertPublicKey(edKeyPair.publicKey); + if (!publicKey) return null; + return { + publicKey: publicKey, + secretKey: convertSecretKey(edKeyPair.secretKey) + }; +} + +export default { + convertPublicKey: convertPublicKey, + convertSecretKey: convertSecretKey, + convertKeyPair: convertKeyPair, +} diff --git a/crypto/api/deps/nacl-fast.js b/crypto/api/deps/nacl-fast.js index b2fd186f..6693543b 100644 --- a/crypto/api/deps/nacl-fast.js +++ b/crypto/api/deps/nacl-fast.js @@ -1,7 +1,5 @@ // == CHANGE TO ES6 EXPORT == // const nacl = {} -//(function(nacl) { -'use strict'; // Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. // Public domain. @@ -9,456 +7,456 @@ const nacl = {} // Implementation derived from TweetNaCl version 20140427. // See for details: http://tweetnacl.cr.yp.to/ -var gf = function(init) { - var i, r = new Float64Array(16); - if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; - return r; +var gf = function (init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; }; // Pluggable, initialized in high-level API below. -var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; +var randombytes = function (/* x, n */) { throw new Error('no PRNG'); }; var _0 = new Uint8Array(16); var _9 = new Uint8Array(32); _9[0] = 9; var gf0 = gf(), - gf1 = gf([1]), - _121665 = gf([0xdb41, 1]), - D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), - D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), - X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), - Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), - I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); + gf1 = gf([1]), + _121665 = gf([0xdb41, 1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), + X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), + Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); function ts64(x, i, h, l) { - x[i] = (h >> 24) & 0xff; - x[i+1] = (h >> 16) & 0xff; - x[i+2] = (h >> 8) & 0xff; - x[i+3] = h & 0xff; - x[i+4] = (l >> 24) & 0xff; - x[i+5] = (l >> 16) & 0xff; - x[i+6] = (l >> 8) & 0xff; - x[i+7] = l & 0xff; + x[i] = (h >> 24) & 0xff; + x[i + 1] = (h >> 16) & 0xff; + x[i + 2] = (h >> 8) & 0xff; + x[i + 3] = h & 0xff; + x[i + 4] = (l >> 24) & 0xff; + x[i + 5] = (l >> 16) & 0xff; + x[i + 6] = (l >> 8) & 0xff; + x[i + 7] = l & 0xff; } function vn(x, xi, y, yi, n) { - var i,d = 0; - for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; - return (1 & ((d - 1) >>> 8)) - 1; + var i, d = 0; + for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; + return (1 & ((d - 1) >>> 8)) - 1; } function crypto_verify_16(x, xi, y, yi) { - return vn(x,xi,y,yi,16); + return vn(x, xi, y, yi, 16); } function crypto_verify_32(x, xi, y, yi) { - return vn(x,xi,y,yi,32); + return vn(x, xi, y, yi, 32); } function core_salsa20(o, p, k, c) { - var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, - j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, - j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, - j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, - j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, - j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, - j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, - j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, - j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, - j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, - j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, - j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, - j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, - j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, - j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, - j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; + var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24, + j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24, + j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24, + j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24, + j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24, + j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24, + j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24, + j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24, + j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24, + j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24, + j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24, + j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24, + j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24, + j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24, + j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24, + j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24; - var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, - x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, - x15 = j15, u; + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; - for (var i = 0; i < 20; i += 2) { - u = x0 + x12 | 0; - x4 ^= u<<7 | u>>>(32-7); - u = x4 + x0 | 0; - x8 ^= u<<9 | u>>>(32-9); - u = x8 + x4 | 0; - x12 ^= u<<13 | u>>>(32-13); - u = x12 + x8 | 0; - x0 ^= u<<18 | u>>>(32-18); + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u << 7 | u >>> (32 - 7); + u = x4 + x0 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x4 | 0; + x12 ^= u << 13 | u >>> (32 - 13); + u = x12 + x8 | 0; + x0 ^= u << 18 | u >>> (32 - 18); - u = x5 + x1 | 0; - x9 ^= u<<7 | u>>>(32-7); - u = x9 + x5 | 0; - x13 ^= u<<9 | u>>>(32-9); - u = x13 + x9 | 0; - x1 ^= u<<13 | u>>>(32-13); - u = x1 + x13 | 0; - x5 ^= u<<18 | u>>>(32-18); + u = x5 + x1 | 0; + x9 ^= u << 7 | u >>> (32 - 7); + u = x9 + x5 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x9 | 0; + x1 ^= u << 13 | u >>> (32 - 13); + u = x1 + x13 | 0; + x5 ^= u << 18 | u >>> (32 - 18); - u = x10 + x6 | 0; - x14 ^= u<<7 | u>>>(32-7); - u = x14 + x10 | 0; - x2 ^= u<<9 | u>>>(32-9); - u = x2 + x14 | 0; - x6 ^= u<<13 | u>>>(32-13); - u = x6 + x2 | 0; - x10 ^= u<<18 | u>>>(32-18); + u = x10 + x6 | 0; + x14 ^= u << 7 | u >>> (32 - 7); + u = x14 + x10 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x14 | 0; + x6 ^= u << 13 | u >>> (32 - 13); + u = x6 + x2 | 0; + x10 ^= u << 18 | u >>> (32 - 18); - u = x15 + x11 | 0; - x3 ^= u<<7 | u>>>(32-7); - u = x3 + x15 | 0; - x7 ^= u<<9 | u>>>(32-9); - u = x7 + x3 | 0; - x11 ^= u<<13 | u>>>(32-13); - u = x11 + x7 | 0; - x15 ^= u<<18 | u>>>(32-18); + u = x15 + x11 | 0; + x3 ^= u << 7 | u >>> (32 - 7); + u = x3 + x15 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x3 | 0; + x11 ^= u << 13 | u >>> (32 - 13); + u = x11 + x7 | 0; + x15 ^= u << 18 | u >>> (32 - 18); - u = x0 + x3 | 0; - x1 ^= u<<7 | u>>>(32-7); - u = x1 + x0 | 0; - x2 ^= u<<9 | u>>>(32-9); - u = x2 + x1 | 0; - x3 ^= u<<13 | u>>>(32-13); - u = x3 + x2 | 0; - x0 ^= u<<18 | u>>>(32-18); + u = x0 + x3 | 0; + x1 ^= u << 7 | u >>> (32 - 7); + u = x1 + x0 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x1 | 0; + x3 ^= u << 13 | u >>> (32 - 13); + u = x3 + x2 | 0; + x0 ^= u << 18 | u >>> (32 - 18); - u = x5 + x4 | 0; - x6 ^= u<<7 | u>>>(32-7); - u = x6 + x5 | 0; - x7 ^= u<<9 | u>>>(32-9); - u = x7 + x6 | 0; - x4 ^= u<<13 | u>>>(32-13); - u = x4 + x7 | 0; - x5 ^= u<<18 | u>>>(32-18); + u = x5 + x4 | 0; + x6 ^= u << 7 | u >>> (32 - 7); + u = x6 + x5 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x6 | 0; + x4 ^= u << 13 | u >>> (32 - 13); + u = x4 + x7 | 0; + x5 ^= u << 18 | u >>> (32 - 18); - u = x10 + x9 | 0; - x11 ^= u<<7 | u>>>(32-7); - u = x11 + x10 | 0; - x8 ^= u<<9 | u>>>(32-9); - u = x8 + x11 | 0; - x9 ^= u<<13 | u>>>(32-13); - u = x9 + x8 | 0; - x10 ^= u<<18 | u>>>(32-18); + u = x10 + x9 | 0; + x11 ^= u << 7 | u >>> (32 - 7); + u = x11 + x10 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x11 | 0; + x9 ^= u << 13 | u >>> (32 - 13); + u = x9 + x8 | 0; + x10 ^= u << 18 | u >>> (32 - 18); - u = x15 + x14 | 0; - x12 ^= u<<7 | u>>>(32-7); - u = x12 + x15 | 0; - x13 ^= u<<9 | u>>>(32-9); - u = x13 + x12 | 0; - x14 ^= u<<13 | u>>>(32-13); - u = x14 + x13 | 0; - x15 ^= u<<18 | u>>>(32-18); - } - x0 = x0 + j0 | 0; - x1 = x1 + j1 | 0; - x2 = x2 + j2 | 0; - x3 = x3 + j3 | 0; - x4 = x4 + j4 | 0; - x5 = x5 + j5 | 0; - x6 = x6 + j6 | 0; - x7 = x7 + j7 | 0; - x8 = x8 + j8 | 0; - x9 = x9 + j9 | 0; - x10 = x10 + j10 | 0; - x11 = x11 + j11 | 0; - x12 = x12 + j12 | 0; - x13 = x13 + j13 | 0; - x14 = x14 + j14 | 0; - x15 = x15 + j15 | 0; + u = x15 + x14 | 0; + x12 ^= u << 7 | u >>> (32 - 7); + u = x12 + x15 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x12 | 0; + x14 ^= u << 13 | u >>> (32 - 13); + u = x14 + x13 | 0; + x15 ^= u << 18 | u >>> (32 - 18); + } + x0 = x0 + j0 | 0; + x1 = x1 + j1 | 0; + x2 = x2 + j2 | 0; + x3 = x3 + j3 | 0; + x4 = x4 + j4 | 0; + x5 = x5 + j5 | 0; + x6 = x6 + j6 | 0; + x7 = x7 + j7 | 0; + x8 = x8 + j8 | 0; + x9 = x9 + j9 | 0; + x10 = x10 + j10 | 0; + x11 = x11 + j11 | 0; + x12 = x12 + j12 | 0; + x13 = x13 + j13 | 0; + x14 = x14 + j14 | 0; + x15 = x15 + j15 | 0; - o[ 0] = x0 >>> 0 & 0xff; - o[ 1] = x0 >>> 8 & 0xff; - o[ 2] = x0 >>> 16 & 0xff; - o[ 3] = x0 >>> 24 & 0xff; + o[0] = x0 >>> 0 & 0xff; + o[1] = x0 >>> 8 & 0xff; + o[2] = x0 >>> 16 & 0xff; + o[3] = x0 >>> 24 & 0xff; - o[ 4] = x1 >>> 0 & 0xff; - o[ 5] = x1 >>> 8 & 0xff; - o[ 6] = x1 >>> 16 & 0xff; - o[ 7] = x1 >>> 24 & 0xff; + o[4] = x1 >>> 0 & 0xff; + o[5] = x1 >>> 8 & 0xff; + o[6] = x1 >>> 16 & 0xff; + o[7] = x1 >>> 24 & 0xff; - o[ 8] = x2 >>> 0 & 0xff; - o[ 9] = x2 >>> 8 & 0xff; - o[10] = x2 >>> 16 & 0xff; - o[11] = x2 >>> 24 & 0xff; + o[8] = x2 >>> 0 & 0xff; + o[9] = x2 >>> 8 & 0xff; + o[10] = x2 >>> 16 & 0xff; + o[11] = x2 >>> 24 & 0xff; - o[12] = x3 >>> 0 & 0xff; - o[13] = x3 >>> 8 & 0xff; - o[14] = x3 >>> 16 & 0xff; - o[15] = x3 >>> 24 & 0xff; + o[12] = x3 >>> 0 & 0xff; + o[13] = x3 >>> 8 & 0xff; + o[14] = x3 >>> 16 & 0xff; + o[15] = x3 >>> 24 & 0xff; - o[16] = x4 >>> 0 & 0xff; - o[17] = x4 >>> 8 & 0xff; - o[18] = x4 >>> 16 & 0xff; - o[19] = x4 >>> 24 & 0xff; + o[16] = x4 >>> 0 & 0xff; + o[17] = x4 >>> 8 & 0xff; + o[18] = x4 >>> 16 & 0xff; + o[19] = x4 >>> 24 & 0xff; - o[20] = x5 >>> 0 & 0xff; - o[21] = x5 >>> 8 & 0xff; - o[22] = x5 >>> 16 & 0xff; - o[23] = x5 >>> 24 & 0xff; + o[20] = x5 >>> 0 & 0xff; + o[21] = x5 >>> 8 & 0xff; + o[22] = x5 >>> 16 & 0xff; + o[23] = x5 >>> 24 & 0xff; - o[24] = x6 >>> 0 & 0xff; - o[25] = x6 >>> 8 & 0xff; - o[26] = x6 >>> 16 & 0xff; - o[27] = x6 >>> 24 & 0xff; + o[24] = x6 >>> 0 & 0xff; + o[25] = x6 >>> 8 & 0xff; + o[26] = x6 >>> 16 & 0xff; + o[27] = x6 >>> 24 & 0xff; - o[28] = x7 >>> 0 & 0xff; - o[29] = x7 >>> 8 & 0xff; - o[30] = x7 >>> 16 & 0xff; - o[31] = x7 >>> 24 & 0xff; + o[28] = x7 >>> 0 & 0xff; + o[29] = x7 >>> 8 & 0xff; + o[30] = x7 >>> 16 & 0xff; + o[31] = x7 >>> 24 & 0xff; - o[32] = x8 >>> 0 & 0xff; - o[33] = x8 >>> 8 & 0xff; - o[34] = x8 >>> 16 & 0xff; - o[35] = x8 >>> 24 & 0xff; + o[32] = x8 >>> 0 & 0xff; + o[33] = x8 >>> 8 & 0xff; + o[34] = x8 >>> 16 & 0xff; + o[35] = x8 >>> 24 & 0xff; - o[36] = x9 >>> 0 & 0xff; - o[37] = x9 >>> 8 & 0xff; - o[38] = x9 >>> 16 & 0xff; - o[39] = x9 >>> 24 & 0xff; + o[36] = x9 >>> 0 & 0xff; + o[37] = x9 >>> 8 & 0xff; + o[38] = x9 >>> 16 & 0xff; + o[39] = x9 >>> 24 & 0xff; - o[40] = x10 >>> 0 & 0xff; - o[41] = x10 >>> 8 & 0xff; - o[42] = x10 >>> 16 & 0xff; - o[43] = x10 >>> 24 & 0xff; + o[40] = x10 >>> 0 & 0xff; + o[41] = x10 >>> 8 & 0xff; + o[42] = x10 >>> 16 & 0xff; + o[43] = x10 >>> 24 & 0xff; - o[44] = x11 >>> 0 & 0xff; - o[45] = x11 >>> 8 & 0xff; - o[46] = x11 >>> 16 & 0xff; - o[47] = x11 >>> 24 & 0xff; + o[44] = x11 >>> 0 & 0xff; + o[45] = x11 >>> 8 & 0xff; + o[46] = x11 >>> 16 & 0xff; + o[47] = x11 >>> 24 & 0xff; - o[48] = x12 >>> 0 & 0xff; - o[49] = x12 >>> 8 & 0xff; - o[50] = x12 >>> 16 & 0xff; - o[51] = x12 >>> 24 & 0xff; + o[48] = x12 >>> 0 & 0xff; + o[49] = x12 >>> 8 & 0xff; + o[50] = x12 >>> 16 & 0xff; + o[51] = x12 >>> 24 & 0xff; - o[52] = x13 >>> 0 & 0xff; - o[53] = x13 >>> 8 & 0xff; - o[54] = x13 >>> 16 & 0xff; - o[55] = x13 >>> 24 & 0xff; + o[52] = x13 >>> 0 & 0xff; + o[53] = x13 >>> 8 & 0xff; + o[54] = x13 >>> 16 & 0xff; + o[55] = x13 >>> 24 & 0xff; - o[56] = x14 >>> 0 & 0xff; - o[57] = x14 >>> 8 & 0xff; - o[58] = x14 >>> 16 & 0xff; - o[59] = x14 >>> 24 & 0xff; + o[56] = x14 >>> 0 & 0xff; + o[57] = x14 >>> 8 & 0xff; + o[58] = x14 >>> 16 & 0xff; + o[59] = x14 >>> 24 & 0xff; - o[60] = x15 >>> 0 & 0xff; - o[61] = x15 >>> 8 & 0xff; - o[62] = x15 >>> 16 & 0xff; - o[63] = x15 >>> 24 & 0xff; + o[60] = x15 >>> 0 & 0xff; + o[61] = x15 >>> 8 & 0xff; + o[62] = x15 >>> 16 & 0xff; + o[63] = x15 >>> 24 & 0xff; } -function core_hsalsa20(o,p,k,c) { - var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, - j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, - j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, - j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, - j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, - j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, - j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, - j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, - j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, - j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, - j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, - j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, - j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, - j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, - j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, - j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; +function core_hsalsa20(o, p, k, c) { + var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24, + j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24, + j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24, + j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24, + j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24, + j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24, + j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24, + j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24, + j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24, + j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24, + j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24, + j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24, + j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24, + j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24, + j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24, + j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24; - var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, - x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, - x15 = j15, u; + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; - for (var i = 0; i < 20; i += 2) { - u = x0 + x12 | 0; - x4 ^= u<<7 | u>>>(32-7); - u = x4 + x0 | 0; - x8 ^= u<<9 | u>>>(32-9); - u = x8 + x4 | 0; - x12 ^= u<<13 | u>>>(32-13); - u = x12 + x8 | 0; - x0 ^= u<<18 | u>>>(32-18); + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u << 7 | u >>> (32 - 7); + u = x4 + x0 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x4 | 0; + x12 ^= u << 13 | u >>> (32 - 13); + u = x12 + x8 | 0; + x0 ^= u << 18 | u >>> (32 - 18); - u = x5 + x1 | 0; - x9 ^= u<<7 | u>>>(32-7); - u = x9 + x5 | 0; - x13 ^= u<<9 | u>>>(32-9); - u = x13 + x9 | 0; - x1 ^= u<<13 | u>>>(32-13); - u = x1 + x13 | 0; - x5 ^= u<<18 | u>>>(32-18); + u = x5 + x1 | 0; + x9 ^= u << 7 | u >>> (32 - 7); + u = x9 + x5 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x9 | 0; + x1 ^= u << 13 | u >>> (32 - 13); + u = x1 + x13 | 0; + x5 ^= u << 18 | u >>> (32 - 18); - u = x10 + x6 | 0; - x14 ^= u<<7 | u>>>(32-7); - u = x14 + x10 | 0; - x2 ^= u<<9 | u>>>(32-9); - u = x2 + x14 | 0; - x6 ^= u<<13 | u>>>(32-13); - u = x6 + x2 | 0; - x10 ^= u<<18 | u>>>(32-18); + u = x10 + x6 | 0; + x14 ^= u << 7 | u >>> (32 - 7); + u = x14 + x10 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x14 | 0; + x6 ^= u << 13 | u >>> (32 - 13); + u = x6 + x2 | 0; + x10 ^= u << 18 | u >>> (32 - 18); - u = x15 + x11 | 0; - x3 ^= u<<7 | u>>>(32-7); - u = x3 + x15 | 0; - x7 ^= u<<9 | u>>>(32-9); - u = x7 + x3 | 0; - x11 ^= u<<13 | u>>>(32-13); - u = x11 + x7 | 0; - x15 ^= u<<18 | u>>>(32-18); + u = x15 + x11 | 0; + x3 ^= u << 7 | u >>> (32 - 7); + u = x3 + x15 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x3 | 0; + x11 ^= u << 13 | u >>> (32 - 13); + u = x11 + x7 | 0; + x15 ^= u << 18 | u >>> (32 - 18); - u = x0 + x3 | 0; - x1 ^= u<<7 | u>>>(32-7); - u = x1 + x0 | 0; - x2 ^= u<<9 | u>>>(32-9); - u = x2 + x1 | 0; - x3 ^= u<<13 | u>>>(32-13); - u = x3 + x2 | 0; - x0 ^= u<<18 | u>>>(32-18); + u = x0 + x3 | 0; + x1 ^= u << 7 | u >>> (32 - 7); + u = x1 + x0 | 0; + x2 ^= u << 9 | u >>> (32 - 9); + u = x2 + x1 | 0; + x3 ^= u << 13 | u >>> (32 - 13); + u = x3 + x2 | 0; + x0 ^= u << 18 | u >>> (32 - 18); - u = x5 + x4 | 0; - x6 ^= u<<7 | u>>>(32-7); - u = x6 + x5 | 0; - x7 ^= u<<9 | u>>>(32-9); - u = x7 + x6 | 0; - x4 ^= u<<13 | u>>>(32-13); - u = x4 + x7 | 0; - x5 ^= u<<18 | u>>>(32-18); + u = x5 + x4 | 0; + x6 ^= u << 7 | u >>> (32 - 7); + u = x6 + x5 | 0; + x7 ^= u << 9 | u >>> (32 - 9); + u = x7 + x6 | 0; + x4 ^= u << 13 | u >>> (32 - 13); + u = x4 + x7 | 0; + x5 ^= u << 18 | u >>> (32 - 18); - u = x10 + x9 | 0; - x11 ^= u<<7 | u>>>(32-7); - u = x11 + x10 | 0; - x8 ^= u<<9 | u>>>(32-9); - u = x8 + x11 | 0; - x9 ^= u<<13 | u>>>(32-13); - u = x9 + x8 | 0; - x10 ^= u<<18 | u>>>(32-18); + u = x10 + x9 | 0; + x11 ^= u << 7 | u >>> (32 - 7); + u = x11 + x10 | 0; + x8 ^= u << 9 | u >>> (32 - 9); + u = x8 + x11 | 0; + x9 ^= u << 13 | u >>> (32 - 13); + u = x9 + x8 | 0; + x10 ^= u << 18 | u >>> (32 - 18); - u = x15 + x14 | 0; - x12 ^= u<<7 | u>>>(32-7); - u = x12 + x15 | 0; - x13 ^= u<<9 | u>>>(32-9); - u = x13 + x12 | 0; - x14 ^= u<<13 | u>>>(32-13); - u = x14 + x13 | 0; - x15 ^= u<<18 | u>>>(32-18); - } + u = x15 + x14 | 0; + x12 ^= u << 7 | u >>> (32 - 7); + u = x12 + x15 | 0; + x13 ^= u << 9 | u >>> (32 - 9); + u = x13 + x12 | 0; + x14 ^= u << 13 | u >>> (32 - 13); + u = x14 + x13 | 0; + x15 ^= u << 18 | u >>> (32 - 18); + } - o[ 0] = x0 >>> 0 & 0xff; - o[ 1] = x0 >>> 8 & 0xff; - o[ 2] = x0 >>> 16 & 0xff; - o[ 3] = x0 >>> 24 & 0xff; + o[0] = x0 >>> 0 & 0xff; + o[1] = x0 >>> 8 & 0xff; + o[2] = x0 >>> 16 & 0xff; + o[3] = x0 >>> 24 & 0xff; - o[ 4] = x5 >>> 0 & 0xff; - o[ 5] = x5 >>> 8 & 0xff; - o[ 6] = x5 >>> 16 & 0xff; - o[ 7] = x5 >>> 24 & 0xff; + o[4] = x5 >>> 0 & 0xff; + o[5] = x5 >>> 8 & 0xff; + o[6] = x5 >>> 16 & 0xff; + o[7] = x5 >>> 24 & 0xff; - o[ 8] = x10 >>> 0 & 0xff; - o[ 9] = x10 >>> 8 & 0xff; - o[10] = x10 >>> 16 & 0xff; - o[11] = x10 >>> 24 & 0xff; + o[8] = x10 >>> 0 & 0xff; + o[9] = x10 >>> 8 & 0xff; + o[10] = x10 >>> 16 & 0xff; + o[11] = x10 >>> 24 & 0xff; - o[12] = x15 >>> 0 & 0xff; - o[13] = x15 >>> 8 & 0xff; - o[14] = x15 >>> 16 & 0xff; - o[15] = x15 >>> 24 & 0xff; + o[12] = x15 >>> 0 & 0xff; + o[13] = x15 >>> 8 & 0xff; + o[14] = x15 >>> 16 & 0xff; + o[15] = x15 >>> 24 & 0xff; - o[16] = x6 >>> 0 & 0xff; - o[17] = x6 >>> 8 & 0xff; - o[18] = x6 >>> 16 & 0xff; - o[19] = x6 >>> 24 & 0xff; + o[16] = x6 >>> 0 & 0xff; + o[17] = x6 >>> 8 & 0xff; + o[18] = x6 >>> 16 & 0xff; + o[19] = x6 >>> 24 & 0xff; - o[20] = x7 >>> 0 & 0xff; - o[21] = x7 >>> 8 & 0xff; - o[22] = x7 >>> 16 & 0xff; - o[23] = x7 >>> 24 & 0xff; + o[20] = x7 >>> 0 & 0xff; + o[21] = x7 >>> 8 & 0xff; + o[22] = x7 >>> 16 & 0xff; + o[23] = x7 >>> 24 & 0xff; - o[24] = x8 >>> 0 & 0xff; - o[25] = x8 >>> 8 & 0xff; - o[26] = x8 >>> 16 & 0xff; - o[27] = x8 >>> 24 & 0xff; + o[24] = x8 >>> 0 & 0xff; + o[25] = x8 >>> 8 & 0xff; + o[26] = x8 >>> 16 & 0xff; + o[27] = x8 >>> 24 & 0xff; - o[28] = x9 >>> 0 & 0xff; - o[29] = x9 >>> 8 & 0xff; - o[30] = x9 >>> 16 & 0xff; - o[31] = x9 >>> 24 & 0xff; + o[28] = x9 >>> 0 & 0xff; + o[29] = x9 >>> 8 & 0xff; + o[30] = x9 >>> 16 & 0xff; + o[31] = x9 >>> 24 & 0xff; } -function crypto_core_salsa20(out,inp,k,c) { - core_salsa20(out,inp,k,c); +function crypto_core_salsa20(out, inp, k, c) { + core_salsa20(out, inp, k, c); } -function crypto_core_hsalsa20(out,inp,k,c) { - core_hsalsa20(out,inp,k,c); +function crypto_core_hsalsa20(out, inp, k, c) { + core_hsalsa20(out, inp, k, c); } var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); - // "expand 32-byte k" +// "expand 32-byte k" -function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { - var z = new Uint8Array(16), x = new Uint8Array(64); - var u, i; - for (i = 0; i < 16; i++) z[i] = 0; - for (i = 0; i < 8; i++) z[i] = n[i]; - while (b >= 64) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i]; - u = 1; - for (i = 8; i < 16; i++) { - u = u + (z[i] & 0xff) | 0; - z[i] = u & 0xff; - u >>>= 8; - } - b -= 64; - cpos += 64; - mpos += 64; - } - if (b > 0) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i]; - } - return 0; +function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < 64; i++) c[cpos + i] = m[mpos + i] ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < b; i++) c[cpos + i] = m[mpos + i] ^ x[i]; + } + return 0; } -function crypto_stream_salsa20(c,cpos,b,n,k) { - var z = new Uint8Array(16), x = new Uint8Array(64); - var u, i; - for (i = 0; i < 16; i++) z[i] = 0; - for (i = 0; i < 8; i++) z[i] = n[i]; - while (b >= 64) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < 64; i++) c[cpos+i] = x[i]; - u = 1; - for (i = 8; i < 16; i++) { - u = u + (z[i] & 0xff) | 0; - z[i] = u & 0xff; - u >>>= 8; - } - b -= 64; - cpos += 64; - } - if (b > 0) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < b; i++) c[cpos+i] = x[i]; - } - return 0; +function crypto_stream_salsa20(c, cpos, b, n, k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < 64; i++) c[cpos + i] = x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < b; i++) c[cpos + i] = x[i]; + } + return 0; } -function crypto_stream(c,cpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - var sn = new Uint8Array(8); - for (var i = 0; i < 8; i++) sn[i] = n[i+16]; - return crypto_stream_salsa20(c,cpos,d,sn,s); +function crypto_stream(c, cpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; + return crypto_stream_salsa20(c, cpos, d, sn, s); } -function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - var sn = new Uint8Array(8); - for (var i = 0; i < 8; i++) sn[i] = n[i+16]; - return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s); +function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; + return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s); } /* @@ -466,1820 +464,1820 @@ function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { * https://github.com/floodyberry/poly1305-donna */ -var poly1305 = function(key) { - this.buffer = new Uint8Array(16); - this.r = new Uint16Array(10); - this.h = new Uint16Array(10); - this.pad = new Uint16Array(8); - this.leftover = 0; - this.fin = 0; +var poly1305 = function (key) { + this.buffer = new Uint8Array(16); + this.r = new Uint16Array(10); + this.h = new Uint16Array(10); + this.pad = new Uint16Array(8); + this.leftover = 0; + this.fin = 0; - var t0, t1, t2, t3, t4, t5, t6, t7; + var t0, t1, t2, t3, t4, t5, t6, t7; - t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff; - t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; - t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; - t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; - t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; - this.r[5] = ((t4 >>> 1)) & 0x1ffe; - t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; - t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; - t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; - this.r[9] = ((t7 >>> 5)) & 0x007f; + t0 = key[0] & 0xff | (key[1] & 0xff) << 8; this.r[0] = (t0) & 0x1fff; + t1 = key[2] & 0xff | (key[3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = key[4] & 0xff | (key[5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; + t3 = key[6] & 0xff | (key[7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = key[8] & 0xff | (key[9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; + this.r[5] = ((t4 >>> 1)) & 0x1ffe; + t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; + t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + this.r[9] = ((t7 >>> 5)) & 0x007f; - this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; - this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; - this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; - this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; - this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; - this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; - this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; - this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; + this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; + this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; + this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; + this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; + this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; + this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; + this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; + this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; }; -poly1305.prototype.blocks = function(m, mpos, bytes) { - var hibit = this.fin ? 0 : (1 << 11); - var t0, t1, t2, t3, t4, t5, t6, t7, c; - var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; +poly1305.prototype.blocks = function (m, mpos, bytes) { + var hibit = this.fin ? 0 : (1 << 11); + var t0, t1, t2, t3, t4, t5, t6, t7, c; + var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; - var h0 = this.h[0], - h1 = this.h[1], - h2 = this.h[2], - h3 = this.h[3], - h4 = this.h[4], - h5 = this.h[5], - h6 = this.h[6], - h7 = this.h[7], - h8 = this.h[8], - h9 = this.h[9]; + var h0 = this.h[0], + h1 = this.h[1], + h2 = this.h[2], + h3 = this.h[3], + h4 = this.h[4], + h5 = this.h[5], + h6 = this.h[6], + h7 = this.h[7], + h8 = this.h[8], + h9 = this.h[9]; - var r0 = this.r[0], - r1 = this.r[1], - r2 = this.r[2], - r3 = this.r[3], - r4 = this.r[4], - r5 = this.r[5], - r6 = this.r[6], - r7 = this.r[7], - r8 = this.r[8], - r9 = this.r[9]; + var r0 = this.r[0], + r1 = this.r[1], + r2 = this.r[2], + r3 = this.r[3], + r4 = this.r[4], + r5 = this.r[5], + r6 = this.r[6], + r7 = this.r[7], + r8 = this.r[8], + r9 = this.r[9]; - while (bytes >= 16) { - t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff; - t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; - t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; - t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; - t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; - h5 += ((t4 >>> 1)) & 0x1fff; - t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; - t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; - t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; - h9 += ((t7 >>> 5)) | hibit; + while (bytes >= 16) { + t0 = m[mpos + 0] & 0xff | (m[mpos + 1] & 0xff) << 8; h0 += (t0) & 0x1fff; + t1 = m[mpos + 2] & 0xff | (m[mpos + 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = m[mpos + 4] & 0xff | (m[mpos + 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; + t3 = m[mpos + 6] & 0xff | (m[mpos + 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = m[mpos + 8] & 0xff | (m[mpos + 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; + h5 += ((t4 >>> 1)) & 0x1fff; + t5 = m[mpos + 10] & 0xff | (m[mpos + 11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = m[mpos + 12] & 0xff | (m[mpos + 13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; + t7 = m[mpos + 14] & 0xff | (m[mpos + 15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + h9 += ((t7 >>> 5)) | hibit; - c = 0; + c = 0; - d0 = c; - d0 += h0 * r0; - d0 += h1 * (5 * r9); - d0 += h2 * (5 * r8); - d0 += h3 * (5 * r7); - d0 += h4 * (5 * r6); - c = (d0 >>> 13); d0 &= 0x1fff; - d0 += h5 * (5 * r5); - d0 += h6 * (5 * r4); - d0 += h7 * (5 * r3); - d0 += h8 * (5 * r2); - d0 += h9 * (5 * r1); - c += (d0 >>> 13); d0 &= 0x1fff; + d0 = c; + d0 += h0 * r0; + d0 += h1 * (5 * r9); + d0 += h2 * (5 * r8); + d0 += h3 * (5 * r7); + d0 += h4 * (5 * r6); + c = (d0 >>> 13); d0 &= 0x1fff; + d0 += h5 * (5 * r5); + d0 += h6 * (5 * r4); + d0 += h7 * (5 * r3); + d0 += h8 * (5 * r2); + d0 += h9 * (5 * r1); + c += (d0 >>> 13); d0 &= 0x1fff; - d1 = c; - d1 += h0 * r1; - d1 += h1 * r0; - d1 += h2 * (5 * r9); - d1 += h3 * (5 * r8); - d1 += h4 * (5 * r7); - c = (d1 >>> 13); d1 &= 0x1fff; - d1 += h5 * (5 * r6); - d1 += h6 * (5 * r5); - d1 += h7 * (5 * r4); - d1 += h8 * (5 * r3); - d1 += h9 * (5 * r2); - c += (d1 >>> 13); d1 &= 0x1fff; + d1 = c; + d1 += h0 * r1; + d1 += h1 * r0; + d1 += h2 * (5 * r9); + d1 += h3 * (5 * r8); + d1 += h4 * (5 * r7); + c = (d1 >>> 13); d1 &= 0x1fff; + d1 += h5 * (5 * r6); + d1 += h6 * (5 * r5); + d1 += h7 * (5 * r4); + d1 += h8 * (5 * r3); + d1 += h9 * (5 * r2); + c += (d1 >>> 13); d1 &= 0x1fff; - d2 = c; - d2 += h0 * r2; - d2 += h1 * r1; - d2 += h2 * r0; - d2 += h3 * (5 * r9); - d2 += h4 * (5 * r8); - c = (d2 >>> 13); d2 &= 0x1fff; - d2 += h5 * (5 * r7); - d2 += h6 * (5 * r6); - d2 += h7 * (5 * r5); - d2 += h8 * (5 * r4); - d2 += h9 * (5 * r3); - c += (d2 >>> 13); d2 &= 0x1fff; + d2 = c; + d2 += h0 * r2; + d2 += h1 * r1; + d2 += h2 * r0; + d2 += h3 * (5 * r9); + d2 += h4 * (5 * r8); + c = (d2 >>> 13); d2 &= 0x1fff; + d2 += h5 * (5 * r7); + d2 += h6 * (5 * r6); + d2 += h7 * (5 * r5); + d2 += h8 * (5 * r4); + d2 += h9 * (5 * r3); + c += (d2 >>> 13); d2 &= 0x1fff; - d3 = c; - d3 += h0 * r3; - d3 += h1 * r2; - d3 += h2 * r1; - d3 += h3 * r0; - d3 += h4 * (5 * r9); - c = (d3 >>> 13); d3 &= 0x1fff; - d3 += h5 * (5 * r8); - d3 += h6 * (5 * r7); - d3 += h7 * (5 * r6); - d3 += h8 * (5 * r5); - d3 += h9 * (5 * r4); - c += (d3 >>> 13); d3 &= 0x1fff; + d3 = c; + d3 += h0 * r3; + d3 += h1 * r2; + d3 += h2 * r1; + d3 += h3 * r0; + d3 += h4 * (5 * r9); + c = (d3 >>> 13); d3 &= 0x1fff; + d3 += h5 * (5 * r8); + d3 += h6 * (5 * r7); + d3 += h7 * (5 * r6); + d3 += h8 * (5 * r5); + d3 += h9 * (5 * r4); + c += (d3 >>> 13); d3 &= 0x1fff; - d4 = c; - d4 += h0 * r4; - d4 += h1 * r3; - d4 += h2 * r2; - d4 += h3 * r1; - d4 += h4 * r0; - c = (d4 >>> 13); d4 &= 0x1fff; - d4 += h5 * (5 * r9); - d4 += h6 * (5 * r8); - d4 += h7 * (5 * r7); - d4 += h8 * (5 * r6); - d4 += h9 * (5 * r5); - c += (d4 >>> 13); d4 &= 0x1fff; + d4 = c; + d4 += h0 * r4; + d4 += h1 * r3; + d4 += h2 * r2; + d4 += h3 * r1; + d4 += h4 * r0; + c = (d4 >>> 13); d4 &= 0x1fff; + d4 += h5 * (5 * r9); + d4 += h6 * (5 * r8); + d4 += h7 * (5 * r7); + d4 += h8 * (5 * r6); + d4 += h9 * (5 * r5); + c += (d4 >>> 13); d4 &= 0x1fff; - d5 = c; - d5 += h0 * r5; - d5 += h1 * r4; - d5 += h2 * r3; - d5 += h3 * r2; - d5 += h4 * r1; - c = (d5 >>> 13); d5 &= 0x1fff; - d5 += h5 * r0; - d5 += h6 * (5 * r9); - d5 += h7 * (5 * r8); - d5 += h8 * (5 * r7); - d5 += h9 * (5 * r6); - c += (d5 >>> 13); d5 &= 0x1fff; + d5 = c; + d5 += h0 * r5; + d5 += h1 * r4; + d5 += h2 * r3; + d5 += h3 * r2; + d5 += h4 * r1; + c = (d5 >>> 13); d5 &= 0x1fff; + d5 += h5 * r0; + d5 += h6 * (5 * r9); + d5 += h7 * (5 * r8); + d5 += h8 * (5 * r7); + d5 += h9 * (5 * r6); + c += (d5 >>> 13); d5 &= 0x1fff; - d6 = c; - d6 += h0 * r6; - d6 += h1 * r5; - d6 += h2 * r4; - d6 += h3 * r3; - d6 += h4 * r2; - c = (d6 >>> 13); d6 &= 0x1fff; - d6 += h5 * r1; - d6 += h6 * r0; - d6 += h7 * (5 * r9); - d6 += h8 * (5 * r8); - d6 += h9 * (5 * r7); - c += (d6 >>> 13); d6 &= 0x1fff; + d6 = c; + d6 += h0 * r6; + d6 += h1 * r5; + d6 += h2 * r4; + d6 += h3 * r3; + d6 += h4 * r2; + c = (d6 >>> 13); d6 &= 0x1fff; + d6 += h5 * r1; + d6 += h6 * r0; + d6 += h7 * (5 * r9); + d6 += h8 * (5 * r8); + d6 += h9 * (5 * r7); + c += (d6 >>> 13); d6 &= 0x1fff; - d7 = c; - d7 += h0 * r7; - d7 += h1 * r6; - d7 += h2 * r5; - d7 += h3 * r4; - d7 += h4 * r3; - c = (d7 >>> 13); d7 &= 0x1fff; - d7 += h5 * r2; - d7 += h6 * r1; - d7 += h7 * r0; - d7 += h8 * (5 * r9); - d7 += h9 * (5 * r8); - c += (d7 >>> 13); d7 &= 0x1fff; + d7 = c; + d7 += h0 * r7; + d7 += h1 * r6; + d7 += h2 * r5; + d7 += h3 * r4; + d7 += h4 * r3; + c = (d7 >>> 13); d7 &= 0x1fff; + d7 += h5 * r2; + d7 += h6 * r1; + d7 += h7 * r0; + d7 += h8 * (5 * r9); + d7 += h9 * (5 * r8); + c += (d7 >>> 13); d7 &= 0x1fff; - d8 = c; - d8 += h0 * r8; - d8 += h1 * r7; - d8 += h2 * r6; - d8 += h3 * r5; - d8 += h4 * r4; - c = (d8 >>> 13); d8 &= 0x1fff; - d8 += h5 * r3; - d8 += h6 * r2; - d8 += h7 * r1; - d8 += h8 * r0; - d8 += h9 * (5 * r9); - c += (d8 >>> 13); d8 &= 0x1fff; + d8 = c; + d8 += h0 * r8; + d8 += h1 * r7; + d8 += h2 * r6; + d8 += h3 * r5; + d8 += h4 * r4; + c = (d8 >>> 13); d8 &= 0x1fff; + d8 += h5 * r3; + d8 += h6 * r2; + d8 += h7 * r1; + d8 += h8 * r0; + d8 += h9 * (5 * r9); + c += (d8 >>> 13); d8 &= 0x1fff; - d9 = c; - d9 += h0 * r9; - d9 += h1 * r8; - d9 += h2 * r7; - d9 += h3 * r6; - d9 += h4 * r5; - c = (d9 >>> 13); d9 &= 0x1fff; - d9 += h5 * r4; - d9 += h6 * r3; - d9 += h7 * r2; - d9 += h8 * r1; - d9 += h9 * r0; - c += (d9 >>> 13); d9 &= 0x1fff; + d9 = c; + d9 += h0 * r9; + d9 += h1 * r8; + d9 += h2 * r7; + d9 += h3 * r6; + d9 += h4 * r5; + c = (d9 >>> 13); d9 &= 0x1fff; + d9 += h5 * r4; + d9 += h6 * r3; + d9 += h7 * r2; + d9 += h8 * r1; + d9 += h9 * r0; + c += (d9 >>> 13); d9 &= 0x1fff; - c = (((c << 2) + c)) | 0; - c = (c + d0) | 0; - d0 = c & 0x1fff; - c = (c >>> 13); - d1 += c; + c = (((c << 2) + c)) | 0; + c = (c + d0) | 0; + d0 = c & 0x1fff; + c = (c >>> 13); + d1 += c; - h0 = d0; - h1 = d1; - h2 = d2; - h3 = d3; - h4 = d4; - h5 = d5; - h6 = d6; - h7 = d7; - h8 = d8; - h9 = d9; + h0 = d0; + h1 = d1; + h2 = d2; + h3 = d3; + h4 = d4; + h5 = d5; + h6 = d6; + h7 = d7; + h8 = d8; + h9 = d9; - mpos += 16; - bytes -= 16; - } - this.h[0] = h0; - this.h[1] = h1; - this.h[2] = h2; - this.h[3] = h3; - this.h[4] = h4; - this.h[5] = h5; - this.h[6] = h6; - this.h[7] = h7; - this.h[8] = h8; - this.h[9] = h9; + mpos += 16; + bytes -= 16; + } + this.h[0] = h0; + this.h[1] = h1; + this.h[2] = h2; + this.h[3] = h3; + this.h[4] = h4; + this.h[5] = h5; + this.h[6] = h6; + this.h[7] = h7; + this.h[8] = h8; + this.h[9] = h9; }; -poly1305.prototype.finish = function(mac, macpos) { - var g = new Uint16Array(10); - var c, mask, f, i; +poly1305.prototype.finish = function (mac, macpos) { + var g = new Uint16Array(10); + var c, mask, f, i; - if (this.leftover) { - i = this.leftover; - this.buffer[i++] = 1; - for (; i < 16; i++) this.buffer[i] = 0; - this.fin = 1; - this.blocks(this.buffer, 0, 16); - } + if (this.leftover) { + i = this.leftover; + this.buffer[i++] = 1; + for (; i < 16; i++) this.buffer[i] = 0; + this.fin = 1; + this.blocks(this.buffer, 0, 16); + } - c = this.h[1] >>> 13; - this.h[1] &= 0x1fff; - for (i = 2; i < 10; i++) { - this.h[i] += c; - c = this.h[i] >>> 13; - this.h[i] &= 0x1fff; - } - this.h[0] += (c * 5); - c = this.h[0] >>> 13; - this.h[0] &= 0x1fff; - this.h[1] += c; - c = this.h[1] >>> 13; - this.h[1] &= 0x1fff; - this.h[2] += c; + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + for (i = 2; i < 10; i++) { + this.h[i] += c; + c = this.h[i] >>> 13; + this.h[i] &= 0x1fff; + } + this.h[0] += (c * 5); + c = this.h[0] >>> 13; + this.h[0] &= 0x1fff; + this.h[1] += c; + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + this.h[2] += c; - g[0] = this.h[0] + 5; - c = g[0] >>> 13; - g[0] &= 0x1fff; - for (i = 1; i < 10; i++) { - g[i] = this.h[i] + c; - c = g[i] >>> 13; - g[i] &= 0x1fff; - } - g[9] -= (1 << 13); + g[0] = this.h[0] + 5; + c = g[0] >>> 13; + g[0] &= 0x1fff; + for (i = 1; i < 10; i++) { + g[i] = this.h[i] + c; + c = g[i] >>> 13; + g[i] &= 0x1fff; + } + g[9] -= (1 << 13); - mask = (g[9] >>> ((2 * 8) - 1)) - 1; - for (i = 0; i < 10; i++) g[i] &= mask; - mask = ~mask; - for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; + mask = (g[9] >>> ((2 * 8) - 1)) - 1; + for (i = 0; i < 10; i++) g[i] &= mask; + mask = ~mask; + for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; - this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff; - this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff; - this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff; - this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff; - this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; - this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff; - this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff; - this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff; + this.h[0] = ((this.h[0]) | (this.h[1] << 13)) & 0xffff; + this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10)) & 0xffff; + this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7)) & 0xffff; + this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4)) & 0xffff; + this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; + this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11)) & 0xffff; + this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8)) & 0xffff; + this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5)) & 0xffff; - f = this.h[0] + this.pad[0]; - this.h[0] = f & 0xffff; - for (i = 1; i < 8; i++) { - f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; - this.h[i] = f & 0xffff; - } + f = this.h[0] + this.pad[0]; + this.h[0] = f & 0xffff; + for (i = 1; i < 8; i++) { + f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; + this.h[i] = f & 0xffff; + } - mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff; - mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff; - mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff; - mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff; - mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff; - mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff; - mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff; - mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff; - mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff; - mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff; - mac[macpos+10] = (this.h[5] >>> 0) & 0xff; - mac[macpos+11] = (this.h[5] >>> 8) & 0xff; - mac[macpos+12] = (this.h[6] >>> 0) & 0xff; - mac[macpos+13] = (this.h[6] >>> 8) & 0xff; - mac[macpos+14] = (this.h[7] >>> 0) & 0xff; - mac[macpos+15] = (this.h[7] >>> 8) & 0xff; + mac[macpos + 0] = (this.h[0] >>> 0) & 0xff; + mac[macpos + 1] = (this.h[0] >>> 8) & 0xff; + mac[macpos + 2] = (this.h[1] >>> 0) & 0xff; + mac[macpos + 3] = (this.h[1] >>> 8) & 0xff; + mac[macpos + 4] = (this.h[2] >>> 0) & 0xff; + mac[macpos + 5] = (this.h[2] >>> 8) & 0xff; + mac[macpos + 6] = (this.h[3] >>> 0) & 0xff; + mac[macpos + 7] = (this.h[3] >>> 8) & 0xff; + mac[macpos + 8] = (this.h[4] >>> 0) & 0xff; + mac[macpos + 9] = (this.h[4] >>> 8) & 0xff; + mac[macpos + 10] = (this.h[5] >>> 0) & 0xff; + mac[macpos + 11] = (this.h[5] >>> 8) & 0xff; + mac[macpos + 12] = (this.h[6] >>> 0) & 0xff; + mac[macpos + 13] = (this.h[6] >>> 8) & 0xff; + mac[macpos + 14] = (this.h[7] >>> 0) & 0xff; + mac[macpos + 15] = (this.h[7] >>> 8) & 0xff; }; -poly1305.prototype.update = function(m, mpos, bytes) { - var i, want; +poly1305.prototype.update = function (m, mpos, bytes) { + var i, want; - if (this.leftover) { - want = (16 - this.leftover); - if (want > bytes) - want = bytes; - for (i = 0; i < want; i++) - this.buffer[this.leftover + i] = m[mpos+i]; - bytes -= want; - mpos += want; - this.leftover += want; - if (this.leftover < 16) - return; - this.blocks(this.buffer, 0, 16); - this.leftover = 0; - } + if (this.leftover) { + want = (16 - this.leftover); + if (want > bytes) + want = bytes; + for (i = 0; i < want; i++) + this.buffer[this.leftover + i] = m[mpos + i]; + bytes -= want; + mpos += want; + this.leftover += want; + if (this.leftover < 16) + return; + this.blocks(this.buffer, 0, 16); + this.leftover = 0; + } - if (bytes >= 16) { - want = bytes - (bytes % 16); - this.blocks(m, mpos, want); - mpos += want; - bytes -= want; - } + if (bytes >= 16) { + want = bytes - (bytes % 16); + this.blocks(m, mpos, want); + mpos += want; + bytes -= want; + } - if (bytes) { - for (i = 0; i < bytes; i++) - this.buffer[this.leftover + i] = m[mpos+i]; - this.leftover += bytes; - } + if (bytes) { + for (i = 0; i < bytes; i++) + this.buffer[this.leftover + i] = m[mpos + i]; + this.leftover += bytes; + } }; function crypto_onetimeauth(out, outpos, m, mpos, n, k) { - var s = new poly1305(k); - s.update(m, mpos, n); - s.finish(out, outpos); - return 0; + var s = new poly1305(k); + s.update(m, mpos, n); + s.finish(out, outpos); + return 0; } function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { - var x = new Uint8Array(16); - crypto_onetimeauth(x,0,m,mpos,n,k); - return crypto_verify_16(h,hpos,x,0); + var x = new Uint8Array(16); + crypto_onetimeauth(x, 0, m, mpos, n, k); + return crypto_verify_16(h, hpos, x, 0); } -function crypto_secretbox(c,m,d,n,k) { - var i; - if (d < 32) return -1; - crypto_stream_xor(c,0,m,0,d,n,k); - crypto_onetimeauth(c, 16, c, 32, d - 32, c); - for (i = 0; i < 16; i++) c[i] = 0; - return 0; +function crypto_secretbox(c, m, d, n, k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c, 0, m, 0, d, n, k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; } -function crypto_secretbox_open(m,c,d,n,k) { - var i; - var x = new Uint8Array(32); - if (d < 32) return -1; - crypto_stream(x,0,32,n,k); - if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; - crypto_stream_xor(m,0,c,0,d,n,k); - for (i = 0; i < 32; i++) m[i] = 0; - return 0; +function crypto_secretbox_open(m, c, d, n, k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x, 0, 32, n, k); + if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1; + crypto_stream_xor(m, 0, c, 0, d, n, k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; } function set25519(r, a) { - var i; - for (i = 0; i < 16; i++) r[i] = a[i]|0; + var i; + for (i = 0; i < 16; i++) r[i] = a[i] | 0; } function car25519(o) { - var i, v, c = 1; - for (i = 0; i < 16; i++) { - v = o[i] + c + 65535; - c = Math.floor(v / 65536); - o[i] = v - c * 65536; - } - o[0] += c-1 + 37 * (c-1); + var i, v, c = 1; + for (i = 0; i < 16; i++) { + v = o[i] + c + 65535; + c = Math.floor(v / 65536); + o[i] = v - c * 65536; + } + o[0] += c - 1 + 37 * (c - 1); } function sel25519(p, q, b) { - var t, c = ~(b-1); - for (var i = 0; i < 16; i++) { - t = c & (p[i] ^ q[i]); - p[i] ^= t; - q[i] ^= t; - } + var t, c = ~(b - 1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } } function pack25519(o, n) { - var i, j, b; - var m = gf(), t = gf(); - for (i = 0; i < 16; i++) t[i] = n[i]; - car25519(t); - car25519(t); - car25519(t); - for (j = 0; j < 2; j++) { - m[0] = t[0] - 0xffed; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); - m[i-1] &= 0xffff; - } - m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); - b = (m[15]>>16) & 1; - m[14] &= 0xffff; - sel25519(t, m, 1-b); - } - for (i = 0; i < 16; i++) { - o[2*i] = t[i] & 0xff; - o[2*i+1] = t[i]>>8; - } + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1); + m[i - 1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1); + b = (m[15] >> 16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1 - b); + } + for (i = 0; i < 16; i++) { + o[2 * i] = t[i] & 0xff; + o[2 * i + 1] = t[i] >> 8; + } } function neq25519(a, b) { - var c = new Uint8Array(32), d = new Uint8Array(32); - pack25519(c, a); - pack25519(d, b); - return crypto_verify_32(c, 0, d, 0); + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); } function par25519(a) { - var d = new Uint8Array(32); - pack25519(d, a); - return d[0] & 1; + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; } function unpack25519(o, n) { - var i; - for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); - o[15] &= 0x7fff; + var i; + for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8); + o[15] &= 0x7fff; } function A(o, a, b) { - for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; + for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; } function Z(o, a, b) { - for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; + for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; } function M(o, a, b) { - var v, c, - t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, - t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, - t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, - t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, - b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11], - b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; + var v, c, + t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, + t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, + t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, + t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, + b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7], + b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11], + b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; - v = a[0]; - t0 += v * b0; - t1 += v * b1; - t2 += v * b2; - t3 += v * b3; - t4 += v * b4; - t5 += v * b5; - t6 += v * b6; - t7 += v * b7; - t8 += v * b8; - t9 += v * b9; - t10 += v * b10; - t11 += v * b11; - t12 += v * b12; - t13 += v * b13; - t14 += v * b14; - t15 += v * b15; - v = a[1]; - t1 += v * b0; - t2 += v * b1; - t3 += v * b2; - t4 += v * b3; - t5 += v * b4; - t6 += v * b5; - t7 += v * b6; - t8 += v * b7; - t9 += v * b8; - t10 += v * b9; - t11 += v * b10; - t12 += v * b11; - t13 += v * b12; - t14 += v * b13; - t15 += v * b14; - t16 += v * b15; - v = a[2]; - t2 += v * b0; - t3 += v * b1; - t4 += v * b2; - t5 += v * b3; - t6 += v * b4; - t7 += v * b5; - t8 += v * b6; - t9 += v * b7; - t10 += v * b8; - t11 += v * b9; - t12 += v * b10; - t13 += v * b11; - t14 += v * b12; - t15 += v * b13; - t16 += v * b14; - t17 += v * b15; - v = a[3]; - t3 += v * b0; - t4 += v * b1; - t5 += v * b2; - t6 += v * b3; - t7 += v * b4; - t8 += v * b5; - t9 += v * b6; - t10 += v * b7; - t11 += v * b8; - t12 += v * b9; - t13 += v * b10; - t14 += v * b11; - t15 += v * b12; - t16 += v * b13; - t17 += v * b14; - t18 += v * b15; - v = a[4]; - t4 += v * b0; - t5 += v * b1; - t6 += v * b2; - t7 += v * b3; - t8 += v * b4; - t9 += v * b5; - t10 += v * b6; - t11 += v * b7; - t12 += v * b8; - t13 += v * b9; - t14 += v * b10; - t15 += v * b11; - t16 += v * b12; - t17 += v * b13; - t18 += v * b14; - t19 += v * b15; - v = a[5]; - t5 += v * b0; - t6 += v * b1; - t7 += v * b2; - t8 += v * b3; - t9 += v * b4; - t10 += v * b5; - t11 += v * b6; - t12 += v * b7; - t13 += v * b8; - t14 += v * b9; - t15 += v * b10; - t16 += v * b11; - t17 += v * b12; - t18 += v * b13; - t19 += v * b14; - t20 += v * b15; - v = a[6]; - t6 += v * b0; - t7 += v * b1; - t8 += v * b2; - t9 += v * b3; - t10 += v * b4; - t11 += v * b5; - t12 += v * b6; - t13 += v * b7; - t14 += v * b8; - t15 += v * b9; - t16 += v * b10; - t17 += v * b11; - t18 += v * b12; - t19 += v * b13; - t20 += v * b14; - t21 += v * b15; - v = a[7]; - t7 += v * b0; - t8 += v * b1; - t9 += v * b2; - t10 += v * b3; - t11 += v * b4; - t12 += v * b5; - t13 += v * b6; - t14 += v * b7; - t15 += v * b8; - t16 += v * b9; - t17 += v * b10; - t18 += v * b11; - t19 += v * b12; - t20 += v * b13; - t21 += v * b14; - t22 += v * b15; - v = a[8]; - t8 += v * b0; - t9 += v * b1; - t10 += v * b2; - t11 += v * b3; - t12 += v * b4; - t13 += v * b5; - t14 += v * b6; - t15 += v * b7; - t16 += v * b8; - t17 += v * b9; - t18 += v * b10; - t19 += v * b11; - t20 += v * b12; - t21 += v * b13; - t22 += v * b14; - t23 += v * b15; - v = a[9]; - t9 += v * b0; - t10 += v * b1; - t11 += v * b2; - t12 += v * b3; - t13 += v * b4; - t14 += v * b5; - t15 += v * b6; - t16 += v * b7; - t17 += v * b8; - t18 += v * b9; - t19 += v * b10; - t20 += v * b11; - t21 += v * b12; - t22 += v * b13; - t23 += v * b14; - t24 += v * b15; - v = a[10]; - t10 += v * b0; - t11 += v * b1; - t12 += v * b2; - t13 += v * b3; - t14 += v * b4; - t15 += v * b5; - t16 += v * b6; - t17 += v * b7; - t18 += v * b8; - t19 += v * b9; - t20 += v * b10; - t21 += v * b11; - t22 += v * b12; - t23 += v * b13; - t24 += v * b14; - t25 += v * b15; - v = a[11]; - t11 += v * b0; - t12 += v * b1; - t13 += v * b2; - t14 += v * b3; - t15 += v * b4; - t16 += v * b5; - t17 += v * b6; - t18 += v * b7; - t19 += v * b8; - t20 += v * b9; - t21 += v * b10; - t22 += v * b11; - t23 += v * b12; - t24 += v * b13; - t25 += v * b14; - t26 += v * b15; - v = a[12]; - t12 += v * b0; - t13 += v * b1; - t14 += v * b2; - t15 += v * b3; - t16 += v * b4; - t17 += v * b5; - t18 += v * b6; - t19 += v * b7; - t20 += v * b8; - t21 += v * b9; - t22 += v * b10; - t23 += v * b11; - t24 += v * b12; - t25 += v * b13; - t26 += v * b14; - t27 += v * b15; - v = a[13]; - t13 += v * b0; - t14 += v * b1; - t15 += v * b2; - t16 += v * b3; - t17 += v * b4; - t18 += v * b5; - t19 += v * b6; - t20 += v * b7; - t21 += v * b8; - t22 += v * b9; - t23 += v * b10; - t24 += v * b11; - t25 += v * b12; - t26 += v * b13; - t27 += v * b14; - t28 += v * b15; - v = a[14]; - t14 += v * b0; - t15 += v * b1; - t16 += v * b2; - t17 += v * b3; - t18 += v * b4; - t19 += v * b5; - t20 += v * b6; - t21 += v * b7; - t22 += v * b8; - t23 += v * b9; - t24 += v * b10; - t25 += v * b11; - t26 += v * b12; - t27 += v * b13; - t28 += v * b14; - t29 += v * b15; - v = a[15]; - t15 += v * b0; - t16 += v * b1; - t17 += v * b2; - t18 += v * b3; - t19 += v * b4; - t20 += v * b5; - t21 += v * b6; - t22 += v * b7; - t23 += v * b8; - t24 += v * b9; - t25 += v * b10; - t26 += v * b11; - t27 += v * b12; - t28 += v * b13; - t29 += v * b14; - t30 += v * b15; + v = a[0]; + t0 += v * b0; + t1 += v * b1; + t2 += v * b2; + t3 += v * b3; + t4 += v * b4; + t5 += v * b5; + t6 += v * b6; + t7 += v * b7; + t8 += v * b8; + t9 += v * b9; + t10 += v * b10; + t11 += v * b11; + t12 += v * b12; + t13 += v * b13; + t14 += v * b14; + t15 += v * b15; + v = a[1]; + t1 += v * b0; + t2 += v * b1; + t3 += v * b2; + t4 += v * b3; + t5 += v * b4; + t6 += v * b5; + t7 += v * b6; + t8 += v * b7; + t9 += v * b8; + t10 += v * b9; + t11 += v * b10; + t12 += v * b11; + t13 += v * b12; + t14 += v * b13; + t15 += v * b14; + t16 += v * b15; + v = a[2]; + t2 += v * b0; + t3 += v * b1; + t4 += v * b2; + t5 += v * b3; + t6 += v * b4; + t7 += v * b5; + t8 += v * b6; + t9 += v * b7; + t10 += v * b8; + t11 += v * b9; + t12 += v * b10; + t13 += v * b11; + t14 += v * b12; + t15 += v * b13; + t16 += v * b14; + t17 += v * b15; + v = a[3]; + t3 += v * b0; + t4 += v * b1; + t5 += v * b2; + t6 += v * b3; + t7 += v * b4; + t8 += v * b5; + t9 += v * b6; + t10 += v * b7; + t11 += v * b8; + t12 += v * b9; + t13 += v * b10; + t14 += v * b11; + t15 += v * b12; + t16 += v * b13; + t17 += v * b14; + t18 += v * b15; + v = a[4]; + t4 += v * b0; + t5 += v * b1; + t6 += v * b2; + t7 += v * b3; + t8 += v * b4; + t9 += v * b5; + t10 += v * b6; + t11 += v * b7; + t12 += v * b8; + t13 += v * b9; + t14 += v * b10; + t15 += v * b11; + t16 += v * b12; + t17 += v * b13; + t18 += v * b14; + t19 += v * b15; + v = a[5]; + t5 += v * b0; + t6 += v * b1; + t7 += v * b2; + t8 += v * b3; + t9 += v * b4; + t10 += v * b5; + t11 += v * b6; + t12 += v * b7; + t13 += v * b8; + t14 += v * b9; + t15 += v * b10; + t16 += v * b11; + t17 += v * b12; + t18 += v * b13; + t19 += v * b14; + t20 += v * b15; + v = a[6]; + t6 += v * b0; + t7 += v * b1; + t8 += v * b2; + t9 += v * b3; + t10 += v * b4; + t11 += v * b5; + t12 += v * b6; + t13 += v * b7; + t14 += v * b8; + t15 += v * b9; + t16 += v * b10; + t17 += v * b11; + t18 += v * b12; + t19 += v * b13; + t20 += v * b14; + t21 += v * b15; + v = a[7]; + t7 += v * b0; + t8 += v * b1; + t9 += v * b2; + t10 += v * b3; + t11 += v * b4; + t12 += v * b5; + t13 += v * b6; + t14 += v * b7; + t15 += v * b8; + t16 += v * b9; + t17 += v * b10; + t18 += v * b11; + t19 += v * b12; + t20 += v * b13; + t21 += v * b14; + t22 += v * b15; + v = a[8]; + t8 += v * b0; + t9 += v * b1; + t10 += v * b2; + t11 += v * b3; + t12 += v * b4; + t13 += v * b5; + t14 += v * b6; + t15 += v * b7; + t16 += v * b8; + t17 += v * b9; + t18 += v * b10; + t19 += v * b11; + t20 += v * b12; + t21 += v * b13; + t22 += v * b14; + t23 += v * b15; + v = a[9]; + t9 += v * b0; + t10 += v * b1; + t11 += v * b2; + t12 += v * b3; + t13 += v * b4; + t14 += v * b5; + t15 += v * b6; + t16 += v * b7; + t17 += v * b8; + t18 += v * b9; + t19 += v * b10; + t20 += v * b11; + t21 += v * b12; + t22 += v * b13; + t23 += v * b14; + t24 += v * b15; + v = a[10]; + t10 += v * b0; + t11 += v * b1; + t12 += v * b2; + t13 += v * b3; + t14 += v * b4; + t15 += v * b5; + t16 += v * b6; + t17 += v * b7; + t18 += v * b8; + t19 += v * b9; + t20 += v * b10; + t21 += v * b11; + t22 += v * b12; + t23 += v * b13; + t24 += v * b14; + t25 += v * b15; + v = a[11]; + t11 += v * b0; + t12 += v * b1; + t13 += v * b2; + t14 += v * b3; + t15 += v * b4; + t16 += v * b5; + t17 += v * b6; + t18 += v * b7; + t19 += v * b8; + t20 += v * b9; + t21 += v * b10; + t22 += v * b11; + t23 += v * b12; + t24 += v * b13; + t25 += v * b14; + t26 += v * b15; + v = a[12]; + t12 += v * b0; + t13 += v * b1; + t14 += v * b2; + t15 += v * b3; + t16 += v * b4; + t17 += v * b5; + t18 += v * b6; + t19 += v * b7; + t20 += v * b8; + t21 += v * b9; + t22 += v * b10; + t23 += v * b11; + t24 += v * b12; + t25 += v * b13; + t26 += v * b14; + t27 += v * b15; + v = a[13]; + t13 += v * b0; + t14 += v * b1; + t15 += v * b2; + t16 += v * b3; + t17 += v * b4; + t18 += v * b5; + t19 += v * b6; + t20 += v * b7; + t21 += v * b8; + t22 += v * b9; + t23 += v * b10; + t24 += v * b11; + t25 += v * b12; + t26 += v * b13; + t27 += v * b14; + t28 += v * b15; + v = a[14]; + t14 += v * b0; + t15 += v * b1; + t16 += v * b2; + t17 += v * b3; + t18 += v * b4; + t19 += v * b5; + t20 += v * b6; + t21 += v * b7; + t22 += v * b8; + t23 += v * b9; + t24 += v * b10; + t25 += v * b11; + t26 += v * b12; + t27 += v * b13; + t28 += v * b14; + t29 += v * b15; + v = a[15]; + t15 += v * b0; + t16 += v * b1; + t17 += v * b2; + t18 += v * b3; + t19 += v * b4; + t20 += v * b5; + t21 += v * b6; + t22 += v * b7; + t23 += v * b8; + t24 += v * b9; + t25 += v * b10; + t26 += v * b11; + t27 += v * b12; + t28 += v * b13; + t29 += v * b14; + t30 += v * b15; - t0 += 38 * t16; - t1 += 38 * t17; - t2 += 38 * t18; - t3 += 38 * t19; - t4 += 38 * t20; - t5 += 38 * t21; - t6 += 38 * t22; - t7 += 38 * t23; - t8 += 38 * t24; - t9 += 38 * t25; - t10 += 38 * t26; - t11 += 38 * t27; - t12 += 38 * t28; - t13 += 38 * t29; - t14 += 38 * t30; - // t15 left as is + t0 += 38 * t16; + t1 += 38 * t17; + t2 += 38 * t18; + t3 += 38 * t19; + t4 += 38 * t20; + t5 += 38 * t21; + t6 += 38 * t22; + t7 += 38 * t23; + t8 += 38 * t24; + t9 += 38 * t25; + t10 += 38 * t26; + t11 += 38 * t27; + t12 += 38 * t28; + t13 += 38 * t29; + t14 += 38 * t30; + // t15 left as is - // first car - c = 1; - v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; - v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; - v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; - v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; - v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; - v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; - v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; - v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; - v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; - v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; - v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; - v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; - v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; - v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; - v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; - v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; - t0 += c-1 + 37 * (c-1); + // first car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c - 1 + 37 * (c - 1); - // second car - c = 1; - v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; - v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; - v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; - v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; - v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; - v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; - v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; - v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; - v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; - v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; - v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; - v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; - v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; - v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; - v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; - v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; - t0 += c-1 + 37 * (c-1); + // second car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c - 1 + 37 * (c - 1); - o[ 0] = t0; - o[ 1] = t1; - o[ 2] = t2; - o[ 3] = t3; - o[ 4] = t4; - o[ 5] = t5; - o[ 6] = t6; - o[ 7] = t7; - o[ 8] = t8; - o[ 9] = t9; - o[10] = t10; - o[11] = t11; - o[12] = t12; - o[13] = t13; - o[14] = t14; - o[15] = t15; + o[0] = t0; + o[1] = t1; + o[2] = t2; + o[3] = t3; + o[4] = t4; + o[5] = t5; + o[6] = t6; + o[7] = t7; + o[8] = t8; + o[9] = t9; + o[10] = t10; + o[11] = t11; + o[12] = t12; + o[13] = t13; + o[14] = t14; + o[15] = t15; } function S(o, a) { - M(o, a, a); + M(o, a, a); } function inv25519(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 253; a >= 0; a--) { - S(c, c); - if(a !== 2 && a !== 4) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if (a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; } function pow2523(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 250; a >= 0; a--) { - S(c, c); - if(a !== 1) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if (a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; } function crypto_scalarmult(q, n, p) { - var z = new Uint8Array(32); - var x = new Float64Array(80), r, i; - var a = gf(), b = gf(), c = gf(), - d = gf(), e = gf(), f = gf(); - for (i = 0; i < 31; i++) z[i] = n[i]; - z[31]=(n[31]&127)|64; - z[0]&=248; - unpack25519(x,p); - for (i = 0; i < 16; i++) { - b[i]=x[i]; - d[i]=a[i]=c[i]=0; - } - a[0]=d[0]=1; - for (i=254; i>=0; --i) { - r=(z[i>>>3]>>>(i&7))&1; - sel25519(a,b,r); - sel25519(c,d,r); - A(e,a,c); - Z(a,a,c); - A(c,b,d); - Z(b,b,d); - S(d,e); - S(f,a); - M(a,c,a); - M(c,b,e); - A(e,a,c); - Z(a,a,c); - S(b,a); - Z(c,d,f); - M(a,c,_121665); - A(a,a,d); - M(c,c,a); - M(a,d,f); - M(d,b,x); - S(b,e); - sel25519(a,b,r); - sel25519(c,d,r); - } - for (i = 0; i < 16; i++) { - x[i+16]=a[i]; - x[i+32]=c[i]; - x[i+48]=b[i]; - x[i+64]=d[i]; - } - var x32 = x.subarray(32); - var x16 = x.subarray(16); - inv25519(x32,x32); - M(x16,x16,x32); - pack25519(q,x16); - return 0; + var z = new Uint8Array(32); + var x = new Float64Array(80), r, i; + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31] = (n[31] & 127) | 64; + z[0] &= 248; + unpack25519(x, p); + for (i = 0; i < 16; i++) { + b[i] = x[i]; + d[i] = a[i] = c[i] = 0; + } + a[0] = d[0] = 1; + for (i = 254; i >= 0; --i) { + r = (z[i >>> 3] >>> (i & 7)) & 1; + sel25519(a, b, r); + sel25519(c, d, r); + A(e, a, c); + Z(a, a, c); + A(c, b, d); + Z(b, b, d); + S(d, e); + S(f, a); + M(a, c, a); + M(c, b, e); + A(e, a, c); + Z(a, a, c); + S(b, a); + Z(c, d, f); + M(a, c, _121665); + A(a, a, d); + M(c, c, a); + M(a, d, f); + M(d, b, x); + S(b, e); + sel25519(a, b, r); + sel25519(c, d, r); + } + for (i = 0; i < 16; i++) { + x[i + 16] = a[i]; + x[i + 32] = c[i]; + x[i + 48] = b[i]; + x[i + 64] = d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32, x32); + M(x16, x16, x32); + pack25519(q, x16); + return 0; } function crypto_scalarmult_base(q, n) { - return crypto_scalarmult(q, n, _9); + return crypto_scalarmult(q, n, _9); } function crypto_box_keypair(y, x) { - randombytes(x, 32); - return crypto_scalarmult_base(y, x); + randombytes(x, 32); + return crypto_scalarmult_base(y, x); } function crypto_box_beforenm(k, y, x) { - var s = new Uint8Array(32); - crypto_scalarmult(s, x, y); - return crypto_core_hsalsa20(k, _0, s, sigma); + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); } var crypto_box_afternm = crypto_secretbox; var crypto_box_open_afternm = crypto_secretbox_open; function crypto_box(c, m, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_afternm(c, m, d, n, k); + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); } function crypto_box_open(m, c, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_open_afternm(m, c, d, n, k); + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); } var K = [ - 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, - 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, - 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, - 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, - 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, - 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, - 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, - 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, - 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, - 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, - 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, - 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, - 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, - 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, - 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, - 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, - 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, - 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, - 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, - 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, - 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, - 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, - 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, - 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, - 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, - 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, - 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, - 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, - 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, - 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, - 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, - 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, - 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, - 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, - 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, - 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, - 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, - 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, - 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, - 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 ]; function crypto_hashblocks_hl(hh, hl, m, n) { - var wh = new Int32Array(16), wl = new Int32Array(16), - bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, - bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, - th, tl, i, j, h, l, a, b, c, d; - - var ah0 = hh[0], - ah1 = hh[1], - ah2 = hh[2], - ah3 = hh[3], - ah4 = hh[4], - ah5 = hh[5], - ah6 = hh[6], - ah7 = hh[7], - - al0 = hl[0], - al1 = hl[1], - al2 = hl[2], - al3 = hl[3], - al4 = hl[4], - al5 = hl[5], - al6 = hl[6], - al7 = hl[7]; - - var pos = 0; - while (n >= 128) { - for (i = 0; i < 16; i++) { - j = 8 * i + pos; - wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3]; - wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7]; - } - for (i = 0; i < 80; i++) { - bh0 = ah0; - bh1 = ah1; - bh2 = ah2; - bh3 = ah3; - bh4 = ah4; - bh5 = ah5; - bh6 = ah6; - bh7 = ah7; - - bl0 = al0; - bl1 = al1; - bl2 = al2; - bl3 = al3; - bl4 = al4; - bl5 = al5; - bl6 = al6; - bl7 = al7; - - // add - h = ah7; - l = al7; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - // Sigma1 - h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32)))); - l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32)))); - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // Ch - h = (ah4 & ah5) ^ (~ah4 & ah6); - l = (al4 & al5) ^ (~al4 & al6); - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // K - h = K[i*2]; - l = K[i*2+1]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // w - h = wh[i%16]; - l = wl[i%16]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - th = c & 0xffff | d << 16; - tl = a & 0xffff | b << 16; - - // add - h = th; - l = tl; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - // Sigma0 - h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32)))); - l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32)))); - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // Maj - h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); - l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - bh7 = (c & 0xffff) | (d << 16); - bl7 = (a & 0xffff) | (b << 16); - - // add - h = bh3; - l = bl3; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = th; - l = tl; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + var wh = new Int32Array(16), wl = new Int32Array(16), + bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, + bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, + th, tl, i, j, h, l, a, b, c, d; + + var ah0 = hh[0], + ah1 = hh[1], + ah2 = hh[2], + ah3 = hh[3], + ah4 = hh[4], + ah5 = hh[5], + ah6 = hh[6], + ah7 = hh[7], + + al0 = hl[0], + al1 = hl[1], + al2 = hl[2], + al3 = hl[3], + al4 = hl[4], + al5 = hl[5], + al6 = hl[6], + al7 = hl[7]; + + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) { + j = 8 * i + pos; + wh[i] = (m[j + 0] << 24) | (m[j + 1] << 16) | (m[j + 2] << 8) | m[j + 3]; + wl[i] = (m[j + 4] << 24) | (m[j + 5] << 16) | (m[j + 6] << 8) | m[j + 7]; + } + for (i = 0; i < 80; i++) { + bh0 = ah0; + bh1 = ah1; + bh2 = ah2; + bh3 = ah3; + bh4 = ah4; + bh5 = ah5; + bh6 = ah6; + bh7 = ah7; + + bl0 = al0; + bl1 = al1; + bl2 = al2; + bl3 = al3; + bl4 = al4; + bl5 = al5; + bl6 = al6; + bl7 = al7; + + // add + h = ah7; + l = al7; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma1 + h = ((ah4 >>> 14) | (al4 << (32 - 14))) ^ ((ah4 >>> 18) | (al4 << (32 - 18))) ^ ((al4 >>> (41 - 32)) | (ah4 << (32 - (41 - 32)))); + l = ((al4 >>> 14) | (ah4 << (32 - 14))) ^ ((al4 >>> 18) | (ah4 << (32 - 18))) ^ ((ah4 >>> (41 - 32)) | (al4 << (32 - (41 - 32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Ch + h = (ah4 & ah5) ^ (~ah4 & ah6); + l = (al4 & al5) ^ (~al4 & al6); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // K + h = K[i * 2]; + l = K[i * 2 + 1]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // w + h = wh[i % 16]; + l = wl[i % 16]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + th = c & 0xffff | d << 16; + tl = a & 0xffff | b << 16; + + // add + h = th; + l = tl; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma0 + h = ((ah0 >>> 28) | (al0 << (32 - 28))) ^ ((al0 >>> (34 - 32)) | (ah0 << (32 - (34 - 32)))) ^ ((al0 >>> (39 - 32)) | (ah0 << (32 - (39 - 32)))); + l = ((al0 >>> 28) | (ah0 << (32 - 28))) ^ ((ah0 >>> (34 - 32)) | (al0 << (32 - (34 - 32)))) ^ ((ah0 >>> (39 - 32)) | (al0 << (32 - (39 - 32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Maj + h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); + l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + bh7 = (c & 0xffff) | (d << 16); + bl7 = (a & 0xffff) | (b << 16); + + // add + h = bh3; + l = bl3; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = th; + l = tl; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - bh3 = (c & 0xffff) | (d << 16); - bl3 = (a & 0xffff) | (b << 16); + bh3 = (c & 0xffff) | (d << 16); + bl3 = (a & 0xffff) | (b << 16); - ah1 = bh0; - ah2 = bh1; - ah3 = bh2; - ah4 = bh3; - ah5 = bh4; - ah6 = bh5; - ah7 = bh6; - ah0 = bh7; + ah1 = bh0; + ah2 = bh1; + ah3 = bh2; + ah4 = bh3; + ah5 = bh4; + ah6 = bh5; + ah7 = bh6; + ah0 = bh7; - al1 = bl0; - al2 = bl1; - al3 = bl2; - al4 = bl3; - al5 = bl4; - al6 = bl5; - al7 = bl6; - al0 = bl7; + al1 = bl0; + al2 = bl1; + al3 = bl2; + al4 = bl3; + al5 = bl4; + al6 = bl5; + al7 = bl6; + al0 = bl7; - if (i%16 === 15) { - for (j = 0; j < 16; j++) { - // add - h = wh[j]; - l = wl[j]; + if (i % 16 === 15) { + for (j = 0; j < 16; j++) { + // add + h = wh[j]; + l = wl[j]; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = wh[(j+9)%16]; - l = wl[(j+9)%16]; + h = wh[(j + 9) % 16]; + l = wl[(j + 9) % 16]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - // sigma0 - th = wh[(j+1)%16]; - tl = wl[(j+1)%16]; - h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7); - l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7))); + // sigma0 + th = wh[(j + 1) % 16]; + tl = wl[(j + 1) % 16]; + h = ((th >>> 1) | (tl << (32 - 1))) ^ ((th >>> 8) | (tl << (32 - 8))) ^ (th >>> 7); + l = ((tl >>> 1) | (th << (32 - 1))) ^ ((tl >>> 8) | (th << (32 - 8))) ^ ((tl >>> 7) | (th << (32 - 7))); - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - // sigma1 - th = wh[(j+14)%16]; - tl = wl[(j+14)%16]; - h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6); - l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6))); + // sigma1 + th = wh[(j + 14) % 16]; + tl = wl[(j + 14) % 16]; + h = ((th >>> 19) | (tl << (32 - 19))) ^ ((tl >>> (61 - 32)) | (th << (32 - (61 - 32)))) ^ (th >>> 6); + l = ((tl >>> 19) | (th << (32 - 19))) ^ ((th >>> (61 - 32)) | (tl << (32 - (61 - 32)))) ^ ((tl >>> 6) | (th << (32 - 6))); - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - wh[j] = (c & 0xffff) | (d << 16); - wl[j] = (a & 0xffff) | (b << 16); - } - } - } + wh[j] = (c & 0xffff) | (d << 16); + wl[j] = (a & 0xffff) | (b << 16); + } + } + } - // add - h = ah0; - l = al0; + // add + h = ah0; + l = al0; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[0]; - l = hl[0]; + h = hh[0]; + l = hl[0]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[0] = ah0 = (c & 0xffff) | (d << 16); - hl[0] = al0 = (a & 0xffff) | (b << 16); + hh[0] = ah0 = (c & 0xffff) | (d << 16); + hl[0] = al0 = (a & 0xffff) | (b << 16); - h = ah1; - l = al1; + h = ah1; + l = al1; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[1]; - l = hl[1]; + h = hh[1]; + l = hl[1]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[1] = ah1 = (c & 0xffff) | (d << 16); - hl[1] = al1 = (a & 0xffff) | (b << 16); + hh[1] = ah1 = (c & 0xffff) | (d << 16); + hl[1] = al1 = (a & 0xffff) | (b << 16); - h = ah2; - l = al2; + h = ah2; + l = al2; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[2]; - l = hl[2]; + h = hh[2]; + l = hl[2]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[2] = ah2 = (c & 0xffff) | (d << 16); - hl[2] = al2 = (a & 0xffff) | (b << 16); + hh[2] = ah2 = (c & 0xffff) | (d << 16); + hl[2] = al2 = (a & 0xffff) | (b << 16); - h = ah3; - l = al3; + h = ah3; + l = al3; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[3]; - l = hl[3]; + h = hh[3]; + l = hl[3]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[3] = ah3 = (c & 0xffff) | (d << 16); - hl[3] = al3 = (a & 0xffff) | (b << 16); + hh[3] = ah3 = (c & 0xffff) | (d << 16); + hl[3] = al3 = (a & 0xffff) | (b << 16); - h = ah4; - l = al4; + h = ah4; + l = al4; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[4]; - l = hl[4]; + h = hh[4]; + l = hl[4]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[4] = ah4 = (c & 0xffff) | (d << 16); - hl[4] = al4 = (a & 0xffff) | (b << 16); + hh[4] = ah4 = (c & 0xffff) | (d << 16); + hl[4] = al4 = (a & 0xffff) | (b << 16); - h = ah5; - l = al5; + h = ah5; + l = al5; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[5]; - l = hl[5]; + h = hh[5]; + l = hl[5]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[5] = ah5 = (c & 0xffff) | (d << 16); - hl[5] = al5 = (a & 0xffff) | (b << 16); + hh[5] = ah5 = (c & 0xffff) | (d << 16); + hl[5] = al5 = (a & 0xffff) | (b << 16); - h = ah6; - l = al6; + h = ah6; + l = al6; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[6]; - l = hl[6]; + h = hh[6]; + l = hl[6]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[6] = ah6 = (c & 0xffff) | (d << 16); - hl[6] = al6 = (a & 0xffff) | (b << 16); + hh[6] = ah6 = (c & 0xffff) | (d << 16); + hl[6] = al6 = (a & 0xffff) | (b << 16); - h = ah7; - l = al7; + h = ah7; + l = al7; - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; - h = hh[7]; - l = hl[7]; + h = hh[7]; + l = hl[7]; - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; - hh[7] = ah7 = (c & 0xffff) | (d << 16); - hl[7] = al7 = (a & 0xffff) | (b << 16); + hh[7] = ah7 = (c & 0xffff) | (d << 16); + hl[7] = al7 = (a & 0xffff) | (b << 16); - pos += 128; - n -= 128; - } + pos += 128; + n -= 128; + } - return n; + return n; } function crypto_hash(out, m, n) { - var hh = new Int32Array(8), - hl = new Int32Array(8), - x = new Uint8Array(256), - i, b = n; + var hh = new Int32Array(8), + hl = new Int32Array(8), + x = new Uint8Array(256), + i, b = n; - hh[0] = 0x6a09e667; - hh[1] = 0xbb67ae85; - hh[2] = 0x3c6ef372; - hh[3] = 0xa54ff53a; - hh[4] = 0x510e527f; - hh[5] = 0x9b05688c; - hh[6] = 0x1f83d9ab; - hh[7] = 0x5be0cd19; + hh[0] = 0x6a09e667; + hh[1] = 0xbb67ae85; + hh[2] = 0x3c6ef372; + hh[3] = 0xa54ff53a; + hh[4] = 0x510e527f; + hh[5] = 0x9b05688c; + hh[6] = 0x1f83d9ab; + hh[7] = 0x5be0cd19; - hl[0] = 0xf3bcc908; - hl[1] = 0x84caa73b; - hl[2] = 0xfe94f82b; - hl[3] = 0x5f1d36f1; - hl[4] = 0xade682d1; - hl[5] = 0x2b3e6c1f; - hl[6] = 0xfb41bd6b; - hl[7] = 0x137e2179; + hl[0] = 0xf3bcc908; + hl[1] = 0x84caa73b; + hl[2] = 0xfe94f82b; + hl[3] = 0x5f1d36f1; + hl[4] = 0xade682d1; + hl[5] = 0x2b3e6c1f; + hl[6] = 0xfb41bd6b; + hl[7] = 0x137e2179; - crypto_hashblocks_hl(hh, hl, m, n); - n %= 128; + crypto_hashblocks_hl(hh, hl, m, n); + n %= 128; - for (i = 0; i < n; i++) x[i] = m[b-n+i]; - x[n] = 128; + for (i = 0; i < n; i++) x[i] = m[b - n + i]; + x[n] = 128; - n = 256-128*(n<112?1:0); - x[n-9] = 0; - ts64(x, n-8, (b / 0x20000000) | 0, b << 3); - crypto_hashblocks_hl(hh, hl, x, n); + n = 256 - 128 * (n < 112 ? 1 : 0); + x[n - 9] = 0; + ts64(x, n - 8, (b / 0x20000000) | 0, b << 3); + crypto_hashblocks_hl(hh, hl, x, n); - for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]); + for (i = 0; i < 8; i++) ts64(out, 8 * i, hh[i], hl[i]); - return 0; + return 0; } function add(p, q) { - var a = gf(), b = gf(), c = gf(), - d = gf(), e = gf(), f = gf(), - g = gf(), h = gf(), t = gf(); + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(), + g = gf(), h = gf(), t = gf(); - Z(a, p[1], p[0]); - Z(t, q[1], q[0]); - M(a, a, t); - A(b, p[0], p[1]); - A(t, q[0], q[1]); - M(b, b, t); - M(c, p[3], q[3]); - M(c, c, D2); - M(d, p[2], q[2]); - A(d, d, d); - Z(e, b, a); - Z(f, d, c); - A(g, d, c); - A(h, b, a); + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); - M(p[0], e, f); - M(p[1], h, g); - M(p[2], g, f); - M(p[3], e, h); + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); } function cswap(p, q, b) { - var i; - for (i = 0; i < 4; i++) { - sel25519(p[i], q[i], b); - } + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } } function pack(r, p) { - var tx = gf(), ty = gf(), zi = gf(); - inv25519(zi, p[2]); - M(tx, p[0], zi); - M(ty, p[1], zi); - pack25519(r, ty); - r[31] ^= par25519(tx) << 7; + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; } function scalarmult(p, q, s) { - var b, i; - set25519(p[0], gf0); - set25519(p[1], gf1); - set25519(p[2], gf1); - set25519(p[3], gf0); - for (i = 255; i >= 0; --i) { - b = (s[(i/8)|0] >> (i&7)) & 1; - cswap(p, q, b); - add(q, p); - add(p, p); - cswap(p, q, b); - } + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i / 8) | 0] >> (i & 7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } } function scalarbase(p, s) { - var q = [gf(), gf(), gf(), gf()]; - set25519(q[0], X); - set25519(q[1], Y); - set25519(q[2], gf1); - M(q[3], X, Y); - scalarmult(p, q, s); + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); } function crypto_sign_keypair(pk, sk, seeded) { - var d = new Uint8Array(64); - var p = [gf(), gf(), gf(), gf()]; - var i; + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; - if (!seeded) randombytes(sk, 32); - crypto_hash(d, sk, 32); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; - scalarbase(p, d); - pack(pk, p); + scalarbase(p, d); + pack(pk, p); - for (i = 0; i < 32; i++) sk[i+32] = pk[i]; - return 0; + for (i = 0; i < 32; i++) sk[i + 32] = pk[i]; + return 0; } var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); function modL(r, x) { - var carry, i, j, k; - for (i = 63; i >= 32; --i) { - carry = 0; - for (j = i - 32, k = i - 12; j < k; ++j) { - x[j] += carry - 16 * x[i] * L[j - (i - 32)]; - carry = (x[j] + 128) >> 8; - x[j] -= carry * 256; - } - x[j] += carry; - x[i] = 0; - } - carry = 0; - for (j = 0; j < 32; j++) { - x[j] += carry - (x[31] >> 4) * L[j]; - carry = x[j] >> 8; - x[j] &= 255; - } - for (j = 0; j < 32; j++) x[j] -= carry * L[j]; - for (i = 0; i < 32; i++) { - x[i+1] += x[i] >> 8; - r[i] = x[i] & 255; - } + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i + 1] += x[i] >> 8; + r[i] = x[i] & 255; + } } function reduce(r) { - var x = new Float64Array(64), i; - for (i = 0; i < 64; i++) x[i] = r[i]; - for (i = 0; i < 64; i++) r[i] = 0; - modL(r, x); + var x = new Float64Array(64), i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); } // Note: difference from C - smlen returned, not passed as argument. function crypto_sign(sm, m, n, sk) { - var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); - var i, j, x = new Float64Array(64); - var p = [gf(), gf(), gf(), gf()]; + var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; - crypto_hash(d, sk, 32); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; - var smlen = n + 64; - for (i = 0; i < n; i++) sm[64 + i] = m[i]; - for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; - crypto_hash(r, sm.subarray(32), n+32); - reduce(r); - scalarbase(p, r); - pack(sm, p); + crypto_hash(r, sm.subarray(32), n + 32); + reduce(r); + scalarbase(p, r); + pack(sm, p); - for (i = 32; i < 64; i++) sm[i] = sk[i]; - crypto_hash(h, sm, n + 64); - reduce(h); + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); - for (i = 0; i < 64; i++) x[i] = 0; - for (i = 0; i < 32; i++) x[i] = r[i]; - for (i = 0; i < 32; i++) { - for (j = 0; j < 32; j++) { - x[i+j] += h[i] * d[j]; - } - } + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i + j] += h[i] * d[j]; + } + } - modL(sm.subarray(32), x); - return smlen; + modL(sm.subarray(32), x); + return smlen; } function unpackneg(r, p) { - var t = gf(), chk = gf(), num = gf(), - den = gf(), den2 = gf(), den4 = gf(), - den6 = gf(); + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); - set25519(r[2], gf1); - unpack25519(r[1], p); - S(num, r[1]); - M(den, num, D); - Z(num, num, r[2]); - A(den, r[2], den); + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); - S(den2, den); - S(den4, den2); - M(den6, den4, den2); - M(t, den6, num); - M(t, t, den); + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); - pow2523(t, t); - M(t, t, num); - M(t, t, den); - M(t, t, den); - M(r[0], t, den); + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) M(r[0], r[0], I); + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) return -1; + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; - if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + if (par25519(r[0]) === (p[31] >> 7)) Z(r[0], gf0, r[0]); - M(r[3], r[0], r[1]); - return 0; + M(r[3], r[0], r[1]); + return 0; } function crypto_sign_open(m, sm, n, pk) { - var i, mlen; - var t = new Uint8Array(32), h = new Uint8Array(64); - var p = [gf(), gf(), gf(), gf()], - q = [gf(), gf(), gf(), gf()]; + var i, mlen; + var t = new Uint8Array(32), h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; - mlen = -1; - if (n < 64) return -1; + mlen = -1; + if (n < 64) return -1; - if (unpackneg(q, pk)) return -1; + if (unpackneg(q, pk)) return -1; - for (i = 0; i < n; i++) m[i] = sm[i]; - for (i = 0; i < 32; i++) m[i+32] = pk[i]; - crypto_hash(h, m, n); - reduce(h); - scalarmult(p, q, h); + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i + 32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); - scalarbase(q, sm.subarray(32)); - add(p, q); - pack(t, p); + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); - n -= 64; - if (crypto_verify_32(sm, 0, t, 0)) { - for (i = 0; i < n; i++) m[i] = 0; - return -1; - } + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } - for (i = 0; i < n; i++) m[i] = sm[i + 64]; - mlen = n; - return mlen; + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + mlen = n; + return mlen; } var crypto_secretbox_KEYBYTES = 32, - crypto_secretbox_NONCEBYTES = 24, - crypto_secretbox_ZEROBYTES = 32, - crypto_secretbox_BOXZEROBYTES = 16, - crypto_scalarmult_BYTES = 32, - crypto_scalarmult_SCALARBYTES = 32, - crypto_box_PUBLICKEYBYTES = 32, - crypto_box_SECRETKEYBYTES = 32, - crypto_box_BEFORENMBYTES = 32, - crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, - crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, - crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, - crypto_sign_BYTES = 64, - crypto_sign_PUBLICKEYBYTES = 32, - crypto_sign_SECRETKEYBYTES = 64, - crypto_sign_SEEDBYTES = 32, - crypto_hash_BYTES = 64; + crypto_secretbox_NONCEBYTES = 24, + crypto_secretbox_ZEROBYTES = 32, + crypto_secretbox_BOXZEROBYTES = 16, + crypto_scalarmult_BYTES = 32, + crypto_scalarmult_SCALARBYTES = 32, + crypto_box_PUBLICKEYBYTES = 32, + crypto_box_SECRETKEYBYTES = 32, + crypto_box_BEFORENMBYTES = 32, + crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, + crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, + crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, + crypto_sign_BYTES = 64, + crypto_sign_PUBLICKEYBYTES = 32, + crypto_sign_SECRETKEYBYTES = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; nacl.lowlevel = { - crypto_core_hsalsa20: crypto_core_hsalsa20, - crypto_stream_xor: crypto_stream_xor, - crypto_stream: crypto_stream, - crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, - crypto_stream_salsa20: crypto_stream_salsa20, - crypto_onetimeauth: crypto_onetimeauth, - crypto_onetimeauth_verify: crypto_onetimeauth_verify, - crypto_verify_16: crypto_verify_16, - crypto_verify_32: crypto_verify_32, - crypto_secretbox: crypto_secretbox, - crypto_secretbox_open: crypto_secretbox_open, - crypto_scalarmult: crypto_scalarmult, - crypto_scalarmult_base: crypto_scalarmult_base, - crypto_box_beforenm: crypto_box_beforenm, - crypto_box_afternm: crypto_box_afternm, - crypto_box: crypto_box, - crypto_box_open: crypto_box_open, - crypto_box_keypair: crypto_box_keypair, - crypto_hash: crypto_hash, - crypto_sign: crypto_sign, - crypto_sign_keypair: crypto_sign_keypair, - crypto_sign_open: crypto_sign_open, + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, - crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, - crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, - crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, - crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, - crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, - crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, - crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, - crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, - crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, - crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, - crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, - crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, - crypto_sign_BYTES: crypto_sign_BYTES, - crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, - crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, - crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, - crypto_hash_BYTES: crypto_hash_BYTES + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES }; /* High-level API */ function checkLengths(k, n) { - if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); - if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); } function checkBoxLengths(pk, sk) { - if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); - if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); } function checkArrayTypes() { - var t, i; - for (i = 0; i < arguments.length; i++) { - if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') - throw new TypeError('unexpected type ' + t + ', use Uint8Array'); - } + var t, i; + for (i = 0; i < arguments.length; i++) { + if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') + throw new TypeError('unexpected type ' + t + ', use Uint8Array'); + } } function cleanup(arr) { - for (var i = 0; i < arr.length; i++) arr[i] = 0; + for (var i = 0; i < arr.length; i++) arr[i] = 0; } nacl.util = {}; -nacl.util.decodeUTF8 = function(s) { - var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; +nacl.util.decodeUTF8 = function (s) { + var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length); + for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); + return b; }; -nacl.util.encodeUTF8 = function(arr) { - var i, s = []; - for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i])); - return decodeURIComponent(escape(s.join(''))); +nacl.util.encodeUTF8 = function (arr) { + var i, s = []; + for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i])); + return decodeURIComponent(escape(s.join(''))); }; -nacl.util.encodeBase64 = function(arr) { - if (typeof btoa === 'undefined') { - return (new Buffer(arr)).toString('base64'); - } else { - var i, s = [], len = arr.length; - for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i])); - return btoa(s.join('')); - } +nacl.util.encodeBase64 = function (arr) { + if (typeof btoa === 'undefined') { + return (new Buffer(arr)).toString('base64'); + } else { + var i, s = [], len = arr.length; + for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i])); + return btoa(s.join('')); + } }; -nacl.util.decodeBase64 = function(s) { - if (typeof atob === 'undefined') { - return new Uint8Array(Array.prototype.slice.call(new Buffer(s, 'base64'), 0)); - } else { - var i, d = atob(s), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; - } +nacl.util.decodeBase64 = function (s) { + if (typeof atob === 'undefined') { + return new Uint8Array(Array.prototype.slice.call(new Buffer(s, 'base64'), 0)); + } else { + var i, d = atob(s), b = new Uint8Array(d.length); + for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); + return b; + } }; -nacl.randomBytes = function(n) { - var b = new Uint8Array(n); - randombytes(b, n); - return b; +nacl.randomBytes = function (n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; }; -nacl.secretbox = function(msg, nonce, key) { - checkArrayTypes(msg, nonce, key); - checkLengths(key, nonce); - var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); - var c = new Uint8Array(m.length); - for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; - crypto_secretbox(c, m, m.length, nonce, key); - return c.subarray(crypto_secretbox_BOXZEROBYTES); +nacl.secretbox = function (msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i + crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); }; -nacl.secretbox.open = function(box, nonce, key) { - checkArrayTypes(box, nonce, key); - checkLengths(key, nonce); - var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); - var m = new Uint8Array(c.length); - for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; - if (c.length < 32) return false; - if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; - return m.subarray(crypto_secretbox_ZEROBYTES); +nacl.secretbox.open = function (box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i + crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return false; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; + return m.subarray(crypto_secretbox_ZEROBYTES); }; nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; -nacl.scalarMult = function(n, p) { - checkArrayTypes(n, p); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); - if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult(q, n, p); - return q; +nacl.scalarMult = function (n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; }; -nacl.scalarMult.base = function(n) { - checkArrayTypes(n); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult_base(q, n); - return q; +nacl.scalarMult.base = function (n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; }; nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; -nacl.box = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox(msg, nonce, k); +nacl.box = function (msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); }; -nacl.box.before = function(publicKey, secretKey) { - checkArrayTypes(publicKey, secretKey); - checkBoxLengths(publicKey, secretKey); - var k = new Uint8Array(crypto_box_BEFORENMBYTES); - crypto_box_beforenm(k, publicKey, secretKey); - return k; +nacl.box.before = function (publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; }; nacl.box.after = nacl.secretbox; -nacl.box.open = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox.open(msg, nonce, k); +nacl.box.open = function (msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); }; nacl.box.open.after = nacl.secretbox.open; -nacl.box.keyPair = function() { - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); - crypto_box_keypair(pk, sk); - return {publicKey: pk, secretKey: sk}; +nacl.box.keyPair = function () { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return { publicKey: pk, secretKey: sk }; }; -nacl.box.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_box_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - crypto_scalarmult_base(pk, secretKey); - return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +nacl.box.keyPair.fromSecretKey = function (secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; }; nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; @@ -2288,75 +2286,75 @@ nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; nacl.box.nonceLength = crypto_box_NONCEBYTES; nacl.box.overheadLength = nacl.secretbox.overheadLength; -nacl.sign = function(msg, secretKey) { - checkArrayTypes(msg, secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); - crypto_sign(signedMsg, msg, msg.length, secretKey); - return signedMsg; +nacl.sign = function (msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; }; -nacl.sign.open = function(signedMsg, publicKey) { - if (arguments.length !== 2) - throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); - checkArrayTypes(signedMsg, publicKey); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) - throw new Error('bad public key size'); - var tmp = new Uint8Array(signedMsg.length); - var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); - if (mlen < 0) return null; - var m = new Uint8Array(mlen); - for (var i = 0; i < m.length; i++) m[i] = tmp[i]; - return m; +nacl.sign.open = function (signedMsg, publicKey) { + if (arguments.length !== 2) + throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; }; -nacl.sign.detached = function(msg, secretKey) { - var signedMsg = nacl.sign(msg, secretKey); - var sig = new Uint8Array(crypto_sign_BYTES); - for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; - return sig; +nacl.sign.detached = function (msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; }; -nacl.sign.detached.verify = function(msg, sig, publicKey) { - checkArrayTypes(msg, sig, publicKey); - if (sig.length !== crypto_sign_BYTES) - throw new Error('bad signature size'); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) - throw new Error('bad public key size'); - var sm = new Uint8Array(crypto_sign_BYTES + msg.length); - var m = new Uint8Array(crypto_sign_BYTES + msg.length); - var i; - for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; - for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; - return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); +nacl.sign.detached.verify = function (msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) + throw new Error('bad signature size'); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i]; + return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); }; -nacl.sign.keyPair = function() { - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - crypto_sign_keypair(pk, sk); - return {publicKey: pk, secretKey: sk}; +nacl.sign.keyPair = function () { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return { publicKey: pk, secretKey: sk }; }; -nacl.sign.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; - return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +nacl.sign.keyPair.fromSecretKey = function (secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32 + i]; + return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; }; -nacl.sign.keyPair.fromSeed = function(seed) { - checkArrayTypes(seed); - if (seed.length !== crypto_sign_SEEDBYTES) - throw new Error('bad seed size'); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - for (var i = 0; i < 32; i++) sk[i] = seed[i]; - crypto_sign_keypair(pk, sk, true); - return {publicKey: pk, secretKey: sk}; +nacl.sign.keyPair.fromSeed = function (seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) + throw new Error('bad seed size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return { publicKey: pk, secretKey: sk }; }; nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; @@ -2364,59 +2362,58 @@ nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; nacl.sign.seedLength = crypto_sign_SEEDBYTES; nacl.sign.signatureLength = crypto_sign_BYTES; -nacl.hash = function(msg) { - checkArrayTypes(msg); - var h = new Uint8Array(crypto_hash_BYTES); - crypto_hash(h, msg, msg.length); - return h; +nacl.hash = function (msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; }; nacl.hash.hashLength = crypto_hash_BYTES; -nacl.verify = function(x, y) { - checkArrayTypes(x, y); - // Zero length arguments are considered not equal. - if (x.length === 0 || y.length === 0) return false; - if (x.length !== y.length) return false; - return (vn(x, 0, y, 0, x.length) === 0); +nacl.verify = function (x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return (vn(x, 0, y, 0, x.length) === 0); }; -nacl.setPRNG = function(fn) { - randombytes = fn; +nacl.setPRNG = function (fn) { + randombytes = fn; }; -(function() { - // Initialize PRNG if environment provides CSPRNG. - // If not, methods calling randombytes will throw. - var crypto; - if (typeof window !== 'undefined') { - // Browser. - if (window.crypto && window.crypto.getRandomValues) { - crypto = window.crypto; // Standard - } else if (window.msCrypto && window.msCrypto.getRandomValues) { - crypto = window.msCrypto; // Internet Explorer 11+ - } - if (crypto) { - nacl.setPRNG(function(x, n) { - var i, v = new Uint8Array(n); - crypto.getRandomValues(v); - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } - } else if (typeof require !== 'undefined') { - // Node.js. - crypto = require('crypto'); - if (crypto) { - nacl.setPRNG(function(x, n) { - var i, v = crypto.randomBytes(n); - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } - } +(function () { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto; + if (typeof window !== 'undefined') { + // Browser. + if (window.crypto && window.crypto.getRandomValues) { + crypto = window.crypto; // Standard + } else if (window.msCrypto && window.msCrypto.getRandomValues) { + crypto = window.msCrypto; // Internet Explorer 11+ + } + if (crypto) { + nacl.setPRNG(function (x, n) { + var i, v = new Uint8Array(n); + crypto.getRandomValues(v); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } else if (typeof require !== 'undefined') { + // Node.js. + crypto = require('crypto'); + if (crypto) { + nacl.setPRNG(function (x, n) { + var i, v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } })(); // == CHANGE TO ES6 EXPORT == // -//})(typeof module !== 'undefined' && module.exports ? module.exports : (window.nacl = window.nacl || {})); export default nacl diff --git a/crypto/api/deps/qora.js b/crypto/api/deps/qora.js index 5c52ec44..bc385942 100644 --- a/crypto/api/deps/qora.js +++ b/crypto/api/deps/qora.js @@ -26,9 +26,8 @@ const TYPES = { MESSAGE_TRANSACTION: 17 }; -function getKeyPairFromSeed(seed, returnBase58) -{ - if(typeof(seed) == "string") { +function getKeyPairFromSeed(seed, returnBase58) { + if (typeof (seed) == "string") { seed = new Uint8Array(Base58.decode(seed)); } @@ -36,7 +35,7 @@ function getKeyPairFromSeed(seed, returnBase58) var base58privateKey = Base58.encode(keyPair.secretKey); var base58publicKey = Base58.encode(keyPair.publicKey); - if(returnBase58) { + if (returnBase58) { return { privateKey: Base58.encode(keyPair.secretKey), publicKey: Base58.encode(keyPair.publicKey) @@ -51,16 +50,16 @@ function getKeyPairFromSeed(seed, returnBase58) function stringtoUTF8Array(message) { if (typeof message == 'string') { - var s = unescape(encodeURIComponent(message)); // UTF-8 - message = new Uint8Array(s.length); - for (var i = 0; i < s.length; i++) { + var s = unescape(encodeURIComponent(message)); // UTF-8 + message = new Uint8Array(s.length); + for (var i = 0; i < s.length; i++) { message[i] = s.charCodeAt(i) & 0xff; } } return message; } -function int32ToBytes (word) { +function int32ToBytes(word) { var byteArray = []; for (var b = 0; b < 32; b += 8) { byteArray.push((word >>> (24 - b % 32)) & 0xFF); @@ -68,20 +67,20 @@ function int32ToBytes (word) { return byteArray; } -function int64ToBytes (int64) { - // we want to represent the input as a 8-bytes array - var byteArray = [0, 0, 0, 0, 0, 0, 0, 0]; +function int64ToBytes(int64) { + // we want to represent the input as a 8-bytes array + 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 ; - } + for (var index = 0; index < byteArray.length; index++) { + var byte = int64 & 0xff; + byteArray[byteArray.length - index - 1] = byte; + int64 = (int64 - byte) / 256; + } - return byteArray; + return byteArray; } -function appendBuffer (buffer1, buffer2) { +function appendBuffer(buffer1, buffer2) { buffer1 = new Uint8Array(buffer1); buffer2 = new Uint8Array(buffer2); var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); @@ -90,21 +89,18 @@ function appendBuffer (buffer1, buffer2) { return tmp; } -function 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; +function 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; } -function generateAccountSeed(seed, nonce, returnBase58) -{ - if(typeof(seed) == "string") { +function generateAccountSeed(seed, nonce, returnBase58) { + if (typeof (seed) == "string") { seed = Base58.decode(seed); } @@ -116,7 +112,7 @@ function generateAccountSeed(seed, nonce, returnBase58) resultSeed = appendBuffer(resultSeed, seed); resultSeed = appendBuffer(resultSeed, nonceBytes); - if(returnBase58) { + if (returnBase58) { return Base58.encode(SHA256.digest(SHA256.digest(resultSeed))); } else { return new SHA256.digest(SHA256.digest(resultSeed)); @@ -124,11 +120,10 @@ function generateAccountSeed(seed, nonce, returnBase58) } -function getAccountAddressFromPublicKey(publicKey) -{ +function getAccountAddressFromPublicKey(publicKey) { var ADDRESS_VERSION = 58; // Q - if(typeof(publicKey) == "string") { + if (typeof (publicKey) == "string") { publicKey = Base58.decode(publicKey); } @@ -150,13 +145,12 @@ function getAccountAddressFromPublicKey(publicKey) return Base58.encode(addressArray); } -function getAccountAddressType(address) -{ +function getAccountAddressType(address) { try { var ADDRESS_VERSION = 58; // Q var AT_ADDRESS_VERSION = 23; // A - if(typeof(address) == "string") { + if (typeof (address) == "string") { address = Base58.decode(address); } @@ -166,14 +160,11 @@ function getAccountAddressType(address) var checkSumTwo = SHA256.digest(SHA256.digest(addressWitoutChecksum)); checkSumTwo = checkSumTwo.subarray(0, 4); - if (equal(checkSum, checkSumTwo)) - { - if(address[0] == ADDRESS_VERSION) - { + if (equal(checkSum, checkSumTwo)) { + if (address[0] == ADDRESS_VERSION) { return "standard"; } - if(address[0] == AT_ADDRESS_VERSION) - { + if (address[0] == AT_ADDRESS_VERSION) { return "at"; } } @@ -185,8 +176,7 @@ function getAccountAddressType(address) } } -function isValidAddress(address) -{ +function isValidAddress(address) { return (getAccountAddressType(address) != "invalid"); } @@ -307,8 +297,8 @@ function generateSignatureRegisterNameTransaction(keyPair, lastReference, owner, } function generateRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp, signature) { - return appendBuffer( generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp), - signature ); + return appendBuffer(generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp), + signature); } function generateRegisterNameTransactionBase(publicKey, lastReference, owner, name, value, fee, timestamp) { @@ -333,4 +323,4 @@ function generateRegisterNameTransactionBase(publicKey, lastReference, owner, na data = appendBuffer(data, feeBytes); return data; -} \ No newline at end of file +} diff --git a/crypto/api/deps/ripemd160.js b/crypto/api/deps/ripemd160.js index a50d0035..88f72c31 100644 --- a/crypto/api/deps/ripemd160.js +++ b/crypto/api/deps/ripemd160.js @@ -1,5 +1,7 @@ // Extracted from https://github.com/crypto-browserify/ripemd160 + const ARRAY16 = new Array(16); + const zl = initU8Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, diff --git a/crypto/api/deps/sha256.js b/crypto/api/deps/sha256.js index e4f718f4..4b1fcb93 100644 --- a/crypto/api/deps/sha256.js +++ b/crypto/api/deps/sha256.js @@ -3,140 +3,139 @@ const SHA256 = {}; SHA256.K = [ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, - 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, - 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, - 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, - 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, - 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, - 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, - 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, - 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, - 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, + 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, + 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, + 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, + 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, + 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, + 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, + 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ]; // The digest function returns the hash value (digest) // as a 32 byte (typed) array. // message: the string or byte array to hash -SHA256.digest = function(message) { - var h0 = 0x6a09e667; - var h1 = 0xbb67ae85; - var h2 = 0x3c6ef372; - var h3 = 0xa54ff53a; - var h4 = 0x510e527f; - var h5 = 0x9b05688c; - var h6 = 0x1f83d9ab; - var h7 = 0x5be0cd19; - var K = SHA256.K; - if (typeof message == 'string') { - var s = unescape(encodeURIComponent(message)); // UTF-8 - message = new Uint8Array(s.length); - for (var i = 0; i < s.length; i++) { - message[i] = s.charCodeAt(i) & 0xff; - } - } - var length = message.length; - var byteLength = Math.floor((length + 72) / 64) * 64; - var wordLength = byteLength / 4; - var bitLength = length * 8; - var m = new Uint8Array(byteLength); - m.set(message); - m[length] = 0x80; - m[byteLength - 4] = bitLength >>> 24; - m[byteLength - 3] = (bitLength >>> 16) & 0xff; - m[byteLength - 2] = (bitLength >>> 8) & 0xff; - m[byteLength - 1] = bitLength & 0xff; - var words = new Int32Array(wordLength); - var byteIndex = 0; - for (var i = 0; i < words.length; i++) { - var word = m[byteIndex++] << 24; - word |= m[byteIndex++] << 16; - word |= m[byteIndex++] << 8; - word |= m[byteIndex++]; - words[i] = word; - } - var w = new Int32Array(64); - for (var j = 0; j < wordLength; j += 16) { - for (i = 0; i < 16; i++) { - w[i] = words[j + i]; - } - for (i = 16; i < 64; i++) { - var v = w[i - 15]; - var s0 = (v >>> 7) | (v << 25); - s0 ^= (v >>> 18) | (v << 14); - s0 ^= (v >>> 3); - v = w[i - 2]; - var s1 = (v >>> 17) | (v << 15); - s1 ^= (v >>> 19) | (v << 13); - s1 ^= (v >>> 10); - w[i] = (w[i - 16] + s0 + w[i - 7] + s1) & 0xffffffff; - } - var a = h0; - var b = h1; - var c = h2; - var d = h3; - var e = h4; - var f = h5; - var g = h6; - var h = h7; - for (i = 0; i < 64; i++) { - s1 = (e >>> 6) | (e << 26); - s1 ^= (e >>> 11) | (e << 21); - s1 ^= (e >>> 25) | (e << 7); - var ch = (e & f) ^ (~e & g); - var temp1 = (h + s1 + ch + K[i] + w[i]) & 0xffffffff; - s0 = (a >>> 2) | (a << 30); - s0 ^= (a >>> 13) | (a << 19); - s0 ^= (a >>> 22) | (a << 10); - var maj = (a & b) ^ (a & c) ^ (b & c); - var temp2 = (s0 + maj) & 0xffffffff; - h = g - g = f - f = e - e = (d + temp1) & 0xffffffff; - d = c; - c = b; - b = a; - a = (temp1 + temp2) & 0xffffffff; - } - h0 = (h0 + a) & 0xffffffff; - h1 = (h1 + b) & 0xffffffff; - h2 = (h2 + c) & 0xffffffff; - h3 = (h3 + d) & 0xffffffff; - h4 = (h4 + e) & 0xffffffff; - h5 = (h5 + f) & 0xffffffff; - h6 = (h6 + g) & 0xffffffff; - h7 = (h7 + h) & 0xffffffff; - } - var hash = new Uint8Array(32); - for (var i = 0; i < 4; i++) { - hash[i] = (h0 >>> (8 * (3 - i))) & 0xff; - hash[i + 4] = (h1 >>> (8 * (3 - i))) & 0xff; - hash[i + 8] = (h2 >>> (8 * (3 - i))) & 0xff; - hash[i + 12] = (h3 >>> (8 * (3 - i))) & 0xff; - hash[i + 16] = (h4 >>> (8 * (3 - i))) & 0xff; - hash[i + 20] = (h5 >>> (8 * (3 - i))) & 0xff; - hash[i + 24] = (h6 >>> (8 * (3 - i))) & 0xff; - hash[i + 28] = (h7 >>> (8 * (3 - i))) & 0xff; - } - return hash; -} +SHA256.digest = function (message) { + var h0 = 0x6a09e667; + var h1 = 0xbb67ae85; + var h2 = 0x3c6ef372; + var h3 = 0xa54ff53a; + var h4 = 0x510e527f; + var h5 = 0x9b05688c; + var h6 = 0x1f83d9ab; + var h7 = 0x5be0cd19; + var K = SHA256.K; + if (typeof message == 'string') { + var s = unescape(encodeURIComponent(message)); // UTF-8 + message = new Uint8Array(s.length); + for (var i = 0; i < s.length; i++) { + message[i] = s.charCodeAt(i) & 0xff; + } + } + var length = message.length; + var byteLength = Math.floor((length + 72) / 64) * 64; + var wordLength = byteLength / 4; + var bitLength = length * 8; + var m = new Uint8Array(byteLength); + m.set(message); + m[length] = 0x80; + m[byteLength - 4] = bitLength >>> 24; + m[byteLength - 3] = (bitLength >>> 16) & 0xff; + m[byteLength - 2] = (bitLength >>> 8) & 0xff; + m[byteLength - 1] = bitLength & 0xff; + var words = new Int32Array(wordLength); + var byteIndex = 0; + for (var i = 0; i < words.length; i++) { + var word = m[byteIndex++] << 24; + word |= m[byteIndex++] << 16; + word |= m[byteIndex++] << 8; + word |= m[byteIndex++]; + words[i] = word; + } + var w = new Int32Array(64); + for (var j = 0; j < wordLength; j += 16) { + for (i = 0; i < 16; i++) { + w[i] = words[j + i]; + } + for (i = 16; i < 64; i++) { + var v = w[i - 15]; + var s0 = (v >>> 7) | (v << 25); + s0 ^= (v >>> 18) | (v << 14); + s0 ^= (v >>> 3); + v = w[i - 2]; + var s1 = (v >>> 17) | (v << 15); + s1 ^= (v >>> 19) | (v << 13); + s1 ^= (v >>> 10); + w[i] = (w[i - 16] + s0 + w[i - 7] + s1) & 0xffffffff; + } + var a = h0; + var b = h1; + var c = h2; + var d = h3; + var e = h4; + var f = h5; + var g = h6; + var h = h7; + for (i = 0; i < 64; i++) { + s1 = (e >>> 6) | (e << 26); + s1 ^= (e >>> 11) | (e << 21); + s1 ^= (e >>> 25) | (e << 7); + var ch = (e & f) ^ (~e & g); + var temp1 = (h + s1 + ch + K[i] + w[i]) & 0xffffffff; + s0 = (a >>> 2) | (a << 30); + s0 ^= (a >>> 13) | (a << 19); + s0 ^= (a >>> 22) | (a << 10); + var maj = (a & b) ^ (a & c) ^ (b & c); + var temp2 = (s0 + maj) & 0xffffffff; + h = g + g = f + f = e + e = (d + temp1) & 0xffffffff; + d = c; + c = b; + b = a; + a = (temp1 + temp2) & 0xffffffff; + } + h0 = (h0 + a) & 0xffffffff; + h1 = (h1 + b) & 0xffffffff; + h2 = (h2 + c) & 0xffffffff; + h3 = (h3 + d) & 0xffffffff; + h4 = (h4 + e) & 0xffffffff; + h5 = (h5 + f) & 0xffffffff; + h6 = (h6 + g) & 0xffffffff; + h7 = (h7 + h) & 0xffffffff; + } + var hash = new Uint8Array(32); + for (var i = 0; i < 4; i++) { + hash[i] = (h0 >>> (8 * (3 - i))) & 0xff; + hash[i + 4] = (h1 >>> (8 * (3 - i))) & 0xff; + hash[i + 8] = (h2 >>> (8 * (3 - i))) & 0xff; + hash[i + 12] = (h3 >>> (8 * (3 - i))) & 0xff; + hash[i + 16] = (h4 >>> (8 * (3 - i))) & 0xff; + hash[i + 20] = (h5 >>> (8 * (3 - i))) & 0xff; + hash[i + 24] = (h6 >>> (8 * (3 - i))) & 0xff; + hash[i + 28] = (h7 >>> (8 * (3 - i))) & 0xff; + } + return hash; +} // The hash function returns the hash value as a hex string. // message: the string or byte array to hash -SHA256.hash = function(message) { - var digest = SHA256.digest(message); - var hex = ''; +SHA256.hash = function (message) { + var digest = SHA256.digest(message); + var hex = ''; for (var i = 0; i < digest.length; i++) { var s = '0' + digest[i].toString(16); - hex += s.length > 2 ? s.substring(1) : s; + hex += s.length > 2 ? s.substring(1) : s; } - return hex; + return hex; } - // == Convert to ES6 Module == // -export default SHA256; \ No newline at end of file +export default SHA256; diff --git a/crypto/api/deps/utils.js b/crypto/api/deps/utils.js index 20715934..ae83d18d 100644 --- a/crypto/api/deps/utils.js +++ b/crypto/api/deps/utils.js @@ -1,74 +1,73 @@ -'use strict' const utils = { - int32ToBytes(word) { - var byteArray = [] - for (var b = 0; b < 32; b += 8) { - byteArray.push((word >>> (24 - b % 32)) & 0xFF) - } - return byteArray - }, + int32ToBytes(word) { + var byteArray = [] + for (var b = 0; b < 32; b += 8) { + byteArray.push((word >>> (24 - b % 32)) & 0xFF) + } + return byteArray + }, - stringtoUTF8Array(message) { - if (typeof message === 'string') { - var s = unescape(encodeURIComponent(message)) // UTF-8 - message = new Uint8Array(s.length) - for (var i = 0; i < s.length; i++) { - message[i] = s.charCodeAt(i) & 0xff - } - } - return message - }, - // ...buffers then buffers.foreach and append to buffer1 - 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 - }, + stringtoUTF8Array(message) { + if (typeof message === 'string') { + var s = unescape(encodeURIComponent(message)) // UTF-8 + message = new Uint8Array(s.length) + for (var i = 0; i < s.length; i++) { + message[i] = s.charCodeAt(i) & 0xff + } + } + return message + }, + // ...buffers then buffers.foreach and append to buffer1 + 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 + }, - int64ToBytes(int64) { - // we want to represent the input as a 8-bytes array - var byteArray = [0, 0, 0, 0, 0, 0, 0, 0] + int64ToBytes(int64) { + // we want to represent the input as a 8-bytes array + 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 - } + for (var index = 0; index < byteArray.length; index++) { + var byte = int64 & 0xff + byteArray[byteArray.length - index - 1] = byte + int64 = (int64 - byte) / 256 + } - return byteArray - }, + return byteArray + }, - hexToBytes(hexString) { - return new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))) - }, + hexToBytes(hexString) { + return new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))) + }, - stringToHex(bytes) { - return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '') - }, + stringToHex(bytes) { + return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '') + }, - 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 - }, + 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 + }, - bytesToHex(byteArray) { - var _byteArrayToHex = [] + 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)); - } + 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("") - } + return _byteArrayToHex.join("") + } } export default utils diff --git a/crypto/api/fetch-request.js b/crypto/api/fetch-request.js index 6adab74c..7c0201ee 100644 --- a/crypto/api/fetch-request.js +++ b/crypto/api/fetch-request.js @@ -1,4 +1,4 @@ -import {waitForConfig, watchConfig} from '../config.js' +import { waitForConfig, watchConfig } from '../config' let config = {} diff --git a/crypto/api/kdf.js b/crypto/api/kdf.js index 2c64d5d9..c71ef89e 100644 --- a/crypto/api/kdf.js +++ b/crypto/api/kdf.js @@ -1,11 +1,11 @@ -import {store} from '../api_deps.js' -import {stateAwait} from './utils/stateAwait.js' -import {Sha512} from 'asmcrypto.js' -import utils from '../api/deps/utils.js' -import {get, registerTranslateConfig} from '../../core/translate' +import { store } from '../api_deps' +import { stateAwait } from './utils/stateAwait' +import { Sha512 } from 'asmcrypto.js' +import utils from '../api/deps/utils' +import { get, registerTranslateConfig } from '../../core/translate' registerTranslateConfig({ - loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) + loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) }) export const kdf = async (seed, salt, status = () => { }) => { diff --git a/crypto/api/registerUsername.js b/crypto/api/registerUsername.js index 1092e756..377e7d15 100644 --- a/crypto/api/registerUsername.js +++ b/crypto/api/registerUsername.js @@ -1,7 +1,7 @@ /** * Not to be confused with register name...this is a special use case */ -import {createTransaction, processTransaction, request} from './api.js' +import { createTransaction, processTransaction, request } from './api' const TX_TYPE = 3 // NAME_REGISTRATION const CHECK_LAST_REF_INTERVAL = 30 * 1000 // err 30 seconds diff --git a/crypto/api/storeWallet.js b/crypto/api/storeWallet.js index f63a2ce2..6e9061a6 100644 --- a/crypto/api/storeWallet.js +++ b/crypto/api/storeWallet.js @@ -1,6 +1,6 @@ -import {AES_CBC, HmacSha512} from 'asmcrypto.js' -import {kdf} from './kdf.js' -import Base58 from './deps/Base58.js' +import { AES_CBC, HmacSha512 } from 'asmcrypto.js' +import { kdf } from './kdf' +import Base58 from './deps/Base58' const getRandomValues = window.crypto ? window.crypto.getRandomValues.bind(window.crypto) : window.msCrypto.getRandomValues.bind(window.msCrypto) diff --git a/crypto/api/tradeRequest.js b/crypto/api/tradeRequest.js index 892c1318..447244f0 100644 --- a/crypto/api/tradeRequest.js +++ b/crypto/api/tradeRequest.js @@ -1,9 +1,9 @@ // Trade Bot -import TradeBotCreateRequest from './transactions/trade-portal/tradebot/TradeBotCreateRequest.js' -import TradeBotRespondRequest from './transactions/trade-portal/tradebot/TradeBotRespondRequest.js' -import signTradeBotTransaction from './transactions/trade-portal/tradebot/signTradeBotTransaction.js' -import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer.js' -import {request} from './fetch-request' +import TradeBotCreateRequest from './transactions/trade-portal/tradebot/TradeBotCreateRequest' +import TradeBotRespondRequest from './transactions/trade-portal/tradebot/TradeBotRespondRequest' +import signTradeBotTransaction from './transactions/trade-portal/tradebot/signTradeBotTransaction' +import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer' +import { request } from './fetch-request' // TradeBotCreateRequest export const tradeBotCreateRequest = (requestObject) => { diff --git a/crypto/api/transactions/AirdropTransaction.js b/crypto/api/transactions/AirdropTransaction.js index 04aa8acf..007ed7ff 100644 --- a/crypto/api/transactions/AirdropTransaction.js +++ b/crypto/api/transactions/AirdropTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from './TransactionBase' -import {QORT_DECIMALS} from '../constants' +import { QORT_DECIMALS } from '../constants' export default class PaymentTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/DeployAtTransaction.js b/crypto/api/transactions/DeployAtTransaction.js index 4b77f21e..2ebfe957 100644 --- a/crypto/api/transactions/DeployAtTransaction.js +++ b/crypto/api/transactions/DeployAtTransaction.js @@ -1,6 +1,6 @@ import TransactionBase from './TransactionBase' -import {store} from '../../api' -import {QORT_DECIMALS} from '../constants' +import { store } from '../../api' +import { QORT_DECIMALS } from '../constants' export default class DeployAtTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/PaymentTransaction.js b/crypto/api/transactions/PaymentTransaction.js index ad3c023b..df11e5b5 100644 --- a/crypto/api/transactions/PaymentTransaction.js +++ b/crypto/api/transactions/PaymentTransaction.js @@ -1,6 +1,6 @@ import TransactionBase from './TransactionBase' import Base58 from '../deps/Base58' -import {store} from '../../api' +import { store } from '../../api' export default class PaymentTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/PublicizeTransaction.js b/crypto/api/transactions/PublicizeTransaction.js index 42e5ba50..44660da1 100644 --- a/crypto/api/transactions/PublicizeTransaction.js +++ b/crypto/api/transactions/PublicizeTransaction.js @@ -1,5 +1,5 @@ import ChatBase from './chat/ChatBase' -import {QORT_DECIMALS} from '../constants' +import { QORT_DECIMALS } from '../constants' export default class PublicizeTransaction extends ChatBase { constructor() { @@ -8,21 +8,21 @@ export default class PublicizeTransaction extends ChatBase { this.fee = 0 } - set proofOfWorkNonce(proofOfWorkNonce) { - this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) - } + set proofOfWorkNonce(proofOfWorkNonce) { + this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._proofOfWorkNonce, - this._feeBytes - ) - return params - } + get params() { + const params = super.params + params.push( + this._proofOfWorkNonce, + this._feeBytes + ) + return params + } } diff --git a/crypto/api/transactions/TransactionBase.js b/crypto/api/transactions/TransactionBase.js index c5a96068..5e327116 100644 --- a/crypto/api/transactions/TransactionBase.js +++ b/crypto/api/transactions/TransactionBase.js @@ -1,4 +1,4 @@ -import {QORT_DECIMALS, TX_TYPES} from '../constants' +import { QORT_DECIMALS, TX_TYPES } from '../constants' import nacl from '../deps/nacl-fast' import Base58 from '../deps/Base58' import utils from '../deps/utils' diff --git a/crypto/api/transactions/TransferPrivsTransaction.js b/crypto/api/transactions/TransferPrivsTransaction.js index b9eaf809..6aaff1b9 100644 --- a/crypto/api/transactions/TransferPrivsTransaction.js +++ b/crypto/api/transactions/TransferPrivsTransaction.js @@ -1,6 +1,6 @@ import TransactionBase from './TransactionBase' -import {store} from '../../api' -import {QORT_DECIMALS} from '../constants' +import { store } from '../../api' +import { QORT_DECIMALS } from '../constants' export default class TransferPrivsTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/arbitraryV3.js b/crypto/api/transactions/arbitraryV3.js index dd871aac..515b4044 100644 --- a/crypto/api/transactions/arbitraryV3.js +++ b/crypto/api/transactions/arbitraryV3.js @@ -1,38 +1,36 @@ -'use strict' +(function () { + function generateSignatureArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp) => { + const data = generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp) + return nacl.sign.detached(data, keyPair.privateKey) + } - (function () { - function generateSignatureArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp) => { - const data = generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp) - return nacl.sign.detached(data, keyPair.privateKey) - } + function generateArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp, signature) => { + return appendBuffer(generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp), signature) + } - function generateArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp, signature) => { - return appendBuffer(generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp), signature) - } + function generateArbitraryTransactionV3Base(publicKey, lastReference, service, arbitraryData, fee, timestamp) => { + const txType = TYPES.ARBITRARY_TRANSACTION + const typeBytes = int32ToBytes(txType) + const timestampBytes = int64ToBytes(timestamp) + const feeBytes = int64ToBytes(fee * 100000000) + const serviceBytes = int32ToBytes(service) + const dataSizeBytes = int32ToBytes(arbitraryData.length) + const paymentsLengthBytes = int32ToBytes(0) // Support payments - not yet. - function generateArbitraryTransactionV3Base(publicKey, lastReference, service, arbitraryData, fee, timestamp) => { - const txType = TYPES.ARBITRARY_TRANSACTION - const typeBytes = int32ToBytes(txType) - const timestampBytes = int64ToBytes(timestamp) - const feeBytes = int64ToBytes(fee * 100000000) - const serviceBytes = int32ToBytes(service) - const dataSizeBytes = int32ToBytes(arbitraryData.length) - const paymentsLengthBytes = int32ToBytes(0) // Support payments - not yet. + var data = new Uint8Array() - var data = new Uint8Array() + data = appendBuffer(data, typeBytes) + data = appendBuffer(data, timestampBytes) + data = appendBuffer(data, lastReference) + data = appendBuffer(data, publicKey) + data = appendBuffer(data, paymentsLengthBytes) - data = appendBuffer(data, typeBytes) - data = appendBuffer(data, timestampBytes) - data = appendBuffer(data, lastReference) - data = appendBuffer(data, publicKey) - data = appendBuffer(data, paymentsLengthBytes) + // Here it is necessary to insert the payments, if there are + data = appendBuffer(data, serviceBytes) + data = appendBuffer(data, dataSizeBytes) + data = appendBuffer(data, arbitraryData) + data = appendBuffer(data, feeBytes) - // Here it is necessary to insert the payments, if there are - data = appendBuffer(data, serviceBytes) - data = appendBuffer(data, dataSizeBytes) - data = appendBuffer(data, arbitraryData) - data = appendBuffer(data, feeBytes) - - return data - } - }()) + return data + } +}()) diff --git a/crypto/api/transactions/chat/ChatBase.js b/crypto/api/transactions/chat/ChatBase.js index fe1b26f5..48429c27 100644 --- a/crypto/api/transactions/chat/ChatBase.js +++ b/crypto/api/transactions/chat/ChatBase.js @@ -1,143 +1,143 @@ -import {QORT_DECIMALS, TX_TYPES} from '../../constants' +import { QORT_DECIMALS, TX_TYPES } from '../../constants' import nacl from '../../deps/nacl-fast' import Base58 from '../../deps/Base58' import utils from '../../deps/utils' export default class ChatBase { - static get utils() { - return utils - } + static get utils() { + return utils + } - static get nacl() { - return nacl - } + static get nacl() { + return nacl + } - static get Base58() { - return Base58 - } + static get Base58() { + return Base58 + } - constructor() { - this.fee = 0 - this.groupID = 0 - this.tests = [ - () => { - if (!(this._type >= 1 && this._type in TX_TYPES)) { - return 'Invalid type: ' + this.type - } - return true - }, - () => { - if (this._fee < 0) { - return 'Invalid fee: ' + this._fee / QORT_DECIMALS - } - return true - }, - () => { - if (this._groupID < 0 || !Number.isInteger(this._groupID)) { - return 'Invalid groupID: ' + this._groupID - } - return true - }, - () => { - if (!(new Date(this._timestamp)).getTime() > 0) { - return 'Invalid timestamp: ' + this._timestamp - } - return true - }, - () => { - if (!(this._lastReference instanceof Uint8Array && this._lastReference.byteLength == 64)) { - return 'Invalid last reference: ' + this._lastReference - } - return true - }, - () => { - if (!(this._keyPair)) { - return 'keyPair must be specified' - } - if (!(this._keyPair.publicKey instanceof Uint8Array && this._keyPair.publicKey.byteLength === 32)) { - return 'Invalid publicKey' - } - if (!(this._keyPair.privateKey instanceof Uint8Array && this._keyPair.privateKey.byteLength === 64)) { - return 'Invalid privateKey' - } - return true - } - ] - } + constructor() { + this.fee = 0 + this.groupID = 0 + this.tests = [ + () => { + if (!(this._type >= 1 && this._type in TX_TYPES)) { + return 'Invalid type: ' + this.type + } + return true + }, + () => { + if (this._fee < 0) { + return 'Invalid fee: ' + this._fee / QORT_DECIMALS + } + return true + }, + () => { + if (this._groupID < 0 || !Number.isInteger(this._groupID)) { + return 'Invalid groupID: ' + this._groupID + } + return true + }, + () => { + if (!(new Date(this._timestamp)).getTime() > 0) { + return 'Invalid timestamp: ' + this._timestamp + } + return true + }, + () => { + if (!(this._lastReference instanceof Uint8Array && this._lastReference.byteLength == 64)) { + return 'Invalid last reference: ' + this._lastReference + } + return true + }, + () => { + if (!(this._keyPair)) { + return 'keyPair must be specified' + } + if (!(this._keyPair.publicKey instanceof Uint8Array && this._keyPair.publicKey.byteLength === 32)) { + return 'Invalid publicKey' + } + if (!(this._keyPair.privateKey instanceof Uint8Array && this._keyPair.privateKey.byteLength === 64)) { + return 'Invalid privateKey' + } + return true + } + ] + } - set keyPair(keyPair) { - this._keyPair = keyPair - } + set keyPair(keyPair) { + this._keyPair = keyPair + } - set type(type) { - this.typeText = TX_TYPES[type] - this._type = type - this._typeBytes = this.constructor.utils.int32ToBytes(this._type) - } + set type(type) { + this.typeText = TX_TYPES[type] + this._type = type + this._typeBytes = this.constructor.utils.int32ToBytes(this._type) + } - set groupID(groupID) { - this._groupID = groupID - this._groupIDBytes = this.constructor.utils.int32ToBytes(this._groupID) - } + set groupID(groupID) { + this._groupID = groupID + this._groupIDBytes = this.constructor.utils.int32ToBytes(this._groupID) + } - set timestamp(timestamp) { - this._timestamp = timestamp - this._timestampBytes = this.constructor.utils.int64ToBytes(this._timestamp) - } + set timestamp(timestamp) { + this._timestamp = timestamp + this._timestampBytes = this.constructor.utils.int64ToBytes(this._timestamp) + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set lastReference(lastReference) { - this._lastReference = lastReference instanceof Uint8Array ? lastReference : this.constructor.Base58.decode(lastReference) - } + set lastReference(lastReference) { + this._lastReference = lastReference instanceof Uint8Array ? lastReference : this.constructor.Base58.decode(lastReference) + } - get params() { - return [ - this._typeBytes, - this._timestampBytes, - this._groupIDBytes, - this._lastReference, - this._keyPair.publicKey - ] - } + get params() { + return [ + this._typeBytes, + this._timestampBytes, + this._groupIDBytes, + this._lastReference, + this._keyPair.publicKey + ] + } - get chatBytes() { - const isValid = this.validParams() - if (!isValid.valid) { - throw new Error(isValid.message) - } + get chatBytes() { + const isValid = this.validParams() + if (!isValid.valid) { + throw new Error(isValid.message) + } - let result = new Uint8Array() + let result = new Uint8Array() - this.params.forEach(item => { - result = this.constructor.utils.appendBuffer(result, item) - }) + this.params.forEach(item => { + result = this.constructor.utils.appendBuffer(result, item) + }) - this._chatBytes = result + this._chatBytes = result - return this._chatBytes - } + return this._chatBytes + } - validParams() { - let finalResult = { - valid: true - } + validParams() { + let finalResult = { + valid: true + } - this.tests.some(test => { - const result = test() - if (result !== true) { - finalResult = { - valid: false, - message: result - } - return true - } - }) + this.tests.some(test => { + const result = test() + if (result !== true) { + finalResult = { + valid: false, + message: result + } + return true + } + }) - return finalResult - } + return finalResult + } } diff --git a/crypto/api/transactions/chat/ChatTransaction.js b/crypto/api/transactions/chat/ChatTransaction.js index 1b048aa3..96ac6471 100644 --- a/crypto/api/transactions/chat/ChatTransaction.js +++ b/crypto/api/transactions/chat/ChatTransaction.js @@ -1,8 +1,8 @@ import ChatBase from './ChatBase' import nacl from '../../deps/nacl-fast' import ed2curve from '../../deps/ed2curve' -import {Sha256} from 'asmcrypto.js' -import {CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP} from '../../constants' +import { Sha256 } from 'asmcrypto.js' +import { CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP } from '../../constants' export default class ChatTransaction extends ChatBase { constructor() { diff --git a/crypto/api/transactions/chat/GroupChatTransaction.js b/crypto/api/transactions/chat/GroupChatTransaction.js index bb69f442..e58bc1d0 100644 --- a/crypto/api/transactions/chat/GroupChatTransaction.js +++ b/crypto/api/transactions/chat/GroupChatTransaction.js @@ -1,5 +1,5 @@ import ChatBase from './ChatBase' -import {CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP} from '../../constants' +import { CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP } from '../../constants' export default class GroupChatTransaction extends ChatBase { constructor() { diff --git a/crypto/api/transactions/chat/decryptChatMessage.js b/crypto/api/transactions/chat/decryptChatMessage.js index 8f4b05df..0a88b697 100644 --- a/crypto/api/transactions/chat/decryptChatMessage.js +++ b/crypto/api/transactions/chat/decryptChatMessage.js @@ -1,7 +1,7 @@ import nacl from '../../deps/nacl-fast' import Base58 from '../../deps/Base58' import ed2curve from '../../deps/ed2curve' -import {Sha256} from 'asmcrypto.js' +import { Sha256 } from 'asmcrypto.js' export const decryptChatMessage = (encryptedMessage, privateKey, recipientPublicKey, lastReference) => { let _encryptedMessage = Base58.decode(encryptedMessage) diff --git a/crypto/api/transactions/groups/AddGroupAdminTransaction.js b/crypto/api/transactions/groups/AddGroupAdminTransaction.js index 761e0029..003100aa 100644 --- a/crypto/api/transactions/groups/AddGroupAdminTransaction.js +++ b/crypto/api/transactions/groups/AddGroupAdminTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class AddGroupAdminTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/CancelGroupBanTransaction.js b/crypto/api/transactions/groups/CancelGroupBanTransaction.js index f0b11fa1..604a5f8c 100644 --- a/crypto/api/transactions/groups/CancelGroupBanTransaction.js +++ b/crypto/api/transactions/groups/CancelGroupBanTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class CancelGroupBanTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/CancelGroupInviteTransaction.js b/crypto/api/transactions/groups/CancelGroupInviteTransaction.js index 8dccb6fa..a3023eb4 100644 --- a/crypto/api/transactions/groups/CancelGroupInviteTransaction.js +++ b/crypto/api/transactions/groups/CancelGroupInviteTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class CancelGroupInviteTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/CreateGroupTransaction.js b/crypto/api/transactions/groups/CreateGroupTransaction.js index b81e47ee..13c8220c 100644 --- a/crypto/api/transactions/groups/CreateGroupTransaction.js +++ b/crypto/api/transactions/groups/CreateGroupTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class CreateGroupTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/GroupBanTransaction.js b/crypto/api/transactions/groups/GroupBanTransaction.js index ab679f7a..6bd88b87 100644 --- a/crypto/api/transactions/groups/GroupBanTransaction.js +++ b/crypto/api/transactions/groups/GroupBanTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class GroupBanTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/GroupInviteTransaction.js b/crypto/api/transactions/groups/GroupInviteTransaction.js index 20ce9bed..8e3823a6 100644 --- a/crypto/api/transactions/groups/GroupInviteTransaction.js +++ b/crypto/api/transactions/groups/GroupInviteTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class GroupInviteTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/GroupKickTransaction.js b/crypto/api/transactions/groups/GroupKickTransaction.js index 77391943..6c755ac0 100644 --- a/crypto/api/transactions/groups/GroupKickTransaction.js +++ b/crypto/api/transactions/groups/GroupKickTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class GroupKickTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/JoinGroupTransaction.js b/crypto/api/transactions/groups/JoinGroupTransaction.js index 4db9cb73..7c715b65 100644 --- a/crypto/api/transactions/groups/JoinGroupTransaction.js +++ b/crypto/api/transactions/groups/JoinGroupTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class JoinGroupTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/LeaveGroupTransaction.js b/crypto/api/transactions/groups/LeaveGroupTransaction.js index 104cb9fe..aa8303a5 100644 --- a/crypto/api/transactions/groups/LeaveGroupTransaction.js +++ b/crypto/api/transactions/groups/LeaveGroupTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class LeaveGroupTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js b/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js index d0aff6a3..a648ae6f 100644 --- a/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js +++ b/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class RemoveGroupAdminTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/groups/UpdateGroupTransaction.js b/crypto/api/transactions/groups/UpdateGroupTransaction.js index d080c24f..43926245 100644 --- a/crypto/api/transactions/groups/UpdateGroupTransaction.js +++ b/crypto/api/transactions/groups/UpdateGroupTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class UpdateGroupTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/names/BuyNameTransacion.js b/crypto/api/transactions/names/BuyNameTransacion.js index d41a7ab8..7e18834d 100644 --- a/crypto/api/transactions/names/BuyNameTransacion.js +++ b/crypto/api/transactions/names/BuyNameTransacion.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class BuyNameTransacion extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/names/CancelSellNameTransacion.js b/crypto/api/transactions/names/CancelSellNameTransacion.js index 5d53b3a7..483b6982 100644 --- a/crypto/api/transactions/names/CancelSellNameTransacion.js +++ b/crypto/api/transactions/names/CancelSellNameTransacion.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class CancelSellNameTransacion extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/names/RegisterNameTransaction.js b/crypto/api/transactions/names/RegisterNameTransaction.js index 7240e281..7929d367 100644 --- a/crypto/api/transactions/names/RegisterNameTransaction.js +++ b/crypto/api/transactions/names/RegisterNameTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class RegisterNameTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/names/SellNameTransacion.js b/crypto/api/transactions/names/SellNameTransacion.js index f93ea901..38db5a81 100644 --- a/crypto/api/transactions/names/SellNameTransacion.js +++ b/crypto/api/transactions/names/SellNameTransacion.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class SellNameTransacion extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/names/UpdateNameTransaction.js b/crypto/api/transactions/names/UpdateNameTransaction.js index c9f5aebe..89faf7d2 100644 --- a/crypto/api/transactions/names/UpdateNameTransaction.js +++ b/crypto/api/transactions/names/UpdateNameTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class UpdateNameTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/polls/CreatePollTransaction.js b/crypto/api/transactions/polls/CreatePollTransaction.js index fa01e9b1..07815458 100644 --- a/crypto/api/transactions/polls/CreatePollTransaction.js +++ b/crypto/api/transactions/polls/CreatePollTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class CreatePollTransaction extends TransactionBase { constructor() { @@ -35,7 +35,7 @@ export default class CreatePollTransaction extends TransactionBase { this._options.push({ length: optionLength, bytes: optionBytes }) } - set feeDialog(feeDialog){ + set feeDialog(feeDialog) { this._feeDialog = feeDialog } @@ -106,7 +106,7 @@ export default class CreatePollTransaction extends TransactionBase { params.push(this._options[i].length, this._options[i].bytes) } - params.push(this._feeBytes); + params.push(this._feeBytes) return params } diff --git a/crypto/api/transactions/polls/VoteOnPollTransaction.js b/crypto/api/transactions/polls/VoteOnPollTransaction.js index 83a7eda9..21ce36e6 100644 --- a/crypto/api/transactions/polls/VoteOnPollTransaction.js +++ b/crypto/api/transactions/polls/VoteOnPollTransaction.js @@ -1,5 +1,5 @@ import TransactionBase from '../TransactionBase' -import {QORT_DECIMALS} from '../../constants' +import { QORT_DECIMALS } from '../../constants' export default class VoteOnPollTransaction extends TransactionBase { constructor() { @@ -20,7 +20,7 @@ export default class VoteOnPollTransaction extends TransactionBase { ` } - set feeDialog(feeDialog){ + set feeDialog(feeDialog) { this._feeDialog = feeDialog } diff --git a/crypto/api/transactions/registerName_dnsthing.js b/crypto/api/transactions/registerName_dnsthing.js index 06210cc4..c32be3a2 100644 --- a/crypto/api/transactions/registerName_dnsthing.js +++ b/crypto/api/transactions/registerName_dnsthing.js @@ -1,36 +1,34 @@ -'use strict' +(function () { + function generateSignatureRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp) => { + const data = generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp) + return nacl.sign.detached(data, keyPair.privateKey) + } - (function () { - function generateSignatureRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp) => { - const data = generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp) - return nacl.sign.detached(data, keyPair.privateKey) - } + function generateRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp, signature) => { + return appendBuffer(generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp), signature) + } - function generateRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp, signature) => { - return appendBuffer(generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp), signature) - } + function generateRegisterNameTransactionBase(publicKey, lastReference, owner, name, value, fee, timestamp) => { + const txType = TYPES.REGISTER_NAME_TRANSACTION + const typeBytes = int32ToBytes(txType) + const timestampBytes = int64ToBytes(timestamp) + const feeBytes = int64ToBytes(fee * 100000000) + const nameSizeBytes = int32ToBytes(name.length) + const valueSizeBytes = int32ToBytes(value.length) - function generateRegisterNameTransactionBase(publicKey, lastReference, owner, name, value, fee, timestamp) => { - const txType = TYPES.REGISTER_NAME_TRANSACTION - const typeBytes = int32ToBytes(txType) - const timestampBytes = int64ToBytes(timestamp) - const feeBytes = int64ToBytes(fee * 100000000) - const nameSizeBytes = int32ToBytes(name.length) - const valueSizeBytes = int32ToBytes(value.length) + let data = new Uint8Array() - let data = new Uint8Array() + data = appendBuffer(data, typeBytes) + data = appendBuffer(data, timestampBytes) + data = appendBuffer(data, lastReference) + data = appendBuffer(data, publicKey) + data = appendBuffer(data, owner) + data = appendBuffer(data, nameSizeBytes) + data = appendBuffer(data, name) + data = appendBuffer(data, valueSizeBytes) + data = appendBuffer(data, value) + data = appendBuffer(data, feeBytes) - data = appendBuffer(data, typeBytes) - data = appendBuffer(data, timestampBytes) - data = appendBuffer(data, lastReference) - data = appendBuffer(data, publicKey) - data = appendBuffer(data, owner) - data = appendBuffer(data, nameSizeBytes) - data = appendBuffer(data, name) - data = appendBuffer(data, valueSizeBytes) - data = appendBuffer(data, value) - data = appendBuffer(data, feeBytes) - - return data - } - }()) + return data + } +}()) diff --git a/crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js b/crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js index d16ff579..fe4ecc98 100644 --- a/crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js +++ b/crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js @@ -1,7 +1,7 @@ import TransactionBase from '../TransactionBase' import publicKeyToAddress from '../../wallet/publicKeyToAddress' -import {Base58} from '../../deps/deps' -import {DYNAMIC_FEE_TIMESTAMP} from '../../constants' +import { Base58 } from '../../deps/deps' +import { DYNAMIC_FEE_TIMESTAMP } from '../../constants' export default class RemoveRewardShareTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/transactions/reward-share/RewardShareTransaction.js b/crypto/api/transactions/reward-share/RewardShareTransaction.js index 7033417e..b31e24e0 100644 --- a/crypto/api/transactions/reward-share/RewardShareTransaction.js +++ b/crypto/api/transactions/reward-share/RewardShareTransaction.js @@ -2,8 +2,8 @@ import publicKeyToAddress from '../../wallet/publicKeyToAddress' import TransactionBase from '../TransactionBase' import nacl from '../../deps/nacl-fast' import ed2curve from '../../deps/ed2curve' -import {Sha256} from 'asmcrypto.js' -import {DYNAMIC_FEE_TIMESTAMP} from '../../constants' +import { Sha256 } from 'asmcrypto.js' +import { DYNAMIC_FEE_TIMESTAMP } from '../../constants' export default class RewardShareTransaction extends TransactionBase { constructor() { diff --git a/crypto/api/utils/randomBase58Generator.js b/crypto/api/utils/randomBase58Generator.js index 57e6b0aa..1cc21c7a 100644 --- a/crypto/api/utils/randomBase58Generator.js +++ b/crypto/api/utils/randomBase58Generator.js @@ -1,11 +1,11 @@ export const randomBase58Generator = (digits) => { - digits = digits || 0 - let base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'.split('') - let result = '' - let char - while (result.length < digits) { - char = base58[Math.random() * 57 >> 0] - if (result.indexOf(char) === -1) result += char - } - return result + digits = digits || 0 + let base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'.split('') + let result = '' + let char + while (result.length < digits) { + char = base58[Math.random() * 57 >> 0] + if (result.indexOf(char) === -1) result += char + } + return result } diff --git a/crypto/api/utils/stateAwait.js b/crypto/api/utils/stateAwait.js index 666eb0db..800663b5 100644 --- a/crypto/api/utils/stateAwait.js +++ b/crypto/api/utils/stateAwait.js @@ -1,31 +1,31 @@ -import {store} from '../../api.js' +import { store } from '../../api' let subscriptions = [] // Have to wait with init because something import stateAwait before the store gets initialized let initialized = false const init = () => { - initialized = true - store.subscribe(() => { - const state = store.getState() + initialized = true + store.subscribe(() => { + const state = store.getState() - subscriptions = subscriptions.filter(fn => fn(state)) - }) + subscriptions = subscriptions.filter(fn => fn(state)) + }) } export const stateAwait = fn => { - return new Promise((resolve, reject) => { - // Check immediately...then if not true store it - if (!initialized) { - init() - } - if (fn(store.getState())) resolve() - subscriptions.push(state => { - if (fn(state)) { - resolve() - return true - } - return false - }) - }) + return new Promise((resolve, reject) => { + // Check immediately...then if not true store it + if (!initialized) { + init() + } + if (fn(store.getState())) resolve() + subscriptions.push(state => { + if (fn(state)) { + resolve() + return true + } + return false + }) + }) } diff --git a/crypto/api/wallet/base58PublicKeyToAddress.js b/crypto/api/wallet/base58PublicKeyToAddress.js index 6ed36383..8b20cb51 100644 --- a/crypto/api/wallet/base58PublicKeyToAddress.js +++ b/crypto/api/wallet/base58PublicKeyToAddress.js @@ -1,5 +1,5 @@ import publicKeyToAddress from './publicKeyToAddress' -import Base58 from '../deps/Base58.js' +import Base58 from '../deps/Base58' export const base58PublicKeyToAddress = (base58pubkey, qora = false) => { const decodePubKey = Base58.decode(base58pubkey) diff --git a/crypto/api/wallet/publicKeyToAddress.js b/crypto/api/wallet/publicKeyToAddress.js index 67954a0a..7852393f 100644 --- a/crypto/api/wallet/publicKeyToAddress.js +++ b/crypto/api/wallet/publicKeyToAddress.js @@ -1,10 +1,10 @@ -import Base58 from '../deps/Base58.js' -import BROKEN_RIPEMD160 from '../deps/broken-ripemd160.js' -import RIPEMD160 from '../deps/ripemd160.js' -import utils from '../deps/utils.js' -import {ADDRESS_VERSION} from '../constants.js' -import {Buffer} from 'buffer' -import {Sha256} from 'asmcrypto.js' +import Base58 from '../deps/Base58' +import BROKEN_RIPEMD160 from '../deps/broken-ripemd160' +import RIPEMD160 from '../deps/ripemd160' +import utils from '../deps/utils' +import { ADDRESS_VERSION } from '../constants' +import { Buffer } from 'buffer' +import { Sha256 } from 'asmcrypto.js' const repeatSHA256 = (passphrase, hashes) => { let hash = passphrase diff --git a/crypto/api/wallet/validateAddress.js b/crypto/api/wallet/validateAddress.js index 59d016cc..1dc9b1b5 100644 --- a/crypto/api/wallet/validateAddress.js +++ b/crypto/api/wallet/validateAddress.js @@ -1,8 +1,8 @@ -import Base58 from '../deps/Base58.js' +import Base58 from '../deps/Base58' export const validateAddress = (address) => { const decodePubKey = Base58.decode(address) - return decodePubKey instanceof Uint8Array && decodePubKey.length == 25; + return decodePubKey instanceof Uint8Array && decodePubKey.length == 25 } diff --git a/crypto/config.js b/crypto/config.js index 375b5bd8..bedeca43 100644 --- a/crypto/config.js +++ b/crypto/config.js @@ -1,4 +1,4 @@ -import {store} from './api.js' +import { store } from './api' let config = false let loaded = false From 5f7d8da815ba57faffb1e73d0f2cf4dbfcfd2bf3 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Fri, 10 May 2024 16:02:08 -0400 Subject: [PATCH 16/29] Fix typos --- core/language/es.json | 2 +- core/language/nl.json | 2 +- core/language/us.json | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/language/es.json b/core/language/es.json index 55a16689..710028a0 100644 --- a/core/language/es.json +++ b/core/language/es.json @@ -1176,7 +1176,7 @@ "inf7": "Información de compra automática", "inf8": "Cerrar información de compra automática", "inf9": "'Auto Buy' es una función que permite realizar 'órdenes de compra' en el Portal de comercio. Estas 'órdenes de compra' solo son visibles para la persona que las realiza. No son órdenes de compra 'públicas' como las Las 'ventas de mercado abierto' NO se almacenan en la cadena de bloques de Qortal. La compra automática es una característica de la interfaz de usuario y, como tal, requiere que la interfaz de usuario esté FUNCIONANDO.", - "inf10": "Para realizar un pedido de Compra automática, haga clic en el botón "Agregar pedido de Compra automática" y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR o la cantidad de LTC que desea utilizar, y el PRECIO que desea COMPRAR HASTA. Una vez que la orden esté activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que usted establezca (comenzando en la orden más baja y subiendo en los libros).", + "inf10": "Para realizar un pedido de Compra automática, haga clic en el botón 'Agregar pedido de Compra automática' y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR o la cantidad de LTC que desea utilizar, y el PRECIO que desea COMPRAR HASTA. Una vez que la orden esté activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que usted establezca (comenzando en la orden más baja y subiendo en los libros).", "inf11": "¡Simplemente DEJE SU IU FUNCIONANDO y Auto Buy hace el resto, automáticamente!", "inf12": "PUEDE explorar otros complementos en la IU (Q-Chat, carteras, etc.) pero NO PUEDE CERRAR LA IU si desea que se complete su compra automática. Deje la IU 'minimizada' en la 'barra de tareas' o 'panel' está bien, mientras la interfaz de usuario permanezca ABIERTA, Auto Buy funcionará.", "inf13": "Comprar automáticamente", diff --git a/core/language/nl.json b/core/language/nl.json index 5fbf5599..0180f33f 100644 --- a/core/language/nl.json +++ b/core/language/nl.json @@ -182,7 +182,7 @@ "accountsecurity": "Account-beveiliging", "password": "Wachtwoord", "download": "Qortal back-upbestand exporteren/opslaan", - "choose": "Kies een wachtwoord om uw Qortal-back-upbestand te coderen. (Dit kan dezelfde zijn als waarmee u bent ingelogd, of een nieuwe.)"", + "choose": "Kies een wachtwoord om uw Qortal-back-upbestand te coderen. (Dit kan dezelfde zijn als waarmee u bent ingelogd, of een nieuwe.)", "playsound": "Geluid afspelen", "shownotifications": "Toon waarschuwingen", "nodeurl": "Adres van de node", diff --git a/core/language/us.json b/core/language/us.json index 0918d5c3..b8180cfd 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -38,7 +38,7 @@ "qchat": "Q-CHAT", "groupmanagement": "GROUP MANAGEMENT", "puzzles": "PUZZLES", - "Nodemanagement": "Node MANAGEMENT", + "nodemanagement": "NODE MANAGEMENT", "trading": "TRADING", "groups": "GROUPS", "sm1": "NAMES", @@ -185,16 +185,16 @@ "choose": "Please input a password to encrypt your backup file. (This can be the same as the one you logged in with, or a new one.)", "playsound": "Play Sound", "shownotifications": "Show Notifications", - "Nodeurl": "Node Url", - "Nodehint": "Select a Node from the default list, or add a custom Node to the list by clicking on the button below", - "addcustomNode": "Add Custom Node", + "nodeurl": "Node Url", + "nodehint": "Select a Node from the default list, or add a custom Node to the list by clicking on the button below", + "addcustomnode": "Add Custom Node", "addandsave": "Add and Save", "protocol": "Protocol", "domain": "Domain", "port": "Port", "import": "Import Saved Nodes", "export": "Export Saved Nodes", - "deletecustomNode": "REMOVE ALL Custom Nodes", + "deletecustomnode": "REMOVE ALL Custom Nodes", "warning": "Your Custom Nodes will be deleted and reset to default.", "snack1": "Successfully deleted and added default Nodes", "snack2": "UI conected to Node:", @@ -209,7 +209,7 @@ "exp4": "Please select a wallet to backup/export master private key.", "core": "Core auto-start settings", "qappNotification1": "Q-App Notifications", - "selectNode": "Please select an option", + "selectnode": "Please select an option", "arrr1": "ARRR Wallet Not Initialized!", "arrr2": "Please go to wallet tab and access ARRR wallet to initialize wallet first.", "arrr3": "Need Core Update !", @@ -966,7 +966,7 @@ "pchange16": "Guess incorrect!", "pchange17": "Reward claim submitted - check wallet for reward!" }, - "Nodepage": { + "nodepage": { "nchange1": "Node management for:", "nchange2": "Node has been online for:", "nchange3": "Node's minting accounts", From 36866d3cf1f16254339f963c4e8fa503c8f5a668 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 11 May 2024 11:48:12 +0200 Subject: [PATCH 17/29] Update electron.js and dependencies Removed require for esm support from package json Removed dark mode toogle from new ui instance --- electron.js | 22 +---- package-lock.json | 206 +++++++++++++++++++++++----------------------- package.json | 8 +- 3 files changed, 111 insertions(+), 125 deletions(-) diff --git a/electron.js b/electron.js index ee9b47c7..ad6c3d72 100644 --- a/electron.js +++ b/electron.js @@ -38,16 +38,16 @@ crashReporter.start({ }) 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") } 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") } 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") } 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") } @@ -1194,20 +1194,6 @@ function createNewWindow() { newWindow.on('closed', function () { newWindow = null }) - - ipcMain.handle('dark-mode:toggle', () => { - if (nativeTheme.shouldUseDarkColors) { - nativeTheme.themeSource = 'light' - } else { - nativeTheme.themeSource = 'dark' - } - - return nativeTheme.shouldUseDarkColors - }) - - ipcMain.handle('dark-mode:system', () => { - nativeTheme.themeSource = 'system' - }) } const createTray = () => { diff --git a/package-lock.json b/package-lock.json index 792fc709..26ea2990 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "crypto-js": "4.2.0", "driver.js": "1.3.1", "electron-dl": "3.5.2", - "electron-log": "5.1.2", + "electron-log": "5.1.4", "electron-store": "8.2.0", "electron-updater": "6.1.8", "emoji-picker-js": "https://github.com/Qortal/emoji-picker-js", @@ -47,7 +47,7 @@ "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.6", - "sass": "1.77.0", + "sass": "1.77.1", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, @@ -104,7 +104,7 @@ "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", - "electron": "30.0.2", + "electron": "30.0.3", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", @@ -619,9 +619,9 @@ } }, "node_modules/@electron/packager/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3277,9 +3277,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.3.1.tgz", - "integrity": "sha512-eyw3/Zn/XbIP2Yo11iE4vYcJ0471aBPMLD56YOyUC0PIF7D5tvPutDesSg95R+BDa5Tq/Id2zV5pZerw1dwwOQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.3.2.tgz", + "integrity": "sha512-dyXx1hHAW/0BSxCUNWcxc8UN+s0wRTdtH46u6IEf91z+IOWjJwmSxT00+UMYh6hdOYDDsJYxPe9gcuSWYCIkCg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3289,9 +3289,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.3.1.tgz", - "integrity": "sha512-szHDXKOQfrlCzsys401zBtPWE5gyY3LcpPlrn2zBRrBmzU2U/1A7Y3HkoqZo3SSrTY37eG1Vr2J2aHySK6Uj/w==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.3.2.tgz", + "integrity": "sha512-Mdc0qOPeJxxt5kSYKpNs7TzbQHeVpbpxwafUrxrvfD2iOnJlwlNxVWsVulc1t5EA8NpbTqYJTPmAtv2h/qmsfw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3301,9 +3301,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.3.1.tgz", - "integrity": "sha512-pif0AB4MUoA1Xm26y1ovH7vfXaV19T9EEQH4tgN2g2eTfdFnQWDmKI0r3XRxudtg40RstBJRa81N9xEO79o8ag==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.3.2.tgz", + "integrity": "sha512-nzvXSGxJuuZdQ6NE0gJ2GC+0gjXZTgU2+Z8TEKi7TYLUAjAoiU1Iniz1XA97cuFwVrNKp031IF1LivK085NqQA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3313,9 +3313,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.3.1.tgz", - "integrity": "sha512-bVX0EnDZoRXnoA7dyoZe7w2gdRjxmFEcsatHLkcr3R3x4k9oSgZXLe1C2jGbjJWr4j32tYXZ1cpKte6f1WUKzg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.3.2.tgz", + "integrity": "sha512-LyIRBFJCxbgi96ejoeewESvfUf5igfngamZJK+uegfTcznimP0AjSWs3whJwZ9QXUsQrB9tIrWIG4GBtatp6qw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3325,9 +3325,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.3.1.tgz", - "integrity": "sha512-rM7T+DWuOShariPl5vknNFMesPOFQrhMjmms9Ql636sSxOcnkb0d39NFbUpI/r5noFDC6Km+lAebF0Rx2MxpKQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.3.2.tgz", + "integrity": "sha512-Ng5dh8+FMD3pxaqZEDSRxTjgjPCNdEEVUTJnuljZXQ9ZxI9wVsKsGs53Hunpita4Qgk0DYhlfAvGUKCM0nCH4A==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3338,9 +3338,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.3.1.tgz", - "integrity": "sha512-uWYbzAV95JnetFBduWRI9n2QbQfmznQ7I6XzfZxuTAO2KcWGvHPBS7F00COO9Y67FZAPMbuQ1njtCJK0nClOPw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.3.2.tgz", + "integrity": "sha512-EQcfkvA7lkZPKllhGo2jiEYLJyXhBFK7++oRatgbfgHEJ2uLBGv6ys7WLCeRA/ntcaWTH3rlS+HR/Y8/nnyQYg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3350,9 +3350,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.1.tgz", - "integrity": "sha512-xDG1Z01ftRI4mIOY+bPuG53xZ9FfVd6hzjNchwFHRlU3E+/2O+DsEBy/pJuHmpnFx1B/1ANbssoidGvK3LIPYw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.2.tgz", + "integrity": "sha512-r7JJn9dEnIRDdbnTCAUFCWX4OPsR48+4OEm5eGlysEaD2h4z0G1AaK5XXwOoQhP3WP2LHHjL4LahlYZvltzFzw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3363,9 +3363,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.1.tgz", - "integrity": "sha512-jhMw0LtEV/HVovUDRdoH0QLnBWLDyw4Su7UZ0bkMtsnCO9MujLKths3SKsPstuAckZQKR5smokEytxDHH0aglg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.2.tgz", + "integrity": "sha512-PSry4JHUIOhXytvYUQGtYgfIKCIhnmbKksZ8/CfCaKgGJpjOpnzqRG5FnYXZB7NiqouABreM7+IgkH0mOLq6HQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3376,9 +3376,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.3.1.tgz", - "integrity": "sha512-HO47iS2KQJLxhZM4ghZz5t2qgESH6D/mKJbjO7jM0eCYEyUfPyYJwV2VgjQP7x+1axcvsrhpzkJrjSg5+KqtQQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.3.2.tgz", + "integrity": "sha512-Oy/Dj75kw/tyNyrcFf97r872NZggISfvabTptH8j1gFPg/XzT5ERcT2fvgpbsBx0WWlXOaFkC1owta6kS6MZpg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3388,9 +3388,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.3.1.tgz", - "integrity": "sha512-epdIrg1xpuk5ApnNyM/NJO1dhVZgD7kDPem6QH4fug5UJtCueze942yNzUhCuvckmIegfdferAb1p4ug4674ig==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.3.2.tgz", + "integrity": "sha512-KBew4QCnYASBPEJlZ4vKQnm4R9B206H8kE5+hq8OOyF3FVkR6FgF/AbY/E/4/+2blx82PGp+9gvPUVpEv36ifQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3412,9 +3412,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.3.1.tgz", - "integrity": "sha512-m+W6qTP4V0PHqqKnXw/ma18a62O0Cqp5FDWtSarOuxx6W4FpVr4A3Uxfbp4RigZEYanLcX4UJOWL4nWsFdYWHw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.3.2.tgz", + "integrity": "sha512-LTon7ys+C6wLmN/nXYkr1pDxIiIv0Czn4US7I/1b8Ws2N6PU+nMm4r7Uj8hKrDYL8yPQUaS4gIs1hhOwJ8UjtA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3425,9 +3425,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.1.tgz", - "integrity": "sha512-IPgCFkiT6Y5BSFBQMTXS6gq2Ust6otMzRwddoI0RC8tl/tMftFBEPqYKADWVQeQb4C6AQydRjUbmAwHpBH31Eg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.2.tgz", + "integrity": "sha512-nz4GcYvZmJOX20GAjR5ymZgzQCbhnK/rmcunQf4zkl4LA5sXm70P70I9bDtrT/mgmz5dnBUTkVAkLTtKbovdDQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3450,9 +3450,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.3.1.tgz", - "integrity": "sha512-yEAn0dT1LH1vAULmZv3L1fs7M1Fn/8wZCw7LDGw2/E+VYbDeXgy7XwMPyzhrzV1oV9Z+3gugCbYV0IJ4PBwudA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.3.2.tgz", + "integrity": "sha512-6RJmexu/E+JP2+lhzJLV+5KZJiTrJE+p/hnDk13CBK2VgiwcJYmcZSVk+Yk6Suwrb1qTAosu8paKIwVJa/VMUg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3462,9 +3462,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.3.1.tgz", - "integrity": "sha512-GyHLNoXVo9u29NVqijwZPBcv9MzXMGyIiQiO5FxRpuT4Ei4ZmsaJrJ2dmhO3KZhX0HdTSc65/omM2XBr6PDoLA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.3.2.tgz", + "integrity": "sha512-vgT7tkSZd99xAEph9quPlVdRkgPU4GJp9K7bNS8Y7GnSLU0KkDHbtDpb0pyz76HVpeOnt/QGmtqF14Il9T2IPQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3474,9 +3474,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.3.1.tgz", - "integrity": "sha512-+6I76b7fu0FghUtzB0LyIC5GB0xfrpAKtXjbrmeUGsOEL7jxKsE6+A5RoTrgQTfuP7oItdCZGTSC/8WtGbtEMg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.3.2.tgz", + "integrity": "sha512-eMnQDgWpaQ3sdlFg1M85oziFYl2h/GRBjUt4JhF5kyWpHOYDj1/bX1fndZOBQ5xaoNlbcaeEkIc53xVX4ZV9tw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3486,9 +3486,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.3.1.tgz", - "integrity": "sha512-bHkkHU012clwCrpzmEHGuF8fwLuFL3x9MJ17wnhwanoIM3MG6ZCdeb9copjDvUpZXLKTUYKotoPGNhxmOrP2bQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.3.2.tgz", + "integrity": "sha512-bKzL4NXp0pDM/Q5ZCpjLxjQU4DwoWc6CDww1M4B4dp1sfiXiE2P7EOCMM2TfJOqNPUFpp5RcFKKcxC2Suj8W4w==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3511,9 +3511,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.3.1.tgz", - "integrity": "sha512-fpsVewcnaYk37TAF4JHkwH9O6Ml7JooF1v/Eh9p7PSItNcEfg/3RLlJL3c53RzLWdlunjgptM/M0alPV0Zyq4A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.3.2.tgz", + "integrity": "sha512-gi16YtLnXKPubxafvcGSAELac4i8S6Eb9Av0AaH6QH9H9zzSHN7qOrX930Tp2Pod5a/a82kk7kN7IB6htAeaYA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3523,9 +3523,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.3.1.tgz", - "integrity": "sha512-ZM+Bpty9jChEN/VjUP/fX1Fvoz0Z3YLdjj9+pFA0H7woli+TmxWY6yUUTA2SBDb2mJ52yNOUfRE/sYx6gkDuBQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.3.2.tgz", + "integrity": "sha512-a3whwDyyOsrmOQbfeY+Fm5XypSRgT3IGqWgz0r4U7oko57/X6Env08F1Ie2e2UkQw9B1MoW9cm3dC6jvrdzzYA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3691,9 +3691,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", - "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", "devOptional": true, "dependencies": { "undici-types": "~5.26.4" @@ -4456,9 +4456,9 @@ } }, "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5018,9 +5018,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001616", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", - "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", "dev": true, "funding": [ { @@ -5284,9 +5284,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/conf/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -5314,16 +5314,16 @@ } }, "node_modules/config-file-ts/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.3.14", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.14.tgz", + "integrity": "sha512-4fkAqu93xe9Mk7le9v0y3VrPDqLKHarNi2s4Pv7f2yOvfhWfhc7hRPHC/JyqMqb8B/Dt/eGS4n7ykwf3fOsl8g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", "minimatch": "^9.0.1", "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "path-scurry": "^1.11.0" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -5351,9 +5351,9 @@ } }, "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", - "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5741,9 +5741,9 @@ } }, "node_modules/electron": { - "version": "30.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-30.0.2.tgz", - "integrity": "sha512-zv7T+GG89J/hyWVkQsLH4Y/rVEfqJG5M/wOBIGNaDdqd8UV9/YZPdS7CuFeaIj0H9LhCt95xkIQNpYB/3svOkQ==", + "version": "30.0.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-30.0.3.tgz", + "integrity": "sha512-h+suwx6e0fnv/9wi0/cmCMtG+4LrPzJZa+3DEEpxcPcP+pcWnBI70t8QspxgMNIh2wzXLMD9XVqrLkEbiBAInw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5913,9 +5913,9 @@ } }, "node_modules/electron-log": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.1.2.tgz", - "integrity": "sha512-Cpg4hAZ27yM9wzE77c4TvgzxzavZ+dVltCczParXN+Vb3jocojCSAuSMCVOI9fhFuuOR+iuu3tZLX1cu0y0kgQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.1.4.tgz", + "integrity": "sha512-P0RSXnwT3z+e89Z5uAcZDeN85/QjIgv764a93kqCi+wh2Jm22CCbc3AGDt4S8rsxAHWHB4Q0PGsQl3fw1AN0kQ==", "engines": { "node": ">= 14" } @@ -6032,9 +6032,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.758", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.758.tgz", - "integrity": "sha512-/o9x6TCdrYZBMdGeTifAP3wlF/gVT+TtWJe3BSmtNh92Mw81U9hrYwW9OAGUh+sEOX/yz5e34sksqRruZbjYrw==", + "version": "1.4.763", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", + "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==", "dev": true }, "node_modules/electron-updater": { @@ -6078,9 +6078,9 @@ } }, "node_modules/electron-updater/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -7124,9 +7124,9 @@ } }, "node_modules/global-agent/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "optional": true, "bin": { @@ -8686,9 +8686,9 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.0.tgz", + "integrity": "sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", @@ -9701,9 +9701,9 @@ } }, "node_modules/sass": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz", - "integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==", + "version": "1.77.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz", + "integrity": "sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -9838,9 +9838,9 @@ } }, "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "bin": { "semver": "bin/semver.js" diff --git a/package.json b/package.json index 019ccee1..c588627e 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "license": "GPL-3.0", "scripts": { "dev": "node server.js", - "prebuild": "node -p \"'export const UI_VERSION = ' + JSON.stringify(require('./package.json').version)\" > core/src/redux/app/version.js", + "prebuild": "node -p \"'export const UI_VERSION = ' + JSON.stringify(process.env.npm_package_version)\" > core/src/redux/app/version.js", "build-dev": "node --max-old-space-size=8192 build.js", "build": "NODE_ENV=production node build.js", "server": "NODE_ENV=production node --max-old-space-size=8192 server.js", @@ -50,7 +50,7 @@ "crypto-js": "4.2.0", "driver.js": "1.3.1", "electron-dl": "3.5.2", - "electron-log": "5.1.2", + "electron-log": "5.1.4", "electron-store": "8.2.0", "electron-updater": "6.1.8", "emoji-picker-js": "https://github.com/Qortal/emoji-picker-js", @@ -69,7 +69,7 @@ "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.6", - "sass": "1.77.0", + "sass": "1.77.1", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, @@ -126,7 +126,7 @@ "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", - "electron": "30.0.2", + "electron": "30.0.3", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", From 39d00f294a1b419a1549eb62f08fda92878c1cff Mon Sep 17 00:00:00 2001 From: crowetic Date: Sat, 11 May 2024 20:49:24 -0700 Subject: [PATCH 18/29] Added new group sections to all languages, and further updated us.json, also cleaned up a few mistakes from late night changes xD --- core/language/de.json | 11 +++- core/language/es.json | 14 ++++- core/language/et.json | 11 +++- core/language/fi.json | 11 +++- core/language/fr.json | 11 +++- core/language/hindi.json | 11 +++- core/language/hr.json | 11 +++- core/language/hu.json | 11 +++- core/language/it.json | 11 +++- core/language/jp.json | 11 +++- core/language/ko.json | 11 +++- core/language/nl.json | 13 +++- core/language/no.json | 11 +++- core/language/pl.json | 11 +++- core/language/pt.json | 11 +++- core/language/ro.json | 11 +++- core/language/rs.json | 11 +++- core/language/ru.json | 11 +++- core/language/us.json | 131 +++++++++++++++++++++------------------ core/language/zhc.json | 11 +++- core/language/zht.json | 11 +++- 21 files changed, 273 insertions(+), 83 deletions(-) diff --git a/core/language/de.json b/core/language/de.json index b1f0b8e2..073b4316 100644 --- a/core/language/de.json +++ b/core/language/de.json @@ -945,7 +945,16 @@ "gchange56": "Zu suchender Gruppenname", "gchange57": "Privater Gruppenname nicht gefunden", "gchange58": "Beachten Sie, dass der Gruppenname genau übereinstimmen muss.", - "gchange59": "Ticker ein-/ausblenden" + "gchange59": "Ticker ein-/ausblenden", + "gchange60": "Bitte geben Sie den Gruppennamen ein", + "gchange61": "Bitte Beschreibung eingeben", + "gchange62": "Sind Sie sicher, dass Sie diese Gruppe AKTUALISIEREN möchten?", + "gchange63": "Wenn Sie auf CONFIRM klicken, wird die UPDATE_GROUP Anfrage gesendet!", + "gchange64": "Derzeitiger Besitzer / Neuer Besitzer", + "gchange65": "Ersetzen Sie diese Adresse durch EIGENTUM der Gruppe übertragen!", + "gchange66": "Ungültige Besitzer-/neue Besitzeradresse", + "gchange67": "Gruppen-UPDATE erfolgreich!", + "gchange68": "Gruppen-Avatar festlegen" }, "puzzlepage": { "pchange1": "Rätsel", diff --git a/core/language/es.json b/core/language/es.json index 55a16689..8a61f827 100644 --- a/core/language/es.json +++ b/core/language/es.json @@ -945,7 +945,17 @@ "gchange56": "Nombre del grupo a buscar", "gchange57": "Nombre de grupo privado no encontrado", "gchange58": "Tenga en cuenta que el nombre del grupo debe coincidir exactamente.", - "gchange59": "Mostrar/ocultar teletipo" + "gchange59": "Mostrar/ocultar teletipo", + "gchange60": "Por favor, introduzca el nombre del grupo", + "gchange61": "Por favor, introduzca la descripción", + "gchange62": "¿Estás seguro de ACTUALIZAR este grupo?", + "gchange63": "Al presionar CONFIRMAR, se enviará la solicitud UPDATE_GROUP.", + "gchange64": "Propietario actual / Nuevo propietario", + "gchange65": "¡Reemplace esta dirección para TRANSFERIR LA PROPIEDAD del grupo!", + "gchange66": "Propietario no válido / Dirección de nuevo propietario", + "gchange67": "¡Éxito de la ACTUALIZACIÓN del grupo!", + "gchange68": "Establecer avatar de grupo" + }, "puzzlepage": { "pchange1": "Rompecabezas", @@ -1176,7 +1186,7 @@ "inf7": "Información de compra automática", "inf8": "Cerrar información de compra automática", "inf9": "'Auto Buy' es una función que permite realizar 'órdenes de compra' en el Portal de comercio. Estas 'órdenes de compra' solo son visibles para la persona que las realiza. No son órdenes de compra 'públicas' como las Las 'ventas de mercado abierto' NO se almacenan en la cadena de bloques de Qortal. La compra automática es una característica de la interfaz de usuario y, como tal, requiere que la interfaz de usuario esté FUNCIONANDO.", - "inf10": "Para realizar un pedido de Compra automática, haga clic en el botón "Agregar pedido de Compra automática" y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR o la cantidad de LTC que desea utilizar, y el PRECIO que desea COMPRAR HASTA. Una vez que la orden esté activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que usted establezca (comenzando en la orden más baja y subiendo en los libros).", + "inf10": "Para realizar un pedido de Compra automática, haga clic en el botón 'Agregar pedido de Compra automática' y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR o la cantidad de LTC que desea utilizar, y el PRECIO que desea COMPRAR HASTA. Una vez que la orden esté activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que usted establezca (comenzando en la orden más baja y subiendo en los libros).", "inf11": "¡Simplemente DEJE SU IU FUNCIONANDO y Auto Buy hace el resto, automáticamente!", "inf12": "PUEDE explorar otros complementos en la IU (Q-Chat, carteras, etc.) pero NO PUEDE CERRAR LA IU si desea que se complete su compra automática. Deje la IU 'minimizada' en la 'barra de tareas' o 'panel' está bien, mientras la interfaz de usuario permanezca ABIERTA, Auto Buy funcionará.", "inf13": "Comprar automáticamente", diff --git a/core/language/et.json b/core/language/et.json index 5a67a2d3..d0ff970c 100644 --- a/core/language/et.json +++ b/core/language/et.json @@ -945,7 +945,16 @@ "gchange56": "Otsi grupi nime", "gchange57": "Privaatgrupi nime ei leitud", "gchange58": "Rühma nimi peab olema täpne vaste.", - "gchange59": "Näita / Peida saldod" + "gchange59": "Näita / Peida saldod", + "gchange60": "Palun sisestage grupi nimi", + "gchange61": "Palun sisestage kirjeldus", + "gchange62": "Kas olete kindel, et värskendate seda rühma?", + "gchange63": "Vajutades KINNITA, saadetakse UPDATE_GROUP päring!", + "gchange64": "Praegune omanik / uus omanik", + "gchange65": "Asendage see aadress grupi omandiõiguse üleandmiseks!", + "gchange66": "Kehtetu omanik / uue omaniku aadress", + "gchange67": "Grupi UUENDAMINE edukas!", + "gchange68": "Rühma avatari määramine" }, "puzzlepage": { "pchange1": "Puzzled", diff --git a/core/language/fi.json b/core/language/fi.json index b961dba9..4847f0ee 100644 --- a/core/language/fi.json +++ b/core/language/fi.json @@ -945,7 +945,16 @@ "gchange56": "Hae ryhmän nimeä", "gchange57": "Yksityisen ryhmän nimeä ei löydy", "gchange58": "Ryhmän nimen on oltava täsmällinen.", - "gchange59": "Näytä/piilota saldot" + "gchange59": "Näytä/piilota saldot", + "gchange60": "Anna ryhmän nimi", + "gchange61": "Anna kuvaus", + "gchange62": "Oletko varma, että päivität tämän ryhmän?", + "gchange63": "Kun painat vahvista, UPDATE_GROUP pyyntö lähetetään!", + "gchange64": "Nykyinen / uusi omistaja", + "gchange65": "Korvaa tämä osoite muotoon SIIRRÄ RYHMÄN OMISTAJUUS!", + "gchange66": "Virheellinen omistaja / uuden omistajan osoite", + "gchange67": "Ryhmän päivitys onnistui!", + "gchange68": "Aseta ryhmän avatar" }, "puzzlepage": { "pchange1": "Palapelit", diff --git a/core/language/fr.json b/core/language/fr.json index 7d7375b7..986f4069 100644 --- a/core/language/fr.json +++ b/core/language/fr.json @@ -945,7 +945,16 @@ "gchange56": "Nom du groupe à rechercher", "gchange57": "Nom de groupe privé introuvable", "gchange58": "Notez que le nom du groupe doit correspondre exactement.", - "gchange59": "Afficher / Masquer le téléscripteur" + "gchange59": "Afficher / Masquer le téléscripteur", + "gchange60": "Veuillez saisir le nom du groupe", + "gchange61": "Veuillez entrer la description", + "gchange62": "Êtes-vous sûr de mettre à jour ce groupe?", + "gchange63": "En appuyant sur CONFIRMER, la demande de UPDATE_GROUP sera envoyée !", + "gchange64": "Propriétaire actuel / Nouveau propriétaire", + "gchange65": "Remplacez cette adresse par TRANSFERT DE PROPRIÉTÉ du groupe !", + "gchange66": "Invalid Owner / New Owner Address", + "gchange67": "MISE À JOUR DE GROUPE réussie !", + "gchange68": "Définir l'avatar de groupe" }, "puzzlepage": { "pchange1": "Puzzles", diff --git a/core/language/hindi.json b/core/language/hindi.json index 51f6c16a..f37c22fe 100644 --- a/core/language/hindi.json +++ b/core/language/hindi.json @@ -945,7 +945,16 @@ "gchange56": "खोजने के लिए समूह का नाम", "gchange57": "निजी समूह का नाम नहीं मिला", "gchange58": "ध्यान दें कि समूह का नाम सटीक मेल खाना चाहिए।", - "gchange59": "टिकर दिखाएं / छुपाएं" + "gchange59": "टिकर दिखाएं / छुपाएं", + "gchange60": "कृपया समूह का नाम दर्ज करें", + "gchange61": "कृपया विवरण दर्ज करें", + "gchange62": "क्या आप इस समूह को अपडेट करने के लिए सुनिश्चित हैं?", + "gchange63": "पुष्टि करने पर UPDATE_GROUP अनुरोध भेजा जाएगा!", + "gchange64": "वर्तमान मालिक /", + "gchange65": "इस पते को समूह के स्थानांतरण स्वामित्व में बदलें!", + "gchange66": "अमान्य मालिक/नए मालिक का पता", + "gchange67": "समूह अद्यतन सफल!", + "gchange68": "समूह अवतार सेट करें" }, "puzzlepage": { "pchange1": "पहेलि", diff --git a/core/language/hr.json b/core/language/hr.json index 0c2e07f1..43c7c244 100644 --- a/core/language/hr.json +++ b/core/language/hr.json @@ -945,7 +945,16 @@ "gchange56": "Naziv grupe za pretraživanje", "gchange57": "Ime privatne grupe nije pronađeno", "gchange58": "Imajte na umu da se naziv grupe mora točno podudarati.", - "gchange59": "Prikaži / sakrij ticker" + "gchange59": "Prikaži / sakrij ticker", + "gchange60": "Unesite naziv grupe", + "gchange61": "Unesite opis", + "gchange62": "Jeste li sigurni da AŽURIRATE ovu grupu?", + "gchange63": "Pritiskom na CONFIRM, zahtjev za UPDATE_GROUP bit će poslan!", + "gchange64": "Trenutni vlasnik / novi vlasnik", + "gchange65": "Zamijenite ovu adresu u PRIJENOS VLASNIŠTVA grupe!", + "gchange66": "Vlasnik / nova adresa vlasnika nisu valjani", + "gchange67": "Grupa UPDATE Uspješna!", + "gchange68": "Postavi grupni avatar" }, "puzzlepage": { "pchange1": "Zagonetke", diff --git a/core/language/hu.json b/core/language/hu.json index aefc3b76..8a7ef20f 100644 --- a/core/language/hu.json +++ b/core/language/hu.json @@ -945,7 +945,16 @@ "gchange56": "A keresendő csoport neve", "gchange57": "A privát csoport neve nem található", "gchange58": "Ne feledje, hogy a csoport nevének pontosan meg kell egyeznie.", - "gchange59": "Ticker megjelenítése / elrejtése" + "gchange59": "Ticker megjelenítése / elrejtése", + "gchange60": "Kérjük, adja meg a csoport nevét", + "gchange61": "Kérjük, adja meg a leírást", + "gchange62": "Biztosan FRISSÍTI ezt a csoportot?", + "gchange63": "A MEGERŐSÍTÉS gomb megnyomásával elküldésre kerül a UPDATE_GROUP kérés!", + "gchange64": "Jelenlegi tulajdonos / Új tulajdonos", + "gchange65": "Cserélje ki ezt a címet erre: A CSOPORT TULAJDONJOGÁNAK ÁTRUHÁZÁSA!", + "gchange66": "Érvénytelen tulajdonos / új tulajdonos címe", + "gchange67": "Csoportos FRISSÍTÉS sikeres!", + "gchange68": "Csoportavatar beállítása" }, "puzzlepage": { "pchange1": "Rejtvények", diff --git a/core/language/it.json b/core/language/it.json index 35592ebe..d8e5e55c 100644 --- a/core/language/it.json +++ b/core/language/it.json @@ -945,7 +945,16 @@ "gchange56": "Nome gruppo da cercare", "gchange57": "Nome gruppo privato non trovato", "gchange58": "Nota che il nome del gruppo deve corrispondere esattamente.", - "gchange59": "Mostra / Nascondi ticker" + "gchange59": "Mostra / Nascondi ticker", + "gchange60": "Inserisci il nome del gruppo", + "gchange61": "Si prega di inserire la descrizione", + "gchange62": "Sei sicuro di AGGIORNARE questo gruppo?", + "gchange63": "Premendo CONFERMA, verrà inviata la richiesta UPDATE_GROUP!", + "gchange64": "Proprietario attuale / Nuovo proprietario", + "gchange65": "Sostituisci questo indirizzo per TRASFERIRE LA PROPRIETA' del gruppo!", + "gchange66": "Indirizzo del proprietario non valido/nuovo proprietario", + "gchange67": "AGGIORNAMENTO di gruppo riuscito!", + "gchange68": "Imposta avatar di gruppo" }, "puzzlepage": { "pchange1": "Puzzle", diff --git a/core/language/jp.json b/core/language/jp.json index 18b4a0fa..27f7f200 100644 --- a/core/language/jp.json +++ b/core/language/jp.json @@ -945,7 +945,16 @@ "gchange56": "検索するグループ名", "gchange57": "非公開 グループ名が見つかりません", "gchange58": "グループ名は完全に一致する必要があります", - "gchange59": "ティッカーの表示/非表示" + "gchange59": "ティッカーの表示/非表示", + "gchange60": "グループ名を入力してください", + "gchange61": "説明を入力してください", + "gchange62": "このグループを更新してもよろしいですか?", + "gchange63": "CONFIRMを押すと、UPDATE_GROUPリクエストが送信されます。", + "gchange64": "現在の所有者/新しい所有者", + "gchange65": "このアドレスをグループの所有権の譲渡に置き換えてください。", + "gchange66": "無効な所有者/新しい所有者のアドレス", + "gchange67": "グループ UPDATE 成功しました!", + "gchange68": "グループアバターの設定" }, "puzzlepage": { "pchange1": "パズル", diff --git a/core/language/ko.json b/core/language/ko.json index 9b5cf2d2..dfbed137 100644 --- a/core/language/ko.json +++ b/core/language/ko.json @@ -945,7 +945,16 @@ "gchange56": "검색할 그룹 이름", "gchange57": "비공개 그룹 이름을 찾을 수 없음", "gchange58": "그룹 이름이 정확히 일치해야 합니다.", - "gchange59": "티커 표시/숨기기" + "gchange59": "티커 표시/숨기기", + "gchange60": "그룹 이름을 입력해 주세요.", + "gchange61": "설명을 입력하십시오.", + "gchange62": "이 그룹을 업데이트하시겠습니까?", + "gchange63": "CONFIRM을 누르면 UPDATE_GROUP 요청이 전송됩니다!", + "gchange64": "현재 소유자/새 소유자", + "gchange65": "이 주소를 그룹의 소유권 이전으로 바꾸십시오!", + "gchange66": "잘못된 소유자/새 소유자 주소", + "gchange67": "그룹 업데이트 성공!", + "gchange68": "그룹 아바타 설정" }, "puzzlepage": { "pchange1": "퍼즐", diff --git a/core/language/nl.json b/core/language/nl.json index 5fbf5599..b856aa86 100644 --- a/core/language/nl.json +++ b/core/language/nl.json @@ -182,7 +182,7 @@ "accountsecurity": "Account-beveiliging", "password": "Wachtwoord", "download": "Qortal back-upbestand exporteren/opslaan", - "choose": "Kies een wachtwoord om uw Qortal-back-upbestand te coderen. (Dit kan dezelfde zijn als waarmee u bent ingelogd, of een nieuwe.)"", + "choose": "Kies een wachtwoord om uw Qortal-back-upbestand te coderen. (Dit kan dezelfde zijn als waarmee u bent ingelogd, of een nieuwe.)", "playsound": "Geluid afspelen", "shownotifications": "Toon waarschuwingen", "nodeurl": "Adres van de node", @@ -945,7 +945,16 @@ "gchange56": "Te zoeken groepsnaam", "gchange57": "Geen privé-groep gevonden voor opgegeven naam", "gchange58": "Hou er rekening mee dat de groepsnaam exact overeen moet komen.", - "gchange59": "Ticker wel/niet tonen" + "gchange59": "Ticker wel/niet tonen", + "gchange60": "Voer de groepsnaam in", + "gchange61": "Voer een beschrijving in", + "gchange62": "Weet je zeker dat je deze groep UPDATET?", + "gchange63": "Als u op BEVESTIGEN drukt, wordt het UPDATE_GROUP verzoek verzonden!", + "gchange64": "Huidige eigenaar / nieuwe eigenaar", + "gchange65": "Vervang dit adres door EIGENDOM van de groep OVERDRAGEN!", + "gchange66": "Ongeldig adres van de eigenaar/nieuwe eigenaar", + "gchange67": "Groep UPDATE Geslaagd!", + "gchange68": "Groepsavatar instellen" }, "puzzlepage": { "pchange1": "Puzzels", diff --git a/core/language/no.json b/core/language/no.json index cd46c294..229e6968 100644 --- a/core/language/no.json +++ b/core/language/no.json @@ -945,7 +945,16 @@ "gchange56": "Gruppenavn å søke", "gchange57": "Privat gruppenavn ikke funnet", "gchange58": "Merk at gruppenavnet må samsvare nøyaktig.", - "gchange59": "Vis / Skjul Ticker" + "gchange59": "Vis / Skjul Ticker", + "gchange60": "Vennligst skriv inn gruppenavn", + "gchange61": "Vennligst skriv inn beskrivelse", + "gchange62": "Er du sikker på å oppdatere denne gruppen?", + "gchange63": "Når du trykker på BEKREFT, vil den UPDATE_GROUP forespørselen bli sendt!", + "gchange64": "Nåværende eier / ny eier", + "gchange65": "Erstatt denne adressen til OVERFØR EIERSKAP av gruppen!", + "gchange66": "Ugyldig eier / ny eieradresse", + "gchange67": "Gruppeoppdatering vellykket!", + "gchange68": "Angi gruppeavatar" }, "puzzlepage": { "pchange1": "Puzzles", diff --git a/core/language/pl.json b/core/language/pl.json index 0e408433..7c6b7ee6 100644 --- a/core/language/pl.json +++ b/core/language/pl.json @@ -945,7 +945,16 @@ "gchange56": "Nazwa grupy do wyszukania", "gchange57": "Nie znaleziono nazwy grupy prywatnej", "gchange58": "Zauważ, że nazwa grupy musi dokładnie pasować.", - "gchange59": "Pokaż / Ukryj Znacznik" + "gchange59": "Pokaż / Ukryj Znacznik", + "gchange60": "Podaj nazwę grupy", + "gchange61": "Podaj opis", + "gchange62": "Czy na pewno AKTUALIZUJESZ tę grupę?", + "gchange63": "Po naciśnięciu przycisku POTWIERDŹ zostanie wysłane żądanie UPDATE_GROUP!", + "gchange64": "Current Owner / New Owner", + "gchange65": "Zamień ten adres na PRZENIESIENIE WŁASNOŚCI grupy!", + "gchange66": "Nieprawidłowy właściciel / nowy adres właściciela", + "gchange67": "AKTUALIZACJA grupy powiodła się!", + "gchange68": "Ustaw awatar grupy" }, "puzzlepage": { "pchange1": "Zagadki", diff --git a/core/language/pt.json b/core/language/pt.json index e7fbdc0c..7cff6741 100644 --- a/core/language/pt.json +++ b/core/language/pt.json @@ -945,7 +945,16 @@ "gchange56": "Nome do grupo para pesquisar", "gchange57": "Nome do grupo privado não encontrado", "gchange58": "Observe que o nome do grupo deve corresponder exatamente.", - "gchange59": "Mostrar / Ocultar Ticker" + "gchange59": "Mostrar / Ocultar Ticker", + "gchange60": "Insira o nome do grupo", + "gchange61": "Por favor, insira a descrição", + "gchange62": "Tem certeza de que vai ATUALIZAR este grupo?", + "gchange63": "Ao pressionar CONFIRMAR, a solicitação de UPDATE_GROUP será enviada!", + "gchange64": "Proprietário Atual / Novo Proprietário", + "gchange65": "Substitua este endereço para TRANSFERIR PROPRIEDADE do grupo!", + "gchange66": "Endereço de proprietário / novo proprietário inválido", + "gchange67": "ATUALIZAÇÃO DO Grupo bem-sucedida!", + "gchange68": "Definir avatar do grupo" }, "puzzlepage": { "pchange1": "Enigmas", diff --git a/core/language/ro.json b/core/language/ro.json index c234b51f..3fba32a0 100644 --- a/core/language/ro.json +++ b/core/language/ro.json @@ -945,7 +945,16 @@ "gchange56": "Numele grupului de căutat", "gchange57": "Numele grupului privat nu a fost găsit", "gchange58": "Rețineți că numele grupului trebuie să se potrivească exact.", - "gchange59": "Afișează / Ascunde Ticker" + "gchange59": "Afișează / Ascunde Ticker", + "gchange60": "Vă rugăm să introduceți numele grupului", + "gchange61": "Vă rugăm să introduceți descrierea", + "gchange62": "Sunteți sigur că actualizați acest grup?", + "gchange63": "La apăsarea butonului CONFIRM, va fi trimisă solicitarea UPDATE_GROUP!", + "gchange64": "Proprietar actual / Proprietar nou", + "gchange65": "Înlocuiți această adresă la TRANSFERAȚI PROPRIETATEA grupului!", + "gchange66": "Adresa proprietarului / proprietarului nou nevalidă", + "gchange67": "UPDATE de grup Reușit!", + "gchange68": "Set Avatar grup" }, "puzzlepage": { "pchange1": "Puzzle-uri", diff --git a/core/language/rs.json b/core/language/rs.json index 6b4e65fa..a1e70f56 100644 --- a/core/language/rs.json +++ b/core/language/rs.json @@ -945,7 +945,16 @@ "gchange56": "Ime grupe za pretragu", "gchange57": "Ime privatne grupe nije pronađeno", "gchange58": "Imajte na umu da ime grupe mora potpuno da se podudara.", - "gchange59": "Prikaži / Sakrij Oznaku" + "gchange59": "Prikaži / Sakrij Oznaku", + "gchange60": "Unesite ime grupe", + "gchange61": "Unesite opis", + "gchange62": "Želite li zaista da ažurirate ovu grupu?", + "gchange63": "Na pritisku POTVRDITE, UPDATE_GROUP će biti poslat!", + "gchange64": "Trenutni vlasnik / novi vlasnik", + "gchange65": "Zameni ovu adresu NA PRENOS VLASNIŠTVA GRUPE!", + "gchange66": "Nevažeći vlasnik / adresa novog vlasnika", + "gchange67": "Grupni UPDATE je uspešan!", + "gchange68": "Postavi grupni avatar" }, "puzzlepage": { "pchange1": "Slagalice", diff --git a/core/language/ru.json b/core/language/ru.json index 747afb64..871ec655 100644 --- a/core/language/ru.json +++ b/core/language/ru.json @@ -945,7 +945,16 @@ "gchange56": "Имя группы для поиска", "gchange57": "Имя частной группы не найдено", "gchange58": "Обратите внимание, что название группы должно точно совпадать.", - "gchange59": "Показать/скрыть бегущую строку" + "gchange59": "Показать/скрыть бегущую строку", + "gchange60": "Пожалуйста, введите название группы", + "gchange61": "Пожалуйста, введите описание", + "gchange62": "Вы обязательно ОБНОВИТЕ эту группу?", + "gchange63": "При нажатии кнопки ПОДТВЕРДИТЬ будет отправлен UPDATE_GROUP запрос!", + "gchange64": "Текущий владелец / Новый владелец", + "gchange65": "Замените этот адрес на TRANSFER OWNERSHIP of group!", + "gchange66": "Неверный адрес владельца / нового владельца", + "gchange67": "Групповое ОБНОВЛЕНИЕ выполнено успешно!", + "gchange68": "Установить групповой аватар" }, "puzzlepage": { "pchange1": "Головоломки", diff --git a/core/language/us.json b/core/language/us.json index 0918d5c3..77fae211 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -46,48 +46,48 @@ "sm3": "NAMES MARKET" }, "tabmenu": { - "tm1": "Minting Details", - "tm2": "Become a Minter", - "tm3": "Sponsorship", - "tm4": "Wallets", - "tm5": "Trade Portal", - "tm6": "Auto Buy", - "tm7": "Reward Share", - "tm8": "Q-Chat", - "tm9": "Name Registration", - "tm10": "Names Market", - "tm11": "Websites", - "tm12": "Q-Apps", - "tm13": "Group Management", - "tm14": "Data Management", - "tm15": "Puzzles", - "tm16": "Node Management", - "tm17": "New Tab", - "tm18": "Add New Tab", - "tm19": "Add New Plugin", - "tm20": "Q-App", - "tm21": "Website", - "tm22": "Remove Plugin", - "tm23": "Are you sure to remove this plugin ?", - "tm24": "Plugin Type:", - "tm25": "Please select a plugin type!", - "tm26": "Add New Plugin To Menu", - "tm27": "Remove Plugin From Menu", - "tm28": "Overview Page", - "tm29": "Reset Tab Menu", - "tm30": "Search Qortal Name", - "tm31": "My Followed Names", - "tm32": "This account does not follow any user", - "tm33": "Import Tab Menu", - "tm34": "Export Tab Menu", - "tm35": "Your existing tab menu will be deleted and set to imported tab menu.", - "tm36": "Tab Menu Successfully Restored", - "tm37": "Tab Menu Successfully Saved As", + "tm1": "MINTING DETAILS", + "tm2": "BECOME A MINTER", + "tm3": "SPONSORSHIP", + "tm4": "WALLETS", + "tm5": "TRADE PORTAL", + "tm6": "AUTO-BUY", + "tm7": "REWARD SHARE", + "tm8": "Q-CHAT", + "tm9": "NAME REGISTRATION", + "tm10": "NAMES MARKET", + "tm11": "WEBSITES", + "tm12": "Q-APPS", + "tm13": "GROUP MANAGEMENT", + "tm14": "DATA MANAGEMENT", + "tm15": "PUZZLES", + "tm16": "NODE MANAGEMENT", + "tm17": "NEW TAB", + "tm18": "OPEN NEW TAB", + "tm19": "ADD CUSTOM LINK", + "tm20": "Q-App (input name)", + "tm21": "Website (input name)", + "tm22": "REMOVE LINK", + "tm23": "Are you sure to REMOVE this link?", + "tm24": "Choose LINK TYPE:", + "tm25": "Please SELECT a LINK TYPE!", + "tm26": "ADD LINK TO NEW TAB PAGE", + "tm27": "REMOVE LINK FROM NEW TAB PAGE", + "tm28": "OVERVIEW PAGE", + "tm29": "RESET New Tab Page", + "tm30": "SEARCH For Qortal NAMES", + "tm31": "My FOLLOWED Names", + "tm32": "This Node is NOT Following Any Names", + "tm33": "IMPORT Saved New Tab LINKS", + "tm34": "EXPORT Saved New Tab LINKS", + "tm35": "Your existing New Tab Page Links will be DELETED AND REPLACED with IMPORTED New Tab Links.", + "tm36": "New Tab Page SUCCESSFULLY RESTORED!", + "tm37": "New Tab Links SUCCESSFULLY SAVED as:", "tm38": "DEV MODE", "tm39": "Add Custom Framework", "tm40": "Add and Open", "tm41": "Error: Invalid data please try again!", - "tm42": "Qortal Lottery" + "tm42": "Qortal LOTTERY" }, "login": { "login": "Log In", @@ -101,40 +101,40 @@ "upload": "Import your Qortal backup file", "howlogin": "How would you like to log in?", "seed": "Seedphrase", - "seedphrase": "seedphrase", + "seedphrase": "SEEDPHRASE", "saved": "Saved account", "qora": "QORA address seed", "backup": "Qortal backup file", "decrypt": "Decrypt backup file", "save": "Save in this browser.", "prepare": "Preparing Your Account...", - "areyousure": "Are you sure you want to remove this wallet from saved wallets? (If removed and no backup file exists, account could be lost forever! Ensure you have a backup file before doing this!)", + "areyousure": "Are you sure you want to REMOVE this ACCOUNT from SAVED ACCOUNTS? (If removed and no backup file exists, account could be lost forever! ENSURE YOU HAVE A BACKUP FILE FOR THIS ACCOUNT BEFORE DOING THIS!)", "error1": "Backup file must be valid JSON", "error2": "Login option not selected", "createwelcome": "Welcome to Qortal! Your decentralized digital future awaits you! On Qortal, you and ONLY you have absolute control over your data. Qortal provides the base level of a new, and fully user-controlled digital world!", "createa": "A", - "click": "Click to view seedphrase", + "click": "CLICK to VIEW SEEDPHRASE", "confirmpass": "Confirm Password", - "willbe": "will be randomly generated in the background. If you wish to VIEW the seedphrase, click the word 'seedphrase' in this text. Seedphrases are used to generate the private key for your Qortal account. For security by default, seedphrases are NOT displayed unless specifically chosen.", + "willbe": "will be randomly generated in the background. If you wish to VIEW THE SEEDPHRASE, click the word 'SEEDPHRASE' in this text. Seedphrases are used to generate the private key for your Qortal account. For security by default, seedphrases are NOT displayed unless specifically chosen.", "clicknext": "Create your Qortal account by clicking NEXT below.", - "ready": "Your account is now ready to be created. It will be SAVED AND ENCRYPTED within this copy of the Qortal UI by default. If you do NOT wish for it to be saved, UNCHECK the box below. You are always able to access your new account using the Qortal BACKUP FILE that MUST be SAVED upon account creation.", + "ready": "Your account is now ready to be created. It will be SAVED AND ENCRYPTED within THIS Qortal UI only, by default. If you DO NOT wish for it to be saved, UNCHECK THE BOX BELOW. You are always able to access your new account using the Qortal BACKUP FILE that MUST be SAVED upon account creation.", "welmessage": "Welcome to Qortal", "pleaseenter": "Please enter a Password!", - "notmatch": "Oops! Passwords do not match! Try again!", - "lessthen8": "Your password is less than 5 characters! This is not recommended. To continue anyway, click CONTINUE.", - "lessthen8-2": "Your password is less than 5 characters!", + "notmatch": "Oops! Passwords do NOT match! Try again!", + "lessthen8": "Your password is LESS THAN 5 characters! This is NOT recommended. To continue anyway, click CONTINUE.", + "lessthen8-2": "Your password is LESS THAN 5 characters!", "entername": "Please enter a Display Name!", - "downloaded": "Your Qortal Backup File was saved!", - "loading": "Loading, Please wait...", - "createdseed": "Your created Seedphrase:", - "saveseed": "Save Seedphrase", - "savein": "Save in this UI", - "backup2": "This file is the ONLY way (by default) to access your account (unless saved to the UI). BE SURE TO BACKUP THIS FILE IN MULTIPLE LOCATIONS. The file is ENCRYPTED very securely (and decrypted) with your local password created in the previous step. You can save the file anywhere securely, but be sure to do so in multiple places.", - "savewallet": "Save Qortal Backup File", + "downloaded": "Your Qortal Backup File was SAVED!", + "loading": "LOADING, Please wait...", + "createdseed": "Your Generated Seedphrase:", + "saveseed": "SAVE SEEDPHRASE", + "savein": "SAVE in THIS UI", + "backup2": "This file is the ONLY WAY (by default) to ACCESS YOUR ACCOUNT (unless saved to the UI). BE SURE TO BACKUP THIS FILE IN MULTIPLE LOCATIONS. The file is ENCRYPTED very securely (and decrypted) with your local PASSWORD created in the previous step. You can save the Qortal Backup File anywhere securely, but be sure to do so in MULTIPLE PLACES.", + "savewallet": "SAVE Qortal Backup File", "created1": "Your account is now created", - "created2": " and saved in this UI in encrypted form.", - "downloadbackup": "Save Qortal Backup File", - "passwordhint": "Encryption password must be at least 5 characters.", + "created2": " and saved in THIS UI in ENCRYPTED form.", + "downloadbackup": "SAVE Qortal Backup File", + "passwordhint": "Encryption password is suggested to be at least 5 characters.", "lp1": "Lock Screen", "lp2": "No screen lock password is set!", "lp3": "Please set one", @@ -469,7 +469,7 @@ "rchange9": "Levels 1 - 4 can only create a Self-Share (minting) keys. Only Level 5 or above can create a Reward Share!", "rchange10": "Recipient's Public Key", "rchange11": "Reward Share percentage", - "rchange12": "Executing requested command...", + "rchange12": "Executing Requested Command...", "rchange13": "Adding Minting Account", "rchange14": "Add", "rchange15": "Account is not involved in any Reward Shares", @@ -901,7 +901,7 @@ "gchange12": "Create a New Group", "gchange13": "Group Type", "gchange14": "This Field is Required", - "gchange15": "Select an option", + "gchange15": "--SELECT AN OPTION--", "gchange16": "Public", "gchange17": "Private", "gchange18": "Group Approval Threshold (number / percentage of Admins that must approve a transaction):", @@ -930,7 +930,7 @@ "gchange41": "Group Creation Successful!", "gchange42": "Invalid Group Name", "gchange43": "Invalid Group Description", - "gchange44": "Select a Group Type", + "gchange44": "Select Group Type", "gchange45": "Select a Group Approval Threshold", "gchange46": "Select a Minimum Block delay for Group Transaction Approvals", "gchange47": "Select a Maximum Block delay for Group Transaction Approvals", @@ -944,8 +944,17 @@ "gchange55": "Search Private Group", "gchange56": "Group Name To Search", "gchange57": "Private Group Name Not Found", - "gchange58": "Note that group name must be an exact match.", - "gchange59": "Show / Hide Ticker" + "gchange58": "Group name must be an exact match.", + "gchange59": "Show / Hide Ticker", + "gchange60": "Please enter group name", + "gchange61": "Please enter description", + "gchange62": "Are you sure to UPDATE this group?", + "gchange63": "On pressing CONFIRM, the UPDATE_GROUP request will be sent!", + "gchange64": "Current Owner / New Owner", + "gchange65": "Replace this address to TRANSFER OWNERSHIP of the group!", + "gchange66": "Invalid Owner / New Owner Address", + "gchange67": "Group UPDATE Successful!", + "gchange68": "Set Group Avatar" }, "puzzlepage": { "pchange1": "Puzzles", diff --git a/core/language/zhc.json b/core/language/zhc.json index 2680840d..5149f748 100644 --- a/core/language/zhc.json +++ b/core/language/zhc.json @@ -945,7 +945,16 @@ "gchange56": "要搜索的群组名称", "gchange57": "未找到私人群组名称", "gchange58": "注意群组名称必须完全匹配。", - "gchange59": "显示/隐藏代码" + "gchange59": "显示/隐藏代码", + "gchange60": "请输入组名", + "gchange61": "请输入描述", + "gchange62": "你确定要更新这个组吗?", + "gchange63": "按 CONFIRM 后,将发送UPDATE_GROUP请求!", + "gchange64": "当前所有者/新所有者", + "gchange65": "将此地址替换为组的 TRANSFER OWNERSHIP!", + "gchange66": "无效的所有者/新所有者地址", + "gchange67": "组更新成功!", + "gchange68": "设置组头像" }, "puzzlepage": { "pchange1": "益智游戏", diff --git a/core/language/zht.json b/core/language/zht.json index 9073d7ff..01dba82e 100644 --- a/core/language/zht.json +++ b/core/language/zht.json @@ -945,7 +945,16 @@ "gchange56": "要搜索的群組名稱", "gchange57": "未找到私人群組名稱", "gchange58": "注意群組名稱必須完全匹配。", - "gchange59": "顯示/隱藏代碼" + "gchange59": "顯示/隱藏代碼", + "gchange60": "請輸入組名", + "gchange61": "請輸入描述", + "gchange62": "你確定要更新這個組嗎?", + "gchange63": "按 CONFIRM 後,將發送UPDATE_GROUP請求!", + "gchange64": "當前擁有者/新擁有者", + "gchange65": "將此位址替換為組的 TRANSFER OWNERSHIP!", + "gchange66": "無效的擁有者/新擁有者位址", + "gchange67": "組更新成功!", + "gchange68": "設置組頭像" }, "puzzlepage": { "pchange1": "益智游戲", From 12472e8bde1bddadad9a2f8552a8ca7cf15d3b85 Mon Sep 17 00:00:00 2001 From: crowetic Date: Tue, 14 May 2024 18:13:43 -0700 Subject: [PATCH 19/29] final fixes to US language file, NEW UI icon (keeping same color scheme but improving dramatically.) --- core/language/us.json | 10 +++++----- img/favicon/android-icon-144x144.png | Bin 4988 -> 21352 bytes img/favicon/android-icon-192x192.png | Bin 6031 -> 22400 bytes img/favicon/android-icon-36x36.png | Bin 1374 -> 14387 bytes img/favicon/android-icon-48x48.png | Bin 1618 -> 14089 bytes img/favicon/android-icon-72x72.png | Bin 1876 -> 16591 bytes img/favicon/android-icon-96x96.png | Bin 2213 -> 17240 bytes img/favicon/apple-icon-114x114.png | Bin 2522 -> 19574 bytes img/favicon/apple-icon-120x120.png | Bin 2629 -> 20281 bytes img/favicon/apple-icon-144x144.png | Bin 4988 -> 21350 bytes img/favicon/apple-icon-152x152.png | Bin 5358 -> 21022 bytes img/favicon/apple-icon-180x180.png | Bin 6874 -> 23086 bytes img/favicon/apple-icon-57x57.png | Bin 1634 -> 16416 bytes img/favicon/apple-icon-60x60.png | Bin 1747 -> 16069 bytes img/favicon/apple-icon-72x72.png | Bin 1876 -> 16591 bytes img/favicon/apple-icon-76x76.png | Bin 1907 -> 16330 bytes img/favicon/apple-icon-precomposed.png | Bin 6520 -> 22400 bytes img/favicon/apple-icon.png | Bin 6520 -> 21585 bytes img/favicon/favicon-16x16.png | Bin 976 -> 6260 bytes img/favicon/favicon-32x32.png | Bin 1361 -> 8631 bytes img/favicon/favicon-96x96.png | Bin 2213 -> 17240 bytes img/favicon/favicon.ico | Bin 1150 -> 1150 bytes img/favicon/ms-icon-144x144.png | Bin 4988 -> 21351 bytes img/favicon/ms-icon-150x150.png | Bin 5335 -> 22136 bytes img/favicon/ms-icon-310x310.png | Bin 15292 -> 32012 bytes img/favicon/ms-icon-70x70.png | Bin 1834 -> 17000 bytes img/icons/icns/1024x1024.icns | Bin 0 -> 222543 bytes img/icons/icns/128x128.icns | Bin 0 -> 24064 bytes img/icons/icns/256x256.icns | Bin 58907 -> 39245 bytes img/icons/icns/64x64.icns | Bin 52612 -> 24064 bytes img/icons/icns/icon.icns | Bin 0 -> 222543 bytes img/icons/ico/128x128.ico | Bin 67646 -> 270398 bytes img/icons/ico/16x16.ico | Bin 1150 -> 1150 bytes img/icons/ico/24x24.ico | Bin 2462 -> 2462 bytes img/icons/ico/256x256.ico | Bin 270398 -> 270398 bytes img/icons/ico/32x32.ico | Bin 4286 -> 4286 bytes img/icons/ico/48x48.ico | Bin 9662 -> 9662 bytes img/icons/ico/512x512-multi-size.ico | Bin 0 -> 458262 bytes img/icons/ico/57x57.ico | Bin 0 -> 13514 bytes img/icons/ico/64x64.ico | Bin 16958 -> 270398 bytes img/icons/ico/72x72.ico | Bin 0 -> 21662 bytes img/icons/ico/96x96.ico | Bin 38078 -> 270398 bytes img/icons/icon.icns | Bin 70645 -> 222543 bytes img/icons/icon.ico | Bin 270398 -> 140206 bytes img/icons/icon.png | Bin 7174 -> 17388 bytes img/icons/png/1024x1024.png | Bin 124886 -> 109348 bytes img/icons/png/128x128.png | Bin 7174 -> 17388 bytes img/icons/png/16x16.png | Bin 847 -> 6260 bytes img/icons/png/24x24.png | Bin 1181 -> 10881 bytes img/icons/png/256x256.png | Bin 15645 -> 27944 bytes img/icons/png/32x32.png | Bin 1500 -> 8631 bytes img/icons/png/48x48.png | Bin 2247 -> 11915 bytes img/icons/png/512x512.png | Bin 44130 -> 50738 bytes img/icons/png/64x64.png | Bin 2891 -> 12351 bytes img/icons/png/96x96.png | Bin 4318 -> 17240 bytes img/icons/png/tray/tray.png | Bin 847 -> 6260 bytes img/icons/png/tray/tray@1.5x.png | Bin 1181 -> 10881 bytes img/icons/png/tray/tray@2x.png | Bin 1500 -> 8631 bytes img/icons/png/tray/tray@3x.png | Bin 2247 -> 11915 bytes img/icons/png/tray/tray@4x.png | Bin 2891 -> 12351 bytes img/icons/qortal-ui-1275x1275.png | Bin 0 -> 91215 bytes img/icons/qortal-ui.png | Bin 44130 -> 50738 bytes img/qortal-ui.png | Bin 0 -> 91215 bytes img/qortal.ico | Bin 110600 -> 140206 bytes 64 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 img/icons/icns/1024x1024.icns create mode 100644 img/icons/icns/128x128.icns create mode 100644 img/icons/icns/icon.icns create mode 100644 img/icons/ico/512x512-multi-size.ico create mode 100644 img/icons/ico/57x57.ico create mode 100644 img/icons/ico/72x72.ico create mode 100644 img/icons/qortal-ui-1275x1275.png create mode 100644 img/qortal-ui.png diff --git a/core/language/us.json b/core/language/us.json index 35a6461a..ed9feb6d 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -80,14 +80,14 @@ "tm32": "This Node is NOT Following Any Names", "tm33": "IMPORT Saved New Tab LINKS", "tm34": "EXPORT Saved New Tab LINKS", - "tm35": "Your existing New Tab Page Links will be DELETED AND REPLACED with IMPORTED New Tab Links.", + "tm35": "Your existing New Tab Page Links will be DELETED and REPLACED with IMPORTED New Tab Links.", "tm36": "New Tab Page SUCCESSFULLY RESTORED!", "tm37": "New Tab Links SUCCESSFULLY SAVED as:", "tm38": "DEV MODE", "tm39": "Add Custom Framework", "tm40": "Add and Open", - "tm41": "Error: Invalid data please try again!", - "tm42": "Qortal LOTTERY" + "tm41": "ERROR: Invalid data please try again!", + "tm42": "LOTTERY" }, "login": { "login": "Log In", @@ -197,7 +197,7 @@ "deletecustomnode": "REMOVE ALL Custom Nodes", "warning": "Your Custom Nodes will be deleted and reset to default.", "snack1": "Successfully deleted and added default Nodes", - "snack2": "UI conected to Node:", + "snack2": "UI conected to Node", "snack3": "Successfully ADDED and saved Custom Node (select from drop-down to use)", "snack4": "Nodes successfully exported as:", "snack5": "Nodes successfully imported", @@ -946,7 +946,7 @@ "gchange57": "Private Group Name Not Found", "gchange58": "Group name must be an exact match.", "gchange59": "Show / Hide Ticker", - "gchange60": "Please enter group name", + "gchange60": "Please enter group name", "gchange61": "Please enter description", "gchange62": "Are you sure to UPDATE this group?", "gchange63": "On pressing CONFIRM, the UPDATE_GROUP request will be sent!", diff --git a/img/favicon/android-icon-144x144.png b/img/favicon/android-icon-144x144.png index 2e61cc458e9c16fb6be6a5ac6987b3e741580e1b..3df4979f8e39c8c57d720910baadb4769fa629de 100644 GIT binary patch literal 21352 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 Ty|oJ;BLcw6+|I1Y)I0rO9IohQ diff --git a/img/favicon/android-icon-192x192.png b/img/favicon/android-icon-192x192.png index cc2d2c3d1d2f5ccd7417a5a452357ef45c4b6321..65df45f576224ab7c23b023e3d3b6097fde429a3 100644 GIT binary patch literal 22400 zcmeFYWmFv9(l$JUyIXJx9^Bn6xVyXC;5Il39xS+9a2Q-ekl^kPAxLnyz(?*Q&pF@w z{5fmA@4qu^^>p{%RaaGAyLNT=?4A!QN;0TOgh&7Y098&_Qtfr$^JhbVd;L~hb$|x| zh~N5Z=z!Ery~thMoULpfEXhGWE|%n$-nLc%fcJ7$rmZJ2pJ(`sIj#}ZPg6dEiF33L z{~&zKqB1PaDmUFjEt;f6%pRf>K;Gzc?u+ox?mKn=E1D8D_mQOw+NMSSJ;la}T-O&5 z?)9M4-23N`xj_%B{?EOas+(MbBHS;5UH4hHC%;=e(Ot!r;Vt;kWiv&(RKHlHm zU!Jc|E_AQ&lZd%YBpv&9pRLo~c}bpUFAEf`+TGjQ{mLf77bcq{dx_7#%c^Hg3@U6c z{xR@)==iSB-8L_Obx{BEyeJ-BIPke;mV>4{6gf3W!dvFe)e8ZC&4(bvs0d`k?@t)s z$NmORn@r^v2&*kZJi=>%aF_NDfqnZtLC+R?sgYS#(cKoum)9&Fm-pkpe_l4D2sdb5 zK1QFp>p4FA|Gsfg6Lz{fk3PF6ez_j<2o%0AosjYPZBIA40LpDRY)!Jl6S6W(+>i@U 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 diff --git a/img/favicon/android-icon-36x36.png b/img/favicon/android-icon-36x36.png index eaa12c0621b75efc86f88e8f3d7aef8c8e46f972..7275b55a6a700ccbf4ad33a14dd5f0fe558e5131 100644 GIT binary patch literal 14387 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 GL;nx(O<#8a literal 1374 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 Zf}UF|P&jEe{kUcXP?pz_tCcYi`9BFhfy)2@ literal 1876 zcmZ{ic~leE9>*_R1*w1=ARvMj(Su}TPg^Px0x3e-ih{Msl0b?qk|1CK6;T3cONFQS zP|hj#vBgMOlIETdFMP|&v}2``#bmE&-eSicjlMw;qJU` ztKL=sz&4hPqZd(KHixPbF$Y;3izSM3sDqmW0M$RLqk$^KT7l=~%m5XA25*UlQLu}b z8vqv$0&po604cF`X#s#(3IK~|0HEgrpc8$!#q%>lH|KHO#|g)AM2qE!xoVhF?W@pU=>xkSGTj(skf6JgiKq=)L^bt(4CD;d32^ic_fpm@tX>i(Np zy%a(*yl+L$ev0g>fL}sb(xAks22LK7EF#!HCZyy>(eRqwsa?F~0c77MDt#l{QUZ}0 zML84FvNy7QHE`m9Wb!Zh&I&lB8|hh=yZtI|o=5Lb$=0NpU8^W_Oqw|=r8S8LR^|Px za#n{JlHq^JaAv!BLy9F1N~R!;(kQz1Lb`-t$J)ge(=v@R=;ZH6=OQYV<9n*$=w8Xl zn*3lLEEtu}h_HrPRI?0HDS>QSMER4lf+?A8i%9JOG%La~Mx~~8@YuRMrcd(w66)WD zRL#g7+r{q??2b@MZ4$kLu**Xd;~H3}66QWbc2~gPJwu$^#S%IGZ~^t|6n|U_6}^&u z-X>ZQV_D-;vj&k;F*LCukMEZlRKwlx)j()RT9tkyPNNslPcXxh@(Qa`f7J|#As zY?Xhd?`eN?CW!P{C+XK!wr%^P&e@e_j~p*W#VaX_O1shyJLwqg*m^X~rOG{Tr?#Pj zk=rq??S_Sy)30Z6w3ao33hwVu3JD6D9_MwrRiCS-+Edom(pd)Ps<(4;wJL88mGxL>1gn16@8!)a+aNfsDH2S%*LQ{Dz>r=czRhGI`zer{A57V zKfa@%*EZ+M@xC9H{F4Lvaf6L|Kvcujj-L4a0_w{yq4%{Pv6rn-dbQhG&y8u*#BavH{QH4 z)zv&mCRGV%eSdME*|@7f=VIiU=qIxY16G!{M&GFkjFWBj4EMyw{oFF}Q($-U0rfu* z$n>VJ{&3?fkKxCNZdPP|P5(pI@lUT57KU;Pi=yQ>kIdxW>wKut`+WKZ$xl$At-Y$0 zQo-C)0BPR3#?m|BB*61-?{hCGy@aHT7pSg|haGmoGjA=J*BA#H1t&`KJL1#Lb}Nrm zsz&;+F8Bvj3Jwc=Umoc&Imt{-Xl!X9AxU9L5hG4@;>>B`c-ul+7MIt_YGQm@TmP_j z$v*qiQ@)zuiBpU0c-Pzfh+4r?ww1}^S zolyPf%K#PSX3c%|pQ&veeIi8O)_yc^!0_hP_WI{qsHTuJ)hBYj7tEv$kUY&dEe1v5 z@BNmC4t;~6_0#(E7q2S53aovt&_J}j3E$}?KO~UPrU%Eci2`U8s+~ENW=^B|P;KZ` zYdVc;MxoFtly9d868}dK5f#GaB>aB?xt;rn5HL3rcu^dFTwn|vup$CO*=~WM+~9B{ zYmyDg*4)mBh_p1PSP`j4o>Xh2Fg`z;PA132#gVw1G%*O86crOHytYgj0^LnVpRm}7 zAUfSKDmXTR9m%KDJqVNss6}`y`EShoOgcS`%?%CX1F9WO6U1C47@ZG%{==N$hVa8S zk)bkURRY=b0piAuVDl5A+2H-H$kCCZU)1=z|INqEhoAt}%EpFbVQFVey>6~sL?D_U z_;_wPS_mhE#<8MVT2QRnHdGqN(uzbVNW}d-Tu*E#5&+A|-LZmkCgtCCT9JGJ diff --git a/img/favicon/android-icon-96x96.png b/img/favicon/android-icon-96x96.png index 340a399a1c8375c0400b69cc41f3216af6de87cb..3cabc3a34cb5b35ade613b862d9603d869de6a7e 100644 GIT binary patch literal 17240 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

    !u&xG9}~|xgJKbTpPv|jtyGCY85tZ} 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 wR&9Cq@*qY+_42 zY7GE@mb;si4-rEahngbs?Q{8cv7p3u@N@t`aA^q|s!ZexJRes_P~N?Ef=CR*-F!R& zIBE<)atZ)aVk-F)0Ea06Oojl!$O1q==6b#N_W+PAnI3-5IF5@@{N5O9*ND`Np(uv; z%*qcw6R)}pD;7c+j=zJjQ?Dc&t6)+gL@I(5i=ZhnmOUi1yf0ENf)olNtNS8Ih6_ee zw-!XB7;G3_6hT_W(A76m zy@mXttV50Kh1)bj!2-hwC;K!NRI7{vqI#6j(1i#pN6Np!scKJr2` zFfYe2-1HuNNhlo?VcQ!;cizi<9wCjNPz1$Sl*62-;^#ARqbfMLS27G?S%b1kG3L^Y z-2EtP97j!R;J!I|Y?owB1^j3d4eAhoQwlA}@bZr`mlh;*P})5sZx|=ePBbdQx!6vL}W(H*VGX9;$uPrA7pemN%(Xh*INN;Qh0++o?pe(5>^ z9QRz(|3$7_2JP<@cTAy`Bk1)Z*|Zn~#Masn?Gnhp4QZJ`lX@gKhGap*M%9ZKFKnl) z6G&BF=SC#zF>Zl8A};>B0hcES>;O=F>+a;>7d8Aj8wu!T>UH{7zqy^QFUZ_La%L(C zeEwnYP+{7xu14x})G4d84?JbMTz{rXb=&*lM3hGtL~*X@r#IfrABQj@PbRw#{wz56gudD-6U_L{A44onT5JUde#B*=GC1_F3+wbMQ8-ik6i zA$JrAn;(toJcosG(@JH@9s3%n`sd8UcIDH-^x=;SZxbDsg#`Or*tOi}yxXoVB&!My zR8kZ|?N@$tv=u)gT$jd4FUQ|PmO?g?9k;67gh->0r`}$Z=86US! z_xTU6`Z%uH3daKb-+t8S=EMB+dhwGxTq{H(_|o&K*{S89^LD?!qo!?OJK1kAacRA+ z>Hd(C@^YQ;Vy5fvCP(~cuqN$i9Y4j!O%+9>ZSHoXBWG7!iBL6LvZaQXu5iCVrEBbg zZynupMT}JQ;>7F&A7;pdxEGZ`KENBNdeTV$)DBud5>w5K_y~0nUE}XG*JdNk=Z_tZDLZ_ury0r#j|Yph?cV2W*i#moD20HKC zxc<>e9wq6Xm1(OxN;;Q2a`6IIL+Z&lYMxlTH5th|PNSc93fY2L1aDM*Ur@A5!r7*0 z*Ax%vuoqf@oBzok7%RM?*MXKo8d+PbybYvZh89r5Bf@tybZBSQHsMtCfX z2!KYR+L}>mW;B`~)tW)2GiX#33WY(T?Elzv?0*`#(Gi@;g#X__ZsxQS4K9lgyy!@N zd}u5SxN}3 P2nXQq?B!JM7;@_0`d&N` diff --git a/img/favicon/apple-icon-114x114.png b/img/favicon/apple-icon-114x114.png index e74716a08d0f7452b642c7cf580c877f011cb994..cba98bfced8ff19ee903b93e7bec64aa62da549e 100644 GIT binary patch literal 19574 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 Q@&Et;07*qoM6N<$g0^V2h5!Hn literal 2629 zcmZ{k2{ct}8^&oVEd z6IP}}f(76hh+h4GXjDL(3c-08z5kJ|UBeW{<}7rb!!MoYTE1e56@dZ;Ae+a3{gr#B z4c=A)a#8+=RbF@xqC$sem}u%C`={s7rUGygK_8EE4%Rb8i@?o=AjIWYf8p9Svm}ba zjwPPYTUf3HMEU&THQuFOM7R(K&@h~hJ797L1)+54VD$^Gml1kL`$)~#g<7l36m++P}5lEq;83>V??+ZMSV z?XYYKB#;k!wqs)afp5GE3}j~+H295|KE&3lV&bZpjq_ZidZtJrxTO$0QqPR?sH(*D)WBacr7cAcw!b1oCQ! z+ZVaJ%c0m_1YgDc!a|K3SoxEjtu)Z7g>?n1JP(vFg#x=^w>Mb7AoU8UWQuG4l67yC zeV~Rpy3X_Ogm;uewX@t4Ev&o=j^PXDXC|64#P0vbi+YFbDudbv-PaOR^ zCaH!w0iwzM$lm8rQa>`X#`EidL%NY4o3};fdgjeRb_4^t+=s}QKo380Dn4@;Vf0!*(znXnMgz@WvS?GBH8!7A z&5Y|q#Ej=a6b_tp2cI zU**7nQe~Bm+{);V;=^;7M+f>&JsUASbSidy$*9++{e7Z$#hp*X5Y)g!54FrLc@N!R ziSm)Ttz_TZ5Myp(wT#m_M{VE$;CxA{{ou`|AGRE^2hLyia`FyMUCEzyJ)ZFLEO+Ur zGEttaq;{mbpXoXNX1Sr@-@ zR5Z%TOizPsSNlY#wMZ@(rgBNbfeu18q`bxSl-s_p$jps>GU?^x7mpWax#3c5Y9a!j zzKa#xbIi^l^3+VHb3a&LRMOYKOm}8vxy#8MTwivr(2x#qOkg~WWE|rf+%=qaPm@m; zCB%tN1boSz?kOMPED+EnztcW>lKE#o@hY=cKW+(om}}@Y_987N`?oSiYvK=IQk!p8 zsosq@by1SfP3g!(By&9iBY!Cmt#a1Lzuq0^Ko@ zq6a_^!afbq+$q2m{Z1?$+Fh0&xT|zBJ8?2HgVr|W;4)xTm;Q55e9$KMaa!Aw_vB3+ zO(Qun_(w^L$tHUxTGM|&e*DEdiqg8FY7(JiR|caxWxYKEzTP?RseJIqe#3^lYT~i! zDj(G<{Zcvi?I3~STG`Ct(VeBE%wWn9!>F~ssw$N$PR(m7!Mc=kbNrdw12HEHaP^O) zoWE4xP_pAUA?6Z8+)`O9n!`#eHjvq`XP~m>l=N88Wjd75 zVpS**TaK3Qrv}n`LUiHoUV;P2fnAI@7de{5;^vcoJ z(^D)coo2k^@G`eSnFLFxzQ|ATVDU*Qbk(GLdON< z=CyLdqkU&yPQA@+yzn{vi0)JUuG!?1UkyspfDEp^kb`7SrF2|O;l}Z}4)jQkHCv5fZE5X=A?r z)FhkpD85Vy-BOTw{se$OdJlU6HK^t;RBulzh3pkh!3;nm5Dm15BrOujk*G%|>XJ#s z{R9G;KyaV#z4Si;!J*#%KGFX_0RPgz5eqoFks%_~hZ^M>P64cfJ$)%Qp1%HGfvUPV zJ)FLlfhv|#TZ^EBWmUB&>Z74M7p#TIElg!74i`bU)cUw*lR)CLx5CuCvJ~)IL6zYrj@x0*g6&ezO|GP1G3W=m^ zpslZ~P0`iXCVBgKlYDeY+6M@_6g?uzM_UJnMc}ad?5t19U>N`_b6c}g6OSwZ2Gfy6 ALI3~& diff --git a/img/favicon/apple-icon-144x144.png b/img/favicon/apple-icon-144x144.png index 2e61cc458e9c16fb6be6a5ac6987b3e741580e1b..67964c623658d1855913ec7337930617b9724eb7 100644 GIT binary patch literal 21350 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 literal 4988 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 Ty|oJ;BLcw6+|I1Y)I0rO9IohQ diff --git a/img/favicon/apple-icon-152x152.png b/img/favicon/apple-icon-152x152.png index 8f19aa789e2db3aa2d19b54586998d4e9ff9ef40..bb3a10360e893c558d7352996d3e72dca9730509 100644 GIT binary patch literal 21022 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 literal 5358 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 RJP&99>1Y~gl-xoR{snUj?!W*5 diff --git a/img/favicon/apple-icon-180x180.png b/img/favicon/apple-icon-180x180.png index da71fd540d332ceeedd5c8a532b72650a653e42c..c9833219aa0d23f75069e66b18ca28b9fe959c37 100644 GIT binary patch literal 23086 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 diff --git a/img/favicon/apple-icon-57x57.png b/img/favicon/apple-icon-57x57.png index d4f2d5bbbd1ec34d7b06ec90751908b3e64acf27..41e70bc4ddd598e821033cee7cda438982aa0db3 100644 GIT binary patch literal 16416 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 F`9Cm^4(#qQfKx;_hZPb4K=LvG z4j%M}m0$?{8fRSwgFwX<9AThT(*d5oM5AqLNtJCTFAZ*VgrF9uRro=Axs@vK^}zZbX^l#$z$b`GI&&p z{oJEkS%s9p)A-b(#)XhdtCPRiY-&`@Erzt1u47y)exzJf3h#ZaTviF|=Rp_$Qae^5 zro|Aw8p(UDR%mtXIuzW1W)wi4caVZN>LC;heSj+Q{d*`;hMehA4J)v)2dH&9y#I-^ z=aY6`3Cw9yw2W%in9isG@~cO04QLb^ooqlutU_MH80{AFL5Y!N$S{h{DS{H)lrP4$ ziLFYzO1N`EyP^uo>`=MaBEP>PN7QmnsJ-@^W08gtt}(|2eAVHYsA871e_plS1f9pL)3z z7PTqgz*tBFdhn@odOpOcK`!^HCsdfd6i$DkvMPl?C@|++NR(Xh$9v5dxdKw_f^8&W zlaIUI&(|BIO<%&o6XQfyWD*`H*DT=E6u%k(eLCBFO&F_jw0$`AnWqK#*uUjkjYUUL zb2wpBu!Td|w0FYdT&dTQ4W%oJJA-R_L*#;xp_E&vdV1{*?Vp z*4_EUiO2Vkkm(QS4EtWMX(Lp@{B8+WH(zavo($!fI*caIz*3Dje=%O_S} z#tz2q^=`?WWg6^gV=D4X^J$dBT=rYe)s)dL7L~$qIT(5Vw+p$115dx+yYSk&dS5+{ ztfkHs{=4?1e0<12PE-#n-nob7)}7Pc+_WJkJ;TJ^JjFV7INv7q;!(n*Uu#u;`|}gG`y+NIoz1`>3^Z=8f0qR%FeASqYY1oxLFfp;dPQ zXSzdUO%wFvsplKB)2|`WD%)k!Gvk-hH#vE=>G4X^yGD0A(E-tb?UO;$*1F^MCyq8Z zq1P_8upnE@bH{8HN=I?>fSKfiyN629rqzp9U#b2klx2v2B|Guj4dR$+F_*~^aq$4C zWD0{wp%SUoFp4XaLT6Gbj$|^EOy2VL$$|d}1PL+x*nR&mAl>EP!v#K*6_OHS#gb?d z7qA7(U5ywp;&x&k}aKvf~62KR5#rqPu;Pb6Wi9()7`TD>wd;-F73Q$~JUCGWg zh8yJsap4UdF`eQQ%1`D3vX|G{E2}@?N9(5?g@>>~EPp2#Z=WO(igzaPNU_m-_?!e` z66xQEA#tfxI)mm$r*Y{t8Z{<1h8pWar8$%7TvrM;mgeGwE1dBA1^Gpo;S~UTZJ>9F I*R~)220j4@3IG5A diff --git a/img/favicon/apple-icon-60x60.png b/img/favicon/apple-icon-60x60.png index f94ca544c4aa5432e5c1e33d248d0404633270c6..3fe74a2dd14aec0b98dfb0f578165e956fb73630 100644 GIT binary patch literal 16069 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 Pw*VOlMezzzqrm?ImlWjI literal 1747 zcmZ{ic~BEq9LFEv1!54q5UToU1PC6Oq6r|BOVDvz39t!~BNW1+fKuzx19hrY z@u*cCi~)iM6h#mesv;~6Bz>~5D%XKFjsKi>S_@Ap2x@AvoSz3;<9 zMKf%iYybc=0>uFlbX+m9rddr?TtD@v!z9_7kTn2k4^B5rCeyh^MubQRD%(HmrxWLR zaYP6J+uZ;t*bRV*E*10vkjVyMAQk{YF#z+@PF@SARV_Ng)<>N(~Pf$zM8gel0pl4SUt1!x)L0sj@EI z|GL4t9JVQkMU95CZrnsrcLvSUR-?TJ2Ipadq;#W%@&UF$i)22)I^Gj~26ES9Y)Lg@ zc^>}cGBS#hB`;|abgCNGzQ)(zG)ymtLv9+b_L`IK867I&Ih9EAJ!3Y;< zg)=H(sMXjqM0|P2sCtD@D}#j%hKg<+#;Gx!{PhJsgpsb*NZupt*%PG!JTX0aPvktr94{ijj}bUY)%BS--!?vdPfRU?m)D>NpPJqpNT7nh z(PMG+DGuf*6{*(+^ zLndRi%j(|B#^#f6pX0X9MLXB`9&#AxCnOZ>hUXS~_yx@;YAWh2*)ERmt!+wO&|v6X zaaO_QP1*gY(X!55zWj(EI#L~}8*q|&?E5~E9Wz*=K6jdVMa5XkYde!lSsXp0QTVis z2S5dilhIij=>ZwZ%&?taj)^zK5xk?3c< z;f3`@aeZ)(0P2!7oc(e#e!YrieX=jExH8s1%kQg38%AcZ?(5yTuE*Lw&TV1@?(KA$ zVOy`cGCC^Ua$*0}t%VpFY1Lh-m$j2^XW6&EZO^C*I5ytCX8oSpGmabrh_kEZfM;p+6fMg-%#akKqt|k zZ<%uKMrDFT2?^rUAvypqo8#-j;d*enQ5$e<93Odg-)%x8KteLQ@fX-l35+lzK}4(ITl6P3y| z0gIKLoz0X_(Db5drXpSTeD5$V2plIAqY^Vy;sk;KMSNxol&Ta6!e}%Da8y(s>p#q2 zo&rH4B$p*B0mqkX2h#V@%)AeD{$^t23ChF?L|@@DjYj5wfP~0XAmz3+2>dk_D=k&F zx+*&KKRO{%GzBco+q0Rd2_f@o)?qu WVAAu21;^Oa4j^!CXh5YfcGsV&!cn~d diff --git a/img/favicon/apple-icon-72x72.png b/img/favicon/apple-icon-72x72.png index 9e17dc29c8d0a931e8017645fc8a2b8040b89ffe..47a72bd6b5636f76da4b43f7fe3b7ec18c15fba8 100644 GIT binary patch literal 16591 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 diff --git a/img/favicon/apple-icon-76x76.png b/img/favicon/apple-icon-76x76.png index e2b7106d236f14d14affed9bdacffe3a97b3bfe0..b609df4ee4c847b62263e4258b49fc3dcf4893e4 100644 GIT binary patch literal 16330 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 YQfB4+yV3CNKP!NYgra!0sA16m0RYQM-T(jq literal 1907 zcmZ{jc~BEs9>*U7tAY%mQXC5lBEon;4nqQQ6k$NQ!mS`83kgXG_Yq;$Srx<+2BkpP z+EJ!tP%b$FD%T*035N(Q49GFaC?E{P03+S$T;17bYOB_rs{P~juYd1-zTfYA)%~sq z_#M^LG1CD6=y`d%2jSIseQeUipQ~OEO!1<{b!E5$Ah@Zkiq^(^jr5?SZlGqsd=YP~ zSe`))0M6P1a4`n}1wM80R{%~E0a%IxfPNPMpxm54Bn?L)DG*szW~_ zD5f4>K@(ofOlsi`<B$#qOu@ZwjpR7v+Ig>7Oc~<^`31C!$*g zsW5f_GRk=++g<~|UBk`~%Ps3+t9p2P4O^07cP15tMyX~wq*V?z3RE4{BYQlfESgmOeONvXVeDSnmMX}v6KPpc z6-+41YT?0UbYK}Zu7SJ6sCEV9(T+U%ppvT8?#~g!YACW>*8LGR7r+^V@`+FAo~P3M zam50Hebp*`^iB!Np@2@LbwS1Kkr~y%+*dNscH}Pt_}*J3rCB-yV>u&on+Djp7Ct6K z)|6P~jPh_BQaGV-Xp~N^q34F=JL=(Zk!))<^jdFL&3Fu$PkYg_C9^6R`TuI<91Eqf=^DxVVFvYTab# z{dD>A@pz;-oE!gkvTe+Aa@$DS(Sg3yL;mfn=P&8HcrLfmlEGnmh(=bH#-1x#!-m_< zORfZ1Y&9>P($Uksx{0Or@}-+mkYPcfS@tPcN??JZPWi8Q$D4M(5{X1z?n+OQosF$w z&cRDIyKIHZ!@R=aAnonO*GeDR#D56qEt(oIy$|0lD7MWVW^>rv_HDH}us68dw<0YK zE-A|WX<@!@mtY5>z2lr9$0zjG_uO0028@dTQ8E<~7%k8`78JK{=WtPcjd9+?U1b4} zKIL-EE?bqNVa%E@Y1f&zkA>VQuc{gyX)dhvCi$EU_EBDZI1txxLcH$@p|aYrFDkK( z*2Q@E!qF)BYi;)CIPnB2``d5rawCRgg+gv#E6V6E*8JypH?(}ZZ=_zIu=e%+I#So= zfhlQZ@{Qk_m=H-~wWq_CeHPaG4K**b=a~0TF-=ECcUv~(MrXLpcdN!P2wTnx>xz?_ zO)?^uBtPgaiQ7KjI%Q5;v^0U1L^B&VDh?tV^9Mn}gZGBhVUnIzgA3bk2@beA(W%&q zLN;Dr$1Q9aO>G+&&IQWfF#P_8B-9i0?kg&INvuGI|Kk1WQ2!S-|C-eFYkUVD_rz8teSWraiaYocC^d(YQh_I?-)ny@Xh9 zS63`{^f0R|}?xORmwhuuujoZ}zBDE@ zSUx|6P9S7vW;*cJX?)WTz61Sac_A+e_unRL2)GV63AJBd%H2jFNrAeE_G z34dUI&!p31**tD6ACR2M`XKEx&KQ5@^B*RZ7sHQTM}B&|V-t>;eugl3iERFv6gK#M zSA>)#u1o!Kzd!geLU0O@9BDM-eu}dbDbL=d3`g`o^9kmiWdov{TT#iOkNDE@&z6n_ zc>xYDfsG%ZkeI|zNahka(HT5ea#A|szaNIcCX=bo6elW$O{GxCF`O7O$B|6gPo%PG dBr=EM=zuF6@cjk&gc{-rz{|tWy~Zsn``_()q#FPL diff --git a/img/favicon/apple-icon-precomposed.png b/img/favicon/apple-icon-precomposed.png index 7ace16595ae76a13ab1a588f6421ce517a220330..65df45f576224ab7c23b023e3d3b6097fde429a3 100644 GIT binary patch literal 22400 zcmeFYWmFv9(l$JUyIXJx9^Bn6xVyXC;5Il39xS+9a2Q-ekl^kPAxLnyz(?*Q&pF@w z{5fmA@4qu^^>p{%RaaGAyLNT=?4A!QN;0TOgh&7Y098&_Qtfr$^JhbVd;L~hb$|x| zh~N5Z=z!Ery~thMoULpfEXhGWE|%n$-nLc%fcJ7$rmZJ2pJ(`sIj#}ZPg6dEiF33L z{~&zKqB1PaDmUFjEt;f6%pRf>K;Gzc?u+ox?mKn=E1D8D_mQOw+NMSSJ;la}T-O&5 z?)9M4-23N`xj_%B{?EOas+(MbBHS;5UH4hHC%;=e(Ot!r;Vt;kWiv&(RKHlHm zU!Jc|E_AQ&lZd%YBpv&9pRLo~c}bpUFAEf`+TGjQ{mLf77bcq{dx_7#%c^Hg3@U6c z{xR@)==iSB-8L_Obx{BEyeJ-BIPke;mV>4{6gf3W!dvFe)e8ZC&4(bvs0d`k?@t)s z$NmORn@r^v2&*kZJi=>%aF_NDfqnZtLC+R?sgYS#(cKoum)9&Fm-pkpe_l4D2sdb5 zK1QFp>p4FA|Gsfg6Lz{fk3PF6ez_j<2o%0AosjYPZBIA40LpDRY)!Jl6S6W(+>i@U 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 diff --git a/img/favicon/apple-icon.png b/img/favicon/apple-icon.png index 7ace16595ae76a13ab1a588f6421ce517a220330..89f482fee8be8809927e3e1df4573bab5f5f5b89 100644 GIT binary patch literal 21585 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 diff --git a/img/favicon/favicon-16x16.png b/img/favicon/favicon-16x16.png index 430a064cc3307a616d65fad24b7820fa40662dd4..c95e614d5347d735430b4c98def414fb7a9b34c2 100644 GIT binary patch literal 6260 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 literal 976 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5lvo+|Nmcq|L=PK$A0hkfB*kq`}jBa>`(CxUl~_?dG+I8>(yUMo4+!w_`In^CjT$ z_kAz_Fs=OZ=kX`Z03Fu(PByV>Yh7ML)4NQUgv8H;AwcciF?XkJ_YBax?P|D%KN5qi2oC}eL3BP zeL?qQ*2d=vUQ<$711G8$-U#(|H{x-M4X!rO-6DIvG-t~hIh!xd0t!4eU)VY#?(8+} z{?{~r2}9B&Q>tfGuN}wwNwCFX`*Xj3ba)r(9ldFqokz3N?*Ucyj(96q#B5Us`c`V((kmr z1scd80WvWpqck_k%E~1_ximL5uf)nK0I0N>!EpKi-TG*1z;;?$Wu#`NXOu7)S{m^) z6tx1?h$EQ;RTG|>Qj!5ua(Rs+2T+M5k`mv{+|-iFf>Z{utMm)<((N~e`JtKP8v<0t zU}$P?ZeVO;X<^u-E3q7?gdfSA;LNI21_LLjDU0mh0Hwl^q(Xx{8PYOyQi0yr&&?~z z$xqi$ODxMw&d)2>M?{Q%s*#bIrHO@^NvfHNiBU>gicy-Wk%_T^S*p3AQJRUV9#DrK W(0u{k;etRL7(8A5T-G@yGywpR!+1Ub diff --git a/img/favicon/favicon-32x32.png b/img/favicon/favicon-32x32.png index 65305cd2041b6cdab253c558b3dc0fec14d7afeb..1dd35f0705bc5ed323ec8e4c22b8c116f32e2dca 100644 GIT binary patch literal 8631 zcmeHMc{r5q_aA$9(t?yRiY#Mh>}$4}Y}th*j9H9rhB3?_TOn(a60#+-lqFR5UG^nH zlC468EM){44+ffL%`) zZbrQW_pd{Y)Ne08zwZD5>qS2cYmym~4D=upu+DB6Aj#JQ1H@3Au>b(&ZDEpgse}Ya z=+Ck!JK6-^M7l#DKc?Crd+^b7b4Cz5&ULj%wqcsOofke=?G^`}+TgSk+g>PrZRsbL zZuPaYtr799&vl}2>f3Hj@upwPhTzxgzU%FUElKIcySolv8S~5A6ZZE*H-2nrEk#2s zZWlA5YQFXfF7=IEd%9cG-*xRsdRlE=;Ihrx)_aJptvb77cPGAZ>I|;ERjS87E3Qv< zku=llxjOsF6`VF7PLSBMkdYl~bN^a9xbt#n$KR#pQH8l~dfy#8OOc%}XDCaC5GJ+9 zWV2~~Lo-NA`z$OZY^Q9QZ|_6*Qr*_-D?z)UIqP)8-sc^YS?hd3o%j1LZZ_{)@n6jv z?wr@$hCQjf`f_rDbJgzCE-+v{a*~XnFZ;&1VZ8jITH@V?N5;d&ciLW2@vL=ci?wTS z5sQ-)dZIV1!pLi_@y}ve{mB!t0msBL14GI?ygB3FWW-$$=QesnwnZWxZ>m_nXD zdBTl8zwNFhUukV~q}*C|emrb`*2HK9Wl%A;UOmpz^Y|No5$ ze)3#hQxOi=z#@34p8bL_Xu2jHo+^JavBT@8Z0)-|-xvzRraI4xm31qRE#Pk=wx86X?_RXJ9Kar% zawORGRe@pk&6D!^<=+yo_>8-6sBz@`40PxiDGjChZ1ZL0)i!N+?WjlCP!Qk=-O-lq zNPet8OCP0c@4dke2O^rwE|`Sf86FZ>+2y1iqHsgQe_ zY}4&BB>z@in@F;8;zeD*e81la#s5X`$b3HzjO_II^%I(efUPT#& zj9ivu;vAMiZE9t;^xMt>S^#&{Zs3AG4>*-SDc54vN2x^%ay)}wrm^b_zbGEbe6U##z*5K)ayl&=f zB}cGJpS$oNb3yEr z8vMu5(s=mZyWo;TrJ9-5ZpgCCOP_+D?;Q~pm)7&#R-DhILiYH3?U`OF2Sq!LkAZjrdRXSD8dU9x#EUS53}(b3fyiRi*Qa88PTjPdq9 z3cPB;U6dg4(pV$6-$l~Ly1MM_8zfh9vxB)v_Qv_w42KarBNqvae5@OtUWg8nKF+gm zdfH#D_L^0-N7@>CzBwM-c=8r`HzA=&TBokRuiIGXJ9kbu1*>(#} zOq)d`3bh$G(#&MZE%6p;NItr>J^(`+*xKJ>Tvo(kTE-qXvrH^yQ@Y z=tL|eJ}}E7t}C&4SMP~`%o%-)Y?)o6;b_&Q+rbqoKj?Y)H~?8~4+y$a+rO*hF(!Ui zj#&>aKb1bm!K-h`zQuG%F|D>&`84}bgyU8IB#(9x6^jgsY`sW$CoQ*jj}(R@fg^-P zk1;Hsv=(CIb{(1!`3Z^2doutye}!NxORF>2fYJWIv%FEIqaTUKKqUPwe4`&vwQ4j6B1NcdTWT&)QS z=bh&EnY8pT@xHGz;*)~R9l3(Ub}C)!->xvbNwijph~kwcb;IyVnexEW2iDj$q2cdB z$E~2ZrLVuqj@9TJs@i7Vdey?mFrdbv?je;$N1~14k1!rx(AUg1`O4P%MY%kf{xGlS zOxl-+Iy7(Y--<~TU1cOL#*CxS6`M6hx z*jG{7k(YK7yW)VVLdsiW9|usDzB53l<$DGCRiKzIv!%W+`qatANBVm)Ujc4N0LRI9+uq+o&B|Y0pr`+O=)Nb{ z>r68rWdoHa?L6Jh)V{)oC!gh4O;gY%!s=Bs@lzSftQ(cwA0E;yTf$OY&x?)mgP;sn z@lscBb8ENDcS2yG>phLyF3qN@7f9iZX{yp|2C==KYO6OAedq-BYPCDPvvgiCjUE?G zvdfcYl&rOld9=(;`EIX24TwBcs8qt1JtR8^h}QPum#5dt1~`%{#*%|yUAru#F=%dd zICz{nOHt+7P|nF<5i@1i==(mK zQGK2vj?F(pvpR|wKiS{R=G>)cHb}$y!ohi>8o|E2Ed@{CniD-t&wWN2LwJR3pFY2_ z4K&Mqe$@cc{?l4C?EdHc3xm!RxWen}Q7hs4sfcUT7W#!caTU-E1M7Oe17K90~sa7wAJDy({xRtK-wB{*V&LGoowWXu#T%6sA^-qQn6tLFiJrFh@8vwzMruI3nr^d( zK&$;=l%U0tMd16m2R@}h@%MQb&uWF4NtAzaAbvhB>#S>LE5I;v?Ydy}MW*9US5De8 zXfD&Wj5g}MLg@dnH^Xs%X!KN{825iyOBd>woR4)7Fp=xhZACeXREzu6fr10sfY1XWdi?PM<0kz5rAH@@tuU^9f0W}jA5gpap7F479O(TbZ0DFrU8Z;lrx zXQX;0T!UqPXnn4JKBV_brfJ#Y5^4;e3fOa+(s$jG@OGF@_-pky54q4#0FnBU@v1{?yV}m!-u? znV!8sfNnoA(VAUnl-hUkJ5&2BYr_l5D1y5b5>0T#NKxE9sCfYZsH#&ukSJFS3FwG% za>lEHma6MPKxecX$V$!-YUrVj!8z;t5i#a|MiwYPSCkSOq<)S?m7+`qaL164K#IE? z-b!Q3C8Dv)X7KaB zK~Ue+KsXY~Lm2`glgUzK87TtM2?A46Qi4FGA=1)dssz}}7f(V`z<4j=eTZKeaEup< zNKIyE0v@=JiF71*lhi;U>OAmw|J*$c4gY}0d;P`&l@AC7=>dUBK_Tw$kiTkpkq|yq zkl!5ouNqz!)HW4jhVdeJ6Hyq14+c*X{wo9;^@qNPH_`1N95f1oal^P%MZKt2VSh8J zqi1OHhsHhyPR{Ng2U=9J|0YRt#{Nmx-+bGjISA*kj!@PA!2O%_@39{UQ>6?ImEi=G z_r802a5d1rePuKO<&0K7c!VJ_ifAP{1+c8Fq6}Ep5h(*kA~8rXS{5ZQi1Cy6gz+#a|uo6mkA41j07LgrzE|fi5`Xy(xcASU9_5%t^?7 zHem`dIRzQ0tPE61Rsjl=`%}mgL-e9%;yxw}Dkbv^cYj%wsliZ*MegS*72rUF8jG?v z5rZTVh!zBbn;K}}CE&j1L3#sKe=UlxvlmsucR%BQ%XxE*=dZV4TfoivUX#8Oqz?vtV2G;sYYK%!;+-(m{ry`){XXveUlt4Hh*eU8Nn^l{(lXfn#lnIe9gzxP zMYKE$il~?=~_#fzA1T2Y+Bw{q3sF6~mp(fBlG{Cb5REquG7cvgB&l6Ny77UdG z!(=UB^2)Lb$}lJxs-O&of*`*I4B6k+zelVJ`9GYf9tiy97@+F?8lxUB)YA&`$8q%= zXZtk%4?n-H#sAO(75ZNz|A^mz>H3$hf5gB)68<;4{-x_5G4PLs|IM!dH@aBDCaO}AlaFO1MZh|Rv{e6sp!dia7_#Au)=#+ z5-f&}hG#rmSIVugcH)28sL4Rj3XVN*b~*(VkAAH`(`2!y`SqI@F(D|flz1-+(|Ri+ zDy2b#O`92x;bIKuOWFFWG(MMFYb8|$qoY$a_q6h!Oue`hFj77Ic4xea!^)EWXkPv@ z{W6;a&zR%m&6O$8LUel5?;v-2Fc@1;<^sWy-*Kb zVzkdQ>5v?_&6yt}`4B(C@o#AfWWds@Pdn_J`ZZj-#F+2x~gmI(eF-2za>PAeT>KTOf}rF}Pr zschafJ1{BvBE1r5IlLiS<3z;Lcz44bLv2oMiJ#{KUE@A~Q4o>z4t(mA*Js?t6P|Fr zhVh3)w(=YPOf7gmN!oc+bxvAKT8?WcX_?v14Tp$x@g;E%+s}_~&x{4`W+>DIzGfEw zsb44pG&gv#^KC3}QIw~MoVn-{TRNO}yB$yisA4<+4B&tGLuPW?!rTM@+~+J7!B^O@ z{@&KrfzZwq$ww6uo41oIn=&ds&*xSRC#|%+(y-ebem0wvUYvTF#kF{Wd0yvK>_BAV z@Z-olmJ=ET>)xkAMwp1ooJvxXHyf$P+TPH8rF+fxXJF5Wx-IkK=Tv>#X-k4i|1+GQzC;M3e+EK063pJ-dhZREp5*GePIYs{mtdQH~^12kz0Bw!52BY9@|Sk9Fg`$7f!G^D@EZaNLkC?J0_t%#xtBQ@Crk> z>(^mr+QT2EWxQR%2UdJSH`vnVizB@~mho0xh)c^@VeqIGXxnl#mdi(FJCB=-EhIjKVWj zv!S78)K`AsVu~uBQN|z;b{i~>mp?tnHc=X4XiyKM;PX z(^3>}as~Z3q6m0hQC(>f8ez!X_48w?WWS-8)K)`KFb_7B1N$v!6K`IHVd;E|op<&D zdz$K8lXh{zO}ol&6(pq z&X5EDR&Le(c<|`)kMo(S+(}2K0bJb`S?&JS1sBxDOTyH<=K=yZ+BY^7$7@Pe^H}7# s*M*1xXg9XIA_ZGFmiJP{Fa76n`#zDld2yc0)L$}y9>NG-q~&n!Ka0zv5dZ)H literal 1361 zcmZ{hc~BEq9LFDM6vdMfL6J7vVrzvQOA^RRRWKSNf&n6E9hFEnA%zf1Rx@ZF#i3fz znNF=ebg;v8%0v(`v5E&HB2*4hDR@yu3xf3kkK$grcKhOVrqr4K@!szppYQkkj#71s za`MF469E8|Rf&o;SoyvdFb4LDpUYZc8Ec47jt9W;RiH=9gL6Minlb^@UZ3;SM`kCc zB?GW+J^;H)0C2&jT~7emA_Cx9769lE0E85jpHGd0I$XUjGZT;@07wEKRdgUcraEAKkuInkyKBn1)b(E@+PP#;gImjK| z&U>%DJtN+tF6S&exxL%zWjS3tv*)(!(+;NOmP>S&`tgB##LfQYVh{DY7SvJ6P4wwU z9;cVH4|)QsiJ)3CtBtwx+}k?r-PFcRKTfh7=NR#1-DIY_bldt4u!CU3s-S~{H} zcGAOgP0u_VTA4{TgzgHntbryyoU)PTRTJZ?3C6?aUS)@IL{lEF^tP+)j%$cvKl1mt_&#oPl2QS_iS4-Dm6_hObOx_4uPPD|PGm1A{%53GE%iwrL?VgWn4tTNY7?mG`7>oEsD$J})C>n)B%_z!>B-01FmlT(70!PXZ>st@~E^qQ% zdF^%J%A&7xvcz4L?SC?{{)%=m-~T%(4s8-Xuhi|e#FhGrLHumD6PmPd(^ zCF`zPO4Op_) zV9d_t%LFlk*eE$4MoOYYQkcq570dWJI9`AXg;uLoVD!Nx$GEp=KGa7PmAeJLjLE#sW2^r<{50h!s;W<9! zM$Oy+h|C&=BpXc_UQ~dAH>VO7X-P#Z+1j`B%2 zZo_~mA>rUpi-+M>#;C0|X)2&M=3(&qLQ_7TXEq4++O5WHbG}9R@5cx+1d+)lu`&rJ rlSmMqUWe$Vh$LDh!(zmUULqAhg#eyUos>BpCIHp)6h&=9*6zOn1rch# diff --git a/img/favicon/favicon-96x96.png b/img/favicon/favicon-96x96.png index 340a399a1c8375c0400b69cc41f3216af6de87cb..275ac8b320f950013775f18bc8d0d0d8420e8572 100644 GIT binary patch literal 17240 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 Ap#T5? literal 2213 zcmZ{jc~lg~7RHNVN5Ft6?hsL2SY`nRm?Q{ zY7GE@mb;si4-rEahngbs?Q{8cv7p3u@N@t`aA^q|s!ZexJRes_P~N?Ef=CR*-F!R& zIBE<)atZ)aVk-F)0Ea06Oojl!$O1q==6b#N_W+PAnI3-5IF5@@{N5O9*ND`Np(uv; z%*qcw6R)}pD;7c+j=zJjQ?Dc&t6)+gL@I(5i=ZhnmOUi1yf0ENf)olNtNS8Ih6_ee zw-!XB7;G3_6hT_W(A76m zy@mXttV50Kh1)bj!2-hwC;K!NRI7{vqI#6j(1i#pN6Np!scKJr2` zFfYe2-1HuNNhlo?VcQ!;cizi<9wCjNPz1$Sl*62-;^#ARqbfMLS27G?S%b1kG3L^Y z-2EtP97j!R;J!I|Y?owB1^j3d4eAhoQwlA}@bZr`mlh;*P})5sZx|=ePBbdQx!6vL}W(H*VGX9;$uPrA7pemN%(Xh*INN;Qh0++o?pe(5>^ z9QRz(|3$7_2JP<@cTAy`Bk1)Z*|Zn~#Masn?Gnhp4QZJ`lX@gKhGap*M%9ZKFKnl) z6G&BF=SC#zF>Zl8A};>B0hcES>;O=F>+a;>7d8Aj8wu!T>UH{7zqy^QFUZ_La%L(C zeEwnYP+{7xu14x})G4d84?JbMTz{rXb=&*lM3hGtL~*X@r#IfrABQj@PbRw#{wz56gudD-6U_L{A44onT5JUde#B*=GC1_F3+wbMQ8-ik6i zA$JrAn;(toJcosG(@JH@9s3%n`sd8UcIDH-^x=;SZxbDsg#`Or*tOi}yxXoVB&!My zR8kZ|?N@$tv=u)gT$jd4FUQ|PmO?g?9k;67gh->0r`}$Z=86US! z_xTU6`Z%uH3daKb-+t8S=EMB+dhwGxTq{H(_|o&K*{S89^LD?!qo!?OJK1kAacRA+ z>Hd(C@^YQ;Vy5fvCP(~cuqN$i9Y4j!O%+9>ZSHoXBWG7!iBL6LvZaQXu5iCVrEBbg zZynupMT}JQ;>7F&A7;pdxEGZ`KENBNdeTV$)DBud5>w5K_y~0nUE}XG*JdNk=Z_tZDLZ_ury0r#j|Yph?cV2W*i#moD20HKC zxc<>e9wq6Xm1(OxN;;Q2a`6IIL+Z&lYMxlTH5th|PNSc93fY2L1aDM*Ur@A5!r7*0 z*Ax%vuoqf@oBzok7%RM?*MXKo8d+PbybYvZh89r5Bf@tybZBSQHsMtCfX z2!KYR+L}>mW;B`~)tW)2GiX#33WY(T?Elzv?0*`#(Gi@;g#X__ZsxQS4K9lgyy!@N zd}u5SxN}3 P2nXQq?B!JM7;@_0`d&N` diff --git a/img/favicon/favicon.ico b/img/favicon/favicon.ico index a37b2cb1dfffdfcdd0dc785a3250709f4a94e3ad..f2aa58ddcbff524d24e01bd158a0eb4fc2e025af 100644 GIT binary patch literal 1150 zcma)*PfQa*6vk%>f(f9U{BzQa#h|Hp&^wqWqTW1tGhEXxJkD-* zGIoeDb`nAekyadE{~Y_fyV-@2VP-_kv=IA@Rs%-s+t4i?1t;on9(QiPNU`}l=NWn1 z!?G-Pc4&whDZq*jBjpjJ)D2_ITgZc4xl?-8czNx5-M)G>cGfzK5(z`BF$!#Kfj@w= zE<-k$Dx{$rv?D8LO{50zrCAYBn6gj4e)k^kit*1dm2?tQe&4wtg7J}FJOOO+OoY~;>=lpOr>w**T z#l$End!d7v=jcSdm8!X3^WC!o&t>XR724t1fsoH0mcQ{pbdK0RcH=rhK`5 zr3TfxJ<7um&#~qf;c?(?fM59a{CY5dh#1AOw^mw&fpGF}ur%&9mnJHhdlaL!md6yq zOya-qfvA24u{MP@?7v$-3iZ=Ky>Vnq91W^1%3+F_7AsNrk%e07L+lc~beDGh5<`P( zxtgqz2VVFsgxPNYD2ZB*Tm7Te82l>`a!#~@y~n7xw17v&>`XeHuK2b)y7zOjIr-%=X=&}=)V*45<~1yP**3h literal 1150 zcmbVM%`QVx5I#)>VbfTMrKN;e+uM2rFCgB)3)px8EfIqHU06`ULLw1~SZE?5=+aLj zRC147_x9d9zL_~1Kc!-tx#ygj`Q|@0CWT)nWAN=ZBTdG18e@9E5J94H9L7M`(XK3S ze5es6kyu2xTl9J~OiA$M5J@8>^sq^)4qqT|*3ipF7ex<;igmv0Iuaf5ap>?{WS0zi zbB4mpNrlAf`xBmV?|vg6;XTFQY?93bzi6mhno@|%%{?4W>x%C8$lvKFf4i6B$771_ zb`-w={B^EA9@6;vj4B61Vr%m$iD#Fa#gAQWCU5>LUgIUfBLyd;#I_z{aGrLxO_<+y zDTRB>cf6}1yvmX{!OF6O}6FmwqCR}|ndIAQqO#1h= zeixs6B6$KI-4+xd2WSWw#Ij%Ui2r9iY=t;>Ek5e!{849698*2-pD>9`_J`+xo&An4 zO>6&FS|m?@yALzp73MqVZlU8IS79q8v2}igT?^00$*yOl$C^tT`J^Q;o;&NrhC<7(hr?iTs|d#Z$OyuLOjclIYapVKk(o44TKDX AaR2}S diff --git a/img/favicon/ms-icon-144x144.png b/img/favicon/ms-icon-144x144.png index 2e61cc458e9c16fb6be6a5ac6987b3e741580e1b..7527c28f8c1a1e925180c51beac48e451301f808 100644 GIT binary patch literal 21351 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

    n$?jW6OCd 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%0Aa@5C4}M5!1}Ltgf^fB>lwY|K$A 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 Ty|oJ;BLcw6+|I1Y)I0rO9IohQ diff --git a/img/favicon/ms-icon-150x150.png b/img/favicon/ms-icon-150x150.png index 76c7b9f0b9aef851ac410985738532dd0f2a3439..42365932d3d989edee4166c89eba601ca3351a3b 100644 GIT binary patch literal 22136 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 diff --git a/img/favicon/ms-icon-310x310.png b/img/favicon/ms-icon-310x310.png index f081e4c9776b6e81c0227b50c03029fef4272f75..ad3c2c01824c0c75ad86f4ff23f770843d963b8a 100644 GIT binary patch literal 32012 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 z%0A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

    x7X0S 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

    (*^wN9#yB6;ARdSF5o$ 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 F|Jg;o;+_Bi literal 58907 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 diff --git a/img/icons/icns/64x64.icns b/img/icons/icns/64x64.icns index facb28d82060cd06308097eb45f7025a0e3ab9c0..4947e1d67176956aa382fe4bca849edd734d2dbb 100644 GIT binary patch literal 24064 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 F{{X0xbzT4f diff --git a/img/icons/icns/icon.icns b/img/icons/icns/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..f8b6839ccb3a8df87f12046913df9ce9560af7d7 GIT binary patch literal 222543 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

    x7X0S zd7=c_W6j)M)GQ{cDbE~b2$WK@r{+O$f#bAX{wTD<#p9X0V}H2$inf``pzl@0c^Gd3 zt)*(pX3vWtM3q^YvdA5@NZavhJ^{q5(%r%_Kz~N_w#4Hr7^ll3pD>hc0E6_q>vZU3=pr7wO!c6A%}!MS|;y@Es!(UJT2 zj%#D=9fT?cv!l!e^3uI8zgcN?TAI0;gXqFxkvT!s$*Nhrm(BUGAH@hFHS z`8g%Xj7aUg+|?AK8vl#m_#QK2a_zv&aQkA#LP3)|%vCYY)FBNO(rosy+t^i~@DXZn7H&<-P3gZk4 z4}Ro(u5sffnDyv{tis!*XYst#GhsjCpHo-l>q{)eizP^*K;FSirpHd42SSEj(qbM# z6}M`75;(UhoXi*}h#i`rm?2xmwuu0f{rTY~yuV)w`T0%+|8GWXch_n0o3tY7pY9&7CICK97extH$E`lUg8;7~2v~dtXRgj2~&|{Wq`DO7e7_ zFOT#X7CqLwoYNGSo{zlm4@Chj9-b04hI7em<#?$diF`sfAdPg9xPRJrbE2dtfhL+` zk~&el`h>{4gVC?nUd%w*^K2S_f9^rMAtw)F?M32~^AcOfwg^M`*>dn)_ z0)}ao`^z}!B##%TT>lzW-xZb;Y2Zz#w}AI#D!%ohD2HkV+d0GNIj4u73z8lo=JT_V>bRpM(lH9X%vNz*&7{4yfalVcsT zzA|7;#793iBC#8oYrPWky9J5Q^!~($!N8RbjhbOB%q|8f1~Sq(fzMo9L!|&sf9_R^ z4-OljzEQ_tH?n>8=okqNPn9AJ51FSUJrAD+!oHK57;mPB%jaDa?~^>)TvfxMwzRNlyoWcdolkoXEM%m-81NisU})u-?6|P72RttslEqG1OeK$*V9l zUmqpo{AFjAKC*uRsn12|EZRuSuNZ!*2M@B6Rs;du1oxU2*dV?O-4%KQqhSZ*EB2-< zy{DK9_$Tp$6~}Yurbkhvwq`t>-&?ZuW}XzY)I9$fDBfYHsp%5ZhZ0vel4q=Ms9OP% zDqYxKSoe{-LPYZ?xLSnc>RCo2skYb<3JK@w)Mq@iDz2CBhk^{COVb{S`fR6np@;@t zm{MX4N9@Q8uOgbv^QNQk_E>+8i~dT2&`a-TzO=7kmywqlrGYR}yr^C32+?2V8TaJ% zTCfC|fvl18ySSvOqL}(?UY@8C2pI>id)X#6x*R&Mc{w=-hf+i7rVB@0zmplg_we!) zNIQ!bM@;IXA}eZZYUM3G01+X`b=@og``Y;k{E^aRLh1gYo)%_<-pF`%J|Ru{B+I-k z3Zp$dz@!K8V&%GcV|Zr02)sp1A_Xi^8EtY$17&2Utt3#U5Jv7jIE4zo7-jK4h#`y{ z_`(~e=@4H*LXn&vQmhDD^{YHb?o7l1NM!pk$m6tT+pk`94-`HP!g|iOtG&(>3RQcD zX66$%2lrnINqKnWuix7oS)Yo{lzC1OE2snL06kA$o+=#n8-HrmOCFf^U3UiTh|9Vm$Vae|Ki%OsfrIin;3IQzjSJ8=W>ejp|zJ->59K4XDvH#7zdeU)!*QMKatv zw5UfukvDCOYC_Fh#09!Gd`NxlISPq!DRy6&H&r{MX{7A4PEJv0K_cdi z1vLyeiFG!b#sHCE##&gj8(H(2%I6?k)Y{ouQ)3&07i?IF);f-Qag2VQNMJ#b8whn3 z3yD|n;U;R8LrcG7iO@#P6m=sucdRmPGj8Qt!|laY#EDqCrbOMM;gq+J^V+Fou6YRn z?!+lUS&fhg$Wx=(NWq6NSR@{l`;OUWF@3gymoaZvMV8+)oT{X)o{)vUrn&e1NXqlz z6V5drVu4te+RSGlG}Yowz|!;Tmwb(GC65mgsvd_i#alJZJ1YaJjqsc6YiYO@f(5QB z*kEi3Q}2-g@-AFbK+G!7z3wg@$zdCTB?T=mOfazN&k4L!pB`I_^LIkf>!{n)h?kHj zFi<{*w2zi~lE!&pkT57LmA!n6C+@jC=F*6X{_r77L{J5%4{#-$T78;|t*MaUkzB;V zI(b6}3_ABfi>rJpzCw8`9(osWiO_vdS2dF)LXt->#Ep#5&gKj`>^gV`X|9*8v(dRU znKYEjDqVPCcy3Iko!r>Pj9d~|aROcLSb>j3v}WmEXfn4TFc2sa*`AWB6;aC5`s6;3 z4FzGhi;Uok1!}S|A>3U9IcQI@ar}Z-v1<%%7q;IA6zwcGOKcBLg4mX%1*8`ZtYX(` zA@q=TyP|0^;%vuK?6@`(vm4!j6|oPTi-TRq##5IA*MZPzMI@k(0vLBrG=!Yq3MHsQ zJ!d&zAc|1&tZ*6_zSrD$;INZyQ<)g}{eZ_CUi?9prWA%QVpoNMHv+yt zO2L2ucTLYi`co&qeluv<84u4id5E>CDr@Bh9;g#3K{bG|f5s$MHqs4y;_qYgs~T_f z?1IOqmhK#~qO#<@D}jIgfPkce*1R&^e%lhM(e%2aYVnL^egIOff$-ui$ zwhF`a=Z^0q20IaXs+WgwqHIjVVxnCCN4Bro+~9j$JpZw1PlgB-$+`Ka zIW3K3fhE!Xm6MuzY@sa`;@C&w2(DxW*m(1lq39S#HVfB2RFE6Ue8CNiZ`wG6V#-HV z2RtU-F{_uE#p5iT#P;N(w?K3?Egp_`RN$5)ySUi&;7qUEKsd()r;EQSUEDgHo1oLs z)#9ADfweL<`h^O2BJTtB;W<*%X@zF=uwNZj$7(f~rO*C74)8X+pB?!{{>2ACb~gbD zU~xrU5Doq=aAEV?v|ohZK|Aw_zdW@8t-FT=6B45R+jc`rv&8_aOiwh$Xx9|yE7Q!2O=zBY zyvblWM?_GJO3(`}7#62?&w<)@1`_o=2;}7-fB^BpU|@ECHUun`TGay_(skMiCiwP* zbEhDJg73OoM***7Z|ncHdKbZM-vj+K0XI>N;Xh>>3zzS&7C&ml zs@JPQF}wk z#?bQ*;B5D?%wF?Fq0OMQv<{R92Yv7js+eT*X03eH&929+s~g}7XViXqc%7-jcrVGj z&1jk(gd*`@f3PtS)}%%-0X*`VUxP19aZy|@5N*@a)aW@oJbz{y3#6I_Qq3i@!0%tMi>{izfsPqG-cG5Ypzx6zzyZGLSwO#G5-Enp-H4)(#(_NsDr8OTaBw==l+**`vRxhU5j=J(xqUz4@*Dbg+#@C_p9Inqmy}b$juA7l9{sobm(@AjVdj z{lmIDFOO2}LEe4hRXn~^hx!3L&M?Qubw|dj0bUsxV*mx*H?;w2XV7khV@%}&a#6PZ6N#d znWsorND7fW=q$n3X%C=>&klc5fq(YD{zW;xNT|*g+;@Me<@-?G6IS7#Cwh@) zK7!wu7!V7nR+Xp#oN^?yM}~IS-lp}@t;+Lqn=*#F=KC><;ccV`sU77n^|&vR*B87q zCLYyy+*CAsPaa7Fn2$PFq!;hco^;mB zODHJtqIpl9Hd9aGe%)^JqYw-t^gsQNUqc+yFL%tn$(WbHc;C^*yV_`#+JpWqG9k?l zJG3ppL6F?S-h73Fumu`PL9B@o(}YQtu=EG(f-PA4Vipj?xroF{(VJrAyiD+DEMr=Xcgne8tWS5EjJUUhWu(8S2F% zN-nhff2^FZ+SNYJuN(65tm6T^h?*C&0Y(2i;iWk-zn!md7k-KGdsWf&Mb_M*-*m*w z=+Vc68NQ>fPyCmDl(I!-#xT)d^jg&TNHe0oUIb0~)MP-5Z#O}CX#SJI$L?~6hpouE z4A@SRS8C>q>%A&XirRQBEZL04rl5Ar34SLQV$apLQQzvD)lX;1|IOn+X&=uJs*PbZ zWcyY6^)-SR4I>aBsFS1|Pbe8X(Dk}gf<4igYFyc9N66is6v?bmwOML-($ei;3BI&r zjC(DY8IS#%+QX1@`V!5}j*SEhGPwut|BkjiVNzSMYJ z&U#pGsQD9XxvCNMSl#V(C9C)*@uiM%!KiR^qVxI;-_po&ef&T8I;ZYjv}nu5wr$(C z^~JW09ox3OW81cE+uE_6+;i)x9;(%ESPyfo*?SxFIP)l%T&7=WmIsF%#V!J4b7Q7~ zU`9^e3+(f|SE^a}d6*54ALXOIiO#zN6_|NJB&VS?i|DHti!92I8Nlj;ZYDjeOJW=2 zZD$jD@39qNz-u2&NAa336R5ahTY^+tUAl&gyP`TNz4BytPQt5fc!nZ*sRLU*c@ART zfU8WONJYsiW+lT2zn3Z@b+ZAz_vd_O8$M#dp($L|$5E?wrmCre;}~D7-=rp zV~C(_Cf~0RKWcbvg~PLt-5DmSOO7a{ALvaS`z|SPY+vg_`Ls`C$HK^*9-0Jk!AI?9 zLPf2ZZrJ3n;IRl)Q_R!6wypaT?L6cmqN$OHhJX)EjM|bD8;y8crmlbuBN+dPZ|a+! z36vl6y5;97ZT|Oo+TV#u}(W&!Kf3@ONjJOnfuPD z`*Vy07+f^Q1_?Dr=KqE^@j|B>Mk53oe!!3a{ozgNL~2#bj+k)I{wuIb1{zD8L23Pz z`5tu0-1tnhr>Go&aIy}Q16v!X$dLOiJiQL&N@zLHUC^Pf;Nju32UanBnETuXRrJEs1O zIlz#k;6WvRUm@;;qNW0BL%Eirr=og@#uEb~3_Mb%p*@wFo!C3)P*YM6D(n(oxc0E!NW>K`! zV+!JCLeegeDhjw`{+pQP#T$3@e{l42mxNs2^4s{}@ROZNHUyUvxqbptyuJ<|qS$^a zr@<{ai-XR32cOxZsQ%h;VR%h7tC`*R$#!N{CP47Mb0b3?M-^t(Uq@yY>a>F>Aoe#!P&EDxLc(k~ z681;-DbUSnhZ2?d&F!9A0Iul2Z>lWuIkeG7A(-ur$TQO#%~ikJcAcF+u^IM1j_32T z)eXJs*qqzq8vfdmiznLSGL1A8yRNF$K~1`|fXCV}EY-9A*lXve$VP0Cxy&ft0S_c# z369<=lK#)0lN?`)arF|~#Q4u4NU8|yd{pk856(&75dSNZ)bg^hNVz@WSKD=zY`-nc z!a7pOSN>8o4CNMvJ>vE1g!6i8vSfOC@KKg&EOj7cwiuj0vWKPL;PfoD#t0qACu1RA z_FtHfeShT^6gd0eFyH;@!VN~SbKGzs0ut^ao~M~0!b?c#_9IWWxU`UTZVw|;jAy8O z0jDUQ@mg52ykOk)t*XwP26Ic1g^OWn&iow%aQMChE98NFO#rG!KO&hhUY9A zwQR#m!)zq4Ig+10DY8E-HWRmRcr)e}9xEZy98n{oym9>*IEwpq~CDCPHdE)NMA z+yYR*%5h`6pM=|#k}a9gYhqYDyBUY-Z3S|e-Gf$ID0W9`NbX2CGS=ug%skBWKX}1JRM*-F68Ab-}9W-sUy~VXpM2l@7EEV!oN_xnlqXDa$a74 zz>D8m2@|?gauS3>BPocebJqRQYa5qKtxhO1Y;joSyU3V|T;) z?5`R*@k#Z9+=QEIb8KLVVI0tj(J`RoFA}6$Cb%)JL~2LpIFqb&Z`EpUM23Asjy16L z%Ukb`9~{4W1Fr9l|Br;iA#>DM%mB*2OdE`u^EYsS7Zs1Y-V?bSTg=SbVx0><(leE3 zrz16Y>f|ti<3E9yBbCmZ99XK3%^0Zi!+d;(U92{2{)ZD)3;}CGdvBsx z?QgF1zMh%quA_5d5oL%4&f7uVb;k+*xpr|#W8JncfrL7P-+4Y!DtJ9R#uk14(-Rb= z^KED!UrpETSK8#%X$_i)To9~F?8hh7O*(!J^h`=A1r+r-<#pRRR-KnE=D1Yh64*!K z#oQ{|FoBu_R3K0Y^G1EJf)%3oIAI2N?T@qR@yv5I$6q@WbF34O#4|2C^Cn3JugEXD zt}6H%l>YUBlt>TJ(+Dts-n8m1n`XLAJVSY?710rGoOz)=-uiR0>TFQ1e=-Uzvhl-z zNDliK{~!sMj3SUx>#5yP3^^|+$1QSMGd^iO+17}$eJJ)o5bzzv3g(LrjLuLELIQ5c zPaflsM7Brnfn>j9Shg=Zc|Q9oFIo+j6bwH?f(PMYn&^p9me{$?v)rr^ZpKS@Zi2q2 zjH%BNllF?gu9!&A0|!;U{MhBn$JCr4(QX1UjSsaP~8av8X0MslfES+ z?WNRdg9PP{{ZyRmmD!f6T02dLp;gY2-An4c8$gTeDy`+S>MXs1WYBJ+UR+#h5F0*2 z;!v?VX59?8Pt6f}Ac%y&M8X66Jt|2Zic^0DnD*SmM5^~IsJBM+)vE!-b$7~}#UpUN zC<0Lu&~?zb7U3|bhTm02p8o zTfcLD*7m@3b`O@i^*1O=t$gRQ{5BL9Njbvz!MusX))`t}|B^Qj9gY^F4@Rq>Bc^6Z z{A;kl{m}Ccb1(oMh5Jt9TN+JgqYySHR8qa@R7Xl``;YTa6bVsg9GNe8->1e zN_j}JUfSsr*;*ITgD{iX*Q)fP(l-V4Xcn2m&(!W?z+RlOU$vMOg+t-RoBf)}1i6J2 zZyCm^4pa@S0Ke}YJBXo7^)l9BB-2W=DxZ{e)1yl#ll1DZ$ML`=V^TnAToR~4zPDE`8&8H?-g;{*^@ z3eTVjm*|HV>)EF)Yv5$_Jv(BxCsjG6{rc-mRuVaO%q7zWYl3{EiRr^98@^EWyg#1| zr4DaK*mee?k1aYFm^nx=37;Ze765O_p8M}r2n5@Ns&$B4K2$RCYw*@<=DE^P zk;A5nR(aTTY-;@&-8SpduyX6WKX0>xrg)y^__L?hIyYTwB0VyE|1306J@;~^>5&V!tsMaVgSsF z72RUY#LriMXJsou)R3J;A_|b1PU$FUaGKy9#O<^kj!~IOHY@omYm>JHr=|5-51A-!xY|i|197fucOYaM@ zdYK%&0(?z6>P=g2PLc@!Iz`hc%*H#&%m-%EL_snaZ{*<#gchD?V0h1?*%jwF<2o@F zxTioztiE>&%17iJ3VswGExP4@C z3N2F)nB<(f02>MX3+pEc=a6DJesU2U@BO&3y51=LbR0O;+Fl7{6DAUy=#x*ij@!=B z0eAje|Fh&uRoz(I;G$Kq4t2kJpgothHiKE9EaAezzNaBJ+Q?9)XM-7wqI)*P*K@-j zx4)|}WylqsEUR$;i;NA7u*Itue_xPqTt4<^etH}dz~L`Dm|?7mBO5vvFRxALIA<#T z*7*=dQQ1;-mKUB>nuINfI%&q@NHk?0M|9IXZtb(8X7TKOSnI0g=Q34YYY^L~Uwg!}lj;e$-9 zrMM$hA?_KUX_cu$ZE|=B{ddLIL4J0?8SURheCyOIV~uKq*fdju#ybm!=r7?6z|jRp z;QmBhmfUdnmyE|jt2QBSRtbU+BL*zzYPrZosx0pcdts z6gW}nRCa;&dlDdEukUb08qu<9M1?QtuC$a;zyaB(z5!-F(nCa(-4qTedZ4AeBNi$f zs6F{QloesYHmUWe2Fx{Ib}qDY`E?H$Y|tk2dpThuVuuQxUpK9kDc>NN8(ZZ8(IO}p zQ^LHMliDXSC%Y)Ghci0~{~%HWz(OLwF8?kFV`{%uKu(fT)rZ>Cx6u!pqILHHdAC9$ zA|=`?F99R2;w)_sny1@ona_RnWIR2VHM*S_NL_j&*o;d{*#4nFD*>llrgNOzcWmEOHr(M)?B<=jF0<}+rr}(d!n@cN*OtNl%AgB zNXFOF1X8gxjDA0|58#Kp0dna@WQT)h|LXW8f-H_&3Tp0m5#h4}!46f2@axiO=xH^r z+Se;-r;({K)F0;66StpM9XX(n)aIs?ue?gEu~F(8RoZ(*%q@o(dOk;*gyd`Xwig8M zoGeW=-H|~L-+OGe@X+^*gPQ933b+f!Ktm2tJPPT~zX}I1K8SjXcT#c>gDg5()wXLf zn8n5{G{n1c#^w%Cq+@4y7nE-<@n4*0Z!UU$dBS^h1+aH((RV9&Kfa&_VQ+h3BL-oW z0r$o__bwAB75Pz_>+U{kXQ-m{4&bXC579VaV?VPj#|M(KN#I)4^?)j}uBM~;I?pVq zS_*3iqm_T&jS`>P?P5mnfauc$IvXO5)dSBaW2zZQ;37O87bdAoKWB)`Du16pVFR$GfhAGI?Kj#x zmU<>O4jrTXir7d^{eLNmnT)=dm6%X(+ih;~XW^q5%3h{MVctsOX8M$*kP{uEK!R`h z@AeTFEQj)S^T6m0=N2FTmE!Eh2UeNb?WTpudD+nf+P^%L3@<1cOS8icPD^0Cy@ecr za2DeY#bQ>;0Fs$Dq^o<+o$~@lTtqu~DJwm7<*I9yQ1A#QTm`R(3#Ge2vzYtv>=Q%u zTX(~GTkKp-UhE5@g@iPy#xwNyc*l!Dw*?<&E#jwCtELBO7{-$XGaPDD7!ZI4Z#iZq zy!l87-k@_!_i=#9&pkh!a`i!M)TGqZ7p;9q&Es~RxA}eUQR7+5ogVWJqxJfc{hX4% z_Z`!Bv;5|%*K24iLW*^$)3Qqg1sWPrw0$Oh<}{)`gAg7aC#0-%WmUUkMh=g9nT)S< z0wl;AT?S_)$lOHk=+_=70CRP2s&@u?F+MC2^(Hna(0fZT@EGeC$JlNEu2+p)JTsMj zK8Es1+&2o9a#8F}{n!1mMA9CX%z}DZIaaPN-N&zj3jki?5bxHQ2ALDXWew{;j9Gt{ zHJF)x$;7-MeRP_NpDos0aOID5Rbix-wqw&%eUum})4*s;1$XQWhuGvtkcO7~aob${ zK386?iKd?mvLf=hP|nF+9eX$L2hvnQ^&BnwTCtNIBEY1G1?1qnhLEAuq><1$`f%_r zd>w)Ga~x2+&53_K{0$ItxaOhD8V_n7%aJwjs~`2Oy=yV&&4uxe5oIoXrPK1sUSBL6 zgPmyp26j3y!}v?;(NJ5yiCL|1ZWe1%YyhQ(0BvpTui0f(JcmTqQp}&}ODsIb}QvNmU3Wqv0GiZmsx0>OutD*B5 z!_dO;@_=$%&Z4#r{D@oAiCbMv%6 zVleS!l9%hDXX|{|g)L_RG6^n2~E(yGcF}_io)tAvS8g!m6fZXu3ah%s!j9@cmnsNe&;<@uk2$zmGcir zwR~n|3Z=Z)>rlAEV-@BESO*>GVp&b4(-V{IqIOY98yh~P@Hbv;2 zloW^W7JtOV_uAr^S}moy4ZDm+xR=(=Hl@yD2c@{AvDC0B!dO)MRuPIN7GTT~i5{$b zhI>ElUKUqzpRk7MRvudw1QTMpiHQyB)CJ_Ti$u#VmW^H<>kiaQH&^pmHuhM zGmzHWO1TbALK6t7!gIFb`p!`BvxCIDoLP)qqes$4QUWmtp^C>#|+hM)41jzStr7=up zH)y343#2hnG9*yqOpyTXtAp4LFlZ5hjsDl1m3zk^)Qy>$EPy%xW#YUDkdU2WVA@GP~If)p|x#Asz)*b#` zs$3hLnhHd8u=TW(4JWQejZyJ=k4lJ!lNOe6lXNdY@>g#yK7k^fq^Z1_9vHHrnxh2t z6Y`jZsHZiGj~>x1@VqzOxl=47!8Xv?h$~&=WRhh9+}n)q?vT*u29fA+RZWf7rU)yH z5y}2y8*9T+DMKMF{knhF$@Cj{F6Xmzz7}e+DJ3-~ARz79*yUyIF3G=X2J6(Hi_+~N z;`^!JJkF*8o@1GHkp|+hU_iX)=nS~8U^*@UOqa-tI_zbP{?Ti}lmxEeDF`!R0$7n? zu+sZs&f;OH-c$SN_019XKyuP0c0x@yZaW&yhHDs=145yb6eNSnX^@k&hdygq`*GJ& z^{_+JZi2IzFyt~I>kWMm@VzFCcNA~j7aRI7(g2=WaL<6#@6%GQp!n7v5h^1 zx)|FFdYRpJP&urdTEAq-ufK>)0rQaiyIj7HzoBoU8p;E{KT!DYjxH(<%-7SO z{HUHyNr5a;s!s|Hi&B|%eXNLUcMGKIlF+~2fLS-3;i1g)r^&jYwn8Y(ZZ1##hB1^c zoahvtsM_}pS{fVMT}f~q@%GDnJfVmC{|sD^o~QgW8%|$a=$L~HOU8!zv3D8OV#GuIS7BW z3nE`C5!fz%{t{0RMVYEuOc+QRh;N2Ncptw8JOHs=NX*mQ8EhRLZ2}D^t-U7XP%&of z+|b8Ho2-o4gqsym;kQ;$HnEcPaXEIIY|7K^u+nzUg!C-n*5`V~-F?z_Mi=J8Cs#4M zXbtS1xBYAcj9h(H*C?}yAAUS;b}wH4VvObQMeUdd2zm8WgyUr^WwFIhjzbNgmLSF-2S^T^i zI)N{FK;@Z?9cqgRIBA}2hzfR9C_5m?bgUIIs2&HP zBU(nn+ZvTc_BzHd6?fO;Vw)-s(7{J2&=uKcoIIp=>;(g7(j`Cr>Q;a6H?&dUP-J?^ zh-qOeUtw}(z%94xg=9e=lp!Pho0Z2?RgKlhsL;b4#28I;h=i#&VI&e^nCS&`>@|`)DZ4*(@zh)3=mA2VCu~1zL+UQ6Vp2Yhl@kyPPSC&yYPm@H zgbb{4`G84w&t|$jNbb(wnx@J7qwRW~?0UEX~ zvVltpL(43&65#x`TDClEFq4BO_Q}XYrl@~jCKMGMRCCDC^F^Ijnf+~T%TS33jqQ31 zJ<={Cpz05aX66J1E5C?(uRtP>-qmwf?0e7RXAV&gN}YJ*EfjzVy*mKcT~#r3e1+-) z8fGQ3?1&f@_#e~Rbf7}_+r8^K;LG;Um8G*{8XW3V$#Q!65~2>#FUCW)*dtCif}tkSIM? z__uv`!8a=8ll(-Y9}PoKoMZJXbiqVl^J!o8dVn_Uj7E^U1}WWOV_($4L^D0SrzBOM zPC#)%NW_bfrI#aR5Cr>E=ntgf7Yqv^YLt4fu>zMY60>nEQA3@i^gKU#75S0xl`^iR zG)I*W^$SwkcAH4a-r(S~IFKw#bFX@9F1ie1MF7A9G0bCiKS)WBA*sU~yHx{+q%d+Z zMjEO2W`ZeH7CLY8Wt?#kxgR)Bu!2_x5WcFYRv`ops5V1F zM-_8Ne9=M$Wj?{G-Lu3NOx3Ad!4>n%*94gJTy(>Dpurlt-lHJ^%O1pdlXN1~6p+}1l^Mlln6SyRPTUP3Iqt1#USpk%pE{pNkS|3+? zoMDk0qI@N~G}4HUl*;P+pZb`GuAsutUX=e51#q@f#9~E{8*#xhxQc`@9yni1*WxSI zPceKg*DHV+lDL|WwgM?GRFu^kg6oCRRhr$;3i{byG)RAg5jM z)jNA=85J)Z8T9n?XftOpeqI<+^T*w$uAXRfTdGwBi5;4frz<(N;BFR<1buaq+VJIF zB8oopL&J!rp!Gbt+@;^$)CNdh$>!Xw00Z?G*<;+2H27AJUtJdkc-ifd0XNeVk?~F> zAy98#@(ER?K^`^XN?j3N}#sR z;{7WqOt$K!QdxNk35499!Q};G{43cw4e`1#T6r27ja{8R#QdVzHyoDr089-pxWzG_ zNP>xtMC3IC-%~4u zJFQ7s64GI`Ic9vY7qubYbB7S9zF22Z*LNRZi4s9LZfIPQ11cGbLI{je*r7uzDs%F= za@%f9o=m0%E&5vT0B+qHI3BT|aB{foMkS#m@rx@}g+a_X;hcj?)gF0d3XmI>&Os)e zYf!o0LJu~y`^J6KbBxrFB#CW-t6PzQCwsWNseTe3kSL$4gjdoZKa< z)xsJt9HZU)pF|3V5UMc^7e7&t3Dw1SXP)R-X&@iB>y{xDrOcP*l?;=32ZQv3oO_#J zWuCvysD5uf#ZO?jBKw>;6Kf@U@K$dT?*WzM0HA-`@01Cj^cxWiA-7j~usg9<{f21H ziU(N+5)oRWOtDQ_AuGdkqY^N1ZDx7tTjC7ORA8u`0;I1xMpvn(OgtCYCuG9e9efUj zIA7zK%UBnq2O;B$8J(>(7`O}pBX(*^J7deF+bNjEe}?V8tnOYExSp8vgw$Y&)Sj6} z{(SwcyG0g&pOFFtrW7DdrL&fW*ifq}8Ye1qUdbZwS;6(2dd__f{LE|`EnQLQ3f-1k zXBJ`7!#Q4+^9O5dZK1BoVe^G53+VH-p_+0g9hWsoMe@rL#EDEKWo|j^CO*!YZG>h1 zW}0F-;gU47`*6{eS9Vp_vA*P2W&Ibca1%TDEy6QT8q?&Ws?vO*sLz~cy=@}MUnuk3 zswtQ*Iym1POwkm_+t+3F+V0xO0DBD$=)A&5(ISH7? zd=M!EAjdp}G!K3}h%`4P&(Kr4C-AXCTv8pmc981*QWhJTKJ5@-PGM0t4BC%WbmSB) zDfFmOg`W(p6$ww3kk3(?sp-|8w;GmAh%!AZeQsoI$BdK%%1U0F6ltV2GTHl zPgeV%qnOejh>zkk!asbq_)7P50gIm7`}1;~XTB18wTt$r4eq;orij1hP@+n6AeB7O zjsx1n7+j&r9yJG0Zg_v;_lid^R-JNi)>Uid8F zXE&dw!6H#?eaUmFUQSM&Zk?W}1%sk1GqE5Y{}SIwPMd5hZWwx3>^mlFXQHixkrI~h zcyT;6-s>dL{YnnNmOFwFg=gm|?f*OSI(Xz=?%_v-H9~{yrYQEIR0x~U7J-KWkqI6D<58*qlNqoK zVTGioSxjos;YXBn#GtF`JdhW6MS=d{o)b(!B=!RTZDW(fB53q z{NkV#%#*-8m>+qwD|xde`rp+wGj&?rqV{IfLXZ_UWO!W&*qWdAV$BYD8OP|PH|SRu zZX>UmYf}QgnJ5ng2o|GYa_Q#ZP%)joMKY{5cYHSN_dZ!!E2U=m&G(6_2=}`A(tWWv zh7BWEqyl6%mHGKN){SXah;RjreS6^$he%;{168WAGKG@nSrdx^M8vR}p@|TjXQu+} zJ4nB+W1PBq>PKIa+`(ACzw*CcUw^%nofyl^A^$+mP#aeX?}|+gZP{#qeuvF14u_n& zab^9HNOjXoW_DJ!`-zJCd3K~4Yra6}o-pt*)k|PR({6sxTLdoU0R|pFQRJCD8Nz3u zU0SV75IZ|UtZ_gKWjG>^N{pPN3PI@1VS6P)g|QG-oXC&%;YuL{JmP7CZdJD=`_0B{ zO&9J5dBMXd*)L>8+DBzL5hGtEVfPZ_D(kIk;V0~HW2PGSKdr@;bfw7C9wf3cxScXK zID&5u{wj&Yh9dpaAqZI_=P~Wa;Am0|{pU0Mv%T6a2~W=(FR~ zvmG#Z?YKOP>T;xbo$pIT(?O&uygx|Y8D;0N!(TO`kBU~`{1W%D>SaUIyoZHSzOZ!z zP+PA{JvDvI;;}r{`JP+bj>Ehe&LG2DGzUpAAbQ7)H0+AOLCv;GvQRThN&zC<^+1o8 z@z5?}UMNabva=EZZFjs)%J(6er8181OxY@h|7OBXPs;j?QcjU8@eI>OUqjrF*Ty)c zbcMX#RFeKIgdFDqIQMsn&zstRe_l_4l5i=iNc^yvHiCJiXd8u7_G`c%n@-;US#aBC z=Hp-E+)J9od&(ami?6LxYJzT=U@lmU{tN0xld%Q;k99+X1J#tgmq&|={MC*5IfrDyV)l11nH*Oz?i^;M`JqBvm{>chD@#7s$7&KzbDtp3 z#U+N2qv^Te9Iq{pL3Qsg93g5+p5NA{fGP9Jd*FGNgz<5YJQ+};#F-Hj=ku&kECnqr zEWD8PtRw3xunN3z{Nww#Lr}G~ zG4$VKvI?=(F$_5)&Hqcr7ldZ9Fd+P=9G`q=+CeTOL+#0jOcF!bSwX=4tH2cF#)n|A zT~yE^YgLABUQIax(6HC z8*EQ^`Y~vWfvcF!cbQ$8N$b|3GqaKPH9Gj{gh6P|aFzEa+zG-QwhnRvpds6zpP{VHa7EZf;hf`Zspt%>{ zpgF@^Wwx?S{#b(g^nnjPZ>I&@pFCh+HEF)M)eRoA<==KLz#YW9_*xrHTSLsO0$&Zc zOY8XcRsU)LixTYoP-MT%vo+=m$CnR)?i*r|0q>H2aO%4Fx~;dTo^l#|e@tB0B+vU(YN8 zq^2VJ$0oNY<7J=Pi7#`Y=Ht7j#oY6|Q%&Xritfp?5jxo|u_kVJuXinI{XA-%aEdQvet zY?q0A=}0Rp7clrWvk)GgYg@V)$&CHYQ7W6MpAAFIRxg+m@0VMN-nEC1D5f+;<^{ew zbRBmP4)d7)Lu4C7hrP7?F_AN5f!lw;@6>t;cNIIBL#GC%1HxSD+9xref(n~Nd7Ldhv0CsF6-9^0hl zr<`Uv;$vP9jV~$rvPXvy`eyrm13SCvSGO{S)R2s{e&Cw1L3m-8c0K9gG;e z(zm!S{fxcauJ?-$G*Vw7e19x~NqACdVEh;8M@%=pFta)d|F%A<^Y}dO*rn5vo_y(F zEpWeH^TUy2yVPGR%gQ1z7_XP~D??HQ{iwegd0CV2Te9oZBiJrUXvR^d$D!HTNrXo# zpO=xtesH{%YW5Z8Fyic;!O*A$aE1a@4OBi=R7l6;B{PSW>2ToWAB03R1>|M$f9A0j zXTM)3R4enzFY{=k0ezyhKB@N9Sl)&+4K}HToH%^prP~Ws-WXkBi9slaMzTp7jzi(a zq5^>lghq&R>~nk)Q(nLEH&7|bvV6WiXP6v2U@^+fOaRd97Lhcspi$y>|{Tp=Bn)Tc@ z8ryj#{O_cepSyH_r69~9D1ENaih#pVADvsG=|*Rq&6FNV6iEb4r)OX#s6d(zo@0tx5E zpC@())MwPSg=IH$ZvWBo6V{(SdBdyPim?}@oMZIL4U;E=pt+y{{qkr)z-7MY)6n7Z z(A9dRIytBj?X>6+~#1}kcM3ZHVj~FQWK_J~BaRGa36trN$F?8nwvuvHNOlK0U z1dmj5pMoP=Fxc`Z62ITZrTH2>&&%qrx3voIjERY$rVMQh&hRBg@#!I{V>@YQF+;e9 zRnJ}0Eha-g@Bh8gKR~|dNL%@@3DMOt7P|Tw4?CXozQ6c}dnjJheD29g-Y?!g0)}yI z(B{cMm(9Te#~xz>RvC1^nv3amYkR?6(H)L(o%pw`49RRb7;st zi?$A|ew_Z2FIvHMAY5BKBDs?&06%E&-qU0fno79UYJ_IciiW(F zFeL2>xOJ+=YKB6Ge1P@K9}^eVt35Un-`?2nCfcXd8Dy5#>Ax!y|2XC8gm=LdFg2%o zW;3%(PPbluDA3`)ZDl#90!T<~|x*br*_5rP{qsh?BE!lvIw<@pA3{bdNI%l&=PY zBa(OA1I05OzV-jzw=w#n*Qo#S<2$7zyQP8s-Q;7>Y^)sI(&sy&5*EMop3am8QV5@ta84?#%riJa9xP8 zpA4h+UIlw|kQaoqD!NPXLh{*myfa-udl`Sl!$L(@)w$%KdzLy1tMcxwrj_LI|7QT+ zePu?4lM}u2WFA33@QtMtP;YDuSFy57)pUZPn;$SC6l~X2xUqB8jKTeB z(!g!@!~*^9Fh%>!u;p|a50J+rFQ8cZo)_A_R{bNqu3!@K!EF9*g9uBBP zQw#BBtencX2+jAHC>{u0UoT@x9~C>VG4l5CEi)O-{M%w@WvUWRi`w;jN2K+|(6S5k z$VN~Er2yY)HT6&Wi(mB_KuSVo<`Hi`5HLJT@ZwcjN1lKFtxUMOex%oQ0PlsP`Hb(o zO_-vCySi9N*cuPK=4FJr}(?KrW-@(zc*l3nQ=OLR5U^qT>)2 zv`;=*fwvlq%9=oKG1T1LoJ>ggF!vuXkbD%4#wR6B*;HRpf^}(5jBHoN)1V-U?g2R& zoSwT*OwivPG1$_-X#If_>8aKwNQY>`S*-eH2!Z}fCA>C1A>kwpF0GDIpzW4Wp4;#O zAL`{obx;HW=pEU@^jkXF8650-3cNRAvh0Mf4%5qoc6}U;_WhEeVQx(9A{h4&5&-DD zW(C>tTO=PBX3@*X7`2sss`?Vs{W7jH_eqbLhA5&h)a5}tr<;Lo>r0};L#U!xGzE5 z`R*g%mfFQk93}HYlt9vEl)ULeVrlv5*0hW=$Mqns9FPbpftK*G`1N7 zkUf48c`$9NB!G*;vLQL(!va+uYajP#rJ(!uYYTW)0nDu(5<#LC#$P5%tx(BAxy13- z;W_gdQ(Zu!TroRqoJ^&8`_mOb*}tF% zuIuM4Zt-8kyt{6n!g#d_cq`Zi-LJoPfZnEk#DHV6Q%T6=0Z)+a;xNKFLWZG@P?e5G zrVCD4=n(#-ch0>7*vjQ}W-R3LGP`dr~jJ3 zrWF-$Ocg2-*Gn5sH@S8Oy~c$jRJ;yZu%zBqPw9a%lR|(2sL0y`6pt3`FQ79tF(S?~ z*&TU-F%YtYiM36Gt(Z;wV7TNCprc>xSAQiBGkpL2p`DntC&t8h=d(J*xwDjH1r z4)63?L}_CGVKE&w?r1SSvH{>A1CkYY>9BnEXT`yaLyv{ehNH!eb0&lg-}y=aLYV74 zC#OaIEZ(_rQBn1HulU0U{IXwT0A07~mayja? z{;sGIu_vCc)|4k`8Sb|@?wFkd(`*K0k_N!NGT+Sm2_Hs;L`fL2{ zg+pgJFWBV^I-*Q;-yW>Um4?#9gZ!_&;?}2Nrc483?xUeA7e)doq;t5GI;aAzCGe-5k&<^G`uXj1W#OZSeDZ)E@ya|+O zVXwtGr&P%H`kAN`6#zDz&QD#@4WkJ)%Aq4a8EourDp5TdUJCKM)^dh;=nn}ZTK-?{ zo4L=dW%&U-u&W}ALv&iuX^-kJ<=7+?sGL_{a5k`8;oiWw_M3*c;S^4_8!$AQDgWsN{~9?K$ic*#8Tj|F2UE{sL&~t@k^X6^O9YOO>cb2l*|NxNtVQicc`?rRt$Y<<)N!W81~^4=WXmrNYUl62rlr@4(crMLF$Fk-Kx2)mLLQvTUUyE}Tq9T17@1Xn4w#q4wG%_z$AB6J0MNG9G7) zavCzJZdb}H#{&@3dO@tXki9vy%OaZ-7Ot>xU#|1hz zHKMK9a8Un|x&8b>Y5c^V*PT87>0c$r9s_m}RjYN40VnStjq1EE`GX4TjFr9OsaU z9TGE|+shPI5ima@MAJKI+S)hX<60feCW#8o?g_hIY6H$mhudk1;K92KYLQsTAnKIh zD!0ig$gsRzS@i=cLGwa68uWic7k&2cE1dxhfi#=70I}($L3Y6)oP)~_7eI7SUWWVq zX$Np~VYoJiyjoZ0=&RY>rZfX1pKEX9RxVuJ2tATC9rY{#?BrA4fz`U$bIJ!dsg)1w2ft zZ|UmzqQqf#xBp=*0NU3zTYM9|y?x-i)*Ui5BQUNT3hLRG^~;LqS&dlO;%+A$lqz2SGpxXLkoyLSfojDt%T!c%m{>jJu_14el}%!vr`=-&xr8JYt+UkE(Jdb= z)oeBTg`7iVQT@5j1FwGFJm3~4P`#e-0)<%@Yi9#0doq?mI9mJ*y2!^6hg|@b0gqUj zG^B#s_g(_`XGsZ*^~eXwjHlIVyyu24-C@}(@ckG^n*M`=mkvFFv|g`D7;9M|`PU0^ zgRLT@)Npxh9`dS#X+J%9Q_9@Xw+yd;cF`M$md=yEg5ZH02(Clhq>3K8zG#y%w#<*I zW1k6w3zOme{L>(AYzDX!{56^bU&<-G(w~^-bTwXvjMreKz5&xINSBI(PuY&2b}idp zmJdsrJSE3%E3%Ua`HB7xQ_=A}H7_9%tb^B2MRed#0Vvc2s$7$s;EMK`4bDGvExdz2 zB96o-XgIJPi~bmpk<3wWZm6emo9&9(g)Wd@_2IgxEFzDyrI`?7AhZM=sqkW)ul%h2lMb2FpUj|y*;7-hZii}FcYHI2; z`(v;b^=;KXe>(*JgUH+MCcKN|`x8g`M>)H00XU6?1h~t?1(!CW&qK1qB1Snkis{CR zdcoBKPw4@uXKTfo_Z!fCR$bbrdDJ2{FOWQQ4mVMVSH49tB%2OR^>f!gsJVF2K|tgQ zycLS~@v<+83yb{xV5RuAKUZ5$BgeXk@Kv3gTm3~jkI`+%Hg~Q@-|vv!eH#Arc4WZ4 zh}J3Up<_FJHtW_1d19Zei;9cF2l5b>w-3URQExL(=Gj&bnPO6`ZKaX zcbIEv?uFfpQ?gYa-o_Ls4|2>tO7nO}nn+_Rps@CqYN=Xuyb0|Z$#vsY6@x4j$I%nL zZal9H(ys%Ekiyyd9{_(qfWNF-5GA1?Rkl5a>S}x@k0fFx?Po54K>B$IzK4p96H2J+ zHjS~@jnY4styEBQbnpbW9%{kFHTGA9r8z#{aIQN4d%g=B;K}UA;62G?e-5)^UW7ff zII!47NTKw6|4GcHTYdJU^2PcCO?{|Cx3^^aebl}eEwNx>F8roe!{}!2)VSr$cRyUP zrVJBwtf47jv{4GJ;W-EAJV9{qumM9H<~Z*>CeeI!Odu>nR(C}Utx*1A(zhUYefcBe zlUE*dFGKOU_o-Y16v*@E@al*7bs79RS^gbOZ|BlK^XTUMHsAT|ZhtCT+9%N8gk(+2o6esOq*2_o9fm!|fz` zK^uX74C-+8jWewE*k*f74l#bZ^lzf~#eCMl8lSTc&x{J}gBnJ&nsM4Z7rmbc zetX7j0CnzEU?cM?u2=n~Q#+I2& zdYB$P+Q2JR0e){HEbc*#Xol1#+_(zHv?2E%Pj7G4dbb_YOn^9^-0UkU?J&E zIC(yVDl}EXF*x0esk^);)}9~@j3KS~xNSY$iMR21?p>Ny=1o|@N(U$l)^ zg{R!OlzMwd_#v)a@$&r4>Ic)9WoZbaw9jZb*TlXyD)UffVIFWQ3u`Ib!>`hSH&)R- z`^N-)!Xz>b!Ar!5=e!cyw-xi=g_dgT>?D{I{0gX)(+Pmn*Sqo@707X(S=DJ~>Da*( zFRt%`OoiNdZ|%ggZHT3RmH5sV1Par;;ub1(oeL9(h|R+-VvM#o-1voYAlh7*2*g)Qqlp{>Y-AF2#D-;~-Zon!0xi&|>Mg7aBd zKm;^TUi?zMk?a9yk&F9(8Ru^uP8Dj9+v$x5)fx?V>nT|(YRVu)HnI%*M-HPe^Aix_ zA!VKMj*5Hf;X8_>8%)0HSZ~s79xino<-05BL%<*DHBvXIfd6kp(T1TzQ1stDeASkU z4fV8xoq=7%##7#ZJ611lV zvYGV+z2n1u3K7NXfjuEf*n-@z{|;lRnRH!uK5S(JSgm`w_Gg+bfv-ykt~1n?0H7Oh z#A7Ll(e$z~htDF!ky?kO49?#@asFS|^p_sdW~i!z^u6&`K}4zDr-VmLAAU$hmy2SE$qFkY@;Y7f;Aus$$=Y|5wj2x z7<8HP=7vNzkeqRBP<&1a4ZT0VM++N+>a1FS#vtj$#tUAruzW3?_F&>o-zX#{9XyR5 z5oqFU+?LOSYk~!AYIGz^fY0Ts7Zc=a`_q6rbx2|2RID{aj-Oh3hvmW^F&R5Fp(h}a zGoqCmqgB_$?+68Z)mr=6D%TxchbMZd_vchF3+JYcCPc-IKGZ=#o>f2W18#mjvcifz zq#=&4!cm?*ts($HF3%1HCwe>{xW(BC1ml(c=BBvVg}v3{pGnz%M}d$!7;64;c>6d^ zMFSkgI#i!^tF0Z~Z-k|W5q91?q|JZm+8}?9k{Rt~OF6wlY?vIskK_9dy0NG2SC=Pb ztH9tdi-B>+0IKD(WZObzuG*)vxM#;|^UN6bNKdxpr89KCDEKD7O1uYMw67N2qKz_J zG3(%A(c6}@81*)tOcK!cB-Dp_(MWOU5WLeeMFxkO@f>{br<;K2$H=aVOSSG?F$5D{ z#bctrqvR%GOfqBk+Q^jTMNk#vPRlnf z{*NejJFS-N%g@ix`L|y5ax|qW$psc+$}^~gXKo1ZX(4}$lEf+aDTj+al>4qHH*jxA z0e}v2Vl)S)Z52d?go1!f&sjRl!&IQMg3wjINRv%QM{8`GdbCPQbu`w)-Q8B0WZlFD zV+DUYW5c(ka{kKIu@_`!(Hf%o03L)Q?xtCZ+e`j8ahD{Gu7sb{s^052upfXGvr!A> zL^H->A@x+%74L_XgFvrFBoAVdDqP1th!biXZbF(Oh|jLeGZ?rtqrPsH99L87*Ob6r zJF!-L8W@Rl#oqw`E)O1vvsuJ!ms1_v0<+-eHAR^vx}N`dn{PBK)o3vKBW|b0F_2(s z%HOA+Vp`mTC~eI3T6^RZCHh^p1LAR%aibA@8d)U6Rgd`djex0DG?fggKSeVMkWg#d z4brSpH`sv9E`tSp$qSgJ-><;j0jaxJ-@Fzd>X(5Ex@J&Q0?EG~K|Vo+Vn7NJj%fV5D+I=O z-u3S92@t=X6YzTz(Iest<;cb%FzkIf9!h~^MSui96lplUM*`_(Ddnk}ErauqIHLnB zsXc4u$f@`YjDqQ{e{RM_x~s1LX{nJQg(HJ_hRVU01fTZ93bGU);Eklu_$$(c!42>p zYlNW?a9{sz5IKvG)~&ya)8@A=;BznD5=d62M8IAlBT6w){nU$ngezf&0mE{sFA}el zUO#SJydw6^VY=Ek51q5GJ)UzPgNc2^Rj) z!h?6|DbgCm8mlFxJD{lrwuX`s;wa^wBnM7u}-G;SbjZnwxoOl3(vk$0+W<=Aq}(zg^pEW(ZeO2fN!ZZn`oogNcP%Bo>oM1wy18q$Ur*a(kCAEm#q<13h^LKd-Mme8 zisgJACKx+ttQZ-aav~l`)5IPaCdTb%&eTKiiZ)L(H7-sWVw6I7@=D(RxrM2~`JkJU zFA9S0S^q!Of?hEw*Bmg|Z!4&6+VXFa^09B8+yPf{vfqKTPhoYIkCfW#N#bFL?Sd>J z&QgaZv;k4|Ws#eNjb-7-gf3989<3WEO$Mg8vH_zt*{v+pCdc>NNL*9qZ*B2-AVmu! zC|!2irN-a5rg*U&nplHfqD-Q#mhy20bPVk46`ULgR705!QF?sQv_)NT&LF(Q6M#7zDboZ@8{%#YLpznrVtNF zvri1LDi&7o?6-60R@!q>7NYoE7|-Y~uiNQs3ccoE;c)nuZ>gJ_{3<6meNvFn}CfW}!UpCW(D(f8R!F$dX$YWfa4R zqLU7j)v*Bc-iUxbJrxYd&=ln8a|~9IPH#i+WT+xBB=Cf?-O{thzJ>`n4g3z3Hr6qO0J?gyKAN1 z7}2J?V(gHj@Oof2;J4tVOQ>FL{bh+(bC-yAWti+z;@1BH3;KVARn@bFw?R`_$?k6&alk3Er>N%AtUf`XPg*e zk#YXxxA8z(_()s^{nNx|-!UQTOQ7~-cMzIm?&i-WBOxqQe9+ENd$vRCrur_bT61#H zK|f5q%QjLuv;+a!o)>Or>#6S7BlD+1kKZ1RZmLI`N;s7(1U5)@`YQ()Ke9T)3TG$bWjtg(I;Q{4jDcY7G9yenq2@C1{|y!PEc0BDX6X`jR4u4m>KUwf6^PALz2J9E*~TpnpG znsB>7y$qA`eNTb-S%NGmsvp)8ONvTA9x&Oe^>ldB$~nGEWiU0L9;xqKU#`V8*A_N8)pUlXbUm2 z>VMg}C$-=ue%OK~q@x|eqTk6JRhAQSWIBh&C}esmX2*Cv3bOzmugu8x)a}9&av2Ih z3*O=rev?XLGkVlkjpv2d38U8nH={@bh>;y3)wD`!B_Mpxl!{`+G+uf?5hAC9yjIPtg_eTKX9Z}rGmvl7M$Bi*D9rUT)b~0R6Zg13ikNH@pnI|j=1U% zJ6WPu=af9^_?sfK8BnNk9LF@^&_|tg($)tv^=*N}&jZnyQvNw0dVA}P`T=gGse?7! z_5(!$O@vp5mepZ;W|8FaI%Og8E;w*YO6&ait_s6#U-Q171lsl1BL&fDg!ab`6F4g7 zz|yzqc9lG7;|C%}ot6Sf-#c}FC~E@+EL4;r-)}N4Oh{zXt7~u8$T|dNvpq81rhlQG zu0F|YHY79pDSS9+g8s_5Y=x{X`N>@PW44z@1G`gJ;v92BP;nDUFn7CjX|Y~ll#d%@ zwa{wf#ejVND5v@|lLv6<;9<{fUQY)=iD4-x5AOPq!)v-Z0fa}Y%Ft^_w2OtkvNvm9 zw-0}}X9dSgHBGgvN#-rX(D13@`=zUtUsxE*o&c9%BQuuq@?L+1o*iDK=dWQTbA~s~R3@yL_?ES_w=Mc%XO6ze>Z z#mjNin1Id-F;y%tOO~@51u*k5aco~ZIB>?R zV+vFYtDeKUmCT8iZA9HISJ46V0uKqazUqyNJgk_&RDXpQjV|^dmUV1^umF-C=AH+9 zQyP9UGOiOC&*eijBECm0#v~oHFwR1e^?q_m}#b5Pend_eQl;BJ$vEb^bve z?A{lj2iQm(cg>4t#$@5?~*X)?y%x zsXX_{Jfa^Q5uL$!#%jCHC9_>=9;=m+9@cfRt)iOy9uE$+<@7Pv*L>`B!=Xx%@CS>m zKIb3;Ka}rqL^HY02=({aWZP%GFS!-#gDwOe)#*ujq>FFb?YW6~Qu7lw+yK1gB1Qyp zU1Cr54{r4>P=}_+dl(AqfRI5PUxTFbXR*II? zvwTMhFl^cx5z)5h*~68<9Q?<{c7Q)Z3?D!1O!5C27{kVn)~-ab`3=AVWnd2?txc*; z|9_7PwW%kOHlHU!TV1k?=#?=&$=J(qea6F3r7IALCzoPPTF1HqgKQA2Zc91XdH}H) z<(46w>ttScue0ym)N_0mVE`u-f8NDeE^k2bO}) z>((euUvc5Bb8YQvm1OVNDqT4RK? znX~;s)ryyV+D@pE);(tSVEQ=CT;GvbA|wBaD}~G-)UBW*=3GQ}fa^ur3aL;;-mw|r zwQz~i%7sp$EB`p*`*OIwwluo9amb=8%Uvh@nGdY8d z=qW>Jja3jx)^}Ry<+CK{N+WGEP@c4YcIdz4$RG8C21;73L`9lj%P|Fn96|L~%#$Vu zh`n``?dqb7buB|l54PP?{lh82m#oxy-2$CoddtEspLpmIWDD8CzfaYY`!WT*1rlR~ zdt-j#G1{%}{uT9QcVKq76e!G~t&a~#{7ec6-2WC-?e3}mNRta*il$h}ba6m7#AT4l zh@-?EMn|(6Y1@O!WfbXdE^x^5F#MtI{1A&RdfRb2?V29LIR24#a!g8BS!y+}Oj=c~ zFK^#t3dQYwn^pbA-2q)Z+g=;dDIYc@FM5?mzKgag$Q9Lo>|nJus~+!J5b556hS#*$ zJtPJ!_HB~S6W9EFhjYY7;Cc|`2`G@iR$3tk;13NcK?}_uY&1FgTV{5W##p*-U?OAR z&!OR2wThOY%yILUfI}@3pcjoa7NynuQGW3Xuv-|zJDh(v^0o{}^exS(Ryy&Lh7O^*$=Gl8d#nq1njRop?Wc){d~w63eFV0nQPRkJ@d@8eaqjn5_JR5`4s zbIeR+@VmoDa#-E+GsKr}dzUDtphV$Fqhx?Z8tKO5@m1P6hJ9{A3mvOs{23;HJ!<&~ zalpo9QNQe}F1d!YU;Z(!ygr$BnbWiiNVoqOQA%f{{ZnzA901SCK!U4H*I3BBXNK zwjg}tx0`6VfsA^Dki|6Ac6@fOLAW{MK;0CJlj_F~>)?>)wBTqBH@WzhE`7*~H>Fx$ zq4(ZPKX2}bmG(3JidvUmOw5DVS2!BqAoLqbf*Ho;#521Rcnt-eE+8yTkz< z14!3gIp{?&89~t+S_fJKbs7&+tH6`Sl}y9WsADp!f6X zANlm3ejAN`8zrC5q#N+)^87an{5CA{Vj9m|LTo)WK>OVh`)1aEZuBYk*S+p#{EJVv zOGCowYHX_8xJAoYzg9T7g<6f?c9F(MMpM7p`wefpmel_c>v)pKkT}E5Ud#my%0ee} zl0u{|%|cr)aSbhi=IaX;yxFBO4P0rM<-8I#CcV2d5t>{2FNv=u;D{H{1ctpw6ap5(1bK9fmeu`ApaLNU~(>Pi|DVTXnjn2)Bi3OEofZ|9xo~TY&xPz7q;E~ zcf0J`e~3)KTXWrVQ~HUws%vT&GLg?BSJaVi;n_F9!m^W&9y2OBG61jiRGAzg_JMi8 z@wU}Yv;CD_LJD*iORfU|tJaDD_VW&M_8OLI1~mL8+qz-tUa8Q%>6N>PnN{Z;ok>TB zmt+yZ^O7v$kr(!Zow!2c;D@ec8M8`3vg!0GmnTj{vY8vVms9RJbGT2p16DEGw*O)h z(Ln1Ud@azZq7qVBTp>v-;rhCdG_LW;olFEZe#!3YMLnz3^wnR+muzeNK6^J}+i%?i zR1GnlJ3wsfkddwJj!?vhQPzzF)um2h7#&jIC&T<0<#f}MvfIAwwv%xz0`e!Xo9`Fd zV^ez)j4024{H15`;x!0z9xTxRAg{E{_#3x7=Q;Eyo)@W~{#{1BD<+>6oke}NaBE^l z6>J*7iZvZ2C1pZ(As3DuRNJIfZDdN8GCJ{5_5<~?k7q(iwA#PdY=;|-4e^Z$L4&kM zrj`mi^{Nv7sRe6&+OzP=j8p3ZJfbLKDlhvr#7NX-?&%(P(e7Nzr4E8-x-fy&4bmVc zK7qrIASjkAL|7K9A~ZlBmV2?%>8)@07P2V-5E%Dn?C>u%#ztod(#(@i(Aj&5kix&r zG9)y+ihuAcF2SGOGs6*OMm5R1%uEHO4#$>du@GIOD-HR6FTkr9j5diARR6vR&BS(*Z(-O_)wL;OQeSYIIKIwHEe zJJ1br-&c*CQvYNUg3B!=tw+qTeP?{|fpJShGv`SGA=Dd}me^ntU*Imv$Q1aXVrI5c z;o7q;n-eVR0a(0XJy5{~$a6G<`t1XRBHKGA0(tZ&yooux`G$y3WmgG^VgvI){8kuy zzG-b={Uz3k~cPxSmj0Acw7ceO}K1^}`J zgbhV?7aOC=Kzuce$Y2%)s0LMDRrW*?ANK2M~QW^m~4?-#E&cp*OR-iw(D+Zc@RGf?z^#o65sw}8Rw2X?MRY2lJ0>eR);oCg0S+#cdk5qv ztS(-xxd0NeUe;f zc*l!htp8U5Ll$oGY`QsC8C6j?H0ZTz2 z1VbsdDTx5@T548}0uM2=E^&3A3$ZCi8lO3L4z$toWOJBGp2TzfA2u>FNRj2>jN^8w z)f3OlG3TtFqfjE&rg-KlLo}Hnf`99Fmm=)OGIc8IzUglj^8Jb3AI=QswZlh{fE0zX zT&+g#EOvZdt5Fz@7$}x32XzC%2cWA^% z8bt!ChH2oiL5!__#t`X{KdhM0P@DuQ+0^ysz*Pq=RF4}=i`e+7pJem0qX`|%AjsMa zjnS-WySF5Au;E>d!|86XJW9BhmR)IU9P`&MIs0&pY)rSc+iC#uIz6uuhmy3f3+cco zUnUucj%N>P7NJ2gnYy%yPp#}u;d66=SSj(|HeBFUTrTUu7Vu8E(a>KDidiapx!mQs z4&&gE-@q=210KUPr;`#PNwA6A6f?{;|eag4i!`DCo7U~3EO*W!$F4g-zdVL z+sYkb8G7NrHf_2n^Kk1J-#qX?{wm@)wt&X|8ewerl?eto`aKU}XW=^cz%effc;ur- zl$_h{KX8-ELNCWlUzYqV06lIkKg2W~6TCAoe|k!&a?o6jI5-}BA~Jf#S-%9Zv}tJ~ zKNiERwEt+Hx!>Yx^lHGcOsanlcmzP4Wzm9FmFR20eVfwY3BMr=Ml!Houzeh1BtpMA zm8ll7U0!(36w#vZxsOA^Y-_Fquet&=jU! z5|s_*{2L8B<^pjOYN)vH6+@(EAglmGhr)x0Yl&_&Nx1s{Q3dVr*y{DH8Uwg-z0(nWmg^)s!)y*0hNr9!CHSO)nx4 zB>?hopY|?5gJQ#hJ!GqIUSbOvJ2VTKw(Nspln3SWZoY4GTU`mmWL?X{Y)2U0Wa&M> z&Q~5IVn!b8?r@M|DM9Dyf_^7`k#C~I+0POklLdEa;o*y%M~C)G(8StUHQfwH2c68- z;WJNS(pBZ$541n{lK#n(T8t{>Q;vlff(_wEuaVilq*YQxK9j-q5KarftTZl=ADf8m z_Uv5u(9Elhf%;%*u+^;a@Tx+COhM2le>wrSku8b^(OwZP;Bt(I(D!v2G5m_SxPr!u#Jdm8=-@>HD8ha zrwA->6>>YQb|N4-hZ+3Y;C7yv&Hyz)Og&RaPvXWjcbd(w{s8W_W|)CY@CGk(7kRp_y|D=DOwGeib-<1+Ic3dllVqwY1Ku1fXn8D z`M?_)=)bJa$Pn5_;|jT*MZz|X#2o;;O@!p<(NvdL|4s7f_;V()$2F|Kl#mPK78OW| zt&_>k!3Y(OIYD`ETPxQQ)eDPmfu@ocGOO3#` z4(_N&J;7vdanw(y>c9}*s~Ie%a*^&lj%J6@#ycy&3S*J!fGXcF!88^L3{=duHs?Jk z%p!`nr>_5h}1%s$3MQ(uL(VDyP z;S6p6W)IqVyBcC6;}Yy?T|!zKmwj}kqCVZGn39jxp{q6cHZL7K%c`^wQVplzzLNGx zI9Vl52B!HP90rGzBepW_YRqRX=OAKkIu!;Zupn3}*-Fhy*LH4c@$o!62&0y^6#jascp#VN^s_n!f!#78iU z_9kv4jcMD5AAuLKd^T^9+JS$$)uZa4i7H+?%7xqi5QvNa65TK)Y1=iUN)1 zgfpQ*h5r&RY-11ztMccfqSour{wTGA#F zYZMgixj_SUYvjH$&sCZnXa?x3213Zfn6xwU058q*&vkz%){7>$(hl5_L)SclwMYaS z1do(CkF45eE8N@dVcRXr8AKoC_l_>BwGNzEL*N&!{`SvR=A%rB-`Tk$U^+rrX|4#u zt6qD>D1sKw3F#nAd~C=A+~Tp?N**_g(=`G$O9m&G%uQg9{mFeIDGUjhSSd^NNK-ta z&gDEVO8uuWSvgiHiUkRp$r`W!*gNRn4nGj9uRMMZNPsDt`83N5n2R~qWpnpbrSrm#Oek@hqG&Y zJ}+2Vac@E&0tA{SKEfNvcAS?_0N41_#d{T9K(~YP@zq2L&*<~Np$ETe*7g>NB%T!J zL5t#>8?^DPFK`LC94E)SI08je%_JFy3<-MTVztKMDBF;vP^HXFb zQ%y;HPOCRj?LNDBJZNX&b8G-c?4ghdreSB#A1;`QqbhMrqE(l9ux1{bX?1a!;98L_C<2a>O0R{w++Y3zT$I1bNGV?T;3q{|{syM%QF<{}j9&(q7hMdyO~QW|djj zQ`a7LDbHNB1v<#Fmo=vT_TD@gh0jwwKM}!$T1^d{SPzQCjz}gNi1x9|M}qVr+H@G? zNgfODtSIJ0u{W$%s5v%`qZbf>FibXxP17j08DrB+_99+vW_gp!9Pbor#f$i8sxJsO zP1++%HTi{@_7e{I)z(DpV)Z5nT`=xK_wep9ot20HMKnqsCa~TM*2aS8b#mxh#Igb7 zL{>24M#!J2^Kf=TTfICcVv+4bt1Cs4fFb@(my*l`)bAssyc_dZZoF4A{2=siBwU(? zcgE!yETpobZw4xs9(%GBiMYfIOARmm>T66LN^2EunFSur5r#wneAQPKAv4i(30bG9 zr6nXe*I9WC$H0V>zwu?gYLQS(oTsf~(>KW6#tU4mqG6^vACR|_tga}8fh@7V4k3Do z!CSi^OR+H_AqUK2fPc6=r)uNEn=jKQ(-gn7Yt#p6c~YI^o!g+)ebCef5>av^=3n*d zjW$(Z6vTMEX}BQ_VLLY618yAj;-)$Be!r)C{_xc3ud1A_l)6RY9>=JDDbULn#BHbz%^9wLmmV9Og+WC?EWT zMyMNqM%iyKmIwPqLy9!jS+VP_e3X$=rk3o;cZx`+eDV%>ItB~!8}!DPU*3>fMH`=~ z8Y#%GDqkgj_K*CPC%z`gR+MV`NGXY;M$KcQ0f7<|sYP7JDXyhKzm$#el$)qq!X!j+PHPMK&9b`t_RkzV{VPeSn}tYV59g z(58~lEm)oQ)rZ~Q1R?{PhNp!|+U1wR4AOSE%u^fVt8C9`Z|p;6cc3$}@6p zV1m26CWof9baujFKbf)(_re#Z@h*Y&hgFg`jNz_+RJ1gV{%W3V%-Hl%q|vkeYuhP* zvn0@|>=IV?6Kn!WA!#-&vtcCT!=_D!S+SS}A)+g)jr5G7==}|odWJ}?@JJzCh|rW zOt!_j-5H>9w8N17PuQzSqdQQ%BU)2nFpzef@YzZ!eGM#o;m*uluB4uYz2s+ zsOPEUgvUwZ7{-WGCs`|}SYV?`L&V9Vin^g%wo}uorr!fYrmVKdfmjBYQrd2LNW$u> zZocu6+4cB|>?S~23`P@l4mJl_`hnGp?(cAZO>04LTKaKQx^n+(kA^H-03T<`3w#$Y zN=|*fcrs#9l%Z%i(j&$AUrR-BXTFDE%5_4r75Q%zd^L^v$`5oynBz06gqt>Pc3p=F z1ZAR|ev!GABRx@tF%`Wl)`Y@eM?46Zp0=7iM%$@*^3hUKDLFL|4O_-x6a$Zi$S=R1 zlNJQXEA*t5Pb8P@Mv{m86LK4adX4uUgFEeo=(~fmf2KA!IB$KPlo=N;{LXaB9mRJG z@`ex2qU+AOcsTjP$FFqHR`5c@#<$HbH03*(FxKQ+v^h(A2+MAU;m;SejuDVKXH&Nq zw)0OXW`>QX7;ct^*;Hn9*Lq-+ts4AI+|H_Ji;;b}XDR@T!=d3bwgy})WkYE!7R>*B zRDBDrkSA3cKKq7J6K8GDAccdS6l1dcu$maSLr|j_;&V;!EHycu8)i?z-{q{xNQ<*y zy=*>PzB_8R|HAz$0y%*bu%Qf2PR3NATjZ(Gb<^HJ*}!l zN1NIby1PG)+mF^x43OW2R$A8N3v&DB?&L{Q7qd&&l*X$qcpXlExGeh(C`1POBtN0g&V@ z`4zWmc-0Awqkv^${MpxuJf~KgZbEj5gmskgqYHHTmMs|C%=GJCB8S5*^~Uk)-Bp~Q z&mIuy^BIRCuKZoClg4!1`ooqaL&zrlOA#F3t{IGJnvJ!RR~yaro(>G_8`6o0`Nni# z#3at+%wHIN7OFR<{(7Fslxpb3=n&7~m#FN>w)yp@BI8@uv+2BW&LDhbjqgQcD~+$_ zbLT+)@3q^h{)QcTuqg96jyPH~9~ETjyup)~3mt$Aduw1bqw<#zna?E=U?W;BjzSXo z8Ed6vaCFBRdK!4C38-+OtgM8OK{Iy#!6^1j{o3w#nd8Z3t3F|0+kjoKY*oZ8A=vwX zr;i8jCGz`RoMJs{)gg094u)(9Dz1zI&}!BVa4_sg%JlSG17@UsWdmnq+qxi*y8I2N zF9d*Pd&6UUR_b6d6@l8=Q zsA6;)KB^q)TDTADujDz0sM_DMU9a+80Ia*Hf#iJs7o4cjgzlonHf(!RO^(K9pw;ls zU=_xBU2fO=Yh98ShT{{2&&axsBI3vxTZLVukg@s;iG@Tm-eDQ&V69?d&zSD83-{9Yq&+W7)Q^QTH4vvo>`;#y1P>M{IlWm ztG&D*Jkd8E?Bwgnf3X?@BqV>_1?YQP*W?cG_Pv9FrxDZFYq~bv?x| zwGMr%CP3$X19(+%0$`$ks&j0EeW17_n7Gmxs1Tmbt?r&Akz$v)jQ3qgOya7(yc%G& z4tMK*^_%cYq~iNC$+arI7>U*2QA8RBJNAulFD@kp{W#d7>Pd^g#o)GAy4@?WFtaJ8 zbQWhh4fy|gm`;;`tA^k3(7Wx@PRG30UnUBYV)^fHqm#U=FqO3`yTIuhIdMut9hwd*&yd6IK(i6CUn)e36#f1^p}-pOnZPUZ4=yr}yq0 zG_Q9(PKJQ_rItXqVJJ4%^Nv$--`}JS!A21AX@J4E4>WLSg~6}?Y(GX^;;EO4@W){(k+Anb-=9dhEPR)MA z7>S)R8KlY9=$`R_mD@P&z3=7vvk)@)f=5{<_Ui)7_+$cWRoV$^PG`EG7Sc@FtFt?gp3@ySzYo z6nuD)_y?p3g>!VA(aj?Hil+tR592m$@aObGxxvL@lTT@OlB7Lo&o8K&=S1*^-~A|1 z5U371j*`YY;<`S5KkK3YF(m4j;1a|!nXtRzbtQV1Q zTqWXrd96_Lk~NdYXMkp?-<{v^7#n*NCw@yW15cfZ8 z6nRZ8n563XWf8kS&PO})$QOtTE7!i(Z02kzpJGWoOsPnody)la0xh#rHoWjY*%ALn zhrzzO8!R+dhj)h5>1u_DIN9Yo+QL3`bEqWs8Kc)O-JsHuhjovw`maUYCM9ebfD&2h ztMF`|MG50wr?wpl7<%*z?{@kdV~k@z|A1InO#YU7?_dPMiK#261%*IV!#P#m@BlCc znjOXG%5GqfHfS;=C)v^MwA0nK_idG&mc!I2@Ofs<4CY-YP8JmNqQ9gicPaJCo%ZCP zuudWnya7$-)Y@mW50Bl{lG@Q{{IT{0BKEJ{c?YkQy2fexU(^O)miAB6(N$jg>u0M` z|1Gi3z|fK^D-m^ma4A8YJZv2r=GVM!IaDDQRc@l1>s#a0uFN zS9t=PM7!KWPsUm;LZUU;V6q=?T23gz0M87!k2)@q#^e98FvuJo$2H=g0a!D?3KOV5cE}B=>*pxV!8ljoynmv8frV50nljzaFXl9qi~qo0vE0itx7d)Ge1d!^wKx;wA<0K z6XnBGu;RJBY=+fzNkud(n&mj*Awpj^P!Rhn4PSB~OPcDM{h#PoXN1T(4_ z%&gCpac5g60Ex=Jr-kS!pH-(7UQ2^^DE8saOqyNUu9{1Gxd58XP8I)E@qBQn^hYvr z%%@k<@1#wR8O9f^snwr(#Ym7c-&}Y9R+WzBk?mg5aAke(?=o?pF3tPJ^XdO+qSW{N zb*7!KIAQJkM~no1=*tZ{6kdSt&W4Ftv@eEf?+>#dJz=Ob(y2doFfftKY88s zz(i~j)FcbDi~n#s%5D%3lMNl@n*V(SflqtC68i%@qD}>#df~|lFiSp)W(nF@q6nd>@8!F*?b=q;Gu6KQ}l=L-QLup z7Sm=k{kVo;oex>I*^Vc`?Ohh0K#G3-WNPC7d=?fAUf3%$BsN?I=z>Jmc6bL!z;kyg zw_*m@0ZjQb^XvXXif5d5KgiTN&1dMxGpbbWH+`p^%NwzM@f^gx%s@8v>CF(_IZ3FA^WZ%EVaQXRO)~AKj6RbXnO^2v zzLnB(yl0JenpjY->+?Ll#!*oIKFbE#;a7Dx8ySU6p&IylLryzqC?ah<7HJ@^aZUb0 z0Xcdxf17p({%FBM)>Gu~3|*0T`n<;R0A zdvaxjh~QtxY%I|2ZVe%ew|Vs-V({55^BD>Aa#bL?#iVr6EntP_mxk@EW(&J&C+l~N zpUgPNTnGli05SPr+C~}%!vrJ7i%rah7q|9;xb;Ec-T6JetdUJ2U4YY3A;~bf8DW}f z|AS5sTL{wCS57-bYXGiT=c(q&W5MuSd_yKwTlv7HrKD>qL*RAbX8nYafEHyoRI!|F z4?$~gIWtF;16ayv*Hd4>XW%rQaWxF-+Qz)XW9JLQB>IBpI<=Sexb%Q`X1e9egQxWtvGB#f>strLun5-5IqhVTKJfkDDT)C$!F_YC z2cAQ;gQd!&{&c0GPQ*9~@3GYkV^sc75eXeunXrFHLz_p@TS%)I{zs0PAd#r>)4)`z zvE+K>J^96y{JyR^4=-h^CK1_|(aKwk!qo0s99!?QSWJ4S>G&n+EYNO`SIZcR6)3EH zgdSP3&#Da~aAnh@%pld^DQbItAA}xR0XA&_?h0AWtTgk`42xEWgbFs+yIRaf2ilv( zy0f{44HLf=Y0x28+nNHQ8>YTvTl(VHwpMqa32#ir#;&W-3&p`V-!2S4Ep^9U%@B*O zlW7(zCBiK450A-4ejL|lB2@Ob{|i_#ir$c>qAXZLwpjzy^Xw*uGo4sv{}3d3r$Y<1 z2%tj!=(TpSk*c4PzC=O5w&fXV7gIXjF)GDK>mZWyf{x=i$=Zvc#-SmoCVDA%`1q1EJYo%^1ucVG@iUgzG^5$P zPmhHh%3B#-kK;_)8u^%t_O4%bO~$I~JJ^oG0;U5ru!1T#{x!gwqOB@q;9|yh|l6fl5}I zY2@hITjnOXzGL5rJATHYDp^TmVnl2P62uXokv^`0>LI)^BmM}nqDdR7TED#7q;E(z z_eI7UHEZZ-+M1kz_OMI6k5~0zCo6$ZG9-PG(6iyA$-59O<6%pdIZsQ@5hYpCI#Tj` zFRb6(Mu?NdJj7Krpc(VdP8K1PN>RWQk}H#&pKD!Nu!-@HMbQS~4zbVej#lO| zmMA|_BQj+rzi~{oE4MGTI18uJE!co4Ck*<~(e%1aDjZ%WEU3hOX;Bdf?%Xsw(4X8`IVyN-bQdR}!XvZmA%O{TL!Zw(s@RnTDcZyq8{)Bkjv)uvz8K!u5 z{dP~6b(zrNkg}rqfeI@VP_fUj3mHt&0h?E75-rw5B(pf~hg{VBF_(53Ub7gdxBng7 zv&YPlmNu-rT<2C!=x-3Czf+!3MT=u+Kc_ODMU?bX6nSKJ zo1qdq(QwfhNBAMadTHIUbo|vvm>O6gE{0L!mNLd=A~*>j-$+y~V_bBoB-jVlzBcbv zlU{)LHR?APV_*Q$efOaevbM1jXLZhB#>2sfot^W*J@=S!2!oYTRuaXsbWCUF4 z_(iy>IwwM3DUfd$N_!8rN`nHKckrNao&zvbulfii zz7I4tz{y@T1Yu;%O+Wxcq@W-Y#a+q#m}dTxFw#Lqj; zC`QzGed95#kp$(+ZvR$wpMB3FT@GM?i+Q}&yMgMawv1zV;8*Yq3PA1oPN(?)F?7m| zO$I*FgsQM%9i#!#$;4ET+n%AnXi5YzzY4cs;q0BvV~QNX`A7zhtT7{)9W{K$xg4hR zQ1T18T7l<@EvfR@us8oSk_pvr;g!`yknmzooPg5}!lD2QM7S$PYTP!g7|Awwl{tsC ztK=0mV==DmGDfRHDL*d>gar2289+8EBf2fuiH~b6!k^~cRv}Bn?>pfQ6dMu-r_c|9 ze+Ax4?N@U3re5Tguz!YM)_$GAD_h;oxhZyc{_K3G#Mho*e;DQ$QdV7s(grQ9F+5Iz z*T1kCIeMaJ#EA?|AbTG~>4-?(gv9vuw6Mf_9}jqw;Z@2u!`&j-rHfLbU!XxT2zwz^ zR){A-S8Fq-UEIgW2Cw4Y+!nt-ed(M1`h$R8Y*ER8JKPMGs`8tW=Rv+|>tmxT0%FM( zv^>^1jij64l|SBqAoy8a`nR*+RyIC+Rf(C9lyji92mH_r{7M+aFA?mdR@7XWsw4k7 zt_VsxUR6?t*h|})bzJ%MnTlyGSq<5KniTg~ElI~^i-}5W;i5qbVfZKe8K5x3WA%dP zz=!n1Hb05A@};Q2M070CZ1LkmqS(R=IxhZGIbR@tkW#W|*o};t7<)G{ zxZu+0f0IrbgBuGSZEJ#-g>Q(*rVCSkW_it-!7LvS&tE)fDPH(%a;P+GP<_D>{k=4W z%nz{m4j%t_HYGl zl?ExpJb4?=;@W7N;8#{xY-rZ{T=YF|AmFd~EWdR~R%BGhwx6yN<&)(9M*k{WclSI@ zKA20W1~@os9c()mI`}*VCR91?cKh?AW)@?gtEci}iF=IhvanGF>;-}ca^OsU`Zpa( z-v~l%45{VWd%#)=DEU?4OPjZvp&woF)1b}xZz;vZ8MezU$cP{beCgaBou2r0Md3ZWa7*S1-rSRi`rLEt~G-%LKF8RKsn~QnMFzk$yo| z(fN$s4XU*aSOZ)X%F?jZU8kB;hlFCL{a!2BoQ&iqCot>HDt2))I>12#XEUJ8D+mjx{G-v} zo>As)AxjbT`^zMUYrNiYrikH0-(SUZJ#-?4*_FqcuS5q17QEw2u%_>di{xc>3WR1K ztNoT7buVicP?**W8)PN{H!|D(t#yP0JALz$9Fn?rg@~Bgh%f&1<*=`F@W#e<=NN%LfLG+Zx>Yfc{ar_$aZ^(96>XxWj`o3NK4J-$Zu z9yC68H&gJKLVa&&VnS?b7~y1K5h0`E<6u@VSIO?nZ-f*=Xkaq;4;-Bk}6FO96u=lSgv8Y&t_?@@>u-G|EG%v4I}`h=k^4J(Tj} z{!J1?&2dQvfpzC&^zY=M$QvypRPoR<0cnDlJa5JyX5z5;LfiDxVRgxvO5%m9l%HS~ zI8Xn9N)lmZ4e|tKeemNVo}zIu;>XZ|&E49wjk9^mf<&l5uw#2L0iLYxd)EC8rP@WJ zcFORG-s-y)96km2Rb(3wm9h3IOWDOoup_*u>6sFw{}=rAn7 zz&_tt2Ds$f{W@y=^-4(3JitbGD}JS{FX4<(FA?#DO@^efZ)cc(|8-7J`l(bScBc5K!v7|2+N&4dgBw{A$_tW~AO>rBKsz88q^%SQwy zy_&?-^5F*?`!}(s1h56m=!^m%s&mj4qP(aRfA}2WzuE_bbJ!bOY^7Huglx>wb85X`Agl1x z1=GrhzK3H5kJUs^Cq)JruT8N13XA2Dgjy^;e6ndf2X}U+bVg|8PT)E@9dVi!t!Bi} z9p5b@P%sd_u&+S(GgUFJOvfjBP9HRi(ia;MXGaZ#0@i_8*1PNu2}krH&E)4(2OCs8 zsca0wLH5NB?0YI@yM;=Y9BtQ+*)b`z81v(;g30}&6lu43_fXA1~ZPJZ)<;tr6J zasn0rHbt<`uPUIJnyK2MJks!6NujSyiwCdvI#9-q44u9=d{L%`(b^Wh53_v9yqCeu z7e=*8+`V2%+uv*%e~BpC?f{(gNji5{OlIB*zG#-)%DYlYL%G~LZh2)zwX*6l2UK-i z!(Lw`NIVaQ-D)2Ga+pSuNtTxBZJ}>sXNnCH){Za@cuo0(U3fER)eDGQJH(Qtzr3ln zoOI~RVud~SNhu(xnM-7wSBYr9>?h#g=t>zhUE-rr3tLxr!Tz-}muX8yKP+muY2ucV zU&COjNSDfzyZH^uc~Q*Rqu!g1PvnA29L~$Y7X>~FnsONoScoud(6xg7&E<)Em(nt_ zO3cPbLteG9Qqkcbk(P~&01X+?mjGOK1(zI~_<<5|nCD?)Y#<{S!bL5fLWbAeV1>M% z8y&hA>EGui7Q**9*d88cADs=@BbMd|-2B^>!A)4myjRFUbEv(s9DD~1>8U{DNfwOUCE?Vs2 zCK(DGQ}OA`L**Z;F8XYfgRm;_0BP<#H1A31J+ly@p#C0?RU43{QS*h;%QE^|S*@~n zlSv!G*pJ%O3<-1+6-rOlX7@bBR*i(32?^%hMEKgG} zx{7#iee!DrjP&o&ygdEV-|Ccp)H0PeiG47Ka(~XWCEOvV<|l;cKFxE1%=8;^+oExN zaAXEbBmMtoQ~=m0AqEX9^e7mb|1V2h!W*L7nS|!80|W$MA2@nyFI$5@nCE7r5YNo2OSsGf?+VqtZ81mC=UcQi~`` zhQpocr3|etrF!}fW0zEnGiyQJpge~~OVB?vbHqP6kKgRon6gh`()b&jHSqz~waUCN zlgRfr8)X7;Ju>WPJio)@Us;BTlagN}d=v?`FL7{{o1>Nx57UNQ&0IdMh@d?oEw^XH zlXW|RBIJMPiJ0?NDJ{^9PS7)eZI#d%UcyYu1`FOHjRZUWIAcC#%mBTEv1S|4$}L?d z0hlEX;&?&L7vnAg)58{%%!&eH+@$gYc>6=DTRZ|6evqwz{RK|F z%s1RA1!}~gx#~|Bq2nXn9?JY`B1HmQpOQn&_&nCLvq$cs#pj(V7RK5ADS{84_3x8Adf5-iHMT%yY}z~L#8y?DG

    7~{ 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 literal 67646 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 abrNtdcXQ-k?&QF^yS}v-44&?N-v2+2_lwN{ diff --git a/img/icons/ico/16x16.ico b/img/icons/ico/16x16.ico index dae58a4fc51e7f9c9a0457487caab711f45edabb..49792aa601df281e6b3304b535e6b0b64af15d25 100644 GIT binary patch literal 1150 zcmb`F&ubGw6vv;Sh~ObqQ1IkM@v5jt@t`LW^x%&og1z}yc-Na(Q)|%*Qan^pDLsU; zF~ryfQM4#&Ynm9%ZfrHXJ3F(<%sk)dPFQUEv z1He%Vl1TZdQ-U+px7AjyR(C6t9n;opSKh7WVR*AKu-iRF z+??eoGYX;F#ozc0kjqc7=F^=qU=$I51Qvs-iNP_`)r)}H#g1v%6JVkh!>^H zb(*^)WxPbTpA^32Z9m9EEXvpEDmUbnC|zlUd0>LAyrzjfiXTbXbc0bycr;p|dm#u$e%q%#bu zjtl2%iu;S?F@ai2$L^o*e#~f@#--;hM3cEzG&$r+uV~IfWcmqF5BfZIhUj}D+n?5} zlz*+!jW-DPS>9&E?g?7g+co~apex2>{p)2Z;{R_5-~V&;vj-3 ztRO%@fdqsiA}A{<*(t@jeY;}mapnU+QAMgu)hUDW`Z9vAkLu=3v25N^MYA!QlAIS#RHCX> zhZ<_W(S$iO)*)N97D}aVO(mT4lT>R6${6}Q%tjvW@+I*VM%V&Xp@v%IY$0;KYx`e* z1m1^RViQJKxo_;mKhh%qH~fv;u-nIBFP(tDIS>D1P0r8#Q(hQhr-jiibP;@MqxbX_ z%-J0<@2XhMJ+L24kuPLo4l|(e<{xxyKgTea(~GBx=9_luP^ZI|HLoJ zUx7{)Z|x?}KN81}G3YIwgl{xh2h+L^bnYa!jDf#ilXa8&(e)d3*IN=J>;92=4axoN z&P*NTU@abn_wE`Z%gEMm@(xOf!fN<)x#PY%4{KqvzYe*3hv2@si161+2T>$%Ox~L2 zl84wIkFhT!=+#-XhTT5q@g83AY0+Rl)NJ2yt zewYT3h(MKSMU(_PrU_9Bc8r6l1TBf}U9Wd{e!YI*+KbmwjB60jdOL64y!p)R+c#q& zHsH5yo4|92_=IF9pSJRC>WKjmxh3soGw zQymeH-I1QWdO0~QpWnRe4haI^%B6Enemn)tcn$LXow2*#VwZKP=}P{0H??EZ84!|w z6-3v;927NgY;(@P+{3nBmk(yl_x;lL2Cvx|UGRSU@(#EwbPe3gf}A1o)EySfW)yvV zTW>7ltM&NId=pEQ&aB9#--||-hz5IJ_B#!4s40Vkj*kP=5vcX zX)pdm_#Kmii7j)B7+h`!L}M)h5ktz)lI*0d!>|uI;xm+x7DU6p#)mmthkZ#_JDVuo zi*xi{VgWXjz@&|9U7ezIy0;y#ou6wA|BtCP>omL8rjm8oj?>Anl)oQ&MP1c}ZT5AV Q*X=kGah$c=dG9m+KY&bnVE_OC literal 2462 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 literal 270398 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 z z;F7-Ai!v~!@AYT~%DjG21`5oG-sad|375%UQ3lIouPB2{qW5*@kqk_6pGA+63`9Tf zJukdp+3ZC!ST=i+YM^ZPA{i{3y+{Vv^}bW|tU$sg(NBBN3j&zZ`&sm?Ab{wH(eqFM z{bau&fPt>}Bc6hQ`Vmh-K>diPAfR>8caENi0$LLNEP5UaXrSv;qQ8lrhXRa#RD2!? zu=um+U-o*x;tK`bulPa%_A90TlnF_%8{#_>?)e^I~# zU0+iCi{ig1z$wL_6#qp54s^Zv2c>^iE?)JdN`F!O_khVtv}_xifx@+kdl`=noAQu@Zle~+p4^(n>AEB$L!y|0(PkpJ6Dz)QeO zphYB5_xg8AWkC=0el>5u)>VGL?UR0exc#4jem~s)+d#h`sDC-o^?~}g16?0(|GehE zpHfLds~Ep5sq}lsN9!tGuVVaFQGqa{4s^Yuf=nv03zxoY71t{&(6P+smfkb^H`gmF z&}3720LSHu3Zm;%q7N)SxAui4#h*q08tA&UU#yG%qWFBE>(;(fp#ZIwe4y(U3V4$8 zU!eew)%6MmFj?0t2-sd8@cNWuq4fS`#cRxx-cO3ptoSNix8ke7u<&}n0t_c1`W4`$ zAbp>6??ga z+BE-~CJo6oNu$IV(`u5Y#N?8izYz29?sji?vpYMpGk)LZX0yA!n7if#_n4h;zWL_& zoB8IOZ|4Z9f?rJy!8d7smXPCwkQbnUio6B|_4w35UnL*LoU@FvGnK?F1&bQSDIxeB zDWxfe(0!R^UMywoVQjM5zn<|tei?Yxvj)PdYV6Eh`siVu@BYKk6dfyF_d_8(M{yPE zRUyQ(($UF}CyXTVvR9uvPwHfKQJ^xF%yC{9o;RmBVl}Q^@q5nHXDQi2q#UZ2`R1c( zH{JA7nRJ1@vzdz>V82Lb zz6r1Y5&i&^)A! z$6Eh^tZ9Sqq--t|HkD0U|68Nrm#l<&nJtxFKi6kR;4EcveNIc2%w0RyZDy7+FJNG( z{3EQt9}H{Pj*n5W*)RTmZ^Ek_|8qT!{M)$C5NA1S<9;~*&%-pJ>^|1gtsbzk{rr<8 z71@8q?}2XtTQgVg^eR5)IzMAkZMxhs2ItXXyZNW${D7_RtPKqzpKV!FmSv`}po}_q zwQCaB|6lP#PN&=H?hCe*W1RCXz6Ulxb0Qa1AGR# zPD_$|`6QWC`3L(r==B6yq2uTKU@V@~;2Wr>Py+t~*xrT@-cn(V;O@>ZR`1Ix;|kFP z#5aZfi)RA&+Rw!p^U!DYz1lBa`!~e}=kp=Rx1a=fm}30!P58PnW&rA<`v&?P-yZKX zTAmvLe|Q4;{d1Wh+-N=atH?~^*zote0O?nE;qBjNfd8v_{)Zqw19MgD4Ua3xk?-IV zO<(SYvzCU~oTKUQF(;^d5Qq`mD3%ZlaA!Xo=f}3>ZY}sc9~uw?iZ;oO76UY<#ERTU&j0c D1ngtI literal 4286 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 BoTmT) literal 9662 zcmdU#ZEO@p7{|9QSQQi`ExrT;MnFU&je=l&fB9fyqA|wAh>7|^L_|Iqg%}eh#t$ka zMvZ6iJUtOJszvHwO6EtnKrfHKPT+*I|c->0lHEqzp76SVcXbM!(pLPJw zeoty~ybvOHza+&k;1@7cVQ3*#3u#n236M7X3>>#Y>3#uMl@#Eo4F=Q#&4@I@hK67^ zpb4^9L9-x^y?#$F{Pwfxh|~|66y*MQz~kN{=Ex4Gn1W<{v5PlUvC^7BX3U zg^aL&Lw*w!f(AU5z)zMCG#x5vgSuXWd?WO)q!RhbL^d+!Jp!I9y@=d^%1>!s(w!}m zKJ^`HEW9)a;3pdy^PYh^pN#x4R9-UEVw~O~@$FAZboD5SuDL=IyIv6E+&Kfq5Kr;EIg&^^+vIZ?TyAU)eSS^7H;T zA)A}|1c-J8O5{lHe^>MkQ!;Ch#cufn_FAOu87lgwn+2eoZeIeVvuVB(~*2*s)CXrt4kq zE6Pt+GLwHeL?76HG7?x<+9dYv!&oCPa_PTfcJQ6T`_(uCwp`e2Tb`|+{2Ktw{lhe< z(-*vHh;e3*#COh>=$E4vH`>W-w-~qcw_^8t@*fBD4bWUD<;8DCJ0$Vz>k|F?YW2K} zwe92#a_-4b<~h)(#n`b&lGGm`iQbHHRzF0s`{dy}QfMsudS0IV#Qp^O-i_ZlyH{fE z_hD?FUm6FQ8>%ta%*6asSGwJneZKg~-a8>X4B`A>^*QGk&+0#^bd1hYpWJgyT16rLO+520{sSo|KOU8xaAYYwmyV;cet{{Z7liXr(+eIf8_-d+kC&I zk6|iK$6T?UKbT3Zd*LrcZ@IO|^YzUi?EOK%$6D{Q-f<_N-*ftO`uc0txNtrPU;O9L z7RNxrRP_BJKYV~v`rX-x84K+H*j16;b^i3^-~0ghb-S*T^D_KTyDe-k+}E%F0YBHT zXQ6^)c#!jxnf?QPAo@am(jez2Gui2b(iiQM206d&KXVUIaQ`yM`R)A+`3vqJ{qg%> zx10~SjQP{Kf20j>JL@mbUm^OsYb1SiZJ;@n``^@|j}f1^%*7Wfx_&X%K<3;S#C15& zi=PzbS3YhOG0OP%C&c*s2lze(r?LEQp$~L?qqX*NAMEbOx$={dtl1bAkCk3RZa`M@ z=I5G^b}Zj>j3jn16r=k9?#++$Sd}p@)U`|EJ7&Y*tMTE37UU;epZFCG!F8$zVvNp8 z8UG(~1yBDOc38fDC1NO(CHeb1d47=@IV_1^UX|!q$Lf|*f`9aAu?wB-ag

    n)b%g@Ca)0?NE{Q!Gk_}AP=mb3@9?5~zs+ui8D)tDRNWal>&GFg3W z_j#dQmEpGne)ot#Vn&Zh^0zl6x^8?4&);W1+x@Sejovg>k_SITZ0;1BX5#k?vUq;K zu{}>w_BOEI^iTzG?veV8HentWI`#*qFTfqPT diff --git a/img/icons/ico/512x512-multi-size.ico b/img/icons/ico/512x512-multi-size.ico new file mode 100644 index 0000000000000000000000000000000000000000..71441e66372923aa74440addfebd34d0aa1db959 GIT binary patch literal 458262 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%0D6*{6c*_0$gkC5GLQ}-Vad$P%~+#YKP7Fotn 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

    RfyKvs6AW?aA}du{n77Ax=OMV!U}>U+1sP% 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 literal 0 HcmV?d00001 diff --git a/img/icons/ico/57x57.ico b/img/icons/ico/57x57.ico new file mode 100644 index 0000000000000000000000000000000000000000..d6ab3c8ed7634b11614d498cce2b9d7db59d1397 GIT binary patch literal 13514 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 literal 0 HcmV?d00001 diff --git a/img/icons/ico/64x64.ico b/img/icons/ico/64x64.ico index 4d66e19851ad3a2313a5a8323b42068505f26f59..79a1e9f94ff683f999c99cb757eb3e6f26b11791 100644 GIT binary patch literal 270398 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 literal 16958 zcmds!^itI%s0mt5$`InkcKB4W6@ z2=PK_3A7s83LS)Ah0a1*SNzR$yvBQYFP~WmF%6YodvY63sydH|XG6WvO6Y0m1eAlq z20p`Qna0ZE*l@4aciHUmy9^_hOvIDv7*avrST-F{H}pMdA2bfd8VaX&k6Rlr-Df5{ z?lRXVy3J&w191!l(UJh1s*{N4L-#?4p(50lP&m0u%#H6BbM3SuxDP}3Li5K^7bemU zfYaQp=XXMfARB6HsNjbU5|j-cg6@Q7L&o{!^k{_{@F@Ul_UrL`0Al|&A)x`kwnG-| z1JHGEubtkux&TPBcS5&8$Dj!f9{k!4Be213=DI{D6tF~t-3Cyy&w^G#7Bt}@06*Ehk3jhe2X|i>ke@clr+44Pyw0)n<0}8bO1b_nq`~LOz6NT0 zABT4|4T1TS9g-PZ#=JfTG4J(Y0nYF_h`!guP}{z1NIOsn!=D{m#x$Ad-$L(#0uYyP z;r-A|=x0zA-wlt&8zS&C1I#-a$WjLM_{IBN-HOq#gh5km!)v}8T8oA%^m|knVyHp zSXBpj?CNgB?FnEjoY^Cp{WmLSGikVf>omcbR;{-c={22@%1LsUtzu}iRXKr+jc36L*q@Ve$6kgvUg%ex#{D*fsc+U0zyjalL zINt)qbmC56`pRGyi4r>=+OuCj&OH}uVw)RP~FJ>Kcf&S!)1leGuZb>M-P z!0o&g-+Wdw&wgF3O>3v@kbHglfYyTx`xv@7^%)%PAZzb*D{{7H-f)?+qtT%PIS0VGfaYOp^6U8z&H=4#4v#BSlmC8@k)65$qA$=m zOg(mO5#pN!vuRM~S8$o<`oxUnx7hQGfHbKwV& zRGh(<{OB4ruJWB1@b`bK*1szFX@`3n<~k@p$71VdNNVSGl0Wh&=62p}m|U2Xw)u)P z_qOdyZ@*uU1O55A##<_TwFp?Q16SZ07GP^a7=GphdEi(bQRcwcFo$rd%Z+D)FjwBwoPRTb$fj}YVqSB_HKFn#R`K72JcXEts>~CA zyXBbL{sGAi|6Dkyp#t{@j16Oc;|F5(zdt&+ejoCf9pa~~Dv;$`sA<`2W9WMj-vT-N z->|OBJt~Sp&CTkvjS$lgSU2LFR(|A9u*GUgZU3NC&aRC@mwAbuZDodJ58j8Ym%@4c zB8xA3jSXhv8LpA4iAz;R*jH(7eqZZlr0WCQcN}YIER$pcdq);vzr};7TO8V`z`T=z zEE+FR%=;nke|-dU{35o|GkdXz=c{7zzr|4PAwnC~<<)ZR_AMwA?s?!on~J`r=;qzC z&3hRG&(j8Tp~s=JZ;1XN|7suBgg)i$;cB(shPH#lt@e)X|BBjIRkL@D>}%Y-dm(yW z!}F@mxamBKxM~vL&b)!S-rr$eXOU`mx{r(8euLOS^&c0&_BWyoHX%oB-c^BlWSyM@ z1#a`r458CN%zE@7RO8HG?aCZMpK~wPuI8gnusyV)O{h8s-*U&bu=&Gk-4J=H4a^(! z7`e{-*r5|?FM*Ch)q!hQXP=YIKffK{IUzZ6p!yA)1@05rCF#9iY;m7})5fj7d9dlXVA~;J7x2ouz&tQ7%u~zt z-OoV!9f-MSj(bPY>DCvB+9!fBTWVKN_-`ERI`&wk_kIEEfKS3FZn%cVO2BtB56ny3 z*(+_M--npviRBRY5wPE_3TmIw@Gr1W=tKTKj_TX!8{L5M?qki?(D)9%YdNIGGKed) zHle@yZm0w5hL%D5pqfsZ`@{~z$Ndr3!W;Ows&7juKal=lh5v%2N`YxIZN7u=;yWjl z)$3)^NpWp%P6TBUL6WX@>V|VXhWSSs&3d8#|{b&)?eo>El5sizS{>=eSeH x+73F_cG7m!v9_z*;>&g)WP&IMl_1JRC4_QP5B8uSc^#21SKg?~88_ha{{fAo4C4R* diff --git a/img/icons/ico/72x72.ico b/img/icons/ico/72x72.ico new file mode 100644 index 0000000000000000000000000000000000000000..a61ce5bd1aaaba6a218746b4772e56ab3d872496 GIT binary patch literal 21662 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 literal 38078 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 R>QLkZ6U}?9eM`R2`9Ipel7#>O diff --git a/img/icons/icon.icns b/img/icons/icon.icns index 585a50c705399700065abb177f52a630962d4b7a..f8b6839ccb3a8df87f12046913df9ce9560af7d7 100644 GIT binary patch literal 222543 zcma&MV~{97vnANJZQHhO+qP}nwr$(C?Y?c>-M72vesAAy%+Ab@DdowGimZr=I9XXy zWoc~Z3;=8@Z)wcP@K1^Z006*PDG(6ALWM*9!zgAho(@(HOa%Whz<*2mf70Tgie_nH z;sgKy@(=#&AmHHtnF9cCY;WTP_+Jp=-$-O^VruqZa{vGU0f7JY|40A;pnnzMpZ>4> zb7%Z3|EmbV^dIfN-TeptSNUIb5O6@i|F8X;01yKJ3Okt^y4X8$5l9(2E0{VFsF^xB zTiV+ZFw$`{FwimnDgnU!^8^S03IYNE_^SheEFd5uq3}PqUtItc!2hEa=>KR1{@<+$ z0RP!8U=y%^OC;}yn;Rf1C|_b6hKjLY-#&sRPdVr;{~B|lS)c+u8%fe~t&7EhlLNDt z`}$J|5a_l#rS9#XAwyUbqIWe(%L;qt2qAVzcZsQ8Foru@5Uhm;O2q)#*TIx0A zgO}*yA%bQ^F(asIk;$P#En>Fa7wr}uECx_3p(P#vU80sMX|%nyZ84w(T$6hWRoMn* z##J${gYZL53h+|@Yp!jDHdno%Syz&!RdB`_pe+aK#-c0wN45g<-mF=Xh^8T60FhFK z(p23@mie>N2DKAiJD-YeYz0nCxzdqVWa?QAlM5Wp#Tyuz>{~cb6on{d(2_5radSce zRW62Mn-*xS-dbNEu5~w@*3Kr&$Cg&B_yk8Cn^7#2#=rXxDlF9_krM21)u4Y+oGIAYYuU3p2+uO*R4E1Lqb=3v$$XWt@RQ4r! zB0`0(Y}JDbsi_?L3>*+K2|rf_zC&_QoYm-V|E*uel+?!3(55TI|CMyr8HRGysJvYc zx4dy@ly;O-B)kOr|ezc*L4(ek77(SVtE+@eDAFSO6s zWZ1}GL3+$s4uK_akEDxi1?ns23;fGMHP%`a2zYg3(bt1y6IHSzNeSKD(140zIEu`? zh4X^DFhK}#2Uq>WC7xyT4h4a+AKq8a>E6x$Ki6QEE8md>(|78d(O@)0Tm5%S=8NT3CF$>c zG^8m@<}z6NT4n0Ygv#MfIH~|-5x?$n2u>!7g6M&NqT^2IMla^iFQ)}VomiypzzR;{ zzqA6pR6PJt_RUrypU9M>r5U>$pMd+c0ydFR5*Kc*gBDK8ghzhPK4&@=Vc3l*kM7wj zH!DOj#g(i4RSO{^4geT{BAik?#OxJ+-Fb?Er|>Y6Wj03su6xc_N~fOE>8S`1C0#%@XQf-=NOo=*dIGQ+AxCWi{Oh}rf~v|Dtz7(lIrmUQy7 zN%JkM+$d1jowg^WGcpvfJ&_4D!Vt|^lO{VqjPF#U#?RzE?ZK)mf-B$Npc6MB3fTS{=)I}YY%99&0Vjq%~)v4>d;d}*sQ2JCXvRqmPYSV z^?qWXQ5)b_;pPIjleE($R(d)PXuU3q< zl}MXQgrYq3f_H2!fxbo}+$;Eyq|C4D%a79Ej*>5X=(R3{>3`g)5U7_xO58+-bi-D(fNXZpC~*Y@Wd~JjBpFDBeJt^UP~dG)o~)?&Z3q?a9kT~ zgw)2@8a5TI_Zf50Xl{}CV&tk{wkMQ5H2S<>l93-_&e`zIESz8PB?Z6%%X3vP?-`+F zZ;T8`w1J?^4EvM6sjN}-t6_I#-8s5y=5+=%ZR}-#DZ*}1@M>AO+^?gKVp~p%ESTXl(_EF&JhkZ4$7O zq-fDeZE6unr7C8;D*ig;F{;_vUIaS!oFn)j=JPuh>x-%LgSi`!=uqgN8s{1VsMdG6 z@`k+#oBC$fZIA3f44T97zC7Fsx*s6D2B%ie$4g^*86^%9HVs9#%!et-41Q39cxOU8 zXN0F>%huAUZ4v1dI@hLSF0vMHihT(ypEY*RBaq7EpvQ*a6tY~df&&|(I0uRNApiqV zgqM~gmuOo=&G>`9c{(qUc}1}+T+X$@OEl$QBn3P+a!V=G#!YomK7;Rs&KRE*BrCK#m~uy8oi#! zk1m%fXqF`eo#y1U?lsOJhj~GVHC@}il|C6I_(ZgRN+prXO4E}1ei}Q)_^lN4Y9+0< zpVPik`QIq!9fd{K%N3*5$z{cARxKhm6?TiPr$p|H>4gJFVvHiU)096+F;j4w#LATW z9TE#%cosxX-w>#`|#*9+FxLry$#1FLs-6eqn1(FytI1P`5hyy>@kv^51h zCcCA6oWLTwl*QW5YiZi(BD2?jLD8{fJkg6~1&*_!$;{j#7q+Nkm6ib3K>z#@WqM#a z{xDUae~v4uiR@s{Se^fYwqAhagpsqF$WG5!*YQG$ezw4ByMfwn(JJC%mya6(v9=p! zsN zo(;R-Q*SA}wz)Biue%t9Gr#mxVz zR2|izV3VP!?e*UexB7p$v!nMAqgR#fCB)d!xp1FEd%iy{GOh0GwWIzm`lzp{b^6C> z9hT3KfcS6avT{jH;>6$X>d>##IOb0eflB*SEXU5tom0>IQ3JaJ%_@h;w*so zp*NK|NN%T1H6AYN+u|g3P@|Q}^9j}OnB2!U_%rq;>r=}y9smlTMV`i=R~Naj_CRXS zz-8h0jUl2jfS91-j+W9Wh-u;m8;Qzi4Y6cqPPp*xGk$}LwxT`RxvP#v)W#SPE88!_=St9NtVj2H&>mBUSTjzd8|f zTNI!WWGGy-Y)+;?pa$LJu)s{Kh$!ok?Enr@a6imPseVoG^gy{wNMMp&07w&c zqfwV;u4X;K7s*0t7Wb)G_5B)Hy2LSUM46KlAeW-Mx1#2ttHvQH_2zZb5ZU#mIS_0O z^3}y7Kc8*bu^bQwG-dC=9WyLr6hcI7I8PT@uT~5#+vKnUzo}gKC@ivGtpwSgz5BXG zMZHv`u&^@iL*5r!H(hXMCrMzVx&fls)&+}$1@9P~uEOXo)z{rNH!u|%DVzoT{Fj9U z-#_Z-U#XiqKy$kMKP~e`AY13u3pVc6icvdA!d0-yIZzt7)s`OiYQ?DGgv(n^X=*jd zZlMl2^~4G*YFq(M+vr7+$bp%+$&Dqay`VzGH5oJQKwt0x-PoSG!X9bdDvt@pI3Hj< z_a}3J`-QgCpg{z)L|W}#L08=1Tk)o?QV-C7+-S2gE>uQ3q6Np;H+CrjwFu<%wJb)`TNp>e%~8=p@?XE+Kx*DxepXIz-;cCeBmtB*+U zy8MQR*L)d~r&C_6{uq(#rPlnCW4JFzXg%khgq@LZCZ!Q)k)s2I0~A;`m{~V0*a1)_ zv#0`++L>QHA){q1eUW7&e~}AFZ$I^;`%c+2&JPz-zT1NQeQg?x|8Y1%HxdPa6k?uPPaf6s(0#y1r!u>R&PlQ5mq@=3%Pqam?CfF?4(nDsn zoAsLm=zMlPq>eF}cD5ESR6fSV%~uKHbVCSCx_^D-Tc)o`9~z!w6()k}SLRkPZnJ4e zy}oNkN5-0X;QkYK-}6gv)!;esX*ia%B5AFXGH11cQ)a$&lefM)LlIka(({`RWyx>g z6izV!UzSvM56xL~A8H{p746RdN6+RBn=9G!Q$w+FKdcC!4 z6aA;SPLFMC*|Mj zDw1n)beidiuzO!G4SHP13!<2-+O5LZ<#FO4a;@)#%lK4iuNj`BC*EC9@#^_a4>|I< zAhh&l1VpH79phHg*J*cNiMI;O_w-mUE_ebL3U+#zI4b1xew?8G@1^BgSPC z%JsIyW=a9}A1O6%@@8EqMJpV3=}9jyAdanE;tIB?xBT=A)sv$T8OqyfYX=d9q6wH0 zcU5I3Y9(lV3yxDZY}-}B+L#9lGHlfn`UtiK(%>i*@iHmw9&O|Wq7x`3-5jL4K?>o& z=HR1ryUNZ43$<)Mzk~-h{I)C#-}E3gQM;W0I7iLJ?n=cw$aG@OM4S4g`&kYA`~2JR z(Rf>w?qk^*e2IrqC|5k!fGXWmFUmG^kBKetHL6Rs9m9hpn$BA12v(R!f%#c>*fILw zF|T=#~rFejqo72H0eAW?Zf;?x)}VID;cZ{c#!#32uOu$ z!&AhrYKR?*(gJ$@zwr<9h|3y|Uz4mYpYR6D$_IsKh;pc!%y}iFFFF|-1vNvpIMfTM zSM*|~UMpld)A=>fC*){2ZI_G1X@Qb^W1%e}n)YN0m9aK!U-ox6!`*8Q+31Pe8O**9 z>XO|&1KF266!Q5A0~anW>+fc6m2UTKt&)Nb%d?dFQo(Ypm3 zV#<$j=%k8f(qEVI1PhTCzMv`Og%(L^OPzXs%F*;b?mS(rw>Ovql7DL&pW6HiSHmQ~4pss2jULMU-zn zVS0l#xJ)Y1_TeW>l?1d~n+zu0v0j82!9HbcR3-ST2;>KuXDR(%HFE2G{cH zXVK&Q!jJ%PyL%RDcp{qblA~=KdK5MSoHBUjKNC%&w$VP2BgcBJXq~Dzt@H>)&%gSC zagn|`Lttda<4V%!p-n}>GJeoe!z;+wj(X*JQ_VM*Q(B#=O4sStI$|sXihzhA(0>^U z&56sX--bgI_*oTTm!)~=9N3TAL=qhTCh2w;BqO=d#@I?h)bM_RH0_;=F&xerALm1W zp+5>CPTx1(`E5gqd@TF(Ih;APo{v$$p?zYcl0sMMf$5Ow8|T$oNr)w+$@mfa|99vG z0}e^yu&9jfWr?V>-XbJ5W0^9&m*r!i7~>pe?|Y$m_Bw%y3zYKlr21Q;G?#*=Qy2#w zWy4>~*}6CPQX!R0g4}(Z7Xlkv$*0;f_Vh%sjs7z4z42gxy|tE8C!N7?qNDq zU;wB!IA6e4S1x06AO{H*-gE$RBG0mLJ*qt9F4i zgZ$;{X!((gH4FZP*-Q9kcz=hI0Dz|0KA~1dx+w=wBYl#m{%Gv3uY13sOofQ4t;jHZ zCb55QEELI4(H}Nsi7zo}UGI*agu@U9M=~UkpFaOrP0IbtJHXofu0@OJu&g4X~VBLBK z*!+JnxP~6C=ae|OLx2FTu=LjCXF&yqqU=FoukW34Bt>eyn!68Uj7>S5`VIwUZ)bph zzl~z^axOV`^G2wsab>*O?u;y`H2Vj=Q@566$>#j!e;jpF}9BT)G2U z7HPArR~Ii{`73s0Tnt&=jo?L83NNgrJxT5_+A4JE-u4i+rjog(pgBN`2%oAjqDeq^ zIwOE%M8cXWydB6()j(V#7aCOf9ZCL*kcImKWiqaSKWt~+d%$p%^Vy#RS{1?e>t5R( zLp6)p3H&5ma=hj%bR#0dJ(DBwx^+WE$Q7kQX)f`?XJ8rr#*xmNFEBc3g%3=_EL-(+ zh_#DolH6ZTmJ_vIxt38zQA;3u@%kcyW8d^8{~kWO!vG-`>P^0PeB2{8@U?1*P>akV z(d0*ISPM2$%GO+9YZkj5}~A2n;~S(^{zFTN!5 zKI1)65JYZ)BM?LnMD^`d5I}U@xx}4Elvcc}bmzCAmUxLC9EG@#KFt`ExFNPto$ElF z3#JptK+&0H(50cYvYBi3l(sQ9d_9&72ZsB9iSNa`EzkcHj}@z|*IlMi_;#ld$1DkY zFw@;)u8uX~-*eC>NUtt=s~8kC%YOsPDWnP4wzRZ|r(xM=@eSyL1HpL!l-%l-hkAy~ zmDT`EicC-2V6?T_h@~4jKwCnJR6~{sy7~nAs;E;D+T|-n{_tx4s!`{7f2|4RUYh

    iV)){6J@ntp>(S%i>4;lfCn6N9JRDDF|tRo6LBpF;@doS^Ax z5_mc0;k6*pJMJQ@sGhU`-xa#h|xp)6SKi9HB1b8qAaN*?v=iaI3xkK~^S_*2PgUR&HIiUnPV3i8$ za2~;PnmDu{j}ny*l8g`tm^*(_udb{N+RYXK(m0)=RWiE{pDA;2{Dt5QCs<2E^UxR; z%U>V755H}!V;p#6{JLGtXB}WWB7j}zdWc7>IQ7%%n$tn45Fho<9wN$k*b=f$V$m=E z{~w7X717b>4RWKp2`dW+3Vi=ymT@|ka;hK)ZrrtLe&|H|LOUY=@Y6kTZSJF&xhl8A z43R;}8V?fm$STn3Gvo+MT_>n-)0rn+OEolH9+_2e>JyP`X_R)XAyV20&hs3>D5Tqm zN5X^0$dN!Ro4lvc5~>}V6Am|mq8bvNM+M}}xQ%o$d{`3U2?votA2t9P%ZN{my()&{ z{*e#Gagm8X-6Ka3ob5}<&rph*E)gzznt`uq(|(00CL|cqf1t%Xp3&KFKRM);QM&zG zy0+X-%@-(_7tYrSMI}^k&0LcMtxoI;tCUv*dgTV-y?LXu%rvp$XJq$=Ot4jT8eN4q z=li!$O)rfp>uH2*K-^hLtGKaBVPZb{6|B9GE*g%Essy9iFL2DzrH4DQ6^$w3eQ4(C zU`#in>*!nfzSS;Ww%x~A$9F-jXP35>N%Q456jgzO)-SP~_kH8IQ8Hq`I2X=LU0*_?hv(MY_HffP#|3TWmt)_WLgS@13f*F zY3h}Z#HewL>p$+@Y+)KSqN zBDa9OG4UN)pmJ4~Lf=yK$BOt#H?TsS$1@DssFc5_x1}qMo-Mt!uC45J_pZfdxV(e$F%}?72TS{w=+Q^b}c`M1{^WWQG(#)!E z%j0alPGgOGn5#;?bL|-=CcQgvvb27s%*l@yjO=T+2sXM6cqp4?gIk7Hy4wn#)zFUN53bzWp~eKa6b<4~<2de4)lyGt{7vx zrk-h%LtKUyoE!w1DbC%R)@x6;(SMKGS}fuc>dADZG<^pSc6(>6VSHHUYU#Xat797W z5_X-3d@4pZ1D3V`c@jiLkh%pHofZUZg$_LHh7)h|u>86^mX_M%BSUYAGC z_>*!E>VkSlK`~hE{jm}hz5eh<&WPJaupR)RrKP0Ap9z$(tb~v$ zyr$s~5IfT%h`ESxyw%Uk6>IfmBKWUxRD0pY_s)(DS0O%&-Z2>KxOIF+e^V|G-DdkH zJ8?V672@`i!~8PLYJUM8MybbZrW>=xh9!IJjoBU!4qbT!p?!h8l(=VdbAJDrOlyW= zEo^RC>_(F5z|8w7P-cUX%Xf;kjJ)!-tDt8?FW?tzdyhd>)(FSSdo_EPDQoxAV|wnu zUdGX91f+4(kKUxaGNPH4O~QflCRakolJT(_7zfkmf(IMT>fC_6NLYeyc-CSh2@$~V zc5&FNYBP#h)bU^Hs^a9OgSx4k%|^k#`={>ZP~@n^Mu4(Qd($uCtTC0xU3@zC1`yMx~dIyeR zPwv2(7s(?TU5m$eBDoWDPVMjo>raW%t6jQ_|71LC|gk&MI zr0PyPOwqJxx0a)IB@roPax8-IWjV-|z}i!gv-A{S?$n5&QZEPXT1)A*rf`c|H;#qs z2|ZBtO#pBEq=uRtW@}&n2w3eH*EUor;j<~clH#8o8muXP8u?=iBdw*sDhN)uYnNF@ ztXO|VHliSmByY;BI7hWsjUg-K)va|aN&1EIz^H(~MCz0?RXs^w0>bQ8mUD43BRzuW7YHe=_-#Tp|y*on=`IKseT8N&hf z1!!9s8&MlJRG17Wt$uD^n8V8Fu`&vR%G^W|d(2R`oEr7iV|60aU3`w+E1{`HwvDm6vmLW49Vg)GCn2EtxsU^b5fEqBcnh{MCiO|zjK^JRy? zYf%h8mFG%Fywz2UI9?5fdBg(NKob4e>k$pptwFDvvc}Tf{!iAyGi;A%Bqe=s_fQ>y z2h8grNr>ds_POu3&!eUctJ(NEIygQcoFKA$M8yH+zDkWQi>i^(acEPWw~IyOFNnc6sg)!COZ9_*07@c<9H6|nOrJ<1%$iY`Y5`|8mXp^PC(*$s78MeJ>}RE z;hs19--=&BqE!&7~*H+JUByuW(W{O+DKR>43$8Gmzc{5Gf@s>dP|Sm33vd2Qo;Pw+$+N>a%K zK`>S<H}6l%xLfMOq{!*_JVR-OWG+DIK5*?RSD9C zDlaWB2e6mI?1*iUA>SOqLs^w)Zxy|NEwxO0@0oxxzP&>U=(OWr(k6_`P(D&5F21BjMO<)*4|ZChb4;6RK1KDLO~ z%jV#-@sDn#iVg|f5Oe+@g5h6*mF9=@XXLHqc2gc^UTsY87i{viPy9p>x@F3JvKvoM zM8ES{o3Oz3Dc-feGtQk+3s+HjMpIp{zNEb- zSF|p|17LJ|O4+8n47z2~p3`?wQdHv4iLagcT9cTNWaF9h_GX853z;Ccg#8MxIbtqu z!N#lg!*LcF=~Dmr0s@OTT>FmN=&b78dUg?NqIHXZR{wOZF54uZA4&x?5LLqv*V2I1 z@s(UA$f?5=*pAIWS{X3;j<32wOQNvCqvX!n_2gWd7+0y3a$Ks(4=00$*E7;t?>b?u z*1C4i{ThXTt>z z`1ikt`0+x$_7lmkaz_L7XMj#haW$pizN(^1&V0hDgyBw zBbxzkba)FL+r+eW7zo66p=H8t2m93%O($lA56MYuCMi88>cjQU8;!`H1Zv|rIr}RX z0o}gMNk1^k6m#oR6RX(Kqs0WdS3jVzHM>HDA6E@qTj==u38>ZhpTrD`tGy8E=AWXl zxTk)?;KsZcen{ij&yQb4x|l^rOf-4Xb| z-^=lnsVY*yx-Y{WlWwPB=4=im34nqXRX()}Mm8V@Uv9L-tdhCgO*POE@q1#0sWgy( zjY$e$y;TxGU=ft6=*Wy;&uT$~_7|9vMK~`9T8sOXP{rSCIyNSJ#2-NhWZVgj;yent zXqLK%-HNCTr6-j6+8c-HT2VI}rgc>d*A!junuM}udeS%42I=P z0`P3qVG1pR*H&m`O8NR+?)x{2SRkn~+NIR~) zMNWfLw53KdO>eU7+C-t_vcdckRZ8h(p(o~$kT(IfYbyVR=B_@QhKh)i2827Vrpg_U z9f1n+ISTR1yKgYn7OCW|Og_~~rV;AO#NA`cNjh#VbPu`t^sZJ3*M+`|TN_AkZvgWe z*OWVlC;az=)(S`9dX&?n;(h9JnbD7q!w=^qj|vs?2h%fxi-d`)k$_q(p=)Vm8`#>Z zqEw*ay()f|wPV0Q0K0RcpuX#89nuWFa>tmX!;IWd%cP-ot{}>`Six8pJI;rVD7Nh^ zUV!RQ3G4}u0T~!-GIe;G*CBwl9}WD&V&=QJ>h;uVO70f)03V&+OLB(fCn

    x7X0S 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

    7~{ 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

    J3=z?9zz)zAnB!E?zpe2gJEPo_ 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%0AkUr? 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

    Ys63 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%0A8gQ;`iW;^uyR6mtX_fi+dy-;twOP z)hI7a?LUow(v!cDz0UOZHz<0tLX1b50h-I|1!FK+F%d2mYLYTK_+Q-W{Z8 z8OAvg{jA7h>;aEuTLO!&xff~15m;ng1o{_dfqoqa(B$QyEg9_;S5rFSn6MfO5)R!k zBHg60GAX$Jxtnn>#Z1yOrZG%R$EHJP0$~xlJ8uk|BUMhP{`Ft}qJky*SV!FJC%rs- z`bQ_6o%eV&qsLl)O z0>(W-?-VxFUvlLB@LX%Uj{aY0|C3=5izAwdwj9zg%De$Gf50=AJpkQ?299$?G=3)< z4Wr(bd!6CZ{B6M8p>( z(08LX3dk(pHy%AJv!sBN&RqL@Y{J3Ke#0J~DQ00_Qps)qScDJwboE z@>j}7K1X929XDIMPI_v5AuPr*(0^P}QS`gNx^M?mtXZbDkG14>1^CRG8NYZA{ohWS z^U~PhP^tgQzERK8I8M~jGjQiCP^Txes;c3~-QV2KU&4sGV~r>hnTPrB+!!zD;#ptQ z!PfU0M}J``z6t2FcCJr-QvPx1r?#Ch?8jYW*syJztFD!ypKs7<{Db!SI0s?UZ-gUl z_5Keg-RGIeR_gl5LY+EP=-2g3p$lF)?D)%}m})_&G!s(dZe`FZ?xMF*FNYRh+{Qe1N4TAj5d7a1v z(7zIPg&1bIL4TuT_BTe-8G=KWe#pOO@>vfhqTlUoAM9*xecGT|{0IF9ouHq_Qim-4 zkblFpvj(C5H;c4EUsiRtwM;&E;J|&&jrI4ow=_?IJ`LE^VGalS>Dz6cdDbBGdFGuG zUblPcfr|3~1_OR`Jy8nyH`SDv|JUPmE;Bel_1}Gn%U^^1Yp0y~6yzUPWM%(>stVB9 zKF^@h{tx=+)m83)L6+ol&>wQoIdcr%;c%$de_H3L8+q~{S`>b#+v%K(dXIAyQG<5R zaAFA1;f6j)z|roQ)1dL&-P2AUO!K2dk$%FNFFu0K2aKLQcEdN(pEsHWTbF4Kj+oJC z2%0xe{?Db@=UL7db@csxcKjb_{1+Rq;QSWGzf)N=>cKyn+Blu#?HK=JnNO5G;(V>m zzPB32p7<)>z))i2-@d;7!Ikn+&(oTfJ~k1?s>Ya2pZ{P^;~vG9R!qC?E|0<|nZk}a zoIze(Q+)m7IAgwr=0CJ9YUCIHsSKKHgeoTD9<9_(I_qC4&VS91R^I*Uzpz%TpEne7 z72Fa1tPkeDbiTRm9rk|prlP;1U7U;WVnOY?cOG+$U^D4nPP*41_PxiON9$$aOjJbK z^X{_(^(HPtn8le6{b|mBi#5snSO3%_|A)0cAFX4=>OnmGBebSRYb21Nvt>BDzx6%# zB-TPCS`SaMZW1Aw1RL#%$2;xBH?)xVFCehQLZof~M~q8{{uJfE9`K(*ku--Vvqi34 zKFBkMP0`N<;x2*Myd@qVaMlj=U>~1sY;81NeUGl2U@esHjUd=^?b^psmacDrwqr5e z|A9@ULxQNNNr(O}6f^tDmQ9Q#Byf!XIj1$cC3Q5+wOWl?!#4!{x*=v<&V&VXA_ zn-2YP>i=@Uc^uZL>u@GA7SyU#chlqG!BF(&GVvkVH?FT4APw4)AnxOME9_}|9;Hxy ziyC2^WCX?er|S@9!&u%5{1gAji?HCf5NV5x=Pi{#o%|r} zf9ZF_SljrBK2|~)ovlP&pDCBmqP@^~d&2Qx8)0^wCL`hj0}g14R4jStb6xKL;EV(2 zVl-c)KKglBaqea>1JTKhH95YC3Bl#ReF$yCW}}af;JzekCqVZn!BuxY3TVb1Ey(~U zixUf_eT)}iU%`EwUx`R`Wc1cFsJd1Wo#G^P#R%EnGuvp_f_*Q_kWH05mx+9LjR$wHYW{qIwdVrYt{@_ z4wOER82Zj)MnKyLO8?&kf_5*&6=^WN#b?l#>c4Z#mJ`FWr0bapD44K?u)gB7;0D}B zxoWm|TbEpMwp@g>pY}0^rL10NfCU%ex>j*EUzn<#Q%$D@T{ojXHS{vA35zG(pf~@2 zsnU~aI_N(>g|pKl9v1$K5jk{sl!?nCptJOJru1Zz&tFq^I`qq?+34%Q$rh1CucZv& zFx6jO{pCz($VMLM8D5GrvviK7M-7#UvM0H(VN3ZzmGUV_mRxaP8qP{8*9&c2It@_00N z$Q)@YPcCulY1nQ1K0H1g3eq};Xo%(xy5XTTtz~6BdhdHr@@*Kzw2hIi9fv{^~je8;rhr^RMc@AWW z19&^+Vs!2FY*gO#AO|#0`(3ynj@H0wevY??Lw*YDK@>idMTOexexxaZkHK@ptb}8{ z;lX`Z8$)dee)ySWP7aCoRqi|uYarUKRFws}J;j|p0^qB#TJ8~b# zqpu>1#d+OQ8~@EX%0qcSGmOeIp|Z2>rbtNX*sByJ(BWQU<9|m?%!PB_wV{9;ZBlOU z5Xdt5y#`KctUWIh3a+s+(yZ6EaMIK1)c(ZMn0ep`wXMGE2ismhG2?q}dyOGIRB+pe z^N-g8u6XN6HkNmIV|r4F_}`Hb?f7O$T}p7!G6nw*mn`n zhMRR)WMUlmB7}{P6K)9tuy$#~Emz8P$9O5}J@->vrhKvRH}|w1e@HMWM@VAr{~Cz zwJk1@cOfE3pDL-L`cM4#6|r#a?0Zx<40`l@Spj#?_}m9uMqQflowyuTza9r$R#JGh z;&%_RF)P)!#+FU@k_<^7E~$ybe?vDjdN;#z(pBrnTZ>MZv}w|xzSQH4>45?zSIeKU zChrm$)g8VYV2J-y3{Rr}B>Xq!pwT^Wcw5(B+)wh)I{Bg=U`dY@5p1u&6o;hjdKB5< zJ+Yhgrl%(2yAhrO|8+U&db-e0b}zc(UPa+c>3x(QVNwnX@z;EEdRX!o89a#nXN&JT zIE+7u|MoI$Md}?3+W*_c_TQ-YmVe^Eg0mv-+2`F3M0H#>$yXfMv*jx}U{S6>7GQ7x z8SIOTe8?)_1;C_>Vb|3XqN7d}o)-UobI-pGInA@3L`yi}COx!*Trn*ha1~d}Eof^R zJ24=40doPmOTF&&`G3J}$Rp~f>lA>tCZaJLyvimFrKSENP4=&|u{l?D-Yf>~5AlD7 z8IZt{1^!!T(PZfZUvu3B+2mm+u-v=WpNunVqitkcaJ9u{+dBvIFM6*jsY##z=f|!8 zD8xb=`i7D2U5if6gm>M|gLl;)!M>9!5N^Ru2+yUH?y1cI|Kqnm0wE@?cq>E=`(6L; zE3ezWS@)_t|59+;u?rztMbEUo%*Ndmgd2>>17;QXIbX zk&(uwrh&gLo%wGj?Y~)A)M4UIXWZiPHkB~d@1=9AJ#9?fsbF|k;voF_&ez$E{;8~< z-b#qw9c#INK)-L8*7PT{O6S|`2AT7lkiC{*p#J-4{{{Dz80*iLbqC{ozOnw01^!d9 zx*;B>!s~cxBxn3Pv<%oe_&0eEp4FgTzrp`1yAbyhuj0#5=W*X-j8_)k8)5pLkhs@| z+9aHXUhFOY?&Xl(5CC<`+wQ*>{MYwi41U}HbHRV&VLaZZ5{A4_=77iXK$?7qBLdz( z>>PE*H+-YnyZT)dxNApvU)hjBqW|cfEO=Xm?&!d=9~f4Yw`*_~ubU|GJa!TfTz#I>yl0 zocNVN8{eU`L-*BrPzg|F%J|F9eX?DI@!*VFxgTJ+tM zwA&i`R`?3sp*V$YuYZmGs;t6&>+WiP(Y7Xj{->YT{Q1C8_UFJ@gZ?YgXwaL&e?-^IK_3yA#vHD<*`L?1+4@6wfRo-o*JODNEZv>Q z9Ra@NgP9YrYk8X$2B$IHkJ>No{`@fJe^sFPgd0@co17y5V|r=O2f-ZHGlIRaXxPo? zHGB9_;Ts?1IWhey<$jUXjn_2LIoHwY=9z;gZTdW##@y%Z9L9F|XK3bKux~E@_*T=Rf$q z6z$WDg8i+pvMWCRlwaeMcp33Do=L=iBdu5AJ3skw>+MZ=!zZZU!JE8a_$>3E#*Z{E z@)Y$OL2D!Rt=zij7U!8@ebCwDMu=?qy#I%qXacy(JX4E&5FJA7go%12?_J zZr!8s3yeC9e=9SEh{XIi6PbBGuHe_<-Er)hCGP(})BLCUzqB83AI9!(m-t|lgGn4I z@ZZec(&8S4ccLcK+X0EjU3vcFU8T3!pIUsp&}3W^M>_oXc|z}CzkV9W{oQ%~cWwjp z_8;}X=2dooRYTa?_9u`5#-21DwTwR#B;{T|e*i@hv|C95-{Vn!DQ)}Gz#~jP3p-`Y=&!-Qrm^JI$8&)qlt9s9#2SbV?3A{Jc8exGv z|C6pi=y%nl{cju29zp;6oWVEzTX@;l*!cdYHEVA4x!tCY54kt5T|1z)so^~#A34pu z#DA}l{W;CzCGUAH6r#RaQlZ=c0&gFegiUtM<)>u=uTfgA@CY zZ~gpAjP)n#y1QxUS{%mwuMT9o|4#1-M)%*Fn_gqLu31xku^X={+If$#rE3>0x(562 zk7NH`;keU;_}NvRk9~J~e@y8^q%%GLyLSM7i@l6Y{JpGyYqSZ??vd;lq@xq>?1adJ zL~iOgWBMl_RurpVGw2h&#qf1RvoM{q0ET7P+P! z|2yzH5aYK&LniF!y~KYz&W{II-}+U&1viGzLtBjYJp+BUNOX-Fa=_b~o^fo#O^hA8 z@>=!{??kp#*T1s8DV&7YqHLmYvGz)DvU^6e5y21c_&S(v--EEzl#)DpiT?&}bT;~z z&{Uv*sQ2>+U1Qmmm(7^f=PH6eX|vNmHrt_hK-OsGu7SI-w>uVeB)WEujuPn z0>`Idp(+{1-hz5H+?F{A{ArmU|*oR?*BEm?tQ`7hW=->VU?Zv_F=&MnC z5!2lj>vJmZ2at6G@3UvnU*eof`u$~+ZzPcn%=^aZEEvvGJ|)%HTm{^8eL5Sy zrWfaeG?`=1Le_{EP+eYG^k zi)rw`LwA?nBpuBr1WWI~4CoC@6W6gwPx;>NBA*$ZL;f3OY=&b1EZqelUes*ovytBT z7vo9S{!WaMeu??gR{gAFbiS0R9;X$q>+Yhzfj-?P|9EyS%DNwgi~4jTE(U($zZkC| zg3je$0lQ306wjSy{)>2cP~Ls8zk%H&lr5$af>UyCR3(13cR0HTeS?$whD^_9;M<5$ zUV?%12Cd!^>>f?#zXoz*yOr`IE_oUvjoTX#x@)xO3-Sc(1U( z1uY~=*J+U%21=6xJ7@pEJCeOh^Px0#na%U3(sYa`N3s{C^7U7sfLS)AEM?l_((%&$ zE7T@YzbAhGI*jg|Kc%z7I*^W^58$LWp3bF;_>1n2)akoKI5b{;+*5SUCAi;VKD{xn zpUuNM4b|;9ZGW_lr}NjCANa z(RywsCKUAiI|i#A|98XExTYc&Mt>F@gz)YC~YAKbi2J@~Emrb-e`kN?5vU zs@DvNT%|hID?IPAK^Qv*Iquxh*UPYGqqp%>n8))TdqDN;5_!=Bd` zoprCZJXOi~?7JZ|UjNbO)qp2gZD=|S5NV@1^+SP4pBoS;I{gN?Y0UuaH;tIq49u}Z zC^N#rvzNI0z{v(5yZaxg-SZXP#Wcf4gHWa|rf0mgCP3rB-ZT~-r~&V+K;6DGy36lG z`Bi7b;J~P0X=K@c5NUe=OOT@QqhihKP-*Eq=Tfo>-4}|c;(P`3( zdk>u=)S&wf8-q>UY~hE4*Fu}>_Y5m79C%DByvk)7xn=*iG%1jD z4e=0XzJ>1*Ik3!AwI{20OlCtqvZL`j+|4S^&oD!?pngb+!LCPy`?o7(N6U5D;8iYR z$e#9x@cx{*7IG*G!NeK;oPsx+2IZ1x*@o>YTlU4Us zWnauTe|id@zrGrG(+Ahu_-&!l7S~%|3r@hf)ZbinVNdZX*X7W=1rfYo&|Az+wOrh1 zey}gTv5+PC6yP0?r+VmZl2lmUQRgG{#)#{gEYaDg!L*irayr&B?C<7u@FEq?buW#j zEW8smm2m3QOv?ds!RCXPVcxz)WTkz~C&qQ#Z5s~xK>0!jB_U4~=^KDvPE)l$ME43f|MGvEY*c2D?wLgIQ zzo83GJhjwoTje+7u>KJUd7KX%HjL;+LRw2pj?)6}_Y(2iE)y-_d5@Qs9@mQ~AC^V? z8uyRB`@cNqiq7N_IBiB=!yD*1T=q((~v;Acq_% zy_y{v@;UCs1ef%$2jMNn$0#g^Mdm^G5e|eL4fkMg&e#)L5~~9|9Fp9j_NIY-1kF4e zS>`~nx#lwL5z+Y>)8K5`ba)1v0dPRyb91n%`jRXcp9j}V9PsVjaGDnMB+`kP29eVl zmrh3WyNjAPEI+N6(9RdzeGU|;p0?-1s;I8oX^)5Mg>)?d zv7;V;e0t8##HPiF&sbu)vEn*4=-r<{uBir3Oi%tM*qd-qK_TCacT-CW>KZ4WcIWp7 z@{>MeBIp%z<*M!9R=n=TrX->c^TV`-C-q|fPx5~zX(CIcSt~AMa0QG5%VgH-?&GyC+S^5x-W_D z=%l->`1}IyoqqJVIsg0Hd8h|RB^a0#L@KSUuc6X$qjdOr1xX0fLH z>3xUTomtU);c%yPu%sZ^KJ~=GcmHEUe*LH$H8$8#c{$c>cUk0PJL_VJOW!jNS^k@P zwxsem>VbYIzJ9lOaY04Zgm3+kUCr}4t7+5&KhBIP?$$XrxtPqig=g$V|4;INA$0&I z3h};wQ~q?1p8oC&y|=IwV}lt-uKZ;5HCLs3p7xizShG!CTwSLei#qU9 z*U5|&Da+re3+BDVk-79f*pYAZxhy|Vh*P_R&2_h9&6e)V?MX8Rg}t15foaR%tOsV!?ySpS68v?5RGAvn}Ri8jR>^x$C?~-%s*S=}m4u zLl)%ke1i=L;cXioUhD_Fh~WOGM-TV5KyEwmYxME8BJI8G9*Oe*mog4nkiQ4te<*B~ zzfpb|ya_Z{k-8}RO}k4lDq z{!pw3A!pP5=+{y`U!SrFvYe34p4;~n5*Lws`5R@M^#DBd5ibvwIv^da`h_a__ZWoe z|Jhx$wSexXXE?@yZ>9_*3-b5GZ~x<=VAcVO1W!MenydQkeIL@^jr~=>GaL8I#N$Oy z!XW$M0NhvQZ_sS12N)a7bAi`=r9CLQl^v}(TkK;f3(f{1eej>!|F=@cD+}L$7yW-S zR4hDIy^hx^1`X)d`>v$+#=CK!XlpX0`(T{NM_T_C^#;Yb&ZvjYC5yDz|8yMztp9XF z{+;jv@10V6{aroX76j_bf2;<5mirBXTyoxZ!oG(CY-13-6-sA;z6^VMSdHvU37ag) zKaKuB8A=vjhh^W^P+Q%PdZHd+y>hG#F$*rXxW3{waSW@PQ_=X%#4GOv_88t}e3;z0 z)%+h3EvyO%n|aKzEXY5b-#_rO;D|fTrV=f=GAh<3OkUW^7Q*|I)50HB<+Ri`W8slbG~21JK>;(9`J0eN))1iUI6Yh4b^np*Zh(_U`zv zD;AqHODzZP&UPJuj(urY2=ul1a7d+fh>M9AXy;!c{Y=u?m9ZB~Iy%BWT~tqF1>XI} zTlIJ|{pl@?9i`#T!-y*M31NgpO`jP58OWIbu`v$rsQf6K@-JcR2rVRg%yRms!>s?1 zyNq`H&%^_~!G1?z2J`V%=9})K-0gd|(f8Yt7X3q;_igrDmy4eSSoVGDn+*NmboYO= z-2caw1Z3qRnPsaE+>38Pl>*|MU~$Xsr9e~eR6dUT4#i)A{{?oTZyMV{a_0+79bLP; z6Z-i=Oh3@@};ntx8tqk(T*|f zYry*{*k5|bvcZ|iKTGq!r0i26EBa;+bNTB$2#2%-n6zCoWzNs8!A+L_DQqlX zggzc)u-JE)vMjnI|4j3W@=v1wk*NNs6@Hks|K>N3HQQ#)y!Cs~J>%FQ{|u)0$LW59 znaVC3`SS8lxeA+dryN+beNrFWy~(aYA74lFIqHYAA(Nhjk(Ym$^0&xcQ}|5eIJWIB z_7$wzuG0JXMdp0FPq+2)>XjjX8vo_{e_LG;9>)uZ!aK3n@_l^s{d|+yTYN#Zk0<_t zui27&bZ$>~H}p`Q%FEv-^Elp+FK{2V_1@8JAo_SI#WmY>`hp1U`RHqV*ayH^euKZb z-wwTPnV;J}#gISE|MTB}XW?T`H~v{tAQ0xoB7?N0AA6wK90wt-^C{o@#&vpRnH z2d*pcxo6z*{rgWiX2Ck&RYR_3{R0!(yLU!1592t@ZVTS{v#fBzK!5 zuxIA7#-HtZh+QB}V{2*eC!1?ZdHEBU6C22XsQYzxEy0S?%jp_w8lm+%_%xeI5dcd!w+->a9-EooBQS~lg?>>o!uOq!J26dqRr|4*wc`I zzW*1wZE?Su4f%7rX8|%pe_ro-i(OCs`<{J{7duq9I?4>m@&jDc{?-u^bz#4smz8^8 ze(9Ezz8M(9o>ga|Pr!IFRxdM}gXHCJ=d#t`&F?=#<2LH!A$Kh}kv#;t7i`?>zRl-N zte;Nu*FvGcTQTYIxjnLT{pR+&m)yzDm#46qd@1Sy>5X;V`IS<8L~U7K{vCWx;L7Ct zkIv)uJ{~-t#ztb_``AfKm5bWitorG~5`$TMBKh0Xwzf;3%$&FTrw9Mbet|Of(flN~ z2AOhOV8}l|{xjKcab)uS8+Ⓢ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 z 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 z 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 diff --git a/img/icons/png/1024x1024.png b/img/icons/png/1024x1024.png index 2b4e0d8344b8bcedb4f9d6cf58c2fc37bca67c3e..1e9a335e67fb5998f3573ea39b7b89da6830c991 100644 GIT binary patch literal 109348 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

    Gr4TI)R4}KLVMBT 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%0D<<{9*OCT@PJ;(~Eh!&P7EP;2 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 diff --git a/img/icons/png/128x128.png b/img/icons/png/128x128.png index 35b247a3fc08f672d5b995156462c5c46ca32ab7..f329308bdf61551b80a9ad8c3055650d6acc9d5b 100644 GIT binary patch literal 17388 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 z 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 diff --git a/img/icons/png/16x16.png b/img/icons/png/16x16.png index 8804297b9dff74c6c5c641cc6680cc90fe9ab196..c95e614d5347d735430b4c98def414fb7a9b34c2 100644 GIT binary patch literal 6260 zcmeHKc{o(<`yWERvb4OiC1WT>V-_>a43lMSBYV~?ndJ-zp~~dG7mj-}mSFJj>bT=3=iXuOSbC zKorRiHXh*r0?9Q`4!moRe4;=ga^x6KUx5cj2<7rP3}!e06-09ZC?H}oAP~{>3qF2@ zolvEz?mzi5+k7h{e096z_)}!d(u{%KaYgAT6qfkvIl`Z%#830H;$L+i%6YFtu0gGz z+AMBX5mX-8&?+p9dpTCoR=eYc`5YyfU3E9g?11w9di~hivU#l^eCmrltPt1b9NnX* z(|x?&cKWBmf(eE#1&BOYRPz1Y?$bM|8KZw+ZW90(VbRk>eO1!Q&WQ2a(|;OIwx4&s z6tck*-~Wc98~9FsU?it!%LBy~C8frOjzRHtvaDM<&orI%c8hKee;g=z4bPL2Sy^lU zezh3Yb&VBdGI?iEzopQZz8m`?_42{3n9=Zur*;9j^{o|_((oNP|3nXwd6@17v5Q3T#M}x&6m{!o{I2WH>f%v#PLHC?iKfw zxT$mJ_X8tA1!>RN;rdRIGQc*UncnItL3_4g#?JHRCDKM$T2(!yr_WVjkk;!`HA)f& z$EN+Sqtz5zY7!Nf_&;)YpK~MoFVp&zT~htKh>n3Ow`_a~5CxRlr8JzI%<;|uSfY-s zjEbc_rc7RLrOZ>QhUl(&yaigmnuB`J*9CIzQ_d$JwH>wFc5cft>B8&EL%E%@Ydodr zYFqErk^KXoem}xCC}mZ_Xuu-)$G zcP}X0PiL@|%8u9`vn_9)67&x2Oe0l6VbaRTDW-H?m%{mp_}7p0ny+8|bO2wJ_fdym zJ}fqSGI@3p%Q)&bSG@^+T)BgkOmeh|CbDiOq8<*|hIzOm=X`*uM9jBpR=0KQUueH5 zs%|}Nxww^CuSG6m+#c?ZoxADcZc^F4i6ouAg%uhjV!PguvYm+9@MFZSdL*-w8L8^V zt|G-k`@?Gc>;*w3yWNkCuf$QeiEWYEGVj?d-!ADx5+1cVCn;CF^lx~idD&Xv+0^B8 zCg%!2EuiL!mVY&tqQ|M7*Q&lzIy^SgZS2j>KG(TUXR}twg;8$|WZOX>a-aQ{naCcRPDU22$c${+8NbQtesrh@YcYK z_C+7MisCqmz7Mx1_0OB^Y`LDo7=F1T>63cS{kXd(8#iwa>OQiJRT|VhmGp5pa5~UX9wReYSs1$<2 zR$jJoSCTrf)`(*m8%f1xRH!RiCYs8Za?=UkQ5O4P%O>PUavIF;VP@QGHtc;ET+)*K%8gF9{DT0YEaVxac8 z#Aa8#9uDR8b}i0COzPiksNJ>A!bP(`UG2Tlus?rnj6WwXc069n`RRUR#Z%Bo=_YT! zqu=(%;_aPgPb)n5V&9ij_lc?_L%Fv7UcP~4qOcod>6i<(i&`MaNv;bf_MQ`HJhu7i6Eg)ZwI*YWZ$>?Z&GQv&K6S z3SGqqfP%)QR!jf#wO$0Hd%9bzFF9Vk@#G zXuXh`o6X&yh&tL)RbpY6P#bvEy{LbX*22z)%!Ish4Etah8Qishbp6`-+ETGCx2hu7 z?jPS$trh&1d{E&*+7u>f^D>de3C=_5tye7TvReH4+Gmt4v&tM_K<4hSJZah7yKHb^ z<6!?w<3}@b5Ql$w8NQ14&EQc(g9#ofe4U*LG!Dy%Lg!EcBN2-W$^rs0w-9kDv@k#b zr2-*LHW4;>tsDkr(upu1tTWP?O9Dcf4lz7nU5tw-EhdbHr^77P$eW7@AOH&xP@p1K zIGaxp5n;2q1n^nXjDSIBO$1>?n6I-Nl*HiyP>d1A2nn|pF{9A1HS$n%9-Tq(u(A6B z0lpDop#lMyfItX^LL;HE5r-FoK;iLt1QLxvqv4=6_)UMn(M;(w^+>_RT{= zK?sw@o%I6A{>f6nWPB&&tOyCS04Q!y$jj_nj+0bbOI}VRU0f&>xqJ#hlE<0p4hJ$fqtL6XrUB#2msFSFM|5o z&it3bqM*=tIu@LD7-Jj?jzQv4a6FcVg`1+WC>jNeMlmS=51r3p2!s?KU=;#Z3RVLO zXto;Y%2_H`{hW(16p-+Q1a*YO!ciDclnDW2N&q#1G$kOBFvORF5t3Q`wPJI`e{f5aR1vH7-3^3ble)mxS3u&hB~RjDLxoI1C{%Ks z^GQ%rg+QcfWE(3_TxwEUIj6}>ZAb3-=DP8<{-qa+E&mRc*{HKX&hAilfI%g+tkBb5 z)h~NWSvdFCw`vTkHY-{6}Z>#S0iZ%X0SK{$V0t?AR58NBg>gvh@a|r1_Qmzi#m;gq3NBk>5(i-m z5?XKN1+%X9f9R>pCzPlAFO&~9%{@3&wdrr7*}8766FO=sQk(Wt`<@2h+Llu_43a)Ws27| zV2uYdBUa0FZMm^!yXJtaokjeJ-_@D-BO5>5^6c0;DROoUQhgdH%!ztxnp04heWP{R c#G6l$nScDZcboik9@Hd+Z0llEU>%(Jf8hK24gdfE literal 847 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)TbHX z6XFU~@c;jRhJ~M*SAGF9fZ+R||LY$Aw%Gm6ZtwRkPyhV*3ljYM@BfAOf3JS{`|lr! zd++nVM_<7#5Dx{EUib;&v#t69G*e>3R|t3C%RlU^zA!BRl5_T__=c~HE51l>{91JW zXUo-JikrVOtoXvU`U~gkFRELfR0Nt?i(eI@Xep~MT#=7bY%gQec z@BQw(@vG|M&$mB84tVwBU*Wl*K#Q1Gewlga*Y;BRk9_A@^X2yEzbU7F2(J4oy8f&1y01U~{@?xLkI$j+ylcK_Z2k7> z_rE0%e%tQ-1`LOV_kX|n@o&we-wTf|0R|d_T1k)}C>9vl+?PH2_3P0xiHYytO%z|h zo^`^TrH_8CUk~C+urFKY&aSd!?Kz-A#w2fd7smfgy7zz_&H|6fVj%4S#%?FG?SPC& zo-U3d5|=~!uZJCS5NJ!Ex;3eDSx!zwKzLzKYN*iSW|j>KH>#iil|NLt^V9y>@8|sF zX6Tsn=C!E7`A?VGI4+v@}R zN{e3XRQN0McyaQgQ=X=)e+n^q8Lkpuow!Mgb-_PoR>irCJkNKW^X6=xaL_e4e%r0^ z>*h0AyYk+@6O@+=41eqG@a4-NA;o?Bj$RA-_2&D(z<+;!nVDVt`cG)ZCudo<7$1w^ zE1}0#F2~G0e)de+!I;E-$KSR0lMwFx^mZVxG z7o`Fz1|tI_16>1ST_cka14}C-11keFT?11q1A|YQE7egnoT7 M)78&qol`;+0OG^4vH$=8 diff --git a/img/icons/png/24x24.png b/img/icons/png/24x24.png index c24eb414069a04d7cbe22c9441cb050983a6d062..3aabc85b26407180e237fe6fd84411aa009c6945 100644 GIT binary patch literal 10881 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 VyLgsVJ8JF&R1`GiD`d@r{|7^v3N`=$ literal 1181 zcmZ`$3s96*6ut`r3kby{UT(HbJj0cr6+|{go&g~Xt~Ay-O)LwAIt_0s90L^7w7|$7 zwu>QUvkS}nO)`Lji-7_KNeGKTNDI^={EyxJcmKbOJ!WvmJNMr2o^!r)?sw1qIDsE! zW#M800I-UQju1d}+E`3uxZjiA`3b_7cS7Sr0ca?-)C*0Z&Bzu+g@M|;EEP1^qG&-J z0QnvO6cz)ZgRa6q0LVoESV{tb_cZ{H8IsO}dtu)7gae6@kU-P4Ya?bXL*e0{LFnna zd2-K>`2H@U{h?lG_%A@y28#Y!ZJ1btxM}>Ur5@=vd^0GuNIVhT#C*aSRsUPvz7CVm zkx+(-4E688|EE2~sU2-NkfJaI=U-YXvYP;swPQmXhdRtiiWiV|NpD$=npL4FNk{b%l4){TLw!D}gMHw3;IkO@J5D*(W8aPy5b*zk za|HZD5P@mXImHS|t|%D3D4}7V5&cFs#OTNCmD|UIA>m9+L};Sd@SA03hi@SE zXY5R-+F$arV5YVc%FKZCzt%h`mcrwSdFrOe^R*}V@%PDcw?OqiAZ3rG<=T99aMZ7X zS7RDh!MvrKx3k^mB2LJT6=Yox=DS{u^=oczv1E$ea&q#wdb2K_6dgMp=zut=UPMv+ znzM7!$R*|eo|WFKLhZgXVdY{-Q~z?f6ZT2Tr|}2)!eWzxp5%`Tn{3toVY`|_!vX@; z;c2cRa@IhzAG>6yZA`Cw5#xwQy`A|EpQO~+jQXrK1xazHdou7G!)P^OU`WwA#i^u=~ diff --git a/img/icons/png/256x256.png b/img/icons/png/256x256.png index 5b1df7a885f2f0cf57738f0d2d6828d2d04a6d15..3d9fc7f8a8d9540b2f48f08c5e66b1700a06dda2 100644 GIT binary patch literal 27944 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 Z0S=}{#iD@;K2X#S$h>|31|eza_dm2}#Nz+} literal 15645 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 HZPfn(&EM9K diff --git a/img/icons/png/32x32.png b/img/icons/png/32x32.png index f97882fd32c898bbf4927daff60576cc94205fc8..1dd35f0705bc5ed323ec8e4c22b8c116f32e2dca 100644 GIT binary patch literal 8631 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 literal 1500 zcmaJ<3s4hB7~UiVArS#3ZBRgs7LsihwBEq7wu`v?xV%20B%UAQhiT ztyXY~RWU)z%YcAXp^hay3MvwcfR9RrP~@R^ms~En>qTdr>a^Y2{lESG{r}x>cmE^d zVIelG*(?BnO{g>|lEQiBVa1?q(B-^eDX>TsuN4DOb&_q2Wm25BH!>s;ly^F5&5?1^ z$h81u@Bzro2EahMGDiT|2LUiD13+{RfR9s(8X{H#KwlTWCMuW;AW8D-GaQ_pidE|w zN|>R1MS0#eoslemjxTFK#kX_~!$yPY-HLf)B1qyr$A{$qS3ivYHxA?E(t7j-O1#kq zPb-DrM!lt!eM?h2F>sXt&ZR40ehre>YZ%rMV;FI^-{4b+S}5V=4JftGlz~8uWW{ql@Rp8J0u-?I zHF!<4u7234H<2x4rs%tRn=;s{6rNd*#I@=t4aBNOloG})g-f2|7Y1?PdNllwPH!Y% zVgz+B&ssFU&oHVdhEO7>$FM+!1mD)7M$)koNxzQ`yrv$Q?3pwrcVM&15y@@c{w|Cl zNa`14YQ4PMu&V>h>NaF{V>{dR!Uk0Jr;+-v*EpeghI`bawm-pJTJ-8MlaU~AYmJe2 zbnG%%P>0U0MD}%I4<<}W?Rtj_nSuh zhFg+CGl}Dqnnk|fKE`p!!z0Z^Q$Vl3M#H^D%MlLK3r_O~`ga(VlX&UQrJ7!UqRBT` ztIc&hGdOrg$goK48Bbhfam>ZdT+Os?pN0g{NV?Z!idd&eH}9oT`esO4cde$%dVXk- zIBI!&oGgbI9spCUDN`-2*#hQIXzWp0*Z+TOu}Y-e6PZUfEc(akI4| zGa^{1DtEc;FKW10PD9UQl@C_V^r9`;z8+p@-&hl`(k#X%yMyYyqkL`x& zxcGbbrsue+&qGTbSp2n}ayP4<2eNybEcbIWS<}|XveIfCVK|mm5*txm(IT_UTPIe~ z4)G2!^QIq8VRqZI5}G(%0k_#9sIy2ohqo$myit0N{&luop~l!BdD9JFPMy9|T$$|# z$v0J%InAWCM`xGC)QH$lq=*{izA>E6b)q_(L~u_lP^dp zsf_pX$qg1?u4m3#8E4fhz2sS`s!m7{w`KU%Dp+G<&YSwe1r_Hn71*zNtnRzpbDXp4 z;7xW$N_vL&udmWm({cSTS7-^#gr*Cst%X$8EKCdDlolVGwp|pLx}5?bfCP{iwA4%B v8wITp2_O;V=LHEx5cDcZx#+!wz6Mk diff --git a/img/icons/png/48x48.png b/img/icons/png/48x48.png index 16683dafe940fc8587c13ce3705df114afc295b6..04af51afd3a7137323c791ee6acf51021b07e180 100644 GIT binary patch literal 11915 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 KMNUMnLSTa14)(eL diff --git a/img/icons/png/512x512.png b/img/icons/png/512x512.png index 548576f4311f5a6a294882e9826f46ee54813a2f..ac3e6c6f8c9b78e6a447604e7b5932ca8a405425 100644 GIT binary patch literal 50738 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 PEI{G4s%(X{$>;w8$owrN literal 44130 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

    jS!&zD4W~R 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 Ad;kCd diff --git a/img/icons/png/64x64.png b/img/icons/png/64x64.png index 5bcfd37e92d9f795e871d60b93273ff430b4b3bf..c402938053e9cc41730184b7bdcb57179f5c0e76 100644 GIT binary patch literal 12351 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 delta 2885 zcmV-L3%c~bV9OSeBYyw{XF*Lt006O%3;baP00001b5ch_0Itp)=>Px#AY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^ z000SaNLh0L002k;002k;M#*bF000U=Nkl9^=iGaDlaPlA36K~WkJ{=VMfmw*U&8b zqyY+mnZSHt7BCGc0W8OZ`VNnW8f>0zb!qQc2w+OK;L@okODaujawR@b8`$HE@o(To zpdRQ12uqB#tpsZOlfXj%GXuySC;qh$_+kX!zggE$cPk|Irne zlhW*AuI&fj0iO0hErif2QocJ-;}yV_z@_NgmceqndKGJ099A|tychEZ$R>iPAR=K_ zk>rMIiv?u{1=g^_9WhF|ffI+?irI?iTV0lKwRwH7N56My z;)#UFGk@U=6Af;vwm7rIAj=r;3h*BAYhWEIc8yV$4v;?`xD%KMM1p1dTzIw3<^C-; z8$NQ0IbftvISNn;N}_^=lMSw~vN-uTnaEZ@umQLWcyqKOBwf-c9|bN0egKpQ|92H^ z+UN0LgU!=BTz2;j?&qmO`Ck>|1Xq-sTv={Wo_{M6*=+{y1|A3ck`>{wr2@5{4}1^! zI*=1|u(?~Yy2)l$vqMw2f)I!gg{Qz2P*)(izRG0b6qAzZu%{dV?gf4f#F7zV#1aAW zCBRRBs{k{8v8_+>^mc~_8yw#4^l()2{X88ZvLu{YVsKNn$-GG>x#plE4)8GWU7!s{ z?tc==2v7q22Dl_%zT1HfyBzM{>hO;?mtHsX#0U9>9v=!USWs$mL$%4Q@dlBD^N$Ct zMGw$>QWC%?p9d@ht^%xA_t6SbmL<4ks>wB#Cbju8UKt+n zdtfOebccjjeex0X$hs6T-;a4b*x;~sn}0)VZ~6nAry$$VgXd_b$i)6?U#8^=uCB1S zqI_T>b9#~F+DeO#e#Od0 zhs|9hFOrhAZ3?*KM2kD756sT{fv*9pVfc73X!r<_pXsYME^fHPRwz<;Fi!5o{C|VX z-LhR4XRl zPbX&!7W@6QCU2mhA_W|uFZoejgbO}lu)M+HxmK6G{iz8d68l=^bGj0U1^*ZjAW-{@ zfOAshJB)atB{;v#;Kpi;(~2aPOn+S7l5j?`!HhzKi#~Gs-4>g_?Q!V|Z-zP7=e8o) z3Wm0TO7zqb8J+FHh!1dQm*}vy<3)L`>gM<{EIh|le1 z{0-EA0D;=S9GITYQ>1`Xj+5L_WpUwTgYnVSye^6euB|kgH__m+W`~EHZGXMWOb^q2 zjz5gIf?$IzM{j9UhNqw`D!6xMl}w8HkGl6iOgFOefp>;l*7JopuPTb|0-h zikEijt#QaY$ZD7Kdg(ymkbFEj=c%514qklAiKCO~ENC^sVpg z^H{pEpY=OjZmc$$Uux3pDxTctu%gjnQ>TY}1j1_pbeQP#u@MhKA`(7RVz6dbP=t3J%FM$Sh($T0eDNFE;8jGjqM!Ee2 zi>Wy}%yks$@P7f&DABXPKU1-wBeIga>LRS0lf~5)CPh~GLMSrQ!d?Sn@iV~}7!orZ z4NL)_9xu6fW|T)~MOjd4kS)`9I!=6iL@;N(Br4Oh7eLJCJa8zw5uJpX7P1XEugqZ8 z>?rrmj551OVvw2;o`P%%3rY=E&x-Qx+6Yk@TFcr9ynh`Opc9>a8H)YFh+s*D$=bPD z++7#p_&og>m4tOqfq_nz{Ozex9-SR!eyKrriW{l~P{4Zp7H!;CB8w}REc#pu-b zP!W-ER*AtWg$6I}GjEsQ3>ZxGP$wZWOnhOOs`DfUEr}e=K%o%Xhx^R-A9@^ z0*6Ab2@9u~oH@bZxer|mESO(vkQ-9ua|HDJ+<%&b7Y76gw1RcOmw+#4(whlU!8Mgh zW=({H7l0?@T;oX8;9}^U+lC|QU53%%a~ihR86-eJnR@?*?y>ef1azbG9qWg194^3+ z0&9R@p?6J3D{P;`+C=0N3J@sR58MN+M5mn|ZHTAJ{)|Ipi5^mbfCyc{_t6R-MH@Y( z(0?uX4q*RC$-F16Nnx8+;%u&>V~weIqb#LzjnH#1~0@i9RYa5I8C9YM@loSW25NiRHo z5&D2f&?%>XLJyQ05UK#FfA}M zEiyDzFgZFhFgh?cEig4YFfj6IsXiwF001R)MObuXVRU6WZEs|0W_bWIFfuSLFf%PO jG*mD-Ix;XiFg7hPH99abgESGF00000NkvXXu0mjfYF19^ diff --git a/img/icons/png/96x96.png b/img/icons/png/96x96.png index bb882a0edb57e25e6089572d7ec342612ad7080c..275ac8b320f950013775f18bc8d0d0d8420e8572 100644 GIT binary patch literal 17240 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 Ap#T5? literal 4318 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 GG5-T_$=}=n diff --git a/img/icons/png/tray/tray.png b/img/icons/png/tray/tray.png index 8804297b9dff74c6c5c641cc6680cc90fe9ab196..c95e614d5347d735430b4c98def414fb7a9b34c2 100644 GIT binary patch literal 6260 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 literal 847 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)TbHX z6XFU~@c;jRhJ~M*SAGF9fZ+R||LY$Aw%Gm6ZtwRkPyhV*3ljYM@BfAOf3JS{`|lr! zd++nVM_<7#5Dx{EUib;&v#t69G*e>3R|t3C%RlU^zA!BRl5_T__=c~HE51l>{91JW zXUo-JikrVOtoXvU`U~gkFRELfR0Nt?i(eI@Xep~MT#=7bY%gQec z@BQw(@vG|M&$mB84tVwBU*Wl*K#Q1Gewlga*Y;BRk9_A@^X2yEzbU7F2(J4oy8f&1y01U~{@?xLkI$j+ylcK_Z2k7> z_rE0%e%tQ-1`LOV_kX|n@o&we-wTf|0R|d_T1k)}C>9vl+?PH2_3P0xiHYytO%z|h zo^`^TrH_8CUk~C+urFKY&aSd!?Kz-A#w2fd7smfgy7zz_&H|6fVj%4S#%?FG?SPC& zo-U3d5|=~!uZJCS5NJ!Ex;3eDSx!zwKzLzKYN*iSW|j>KH>#iil|NLt^V9y>@8|sF zX6Tsn=C!E7`A?VGI4+v@}R zN{e3XRQN0McyaQgQ=X=)e+n^q8Lkpuow!Mgb-_PoR>irCJkNKW^X6=xaL_e4e%r0^ z>*h0AyYk+@6O@+=41eqG@a4-NA;o?Bj$RA-_2&D(z<+;!nVDVt`cG)ZCudo<7$1w^ zE1}0#F2~G0e)de+!I;E-$KSR0lMwFx^mZVxG z7o`Fz1|tI_16>1ST_cka14}C-11keFT?11q1A|YQE7egnoT7 M)78&qol`;+0OG^4vH$=8 diff --git a/img/icons/png/tray/tray@1.5x.png b/img/icons/png/tray/tray@1.5x.png index c24eb414069a04d7cbe22c9441cb050983a6d062..3aabc85b26407180e237fe6fd84411aa009c6945 100644 GIT binary patch literal 10881 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 VyLgsVJ8JF&R1`GiD`d@r{|7^v3N`=$ literal 1181 zcmZ`$3s96*6ut`r3kby{UT(HbJj0cr6+|{go&g~Xt~Ay-O)LwAIt_0s90L^7w7|$7 zwu>QUvkS}nO)`Lji-7_KNeGKTNDI^={EyxJcmKbOJ!WvmJNMr2o^!r)?sw1qIDsE! zW#M800I-UQju1d}+E`3uxZjiA`3b_7cS7Sr0ca?-)C*0Z&Bzu+g@M|;EEP1^qG&-J z0QnvO6cz)ZgRa6q0LVoESV{tb_cZ{H8IsO}dtu)7gae6@kU-P4Ya?bXL*e0{LFnna zd2-K>`2H@U{h?lG_%A@y28#Y!ZJ1btxM}>Ur5@=vd^0GuNIVhT#C*aSRsUPvz7CVm zkx+(-4E688|EE2~sU2-NkfJaI=U-YXvYP;swPQmXhdRtiiWiV|NpD$=npL4FNk{b%l4){TLw!D}gMHw3;IkO@J5D*(W8aPy5b*zk za|HZD5P@mXImHS|t|%D3D4}7V5&cFs#OTNCmD|UIA>m9+L};Sd@SA03hi@SE zXY5R-+F$arV5YVc%FKZCzt%h`mcrwSdFrOe^R*}V@%PDcw?OqiAZ3rG<=T99aMZ7X zS7RDh!MvrKx3k^mB2LJT6=Yox=DS{u^=oczv1E$ea&q#wdb2K_6dgMp=zut=UPMv+ znzM7!$R*|eo|WFKLhZgXVdY{-Q~z?f6ZT2Tr|}2)!eWzxp5%`Tn{3toVY`|_!vX@; z;c2cRa@IhzAG>6yZA`Cw5#xwQy`A|EpQO~+jQXrK1xazHdou7G!)P^OU`WwA#i^u=~ diff --git a/img/icons/png/tray/tray@2x.png b/img/icons/png/tray/tray@2x.png index f97882fd32c898bbf4927daff60576cc94205fc8..1dd35f0705bc5ed323ec8e4c22b8c116f32e2dca 100644 GIT binary patch literal 8631 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 literal 1500 zcmaJ<3s4hB7~UiVArS#3ZBRgs7LsihwBEq7wu`v?xV%20B%UAQhiT ztyXY~RWU)z%YcAXp^hay3MvwcfR9RrP~@R^ms~En>qTdr>a^Y2{lESG{r}x>cmE^d zVIelG*(?BnO{g>|lEQiBVa1?q(B-^eDX>TsuN4DOb&_q2Wm25BH!>s;ly^F5&5?1^ z$h81u@Bzro2EahMGDiT|2LUiD13+{RfR9s(8X{H#KwlTWCMuW;AW8D-GaQ_pidE|w zN|>R1MS0#eoslemjxTFK#kX_~!$yPY-HLf)B1qyr$A{$qS3ivYHxA?E(t7j-O1#kq zPb-DrM!lt!eM?h2F>sXt&ZR40ehre>YZ%rMV;FI^-{4b+S}5V=4JftGlz~8uWW{ql@Rp8J0u-?I zHF!<4u7234H<2x4rs%tRn=;s{6rNd*#I@=t4aBNOloG})g-f2|7Y1?PdNllwPH!Y% zVgz+B&ssFU&oHVdhEO7>$FM+!1mD)7M$)koNxzQ`yrv$Q?3pwrcVM&15y@@c{w|Cl zNa`14YQ4PMu&V>h>NaF{V>{dR!Uk0Jr;+-v*EpeghI`bawm-pJTJ-8MlaU~AYmJe2 zbnG%%P>0U0MD}%I4<<}W?Rtj_nSuh zhFg+CGl}Dqnnk|fKE`p!!z0Z^Q$Vl3M#H^D%MlLK3r_O~`ga(VlX&UQrJ7!UqRBT` ztIc&hGdOrg$goK48Bbhfam>ZdT+Os?pN0g{NV?Z!idd&eH}9oT`esO4cde$%dVXk- zIBI!&oGgbI9spCUDN`-2*#hQIXzWp0*Z+TOu}Y-e6PZUfEc(akI4| zGa^{1DtEc;FKW10PD9UQl@C_V^r9`;z8+p@-&hl`(k#X%yMyYyqkL`x& zxcGbbrsue+&qGTbSp2n}ayP4<2eNybEcbIWS<}|XveIfCVK|mm5*txm(IT_UTPIe~ z4)G2!^QIq8VRqZI5}G(%0k_#9sIy2ohqo$myit0N{&luop~l!BdD9JFPMy9|T$$|# z$v0J%InAWCM`xGC)QH$lq=*{izA>E6b)q_(L~u_lP^dp zsf_pX$qg1?u4m3#8E4fhz2sS`s!m7{w`KU%Dp+G<&YSwe1r_Hn71*zNtnRzpbDXp4 z;7xW$N_vL&udmWm({cSTS7-^#gr*Cst%X$8EKCdDlolVGwp|pLx}5?bfCP{iwA4%B v8wITp2_O;V=LHEx5cDcZx#+!wz6Mk diff --git a/img/icons/png/tray/tray@3x.png b/img/icons/png/tray/tray@3x.png index 16683dafe940fc8587c13ce3705df114afc295b6..04af51afd3a7137323c791ee6acf51021b07e180 100644 GIT binary patch literal 11915 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 KMNUMnLSTa14)(eL diff --git a/img/icons/png/tray/tray@4x.png b/img/icons/png/tray/tray@4x.png index 5bcfd37e92d9f795e871d60b93273ff430b4b3bf..c402938053e9cc41730184b7bdcb57179f5c0e76 100644 GIT binary patch literal 12351 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 delta 2885 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 diff --git a/img/icons/qortal-ui-1275x1275.png b/img/icons/qortal-ui-1275x1275.png new file mode 100644 index 0000000000000000000000000000000000000000..17aab27091c2d447e80fc6fbe70b4a67ecf10e94 GIT binary patch literal 91215 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≶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

    K_yO16k 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 PEI{G4s%(X{$>;w8$owrN literal 44130 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

    jS!&zD4W~R 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 Ad;kCd diff --git a/img/qortal-ui.png b/img/qortal-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..17aab27091c2d447e80fc6fbe70b4a67ecf10e94 GIT binary patch literal 91215 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≶lJ&mM5=e8cGl|@q9nswrphA-@u7e{|SktQb6+h=(`r@o7l9_I+IE)mq zhbjjUYiA4FM)P3N4CCC>Z_UAz2gQw*?o!TIVug>%<}`Gf7NtpUrGpx#&p z$P#izy}<9mVUAD-He9Kx&A!CJ7YIgg16l$osQ7D-$IX7@*u|U0>E>RijY0~W@B?9_ zL#~|hWq(pb4qv;dQ!cCpO);1eMzk_H)LpWY{=UKpouRr(0q>P5DswyaG#S%Qk+!JE z3G*c_mKH#?nqY|eUy@ye$48V92jBI)^sqJ8P1c>*-2fY;8Q$=3$s>F8#%0EMqM{Aj z$trB8IcBJ@_rY_*flp#&e9uX?S-IFjKYF!hXP{&=QaKlRey9hIeOsydC>Xj&ZmWun zHkP{oE!}YP-aD*!Ba&GYJFQzcHnRi&y+u)%Sy3O~#| z^?`Naz$a4tqFuwa4u7MoToE4s>(Rw7(gboa%e?f^L|=cW@XzDvF_N*--wi=c6Heqa z6#?4{d|N}=XDw4e&uRqkhMp0MZveWQKAAy~vx+ngR5CnC^zq+-l(1Q6PGH?^8SWJ! z|4+@7Xu58W+E-|BmlT!$nrjn9En&GQosb^@iBFE|VWTS2(P~}SXa&Z%Q4p{a3$prx z+xpC7Qc@mN1UZfh!b)zFOV>Q%6c620D%y#(IC}nsnv)K6F7F~9!EGw4Wkp!cfP?upm91`2ZM4t6b>y!11ES zau~k?nW@0@A{(F)%i28W)uk3ut%ilQcmFh%{vJDQhN$KeaJkcY#T~m%YDrz&XMwI7 zSlCbB@lv&SFz?2#p(^^lvk%5q_nez!VFyf?O%TKSeGngn;PH+hg-r7mR_fN?*|yuB zBJ&dfSfoUgp@^>q8UJ+EBUCNQN2tqBmiTSOm0_CGzm_GF)?T7=){o-;5&U}4jYN1< z=gR=IfQKzV`sjc$pi);)dzxy<=Q`-RYEJS-M>Z$b`_E{c97i^1bWDu|x#l+?U$W&h z$_*D(BAMXvOwgO=yQEpSRI@eo?oIORXTD$7Y8xc?dfU5UAkIq4Mp{a?qH5BVasDYY z71a)>y-8=d1H6UrU_{4zG#LPGfZ4wdNd}Ia{_UNBzf=pvkv~CVE^uq`QN(O4tKcVT z-9C$Qn$ShZNcfIo+%#jU95VRpDP*W8CVR662*Lk>4VK-eB52AgVuzPT`3?U!6=M|d zX~3TX$2VVBsSO8HqrmntM|uesEw6j`X>X4CYz)~-vRyi1yY9tQi`Gyqo*91?3IM~{ z3ak>eh@Dq81-amtY2sQ%ukOYv8ebT*mLr0#9vq-vAQiFj4+M!IYLXYtN&69hyyC?5h|w7nKQw(AqCuC-IawXJtq1nlWUm8@v&W9ZJs~Zq;C1f6EWQzMxWEfOOQ*28LF?fEpSHSJ zY=yep6hOT&j&b0ThQ>$)wE5eMOjB&N`%-V1-UIgLl+m=I57zv_CC0>;-AUGCU~fki z$zyZM{8;INR_>h>r<|LnS+TpN#pBrUgrPZWxADUgx4xx>ipZN_n)i;Rf%Z`3^;S`~ z)_h|r@_%;$78o(3s5+^;!1Qz@KQY3V)3$O(lIaw?Aa1frR>rbwSWOn94F}1 z4!?qLx==kJzLVQrvv=t*iN zSAIuhnr^aRmr70wh8YE{ZwOIkOz_tr^B*dZZ)of9jeZAsLEgLZLmn7Gv!Rbeox-31 zC+L`8{f(Az`S~QTWgZwHJHQ2kh4BJ|DDlZUt)=_#q$@s$&mVxPlna~d%PL8?vW**S zJ0BiwetVY-toA34cRjby1u=3|<8^PF8gvHMQ4)tcc{>WzrUTHRhQD`NHk0}6EU@@i zKZEU?*N1xf7$5F!Qk;a_7=%VE#`9?a%ChSo3D|o;A%VRgB&B)t%L*6rB{2#<=y_mx z-R-mI`%_yH6sj<&O#L0NWr+Z7{r9WL^pC@4U@{Gb&&|_$o&y`&T-8rt$^`5~A<_Nw4UxpC|M(`&z zohTs`od5q`wjt)*7G|^FrWR1p)p-6})>*uP)qqOK*`{8Cw$Slia{DGm3Uk>@_Z7Nx zEU8@Z8f#nCYR=-MfTR>qzs!c?NrkL?S62GlwJ59xpX>&WJ-eUjF;g^16MxO&Q~>*t zCv|ZtoDV0L10h5hg^LIi0uP)PZeFc+Qf1~&#VfE(p~7l~=n{CG3bX}rKUm3Y>uf7^{YlDK!OuNc z_Se@gxIayOj}o9M1(;Ryqz)|`-0~F14)i*kbD4_zZjqf_lu2A}d4`ry@mJv<7W3+P zb)YL*op^hZGHp@}fIv&wJnWPR#4f|BFr*jU$&>E- zv3Fw?8_eA$(#8$B&s$|YyFWf~GzM)UKl5dizhu}Qe7LkeL=fPNd6FW2JUh{@rL7NvgDHvC?^3wdZhwD9;x{z@^_71s3n zTj-LbFveEmua{{xR70}@`hIHU!KQe(=bc&4uIiDvTU7dX@?36?|}Mx1=QDu zyv*e9@y)LVicWKkCzXLV_EDYUm|zSj#=@{CeH$&x&pDyq$poLS<9VJ!Y*ZcZJwv) z-pBV5^NN3&1F$ma#DnT* zgng*3OB)y2KvBctN0yPRtyu#2(<*+0Q76lalLy%$&lyH->!DriqeYWg(N9tt=L-~N81ivC45DpY5+X9Pn zWS(YA@NQ?}OO6|_cjH6?r7e@9a3m2hOVR_dnug3@xjCV&MO7~7bZVAV+#p~&hg~7W z|AvI%>9^S4I!qf(1C>!U9n3~{+SMd>&ZbGp{ws6dm(LLAPPL$ zaxkX7hg!*pxXM&+8AFQbd!{~;$Yt>)_c;_se}&aRnN6Kwi=%Hx;Br1J*wu2 z9RvbVt4C(#wq25UCy@2Jv}u;>pomha$~RS#>yHM>w&wUyOR+&J+WALMlb45^1X<(d zzW1`2i8TM`*ygB%G32!**Prz9uL(vVWs}Ev@7OQb%~|;DlrU!J{{5L#v)+zNc{0wo zBmWD2W8h(I;b;o74bWsT7inq<3kY2Yu8$2?08Ju?8qh_tAA9!DY8O8=ppDl4A*F;1 zO8q4G5R!S}jzHzwG~-kD1~9)sBt-fgM0I{+$^1XPWrI5BW8PGtZD4qHP^Zy${FA7T zeKgVy`{M)1_}MUB%&5~;9Vcsd3>tmmB`F8d9B}kiG0`CRvcn|3(`Dp=<9+IwEShO3G_s(*$|mWsbVmuoj;x-tKoiuTgV`(Q3`poI|#Eq1rk7RDYKkCa6TAf z%!{>fPx#~oa2NSk5LU6xqTn~1-)%?qmXgSf&Q=g(N$aSu#`FDQ#I+2(dDkNIb1fdo zEOXa00WduFZ@X)B1Plxk@WRgfWoUP3xVPRh}R{l&8%G_txlm}c@5neGME;G&_}yw9R?8~ z5Z~GREuIa<7P&L*b=Ab=Gkb_}M~Auklg{TN#L1pRd(p$uRObAsyb)SVc33M^aa3#xJ8s5 zn-nI?zdC)rFoY?(XUu@|gkg<{qCc^O_&t=nZ-Yg=q&u-JwHfD)E5`I-TmhfcPy}XZ z{5L{>lBm{ww-5oAlJHL!Zb?i{FVF0BUR8U=)H|t8d9COrm~oF$DX@KeEiYeBGIhH> zMg=^5LB!m(t|z<@hcStyHAp*5147vQtiW5&-OMv{ZT<4UzG*OSqb)(r9ahC-2D<59GK^xz< zBHTD!Ay2r2S#mG1psDI~^uc@PXynniIM)6f&Gmx+1p@H14RA*dlmtiNAzQ98E1zM0wS+O`IvujaCDYkX_R;j_KqaQsh8K6 zv2u-ga!hvUEkc447R1obt|9I?xjyGaJA>ZR6oAu03GvLY4j7_Juo-=^(^M;Rqz703 z-NXZ`0xETw5!9B4w*n1TCLCnMKIw~vcG2zR{T@ltj!NtGhQC}1X!nSDPC1Q zx7Y+odA%0H&hxX0l(Z@iy831^^WRypHn7PsyL^Jj_i40QA#JqnGr-tU>tCTrNKXZ@ zRSG4g_N~ry27eA0HQH{kpso(D7v7*~sk-BwCBM-MJ0V(wdG)kufjtrdZ*D(!Jn?pH zdsi7)nX}}Nn=Xl=T$}wYCi>0rzMYDP!<&%!Pn=Y5d;VKKa#oA(nMY^*0&G!_| zkW%8O32;FF1Hn+Mf*^TPZq*;S(i_c*Cn|kvNMKjnuYByIEq&NW4j$_Q{)7;@9aM>g zglHB9mWhz*&#*idPDf2DsVfb)>P3l6X^<88Mhe3GTy1IOY!zwDtSULsj-pxH0&Cwnnyt;Q5NL|wJ8a2(z%^XB4r_S6{D~Ws#jp3|?osU&k(^1WN5VZFdiHujy4eyK zMYGJM)E{;cx%zE{A%z>45&0dMTKXg<>H*ja>Y7z=#wUVrL`m?NSQ7g|K9=zkr8MK& z#HW`@xx_O_H-2GB_l>S889ipi>Eq*Qp zZiBA^NNKxkY*g~ZCq)C^;?AFOzEjIF?5#~frZA=vw}S7&sW(;@ZiUhB@cx@x!2Wmp zh)|vMhj4ekuHABUCqp4Xt-89;SS;q>76ySr(5(H!DnUhVw~doYou4!H^J5JX1ux2LN456#k9H`&3G zC$ACR0dW?&ZGkJj(}%8;C&aJ_ils_+6MDlv@7AL{L;Uorg=I#WAKM{SB{e}}<=d`5 zNObf*?9K`oF`cnHlq?`NTYzrwx7?h5Cg}iB;wqg>R0`1(uoDv~q}koL2*4W;a|8R5 zg+R&I-P{ZX51i2u##d2kE}l1RP%&XaGpCRR4zKEUwdRAr1r%HJQNXG(8)T&pHRRJR zduEB09G(B0P!uE}3PPbjl9Gh1DKBO9X4Y}$U&T>Vu%Ah zBgfd%R!9*E7SU)e?bXrq7-Nh&a3F+&^O6}U8%=jK+F6s(SDCzl(wcjW;*TKsR)wKh zmQ70h5Axm0*we;^L06!#^!QvU%~raKhOH+J9d6dBfe^g-L%~MeLDd2lG&&a|fh8jO z?uGZ!w=9>9IY+ ze1S%zm-E9aU{3700<@Ny*X|lcfbMnM5}!T3rzBrJ@tx{=9rG9>f(<;BM>vQSP}{B& z)y`a|{JwXg^CacS?}=y)IM~fW=zLb14Jt@;*|{`=s(Wrz{9t&f4M3t1Z=}(`%*skQ0~f*>6tBGjGtB0+O;!T8 z&w~2bj10|1cRRZJ?LGG4R7yys-ni#J1U8_uFvWn;7QQ3T1~)-=Uu|c~gxm`-JjBA7 zv!B1-nXUJ<(;d&ru?6Xpll^+dUteg|BT^*jYcX44g3n`G+u~ntw9*m|Arfi?{SF2^ zh_AV-Et5dnS!aXAz|1sTptpfV1|BTPeev?(Y_A;0T;InP>^@Tj4&WH}9R>>%Cj!g) z@JTP;lPxD_oB-{)glX29{QR>(stK?U7(p2uWS?65l9j!wKDS6gedk1q_jLxPnKKGU z>Iv2{0ITESq>*lRiAM~7B6Q35f2gsF^lSDgCzVA}@oHP1g2g$WYziFtRfmML)6a~( zW`!!9BQc_kH}nkydA9*Eo;w z)jF7NO#*K|ib$bL9MH%bzs))F05VQw(s^$ z&JeAUCntvs$`GJ!BasJdf&<<4If~5`+9H1s@pvq*ZJXKd6g=20ck{ysC)nW=6iu|@ z?}q}z0it2gsTe+RU8W&=Cv=~8wd)b$3IzX#fn6Ea9 zCf*r0^Db+}&ox5_xQ*s~_;l!I79tv(6iGtq*PJMh1-N;YLuNF4iXg=@RgX3D>p zj&9`WM14P#dl-)Bh80n{)S$ak!f$cH;X^+p7d{VInuH^Kpfa{zeSV+yR34=pqRCIQ zl=kW~+q__po9;_F`3*0%H}_wsK91#fwQSwe`9s5t5aj~@#Aw>Jm`yiWCiKt4n?c+Den>*vpr`jj>V@a=L_sNAJof)flnGdISQ7d=5Js`DK!Cc>5 zI?8$<<|K*Tairxz3_zIvE~xt?dLnYY!mT;swh|8@zQ|?i0>dhpT)~J3qyT9n6Dp|j zlT~a!uEx535x+K9de8BBU^0~M*37c9I`||4;otPB_UqT_6iNKe^>jS>70=nVbaB;EAhw7A( zN3cpJWjzS0Fk*w~o{Hf9!Q%@-wNN(Y87(UCmy)jhI~La@G!r6Wqt8A`KVGXi7Tw$) z*j0L_nO64)arP;jzQt0o=ufI%9P3^(>9%a>Da0f#2~?rp)F>H-XdF{{bMmyJKxWU$ z#JISAit#~4>`ePAYp|qnh*>kFfoRQ6A15AKr&XMyRZMrym?3@@xl9g;gi2g5;YVl< zFde}4P*zZPHKc1gJs(ogTVL=#8KxPM+xO?K?Rk{bg!^y=!>jIGm(5H;s-vB<#){Hg z@Pe{i@KI>sB@DYqhF;;}4d6Ek=-BgVvD3x$=sOLzh@rm5ep<{jx?g5NHqRELT6#^@ zbV+vSM|ifWOeql-_U2+vw7z4trpq%VPc!=E1$U@&$hO>dxGm94HK>z2VXnv;epDggP=Uz8?J)W}lNpCMkRda#vzW zce9LYfmKGPR$B5|>p-2EdUBQO!jI*@w_C5?f-}IL_LD5%HXAe|&Rph3Ai6spxm~;d z@UkvAP)0Yb5}nZhkhH6k{^?{PSV9z7o?g|7&)QK8SxXMaBhrE#W zc|l5*Q}}fc4V|@QC=tm$2*w2R0=i5Ru82V7zU(LC;t$n=w32Suv#+hO(0L4vN!mq^ zt<-&R)KjmBKHQ>K*+(evS7{z!tR+=8=pYV?HG^G;VrU2@s|mRre**aiWqRJwrUch} z-*HNY7O3voT^N~DK)tx6r`1QgeRT=@fIq!$JV(m)Ok=@7GRI!cn+E_h@)utlYR?}Qi-$Q&ZEV; zHn!xmzYDAHW1}zovTVsiR+9B&^l88dtpxpva={3q@_FDUGN}vH6e9Y^@~yS;(bDa< zB>f>RK~BgDBvYz{G<02hOJT=pcl?B?AnDI&sdBVRD-Gx717e0uU&$ri%Ze0M!b>SE zj2A3-qr|R2Lj@q#p&j|d3YQRC*;gT2u!&0xIV2wd7<<}jTCW+^qxE5y0TzM(qu}v2 zqCNMuPD_(M#5ULp!DAiC89RxaXEFO3i*Go+pjTEy-?70eQ#^W{3#Y$9EK;5f_w$85%6kmyNSCD1i?D@mvvJ%xg335Uyv?5> zstP6cV4?6?;UaT8B#JcioW;YJ-Xx7 zK<*V?h2$cai~fP6@a1|l6nsf4UpI%uHv}(7#vj}k_b!XxFi%TRDU{pk-t*Ca=j+{O z{4k8sXMSLR;{xRC=b$6Bn6Mm0Gi5{&T}?SOpfr0(aQ*(oV>@LpNu~pb!3g%y*^Mx? zKs)$WPyuT2j`6&RBTv&vlLxgABYZ0+h?SWk!Zd>9uWbw^ftR2}cWf)T$yOFaPVZ(gjKEm<)s%tw-U(gMe*QU+5i8>`z`E(|gaql4(c` zl3<=f8lm^K^s`uL^!)iBsgEdx*#C60>G7CYGZv6PtA82H>qgYzKzV2f-Kg8FY^r-P z>dlk1)MuI7TecjY-BwAWN>Tak+V1_2f->NZG5|6ldza%YpjVa6ii)5YAWtm?_v`b{ zI?!nH&^gF^F6_b$1VZZqC|$%8aionS>a6@KXqJ@K z#U;h<6sZ#a+?RK1kk6UB|A<}qIApq))-rB;YwH3(j$$jY9x_u^-mqUif%w8DrlXK( z8ukN&Oq*cC zg>!2a2SE7JM|std-3aWiu3fbW0&&b40orMo!OrL5x!+pFL#VICeE_Sel><70m_!#F z(!r(6xN}DC+2g%C)HZ*(CC5rQ9f>OBFDXHMOiwG=BS-h`l(lYOXVtR3vCf-IQ8p9K zDQa`+@cR$Pm?Np~`n5;Z??(^_KX`rpyd0z|9rVqikm~>+w9@ntVnoW41tZ4QOW$oN zqnW@@fh+55cgW`U>eR5qtw~>B`;HLUe>GIS{W!ba>5zevv~rZiYm0f}5%Lkjt|Zg1 z`q}gm+}6joX0+gC-NPQ!aD)lb#T!k(GTp|K^bwDsgY1~^5Hdom)j~hYBmxCZ8T9BYH%P)kFo0A~CGD`=>GL zImueBc#DnN_ehl%);6;H6wx7N&zob)C&d`;7GQ4R z<9>ByvoFXzmz=ncWLEyyYlqqzFQ`5we#(j=g=9&B`lRS}g*gwkA)I2VU%56Kr6r$d zILevX{3zuK`eslOM`Ns{pjn&ZK&n-|lx*5w85bI}zFWDyV3FIa8x;|A?I5;Ka^0q2 z#4KPuGs5_;JiPH)!@_IyaAR7S(xZIe6`r819RBcT5n8ycI!E=hkSCX--QiXjLp`hp z)sy@jCdq~d*vAl&~b3P$Vv=WJQ2!*smUlPCW0jx)i3l8z5 zi8$rT-HK!iiXly_?J#&O9aYN4DH42|z_xRmdbn>;G-Gzv{F`!|6L#Cf>pUR_f@#{x z&bIO{h8Cp51h$Gm5`2<}@LhUMkD;huB6TGaa0KHyWY>3~iv(QWxIR!uGACJ|vrh%H z+|z!AC2o}zj(G&_*}Nipj45>2ajJqHV$ zUNS0t^5HtDxK6o}uz72+Fwll*-F*kn__#^%b#V{tET??)vY$RZBtcwHtlk?5RgR`V$#=e&wv4E_$2-L@F&J z*x&sqd8!`G|0tL5OQjppcDOM$+}1x6;138axKmx4K)$Ixaxu6q!Xwg{EmFaUKNs6l zf@g3mjC?R@Jw^ga(fs_3?3F6Y@20|XK<5grpRJbZi-_3{F>VP=>CBq()3U|473?)P z$POmRE5E1LUe@EQ*?gFkc_bTHWXujghXO~qT7ul7HHsIRWXx122MH$GPFXbA&Nn_% zvEUFuMWSS8aV1G-!SqSvHt`thJLi@!UH$5ee`St!X059v7cNv^Hit8m7_-7{X~xf5 zp>bp{`nn0AA~UIuT;|dG8*@$Xz1;+HZpiD(w$!fqHs2ecvUEVG{ex+w*+0z=NSFoa zFNL=ru5`q9QLzWl!s31BZ#(blK^QsiNYm)?F|yOgTrJO(yMpj!X#GM1myOyECe!=H zI|bQ}nV}{pU4WH|es&e_oq{O8GUKmuep!DtKveaLWlTz|=lU<+z0GqG3;*A|bV7y@ zSx+0B6h&UNHPijvyvL^VEv#Yd73Hy>Gdt3=K^??*-uT)da}$q$!jA zd^_pV>85*HyLZu$$y#LfDJ4!mX_my4o$Jt|x zB*IP)gmRjFe}Doig_J`o-Bcn}pV(4^mrbj^FPgPcufx+$Plgk6WW0?+dk;SzM~#u@S`UkG-xE zl~k_pmxDs)H<|cY+h#-azEdqu#Ft$n@&Ee|T{rr499*|n7K5^JDRFIki_EZNggL0BYql7Ck} z=t;}Q9=70I>-kysPE*|me#r!T$<;Y4@!R%{>Ktwzu3zCbm=da4Tiu>l#)%et&oB8} zO^DtaqzPq3g5OjB?P-V5I!ADGgTp|t-PlecgU2U=#Obbd9*m%z;-Ii)rf}(Cnk7GR z8M^>UG5-E(?|2d#1@_%{?H7gF<-C-C@NtlSxZk}>Wfhut%>TRg0sZ#Wi}r_Yzn@ct z6pp9Ni<}PriqAEV`I&NX+|TfrGv#pDBKsK&MrZv`K)qGHcM9J3nPGn*{o+zO`$?u& zlJzAe1UL_RB_secIByh$C`_sj@n=rGGyPPw9Y5)WGXHD1O07y=Q3kod_aL#r{smOW z>HaROoDYTkpHwIW*Ws95H$FXv>{?=tahX1TyD{0uDOXRdxU+A55-CV0xK;3p|3c^0 zfesa=0khoq5oUURWIhpV8|c<^S+nY<&wrN4LIV(&30H@u{skp|i64&^qk|2_M?9au z_`Hf@gtS%G!AtaYe$L&N7Bh%)>sjYw%$J@DpZNRPqT6`aA0G~LMEgoCYM&+#<;``R z_&u50+YmSTBfS&kb%fm~4-@M#_*@qA5cQnTUC5n{`R5h?dq+wyu}7k}SzDkZ5o<1& z;gI**c~JtV_dexDp);cs0RSVBQ9mlbKD3%hMN28F@10J6%P2S#b0UKDm>@0PInHFIkpEXDex1=#gwvJ%mqY5#$zN4o$rN%v9>NzDyL z6KQ4VUb@-!MuX$c4l6yzDYSK^>;d2~n{V!S5pX5~+Hd{#E= zB*YgLN0&U*rH@--D9_Y}pEZ3gC0cbUcqjV3Bb?i+afsRjh( zQ1*jP+^1%VTYZ1-lepr`%baH#nDNhy1{guT@BgJl4?GN_SzU+`Z_Yry%q(gwX3ELh?0ke2 z${Y1vA~S;b$K6s+RB-||tW$4Dn#;&3@M6^*2(6Ms$)x{{xWoyUc9JU~1~Ik>=Nqd$ zHy^ce=>KjqCWkx(SvzKVSM=9f{^V12-Los+AKI)Qq%2Al8L(0Qp-^c)sOYY&pZ`)! zi|2g1Gc6(P>QJ%e3_rJy#qI9)`(DEEu18PvTgAMB*j%n!aUZ#jba?shkQqEAoOURr z4H~8Vt5gB@!Ku(r8T)3@T^6A<6xl$tC0Uob&t%Mgtf2Oxzgsq>mIF{H=pqG zh?4}JkBzht-EO1isP&rk9meFTe8C?bQ5y&ttB*|RyiW{{xO--~f-Q^t%J74H>J4Q( zY7AWV`L+}2RR$haabR8}#tFYQ(sJtF*97mb>R8iTD>v4bA3Yb3R}D{ce!F^osN!C6 zYvAE$ff`4XOOP4%Q53^uRpTAp=3g<#@$yFZ_NF=-wojY^IFW$E`M>pfTJLL!)A!-p z>(Dv>r<)ig2bI6Z*B;18+1YsX|D)=y1ETDn_u-`#r9q`jKtM#0P$Z?Kq(NGwTUr_w z3F(&Z?(R?;q`ReS0jUL+de5$ppWpZWI~N@9 z5>Vrecf5a9o>4AaWY_T-jYSyxlMRWl{1YurBAsf};%Snv?o#|ML-X5cy0}rLX&KI>@W|I_o&`DEUTW>dlv_26sGt<4VUn3>} zZKN8A21=U~j-s>4&UMz^ikOf2qYsAZ=ZPWv?dID&o6Ji$iCu})qqr&sO6`=8FU^Lo zYipVx%g#P;`Qe_1N3+K0+kE)lwlx>5SKJLG4BW;)YkpS!_(AA$06+2ZqZ%)WY}J!% z0W9qb-yhpb5IT={Wrp&g6a%I}HZg%IBCFAWY6)k!V3Merd)D83BZs5?czII3hgX?0 z#An>zO|Da(!dG2O1*4XI(I8Ky`FF1LnpT?m+Tm1nRUCA>34sN#v&EYs%`Cj4uiHHD2l1`GN}(fx`D@vP{I5d26W97mbr_}h~BmdX6I zNuCsCWqPq$5w!S(?*m?E&$ZQQ(y&Jc)iUhMljvB{U-Z&P{+#EiEtxgE# z?7`;90+xuL`=g7^jLXm^Wtw}fSTUh^lM3un`zURHzK%1n6U(E4Ie_$_fD}8#!42?H z#Pocty@I>lDsWOzn_W%UNR6!^@6OM(7 z@~$F7Q(8bbIe2Mp`az0Ena1bOsQBe3CvEJ-CSRfj$?sOW%9O6ycd<7{>XP6DVL*1i zB@q3N$l{5rV)RbOy#UMlj}Rc%B~XMLO#z6JmMNz6?VGqhWZG12Q@;c0jt{^^OUI7h z?(^;MGFl(|aUeo1fbnI)@{7E&$LE3MFIk>#RG}fO0=M8%`_PBMJEVdbOb_M{D?fGf zPg(J%MY>zxK|CFKqlI+js#rQoxC|ks?Q82B?jN8ONu-)RQwQ}>sVw$A71PI@eWOd_ z+ryO!kMZW{HwJvuJ$B+lq_=M8X|1>vYH(8%b%nl)HGx-FQiW{{(58W6Cy=EZ($!!9c(Hq zX%sR~e*B%+IZ(caF(7(ac`V-uL%Z=K{~+%Up46zZZm6$oto&*;DJ2P+6H#B#kT*Kj zvOXO(xxk$UTE6#;&}wB!F({9?S_@u1J--s$Frr246F zQg$c_2n96I)LgtsT(>_pWmV1z>iA_Qs!(P3V*>31@04Le&{k!&mu0szs849S!A~<;R~d^~ z^)F-n>=8`wdPs*~$9UStF4a!SZkj>;KHamFS1tQ~tdWE%#Jq|mZdh>%{y-@`TA2xYw{9aYXc5pIJE!jWf%OQMF zU6STVIoI+Mog>@}wf5j0=?ek@#yxYOP_&;IV<5zt{CCV%9?M|@g_vUeD^_TAgR8Jc zg9be$_g^u?q!!sC&3a(D{fYPD6t7SzFHHTtW7IX5jSAs?c8bnzZa2f8*gpJ5gXy-q zpIf`qDGRvc*B;?ELT|Y2hxRA@G4L&P++FCSuzmFl@P4zt)wX+;ml$vYd`}=?^;ae( zcgjSertc1Q+TferCg6Pli>%i>@H+M$$^P4N5#|}R{dh2*KQ9~eCdnVeUI?&uP+x_N zGIVAy^i)nC$mCw3uWki_>(``t(B`!#;Q3x_j?79|FMuG20~$$h?G@YP>W$d6X<{Ls;8tyjkm zYWj4hI&VKWiZd*3)X!k}zC9YNy452`a#tZTI2&1}!hq;wBB$rLSN!&~t0j6*zOgwK zi-|YV5;$M`zDBRDM!NmMlNAO~+5!$?2=L{3kMD6qs9oXOMrAK)eR-5awPox|_t|KI zgS|=rjkm1X&Y$-dbLly&UOcSL8b@C*l+G zRSe!Hw5|-P(w})<0r)qW4S-%)eK_Kff)M|MEMN2q)Dkwk<{qbn)Jq^cCiB!m-U=!--c(_>e+$)bHaLf+D0ULklKH8 z0nt8%YrB>Hx@>fGti|wcN)YqG$kjfVZrwIV$+<-CU?~|g%`dY?hNR0BgDQTOv~ z=-bq#krGKUQYuYN^aFbc5pBk#WH9X)IrqGA#q?NJ7{|uYy6C^bH|V-6I-b9$)Tle@ zw?8y@w)XAUp~{CHx){n@LunZESt~2WWLHCnd^7HW>vg)EB|~aZ zsD3C9-PD8fw3b?Z?WPc$Z_qzxcbO=}fIPN;Lo&KJ&{WvP&6^Yv&+GMNtVEs2al6q} zP5Ss|rYi4?lhv!zrP-D5&m?=AoABh%X&r(`(!e`qA@?+R*$y_A;8N+6@_e|Ei7fSt zR))R`e1Y52<7;6EeIOu(U|Rof7cn$CJyCL2eDbS?;hHH@Adq@Zd^er*S-(GI&}nF4 zvuU})oimU9pdzuV;0LQ3O1olluPcm2$1MK2M|q9MzUzUHsDL`4t0ozfN0Oi&$-;j( z{4}0cD zUA(tEao`#1`w!-i_C?07%AN)Z4t1)TT1|jiF|nxkfBEYTOflPF3X;`K?DmUUY<@Nm zOZBX$kRjRCDi^fOLzvFv;k`%V_6F@2^gk`syae$O+9ZG~R`P1(x$8%!=7kT!f?B1J zi_c%EJVUJY9@JD$I#>JOJoOvYyE5)kfTT^3)C{(6m*WUOgOt47rUginzKsyQV#goF z&=f%T-s`J?Q_hCy)mH+#AKf41IhZK-r7B-*L%w=p-icsMaz&drZP=Blg+sw zlva9qLgq%Pq3FeMGB+nSw~s4*w zVmR%Q#{WDUB=4Q;|N5;?Y}@u>IB0jWSA={thcXh}4Bs&trt$mnI%8eOu(g%;4|H=c zH>i87+{iv|p~l%lB~R)0oj{Us`;B7o`mpMa+x4}RN>5a^cSG#k8Qj}r^z)6B{1idO zF9zS!Q}1va3aFd)Iy3tJScMB#wVx$V0$G^x2OH{>Sf?bw=Zvh z{r^f1Bc3aju6bqG(`}qn3CH_tPm)Z$Gc?ng@^q63bJb1wCam~FoP86?{&Ynj-JxcA zj-Pw{N%&C-Guk!?JX|v(Fvo;zP4>UQZ);XTlLlyXt4K8 zaj);S8J#GaYOz>rlW{}qVj*VHkv*4fwshJI8m{QZfb46jf4%R=Lkz7R=#FVqL`t;u zk7Vp1lH-U1e7aettnLsH3A{dK<)ISn^y96XxRKpb;f z!B>Awk-Fcb|M{d3l=D=c11U4v$9Yx?loI}y-?u=2@z0Dp-^=5|C2l0GIYJF^@2zpx31B3em7EV?o+Zet+}TQ0E_a{EQ$-2rj$#z&vK( z1-(T2o0I#H)G7d{<7}M-KGR8KqRZI*s5Mr#_k+c2c>5b0lk#b@Xo@-#ZO~FO(Et0; z7xbkmjG@7g<#6Pke`1qB2WIWr)o1UKk-38H4zQDbLN0*W>oTsBSV!Zb7FZAKr6P2xS0XXV? z_?NPnE*=FpV7Nhz#1>PY(2b{_I9ymr?+ou{2YlK-mzs;bXu!bDIcHI~kKG#WGML*G z%+)S#g-BM3#eG%3k4G_8bMNSq=XFMQGhU0LwqUrrv4e`~km}=Suh0lxZb7`4l%Gy) z#xP+PYb=6|T>A%KQ-*!`(*!yLk46!iM=UDNKjbUV^(XzHudf;WVWUmSfy1IK9r0E9 z;XCN!y>30_rxd>K!SPO!HZ_S6&vIV<)-8$3P)e7z==O%aJ?_Y{sz3dBI_$9bE^GvF zWc0?v(ba*?D299QgYa`%Kpz<6?kx8QGr$pw*?+r2fH1O{ZAS%{2yIP5=bC4523HSx z-LdC*-BSX2EUJFp!V%tu(LLj1(Qd*2{#Iu+rkQhR6f#}&5`R~>Am%M8fq+7>>_R_l zOn+x{SfEl@(Qbx}n|f&A?BM?HT1YGm_c3*z8*z|#_d|abp9yMFaz*VKa4#73qV78h zf}vd*A!9lLjTU~JBGNni4-c&~hkv~1>%oHL_rFY+tY?NS1dMZ;jwtWVUEXeRek@n$ z<4<9_s*5R!Yb`cZpRs&8O#xk`JR6#)i<=cqo9TPM#f9pseI&O3khEERAI-b3<}l#; zD96;W@1VK&+!EJ+6=EX{@Mc8zFEbA-GeY+0dDd|)IRsK2!H9#G#W6c6xJBZ{fseIz zphC)BLRLJ^^XvO0iGJeoc zd`fzKFFi2_vHOpzW;Yf8+;6M#KW}!g2yyw5(a;@LjqQ~PdtEq?5m(~QWfbr$S>Rcz z-KUg{bgU39*kVaKJLjR24wtPbhym|i_S2s&8#`u zqq7^!K=St&4iAMaI|6nPZBcyS=T*JKns&+@)==_vFRJ{$H0j|nBlyiluk6>0B&Kjb z2n6)8>5t3yabL@hsfbC!!Y}m0@i{0?5U7JAihE=OMcxNwkYeFX94Kt^VDRLfK;|K- zKz8_+Qqvic;Mz_o2)7e5r!bqEWP%$8<)M5H49P4|n=~)rl(~1rw~E*dMrm3v;I;ff zXIF$LnJ@La#kcWN9qd?aq8Js+oCTkhb~N9$a`0nY*S)lz2bn91;}4fEVD)3^V}|xl zS#OM%l>ut3AX@Io=@?VFt$M6YJR!P+7?{whmYPGcsKB*8IPX!je_lQ&- z<%!56-BKXpUjz%>v)hNcn9j=&P~YXOzkgRsddMWsKL0^Hj1ctkf1Z2brliihH8VXE zO6~ z>8R(RA|Ylb+{F{Dkgd|w3fo-_^KP{%wb>}Y(OLAHVDT_z8{5ecn~-<@I8UDJ0^Q{G zO3IRse9IsCk{Vjw^P&HcpLhcmu_FE7bk-v%%}obcg^00>T8=Sf$d_gMxwokYf}*V4 z-KUKyGr^6?#cTCe<3e_E1}B}gLB7hz;R5Ne_Z73G9e=Sa346lNSwg5auWlyYKnnr$ z$-RS}*t4D1Wm-)%a+KEkPy#UqFlW z!!!TxH%u3cKL#f>KB+Js6fGhfjEg2zBvWmf2+VD{Btl20Y+denQqF$1G+NaGE?w8w z-*0hZx@y~ZMS3?DVwf=PuEoitNpLw&}FrO#&@6V!I=$6l~?e)7WO z>36@^P(JV8k<+6GV+a#kj8Oi<-Z4J(1}pT!C(-(AlUM-3l_BJ|;ILT?Gq|P(2~+PG z`{uP)f|9?s$btJ5xECXYMr$L^Gr(r~Yq3DKzDh#uRv6EPr`rS0iY#wQ0X z>W;BB@M;cL`gDhZt^(Ta24@F~RUMG(vny3ir{oZ^Krw;(w0>i@5UFT-jn$5CcPhM6u$lqdM;d%L!Y57WLUpX#T+Vs2WZ96)@q?g@W zq_@JY7kVweZAGO#-XzyQeoTQ*GX&;>{QZ;pk@cO~SO2Yxa+DSsBNShz>g*FVZX=TB)4vHT(jzM0Vf(8`N`Hdy zQHu`_R{?$cG5hflK}AGY>*)&wCK0ogKvjf+o8^r`-+Y5E`HQ%5K={?BTldgyw3Zs> z_~HCl z)DWOHaxJT0muWI(sE$e-uZcy4KsCt&ntsnV0}-_fCi(@`2ozJLo@<$ksJku%>N@}eU!ro+U zqli0YAB2MvpHH9aZ46Q>mDCg!X*Mkf?BiWos=X1DpIXXLS7@-7sdUMTcQqG5sG%$k zq#7DQW1<++H{O8JtnI0(ox@!5HlEB;S*gj34LB|zNB?=Fvmmy3+PQQ#tYb#AN_4p| z1~Mp}G;3{8?B9fzmCsZf#LLllX_D9HH5aufD446!v>Z(~p3G_th7R)z7QKhhc58$V z(QWWvzqEORrv}C!{)cFR*XxFQk?R5v85t=iZ{Suk$tHKI2I49pxKNq%+evO;Vhfsn z^eJXI-67@GXW^?XHUJmAdA|$1_y2rdbf~qxqgW%IpLtIlw0P}Z zrYmCMQYEkNw-Bdcp(-Dv3%FRu#&a^X$R;}wDd%{7QqLLb} zA{*>q!7-Z!KMhc2?n^Ofc=SY%MPB%FKk58H;y1O|-S8Hh`Ob(E)DIuz?c|Tv2oWme zU%b5IoK|0KigbT!{5+nwh~h>j;YLfj>{YQD32UYB^auloiSCm++h>?*wAVeCc6bzb zaFifVJ>WUzHa2n&ri-|a=J$9l=+hrQcY?E^qN09)w%2uG!{-v<($^+B2iM(-rf*NP z&h)NtQt=?5N4=_=r9=x69?-4>E$;fn=jHTqUW{l$hz%hI{r<9~DlQCKpt(a5_sp4g zd;IZt)BYB2Gi_`+GOv(eEqMdzyxuBw3k__C+GG&dtIEVr2nNNCS!e=SSttSa2}hGb zgSFliFif?)G>WV_0M#f1y(F%9LafF2=OdVfgtnOP>7lE91#b)uCU;7R zCK~plxb*_(v@_}V>2x_T0GL{dDT&#S3cMe}z`7YYnd^C5HV%H9jB7h_c@hngc;Npl zJXIMur%$B|?wKy;%YJT&Rq=3b^fmCS*8k-ru2d7Q{w<|erWr0)<<(RNMgm^GNo=IB zR+EpKrhEZ=7GGnE6)G`4etI#PXOPDH@^OYIz21Qy>Ej9$Ih_5q(VvBLY4_xMfAkgj zX-uOrd)9$-(lIS_B6TQDcxlO-;O*PjuF|rki+GfL)$P4TB!=UA3UmB%<)cEpR@e&q zip3+v{e2(TqGRr`#`X!d7WzGU_Tpl6_p8iREZ%eXO)U2oXXS6j&mg&zrGaC`su=V2 zj^b@_BM42XhP={U*9sit{=)k68X2KVjsnEJaHZe>^K*cYhek!_UYKVR3xmQ&B;Jt2 zj>xY>cO-NEYO+Y?gT51Gj5R7hnvt7ect8}=4K*qvur&0(=~02_BP)ylV%=zp`kdjkvpIrEK6x0D zEie+@CQRlA_m)4kSDWz@1U>0c{WnocEJi#(Ytc+&6E zejI#ZIaf(~BuE(twb)n$mE2cLw--x=CsxZPp5cN=vGKCsZ2+*Gh^Rld9Q}b z=m9dg84=>O3S=KJKS;8zx%A~E;UkA+V=9uNUn{Kc6=f~5N&HkyA$zYCy$L89WihbW z+x9$uj1<^-jTI=HfZR5K#}<$r<<0%$%)BSov%$GodYGHAL?td>pI+jwxZk8XYM#TH zgpyHDL?)_>pSr{vD(b9D-(5Fmn>I2ot zc?ByJU0Jv3&g`MiP`n}plf`B;dtZbM+DlQqxrIWgwIkDaP$6LWgg{=Noy&S;sKGr? z8^!o!AS|=!kyz^%INLwSf+|WW@?oio-X~Nk4dV@pXx4ia3NEj_WQD!%QfX@nURY`q zMtt(wy`x(|hE>whh+&Z>GOwAdn&YE!M=^f1SXpnb(ct&l(r;qDJC5WI(U{iU2NSKI zta_WG?4Nn(5FVp=1AX-Ogdmv%hf*O{+naMCdgOk1@9`Oa&YlpIonPH8X>m=Px$>RXuun}24W0?aSe^}^WAmDAsuim&YT9ea z<-bQ032=*8;HGPzyFL&sESO38ten3RU9!qp(0s1TWBv9;ez+t?1>$8>NeUsN1S>Ydsi{b`5N|{i{Z&BV zvL&C>GW0rLIzg|JHO9qBvx9T@_eAQOvjNH?!@iiLTT(v`I}QBMNFZVz_1F&2@39}A zKGEYDRGw`M;;f+_Sez@jJO^Lzhb2$zaMNojl(NEYzQ@X4pzfWcu0B?vLGkft4m6wP z#}`pPfWt>@h{O)Ol=-En`6gc@%QQJ&wNatjQp2Bs5esJXT2a{Uo&21`yZz>-wP4=* zrSVBkoI(Y@niLIcMf2yLhwR$5A8+eD)}7*e`24B(;L^u&3!a!z#vl>;Q%>WoEp+7D zf|dSm{|&TcsTj$>D`!tKU99GL1uN<*SG~wI@6Tp#e)>vuB5%pYS#7@F>CYWa=hni+ z%`&SgcM1=58w6cYLMb{39O(a0yjzxIimJR08Fl{X1WOQlc%l9 z1RhL(cCkCre2xp1p7!+2k%ua#oU=t(Y4Nt!sOxc=yu7=xMi2dm00?-Z{l#w0$+*3utI{hI!=I<*dcZu@&--l-+L@AgC1 zm|d+=h0E%bvUIo79|$=8iY6nub02MJrjSWz`GNunyZCmaMsT(*5zOyE%*IE5TRpcP zwexZJQsd{>m9l;R;e$;onP6sMzD5f-kEOt;(T(eMxUO{g_zrHG{5}c_8r)GOl<0Uo zZ&oE{Fy5aV#r}Y1v+uW(`#F$}$T{MFN}H#%kWRX8L6OI5;2_#s_tLy6RQE?A ze}BcpEpu5Vpp6Lx^#2PVG0DeVtWtwBRR_Xp>Fjj5u0}6xFD0Ri(d9k)i|kiJ#>;10 z3<`=pS?yjDf0 z_Bb_NiSy#hn_sZ|A=7PAPO0mbod~?RDpba2OmP>5O*I9!@kIdXJi!+WEg5BeRrgG+$8uVKY)VNccRZkR4 z76epkB#cUUhzVw$t{)wQHt6Cuo$C>Nwr*QxY8U>Hq$zdq+mavz z@)=*B8UhjdahQE>Q+^+Rlv%&7&UJ7%rugMy+}%?!g;|X1%7fJ zs(uH%?!}QZm&-^&cwWGf-AN)}vD8tq)0rr}gVhFHH|s0KeKzoD0`O?`TR8`Gl7(xA zeO_Bm1~NLT4H8Gri(1C_*>$s5eWtWAxOPTk<4?9^q7%p*RH0rP|jJx2c;_6FwkP-}3otO|VDmz<$!CYG zr|ymRp@P~e-wQVSfhS(hSDP-pl_S@AB8Bb&y27ReFce|$r_+8Ew9r1KHop6LOO+c{ zwmXw#d}q7~iM3DFfAnuhnO5*IXckOn&NkPas+H_nHEAjc%LRDK+YD%ZkY6rWo{cS$ z^CRCqBGR2v&Vjq=W{HPh?E~A>_&?XhfIxmblt!GmkdU}IS|sOWM(>-R_wH6JMi$q- zA&poziCYNYl`U`*;Ig;=rv3suOv8q;z-V@_zG1&=UFCE0Hh03b(d}8wpNHr9%2$oj zx+mfhMkR^}A4DRcl-LaBee9(uiN#zp*WPd0e*E`_*&^t?l-CdH=Uz1Wxgg zV2bqUCXG2*R|{MpA5T9wWyo~T3?ORTO+O#CJ6V?b7Rn=aFp|wSYq`JRoU3spApoj( zqMdQS%d(Y7J*+}GJs~p~lsBrB-#IcVLZw716UWhOG*>Y+-|P#E?ivIHLa4w61ab>g z7M4_A&6aPmq@~Qgv5P+2c;Z-h{k~Y*weNU;w#UJAwD#A}4)UhnaJ&T%uL@UKt)tRn z^6sxZbdRE!4mEgp_j1OW_X&^JB#QNnfQ!SvL(#k;OI*6ExAgUrx12=Db!;`N7+8ti zrkwAwDM?>KwZDq!?M`#J9Dg@q>gZ5YXnDD><~P9&{P3=CnRjQ4L%uu5Zl-qcO4~z^ zA*h653Ggi(<8WgE7AjHINg?{>La@Z zd9`OwnkepUluxZThIjz0aY8#u#rV>8vQw*$bHPrPT%%@~PY9aae<=;z#|@3wLee z<^772$Tmj;^&XUdP<+|&UZXsM(7w4+Jz^re$)uBC=f@jQZZW*Ofl52s6nkOn3-WXM zq@&r}3Hx57zQMR@-$W`Vt^X|+sZXWe;r%uF@69J{>cyM&r%?#V@;v388?o77K6 z7Gu`wUu7m-qeVx`&x*EPce(R+XU3jN-L6Y0jmnI%a+^Kh&zw3~>5^+MzT=kzJenSC z)c79}>66+tlYbmMF`vjhNZ$Oe=`;(Qm%gOgxHzYrKHd7Xdm+fZlAK@~%chmT&~%Y2 zbrsk+^DVI|0cJikW(NPb5j%5!P*35N6lyVDTw^twU&U8xlO=(}A~PbOE6^>Y_6vpr z!FRufjN`{EIM|NnNjiB0K7P?*wK`Z{H#442L*t=Zi-WcgqLV2sMk2Fx8k#G47aYD| zE;tsc%Y>I&ZG_q~_iTYdnocv-kwgkFoluL3`WhU2-0kLzy@?YYa+hc{2!xpVUz#@g z4!y%@rKOiwRiM7vbjrI~XCgB*)_z`xogJ}aAZzCyv_816FB$Yvg;G=X$eg(nQ0tpe zF`S^ere~*-?h#|L@yfU1@ikj!83u%wO0OtH z^b~qd`cQ#)0c`$xVX!$>wMcq;%3QTrsqQe;d>g}LCaIx$#Fx8H>vO&SF80x{TKnB^ zB4Gmw#adq>B6b^Oikll0mG){<%beXyk>P$mI7|(J9a0IVVTwHr`1U%TZPqDnw{gh zP7;}!WdNFzYO9C{qXiLm3;)fEIPTSxotIEmpWjNm5r<_N5(_zwCf9YX&%nQgWX8(ljrnnRa>a`Hq^myVlsXE-DdCg zTjYy&IhjwUXFn8oJpuM=6+(t{8{Xmh^`BGkqvdt!<{wq3XKr_Yq>0Sm8Bev2y2mzO z{H0~D%KFS@rq)<3q^(4i)!%_e0{;c4&p!HRKf4FjXW4hy3 zp#9~|xy{wZ$uMP;rb{&K<_G0F5bt;G$^S`LKUh!f5-&7zu!|rQLu|63WXzA8h|Bby zP?hN{)8ze6QSC3**U1y&FoR#RFrOHd9FCfwz}X!q=bgnChHD}b1Z9?>3p?2)nb5Sj z4aY9m7U~D==Z%kuZVKFPIPSSeJ0XmOOQ4}f!S0egp4+W%cZlOOZ4rJTQng#fCpgV%nL=-KVy5>OyW= z_woQh{QX`4gquPhM2b(D^qpNj|GZ!&z?b{}T*-ViJ1&@PfqnA+*Q$c`gqN82E7H86 z!HrzgsA$%e(fu_8}+{GaHrp` zBK2h!Xvi>1q(fqm@gj_<^Ep-_dt~Wgm!Y0M{&Z2%_ISxG{|kosfn)(?X4Z|>ZMuWL z5U~n#ze*NySA&_iRo3^-JS4p)OR=a`zhaY&)h>1Dru;1FN_JJvlRB_#la|x0h<-S3WmmwaR`{L5fZ^QX_zyMwx?vD+EFTE5SiQ>> zTuQ!7JCcD&jx_knpy*5(&nb8<+)J}^*FdYrJhyn#c^aX)`MvJ2mLt*|;r}X=xiG!s zNgJ*DmYr({vZJyfc z7-lPC?qw0A8akL`8#{Y}AZxn6hf8ajq1^Jj66{2w{HoSx9BVPc8tDo>H`ar04%6~5 z9E_cI^|6D2r0Uaow;ERmn-x`TkRl=AUwcFJ%kf?i-YZ*dzL-;N3FVkp&(%@eotx^* zPbz>}t(&(K^;^Aq6+cnjJMZavo(7UZwX)xY>sgwvZWaL3a~z5i!1G~)?t&%Q#DoUP zwdz}Ww%g8w{;0M!zb9rfXI9U6Z^6H@^kx4`_DCv9F7xpa?=Qvjb4up)$g`SWuTGU! z(yVUie-o%-oRRa!|1claD6Lx^AV46WDP?{JCiXpHsW~eTyw2#op9t>D`QJ?zyRe(? zQE^$>MpE)v`tvy#(n}dMZKFUSA6)-cQ2cF%dg0?`9&%s(LV@t^fcBoboO>$f>Eu*- zcwPpYtL*b50lG>QbASrLhfYXi+_1uFeEMWV>g7gUgOcB7AYz!nq zhe_0V1dBfD_4Bdq7L>>xv51B{Xr_Dvp`QS97me_DsHkq)WwuAvRpxFx zW_7KVyHjm%LX-1cx!=~`5qbm0!6A@UVniAJBcw<0GIWM}pd|c(kb1x79K}#>mS~rj z)#XKnYKbue@@VJ;|M)){_}cS$cXqPi;p8@N;{Xgg+*WW`Jegz#;Tvisb5llo{8@ns z-YCZI?A>}jGLkA{H9t`is80H=(VPDYxPB?kOA@k2gxAgaciVpNKsD^Wgi) zC#LOG1v{$F$GF)2VAh3}0<^BFVgj_%NFZpd)Sw)XD%s~c^x9I)}q`@=JMizzkDl1hPIjxkL1&2X@wMU(lpddo|{kI`WBsSqUTO_hPaRA_>en2!}YSMTuvc+O4~D+8B@ z9WBRjGIoUNHYmdR=gs-^WPC znbP{hHE@NlcJV&ISkCFG#y8AikZ--xtO zQQTC+NIDW$h>r%+1Bgq0X0Jsz)M zfW{4y7(S4(AKulcwtK|IHC7-NK}<$g-(G~bs>0j1 zZxhvnAHE2w=qkYMP84{&#a;rwbm9MSOr*$^Ut-T*doqWwQDZlwmm5q2DehkVeF(6u zsAMRW)w(J@0gM*wQoKG98x7ltmTQYWlPhUh;_pS@j zpGXfCc(ocqgE&ZYf+yRsV}`F|<@FQ*7MuXy7^AlTT*kIpNq^`LZ{c>0N3`35anqyKjpWZ@o150?2H zRwc;*`~bl>{BJwBE?_&}=P!fRB?z6XK_LI#4d^2A+n<%7=`uj@72?=dqC?y7E1@2m{(RcL6%BEtOp*DctROr zdwt9TiYg@d5KTi=2sVya+cwXNf6x*-Eifzq2;#$do(O1prxGs%9ClLzXIeq`Z>7?d zm-ntF0bW#8p)#tMRGj6wyTHW0X(Cj;?2s+&)=!^ia zM!*u;?VT;$pYnp>7ha}x_UQmc@V7U69*o8ZAr^L0YN5B&Muyd2qXL3{5s|PFXyi&P z+}sZ7*J8v3sq!|E}v&CXLJh%37+M8Q!E5L==Z4afjT%Uv|E`l{6=g3Bh zdu&7L{-6-v&hH;z09`@ClovfNP6DXAJB~Sk8>x}Dshj?SBOX;1!M-sVd$MK!>k}GQ zV=siJ%k%O83vBwo+}3TwUTdlc$i?sX?LrN#ClY>l4w(&b$v1GD#AV8$J8X%Lm~s=U%_RNBNjmI9@a} zXpBRI-xO*j>;Z#8K0o-!A3PQw<#7~UI|MK(C3wBuqNR&##a> z^lIsu$?&8u~W z&U(uha;p^ow)*LD%z>*sOlkzGp$x3pI=YmxgtT%ufIO8?px>7m5M){VFi!-Jqep{ zkr&))WG#O_oq!0o&z}*0UK%HQ92#*>Z}jCZovwI3c6IZW(mKrpT$*UO{_DHjL{WU7 z4oC*rC`dj8Q@ENI?0@uWme&jmObcV4QzXgmP^IQ-j<23H%ibkfk1 z;63-DeS_x2uO1Ox4&6H705npXO-?z>>cxjFL~g(^3LlUWvpA=4Bl9tf0%5?I{(@gY z-#c`TAgO7hSmyKj=L;8a!cM?v-yzcwxNqPO@7qwEORNEgCbsR1tY#KqTX?w{DK-Pp z^+N=Kv8R0JTscMb2~8=L4j7-{YB zH_w@OSR{W+ea2E&j(a^b1!xD7sQb?hmYlFj54L`yzCKqH=?IUb+bfN=brG7U{li3- zI`E5Z>#GpW3a3zYX75*~8kcIplovrtL#3wSS*(5y!;4A#s*j}*ot8%jI4k_o?;KtFEd4wacnY67FHFnq z@OpxhFBM-(b|KGprIXdjC~*;gP@DI1Dq>#hN_AZbWpP85LKP!Q0YU}?>F3XybxT@2WsY!iVR7miHiokX;I)Qchsh<|GyW(-|M% zD%IDu4?PEfCbdFRy@VEl1X~N{L1rPT@@LeX1Az&w z=L>FYG7PePhqu2+JnyQd)puHK-rF86Fi-=_f9JLk8udnTHa*JDj4VdW?i!uw6ntO) z3hm{8q6uD2yZ6=sOWecr<^n5lL7{tP7iDCSpFUz~o1V+ZK(F`Rr@d6Kp>0 z3Pc1QseC@^chj6n4%;G!x8uG4HL>4ZCDkKE_HnT(UyDgg3lsI$`)9^%lhC*dd0hC+ zoPLtU-qsSi=HSa!H%qhJy2dS4*q~lc_wy=Z!fk+@e~LWP&S06bClih-~#?q}UGvVE}#PWxe=r< zB-^|EQhfbAV>xTK=XoAB`$0Ky|ND~c70crxgS5r*Qqk@EZQ8nswxSgx)zHHS&v-KkW+H6RLd!;NaCwj->~2dDe~-yQ@l1uN%RbiDIRZY+nWrb z+fGYcn_Fw+I^~ivNbX0hv zIFci!_x8^Eo11OkbN5A);}U3J{`l$ZquvNZU-nWbSa%QH^#bDMD0RC+R_W*CqPMnz z9%oD8=9Ag=Eu4^?9?6>;8|duOeQ}0|nFvRqC>JG-EuK|-glRN9>`6Ls{H|S-URaX< zE!uUIm|aJ=)5mBUYy_JanHVu2ejuym%>Ms~`s%o-y6`)GK;?V73cEiab~3hHNUgcO+n07QyHzS0eC*(p?g&3XHrISN#j;~ zT`&jAV-&lzqhKo)u+kyT`4Sk@B%8Jnz$KseTv}(LZz7>E!5vhjhTWv1mwpo`d%=S} zx9r~a%MbM3T-3f-t3=zEl(mGKkD6uR?9}%q-aq7RY86}>`#V(|>hax)=I)r{=ZR7K zL{>cZC;6a#Kay$OGwyHr8~FnEy3K4sep-1f7td=#>>^lQGdg{6?{)4-*1K zv`Z?ArAmV@)VSov#vBl*d^1VMQKoCFMAuSm`v0Jn2+vA z7RsK%db-e-2Y~#~bNI)OjCVs5yzH+hK*sq(w&WZnSd<9XP5OFeQGC0(Q$7{0S>u^P zE|c_NhwrfhIB2O-9b@|-8b8cGC3Wzd`Oq0VDQLf(N@4nw`(K0+<#qS@9lf}JG*r&A zG2r~TnL9-2_mbqV#A_sHS+-L>RXneYv57GnSE+fgb)_YFF4%`y;xA1vLJCOtl2tEN z`kkuN$P2>Bm3ouTT3nU$nhhBWG@Kx-rA8#6)_9wqrNiy$4cT~GWybmc^(W2uox0a> zGn`=*S1oN#8wPWGOJv3)qRrM~BJZ2JJK0!hRU(UAVhZ~U?!gg5V_wk*6Glg}i-=(ev-`}*jil1v-(DvAx@@q<7@OJ%a3 zaWG1Bpo?-b^l5tc=6w!)bl8DDlkH~DZ@anp4tVV#X{ z5poKyPx@i4*G=e+La4j!balb2^~z7*Z#l}+bVHB+=G_@hv8Vpu#Ik6A++m_CNTleO zs6t13{h&n%w6O#Vwue(x=ZQBzms<}csx3bbaY)vl{*%8ga51I~Y-%wnG<COQ5)A%gDX7l`A)p5zC)?<8L>tH|nj>=Il08bRz#pKIo_ zspH|3Xyaw{#X2j z>F1m~zZ@|T@HEf!-Z3`ad7)p4m^n5g70M3U%j)gSyr2eoxpc=l)#w6@D$K6=-~D|c zq1phh49bQ}iL{docmy|-A=CPQK*zUeJu-iM%djxiy^@OPT(+9AFzKQO@$I?6yI_dM zgA6Svt?4wPUn>1Og_lw2*lo~ng=C`3)|4+*HT5%-p579L5UNjrD8yCX#0VX<+uP4x zbFJJXbqRYe{q43?Nr6h5(YQ>5A3fC48{=1MmA>9l$yFX|s&R{$O>P*HCts#K@AaAy zV7D$>);=7Hk@jq{S*!ln@^+YoOOYj-phBc>HeFtw|3Li?R^hggXoB!nNcD~;Y~9eS z!YL$t?DF7ayGKE^0w16I&sB|NZnqOnJQnZ#=4Q6AN(p+mV?d2AZ)N76{i_Er(D4YD zI^IUUWVT4*%VM$SD6~$<8f!E$I%IMg$RFjeIi`ZNxxHAJ@b;!=JSX5V>5u;`dbLcR z&}1D{_ud)lIhpm3j7{%v|~M>>6>(xO!D(A8Tj_e_5gFM^krUN)s)| zd;{s|O*X_}8W$la$V5AMZ_j88ZjsnWOf|urFBGeqJe#z*7@Cu6krtF94LnQ72ge>@ zA4GZvYWd2C-;Wo#O&4e$R4qn~PkCS2sHb$OU3d9p`+Lf@(zbo#9N3{@L7P*KE{NZa=FT$YdA8 zy`8_Ar0$}2XdaQd^d@EfN+&zORcq+waP@nO;op;$?k;EFd%Apw*+h+V1a-U;sJvHN zBff|_ctu9h3FX38iO^im=YnQ6FN$K8?x|}0mBC~8u2d%is+2PaD%|YZ>3YI>)Y8(p z79LYM=v~ms!FHxsJbv$m>J{>>`~lR^=Z;prWjeyv$ZE>NWcN4pxHjizV8X6H*DON@ zI2?NQza^x4Zz6B~z;z1=UwekM^f6->3tQwW4@ou5DD2CIe(-uhybVt_z zsRSP)V}C-SJY5vmo9a4= za%7?n6@_lbk7wP+lcvqbg>$~AC}1zwh9tm--c$ReliIxHm-&_Aws>#=YU#55gZfi@ zv%&0M-V7-V)H@AdqqhCLLKDIUrXP{*sDd0dj0F{U&ybNX)wRa>rJI6r`Hy4XbqUn* zXN;2~+$+zh%=9#&J-gUrZNftmi0$AD7dfr2ml4s=t!`Ya8+WFP>arbj`eJmI;w6Od zbAShK##)Go#;RC58Ij%NOQaTt)O>NDRd&iNoLRLgGT2S2 zO-H5!Y`i=UxG~y&+@hKLkUI4-mlW}4glz`Qqwl&7>4Lc86=uBph2ymn|7MKMtlOGY+)qR=2F~Y<*(Uh^sIDX=&L<97ez0N=kL3It$*^o zJIr-0wv|K-zRbp9`Rgx|Kx9EEdgKPKax zOFGyj?fdyeJ{#!0|Mdd2PM%Z#1@jP4$nnl~*X8zl!>Y^EQeozt8~17z(`vHHRMo`k zwc1>4qj<~rd&AvJ?_+&%yt4bT^83fhg|cO$Gu(Ezs6&J<+7DFg7LTBA?U8Hoy+@*V`GHGy|&cr;ozHV4ZUw^=-?%Ld6WA+LT- zdkHq^QWMC7xZhbzIoXY{0l2{dQt_?WJFg!cZlqHy&lvR*q0>Zb1~9_={Ghr8dTcsl z_a=I&X^HJ_>t;>4t4>$J;l1GD5`)sT#kVZ)Z2gMWx|R z?RBzaGRS+sZ=t408)p==R-=EPBGAhZm|OI}HkLI9#N{k!7K`39{$*1CZ|(W6>+$w8 zfzMHA{#mfTB%p6V=MeVqw(D2iQ+m97P#CqerRdtJo!D9LvpegM+n+zlmi#f%&f=4o zjTlL;6TZCrpF)`g!?7%gzE64oSfRG|Qai!kiP?v54V4_K#SOxCO45tkj3WB7)j0)8 zLPHaft8&7#beNM-;-~$yKJ`xf1G!Fnk}f-Gsl{}FgXSe&^pwbHWb>9C#GFQt4`xjf!Ln4lM4 zC>NsD`v_*QZDP#yw#xf(7K)CUqM|ZFJk{h>2~h~STCH_-u9QM)KO2@yWv$XT*gFcA%OM7$CsJP@zZzdfehham@a^zo>MvO+h*4JM^BeJVy6O` z=9K8Ad%4nDMZ;940nrrlsjzFa`Kc0=?5+PZH^7czBW=2O9!GM9SjaRB_VCdM>VnG; zE^|&U%OWlaqld(+iBDH5VcpWu5UNE|ikrel@(TxOaNNuGS{=4&T}-z>F|+E=(4MKI z_}=SXd!0^!BiR6ZD>?rIJqP`p^x}hMoPQ|3$6ukBsANJ4D5qKs&mQ?XO6#qDSH)Yo zQK4==WqK|B;Wb_HT)ulqk>Zak^|-@|6NTW1c|2t%e?8QwWjodW&dZ){2{NA78{>tz z>RC(4KzJM60or`QzLg|Eq0NnnN7i0~?6=Y6d)d*tQtKJ^UR1&&GC8<*qejmC*(7_Z zN}Inu;Yn{^tcBpo(04h6iJBU&8*}4N z&tCs(tRm|suzJaV_>l2@n%rp@{t(ePI){=1z+G>}VVi{@{TIyVnIszG7^*>wOv8`Z3G`-8;b!duaf!^qg(zVgBBbKClQT~>8JNAJ+3IRm7FQW$M?-YUPtRlpl0>D>q`uynNfYbR`OU6= z!?Gp>wANvV!x$g{gXHREME@?)YHRP6+?hjB82OmyFXgB(0634HSc+rZ)+^y=4<9lB zrBLznX$E+8d&X?d6~AjG#i~bH#^5g_!<~fib^POl{wn9D^}6pS10{CSdW}NmTv!u^ z8G7Suic1ws8I>#Dqc+K5J#ooP1>UDdp+Jey4oDJOg;Qqt#D#VekQamvDLuz_D?$DaJwKD?CI2gAXls}1X;43Oif>Co-f@oi>{)nA9?PaB0ryDaA# zhO0hLe$W-vFTCUQ;*3Rt%EM{nVQT~DyUpnK9NY8kD!`d6p)eXiSF6h^oFy&c|Dfp;*?2I!mr zJB+}{1ZBGj=>5V`vqq~Mp^MyUf<(jvCKhFv^&;M(AuUz?nJD>Idum3c~PsPTlLG=ywyP>z4LB5y2ewX}&p;re`2YNTtK)v*1Shnbyu zdP-Qaq{rqA#Svncmu1HyB~ne}t%d*h6!uMW_BdOlraY)jH~arz4Oq$`bRQ0PAQ2gt=IM@!>4!qhK-2i17 zV+dCZi3a(B6p>f;K_;yMzl}7Hf-vV8Tduk;Kf*qOY_xGVvtN0{^U&v_Ej!2Nm-|wP zS?|!p)uhA@ln6U6avvy|6WoOkImp7_110$Ml`5`#rp6SsN`U91p~(J+5z_I7M+Zk3~0aU z*0rq(4vZo*p9z!0V>yl$Z_%|oAY-x>*55+&RTf7H9J`^mwP~O@K*_jdsVX%g(ihxF zBEW9bt+!Tv`fe#$n>gQH_v*WMz}|seLbQ7PMrFLk=#&k(J3v#HckZK7Lp!te#d~?3 zg}u~XutEhG6G4!>mW?d6&%Vb6&|*=oWPHa4{U=vDJxG?CQkYI^%MZ!eGShp?dqZi^ z<_1)%5%^#Kuly1=UIniIW0vg2ENb4iGpV!%qS}M&mkakih7bI=QCc+LOD>aBjQoS5 z#O30ZrNaE4k{{_K8Aw`b&6}?E}0*4^?0k>D8 zCQNYWZ?R^Ss~Sw5t`dg+bk z>x*h>L)%@|NLA5km5$;v?x#wp^$FpQ87bUqyH*(jN~4Duthkzp!=-8C#Ax0 zoRoX{x}Jw#@Q*&ED6`;9Wpm8x@I?fjSHsdx#q)K;;xbEZXo+gI6O8`22$Yb_#b+P^ ziM0o+`3l1!l*9Dh6@8@D3?o47l9ca|;aZ{fe|HGfWof0iY5=ZKU4_2Bpj(rPE;yWm zQHLhYOXWPcvW#rA?OLfT>00$}vD$6fjB5laQk-6Cwe>ba%GKWFjc0057}WCO^T~B7 zd!xXc&b{(-Cv<5Y(e4JWJ?!oC#p*u2O3lgrJ)-=L5sQpLL%o5vN)~y-vm#29ET5() znxGb_A^m`Us$=R5RJXJNaJ*6CEJno=1*+KyElh-dxyJMbPeXO471zpRm$6X#qyTDT zmY-$F5V5Kh{jcPg-$B`#F5bGjg71i|LRq{^-iJOpnpN)SRC)Ws{RLvrYUFRd6fUn) z^&~NB@6+w%i#xx@<}ZHmPB(B4W->~qJY5;x_?(pUu)yo&?4^XL%M{g;{7qgBc{Qvc znAotdfFdI->8f*zMP9&OLv$>e0hFy2_ z7wAcY71&mIJb1=@)cc zT*}v5(okmF@uYeAvzNR}ML|SvmDGsxzI(Ce+nLvl{>Hg`gABZSS_w^a$D1zI8{_#R zRp-W88S>Y%LwUSHl@2GX?$;r?f+Z}k-oHWEZL0P1TzI~>OgcfxQ3}44mfO%zG}}(6 zPdNH(C{c0N^7e*C|3q=D&#h-7#@+2kyZQMGrlqw_JOY@M!GoA?yJmVMADE@lum2rh zskj`!mIYgltb`oK-l;BkPk`ibM*YXlrAP+SO|oE8W&C#9~aXrA^=`rdFl z5w88p-}vkeQuNZ1A0#Ee6H;C3;v)ivuQA_O@LA0~ zbc}=22d=LTX5iVi93EU_#y{qMXE8i?aO1*TJ1VG)(|-1y|M;>Rl$l@Qv8yQ#S)Ore zb=YYZ0lE|R9+lUi$wzUf0m&h1NhP{MV@MP<iIYe$cYU`m&-dxhS^`C8V8)g&FUom}#oq`c6j zIz16^j}FmW@d{vB;IpM~GF7$BG89pET>=p+;1=__nZ$4~e6mzjlh zG;C0%;IQssqlm4q1;5;B?HlL^k*rrj^|iR3V653z-xj2`{gQ-Es?D=6Ya?X$xO9yZ zqwQxbL0=Erv(?)&_){(PKtTX7PiuF0v$seU;#jn0T|kN9Z~kV@5{^!+b_#Ct0J5uU z%+0fQG;qAk$4{wKm0E zzZ#+kPi6}Bte{2+&*uNs^3%l_>A*g*F}nLi?Jl7MB@KVI&FbOfcto7ECtqoG^=gZ2n_lETOr(}r@}p_#KjzDZ7oQC zaf6}z0=YfkxG5JZdiayn%Zyb;+tKv{i3x3)9(DBl4tElSXZA4^#6D8H#B-TS_CNl? z{?IeD;`A?2)XTO@vl>AmRj5h(qhZAzevQ>Soa0j}v*bb;SbJ8bC+Y0JI*>u>?Wlri z^@V@z|F69W&4`&t2ajMgb9XVL*DXf$U)#3L;;8)$XiIVQc!6Z+F;y!x0+lAMYB(58 zZ!&)-skHj5(8VfK?M?(90a9TA2Oh+(T@7^5+E(zcGOUh;7E~jnFHj~F$DCufG(nPp z@3cHn1=15b(C`9H650o{KT`fui6tjxf7*0-$qdM=oRe{6j(QW9)XFWa!;~q6aJT9gUsQC!2{PdnMzQ3AA(`{ia2m z7g2POAwrW0MhHP>rcwTNU?YLRe=j(*zQV1>6=-frx%l9g4YKT8|>2_LGHsYMM5uB3UBnKrCqWzUl!>=ujTe> zJE56GQ+ev?&`eemalxYHuWVR+XsZ}jficqNRZ3=3SwyKt$7oX~dJqL~WcxznJDCmk z*-dJ@!jv^(*mZ`4<4W~iv8N=XVn;t}%!jI*JRW5gIx_?|Junsw3CxcHYdBtQ@~7hs z>mtx@YD?%h;lqf*i11^zi5wA*ihNjUR?V1uNLjIYIebWIK@?=+hPX*ub=m0;B{uHKNB$DxfxsVuYI_2(`)!92%I3UZM)A4|uT?s6yIxRHfScBzbuu71;p)dtUO zXdbCk>1Y>JUc=fX(T)^mGzx-8Y*s7M3r3lM1JHa+U}oLK9UOx>&_JM>lx-sSAm*=G z)Y=JWJqzkAv)QoqLq6Wyeg9FgJGK0DnRLS*EzQ$GVkyhz<8AP@ZS-2vS;%pcFpNhVjcfZAiy)N?Jtal{YlWmk+IMOHS^nkTHkeiYSq1Q}wC>i5~_m!OC2=`2NM-Z@^Gaaol9G-}N451wp% z=sj>&=+oF(dL>U{^%BW}x2DmctW^Hw-2=su2Q>*yc{IBFaffo9ce@#z57%rV3JzeDLDa)}XM&=Gi(`##&{@t|soYaJ3nK|Y#oZn49h zJL`CFS7cuIqm^t-<_arD7bM2%xvo2Y?ubQXq@2`jO{&F)x=qEEt=$Gccb76ue^92cUZmz_K6ml(eeWybNAA0y9s-T8ZpNOc%-H{h zCPrYvmpSC3Iwy(y&8ZeY{g*C`$Vl`93vd;aza$d-C8H5GCam(00p_@+ zIcWHSE>hrHX#DeWSNh!W+Qr~MXqU@7lLplbUa!nm^53d?7do!L51 zOI?WObdBik5|&oTis^XmNs

    y4kQVR^_NO)=lAu^_yf@Xx1JIt$WU{`o%15(4#I6 zNkF+YR-%_DHJaK?In%wZdSYV9YB|d;o7TsMdgyu(^<_1*4BrS}%s>~^51?eUC|D9_ z6UpL76N7nJPuL*QgV$5m%#r$juxu9lVny5wLTo~osaqSFtDs_%VGXK`Q(_}_I@=P| z9E2~CzS($YxzY(NDl!lAg|&{#+>T6y8o622Mcl?jHl;h|x|E@zLSSzINex$p+oYdg z66bpA>I9+2HN!!by`SYsp_|=?hwAf ziy{C+5NL(rQ_zLay;nH=iNaW_XjN(_5-`nzv8gG1NR0jPd?pna%`QuTlXk5 z8*Zmm(TKwPUMWqpczgx2*Q-NLGnc3J3t995#m7x?{U!|PBO_9uIU=f&p@=8>@i_>7v(DY_lDSkeXx?XqV>2G3&qu!}`4KMRUUHJ^_>ENgUUbV;XnOJ;XQU%X@)}&mrriLyG_i&A_V7O z&U1cb`=HvOj528CBh-S^iUb;kawrF)eHv;b_GPG)f6n5U<9Fw1RCUFDP00iplRrV%9OToCt8hM074NGT*55|3n>ESZJKm3DO z9G73L_W9rd7}FBCy~WRTnW3{O?TqttCwSX`9zQh3y%j-smEh3k{BNVv#@{2mP>$~~ zL8FNVZz1p}2S!bDvlcS@zhw@oaiFgKkuNIpP5F2m?iAWYoK5fOhx7UHUv-sB#nsJw^%l^5F#)%1R?j zk$)dcK@Z==n0jE^ZcDJVShv*M&d)OinoT}O>ej8km`_;`oROWE`^dB_lUngP17+Iv z8v)=*=Wm-hitx{zSZc1;zu9c}nvAWK$K^bay(fz%ienjU7J<5S0XUBtIYomyKiUdH zSnS@`us?TOm4Z2;fK49=uJe9|J@<;Nhhx!MClWom;;m5rnT3kAoQ$Q@q-=s`fqN1i@U&44blKP*`{= zHuSjG2|fyEdzSz_Is-cK)sJqSmh>3F)?4Jx_WCTPUQ#Vrk1pc7@(HWL;iPCv?sFPdB;Ay41OfI zi#abi-y8en)@ad*z#Xml>xnjdc3M78_S*cQ!K}02_(S%0^+D*R@bfX8Jf4}#TLgW4R-m7e5;`}#O!(?1w8lBn7a$h93XVy;0Lb{r!)I; zHWl|3{j@iuyE)8zR>1tN;O&;o5X>YMb%bEDVYy>?{1?Fz)M;jOuzVPHN>3HX zoiYKyN&3WvP zl7kGlcKL*IrjVh@c7plTKM(kYtGF(`oXaA-jd$&_aL_g9jX&~z(Eksl$;56)9?kV) zVH2ps?|#C*bP@_n(3r30Ovo(;(A9+(;e~_QuB@@$3&<17h;6<2f?)W$zojB*8v2|< zhnurW5hpe&9oSTWV7sU0slKz;qfEq@kyyY8-8tn}0xM7=UIrnN+j+Y2_fKMlzL2-W z4RrS}`PpBFtGx2KbFNsT;H;9lix<0WAG9kJQA;KxMNKT?p!KfEtIwb3vtbRy*}aez zVOYqdtQSC!VX`Mm8k@5?u2dRd(*PhqGZ~tJ{YU7cqOxC|#O`bjGWMrjHwlKriBh=| z?t&w;kx;P$SAbxG*p*Cb%L7F$lq3MXrsFjO=uw8_oW8g>8SvdMpE3G}Ctta6O7BZF zQOwK7zwc}W@=1fMhX{=T)|fwGpyG_ZFMg`oI=z6rTX@_A!1X0ITRO+T6EuHqkH%Vc z)W{izsB6Jzpagzm;xt!=7U3$ul62N$`c0kyydZ^-`wqgb62w$*_HK0^?fURVjAfb1?z?Zo_tWP)h zcY6xX-!fipC|J~2SStSuRX(fRgZD4qvYT8Q)Qq%(@qcYd{wN6)yLNJmjh?5c+GN{; zm2AxH5MjbVqmuX2;pZrqBe=DF`j)6AW1mnSxq^sT%7wnvr7(>C%rYC}l-`zV*X!9J z@;0zqT}^;1ysO*qX?F7#Yx2;WaOl6L;N+0r7lu8C_pS%(Fh0X*3a}|b4Ln8Yxj+Lk zA8c|q_aUT4Ba+vJo?_{N{g+svfOY#(qx1gHD$^)%e#mj{n_Qr${`h)-k&J=9p2F(MBD^nMAdRhfQcRrycto_8<61+@F44 zf*d78FKe9Co{Ih^_i}eMa)cQ%T#YI8V9j5k0sM%9C&Qnns+ZnU)pG%PFnk4ek)Q<= zBXT?(rjXDQ8N<&Yx(=MoJGS3MK7(WZ1h<4E`yH4J^cn?c5bcHh$u}S!ZVe$~lM>!V zf#f)FGGgBw?C7>zDmH|J+V_g6uIXsI>(i!h_nV8UwWzY$@B(mrfGbvm1A^z{n>};X z3SXe;fEl@`nGV06tCI-7XsPHPyco+GjCz5NxTDuTs)xFavmsRinrU@7y0?w~+x?^W z(}{dy#;sY-aC~79{O-OyGm1nmcb<~?pCjHLrM>qOq#Q>bin-WaV0dO4l9Y+iu8_*h zz0Q;7U38&R{Tn0e?ZQrz{e+v+K%6PI}kJc~va-@h=FSdf|B3C>0++3RXHt2jqj?I*M6 zCKFb!;9b5+5Th<+V{vdEwz&+8eLr}MGu(EbFqL(H6w!e?P_%deNI}U4qD(_Fv#XNz z=U^Pc6eAI|&a4o+!~9+obH7pg$F(FFTlj|w%2SBUFRh$~l+WV8Sz{$^~hj%a0Ht^CA`$K^<9!IuZ{_tXae~6fb7^D^Jqp0nR zk`;**8FX0Au8BB{=j<~8lnX>w5Rg?m5F(pNd7T!LeO6)}rMSTNCPz%b7hM8pEZhVr z)^KMaxLM-LQ%!}t@y%pk4G>o;g0hk zKk7`jg9q2ZMG(;hxBA(Qe->TleBLSnfa`oixw{!o?Pc&Aw3*%AKn}~->V#BrJ&)$v zEVG*s{8X-9R*3K%$pOL|!U?N`9O5%7Xnf@Bh5qXxxVo>7XhIxe3H<}Ty1I?LI(c0o zjP}2y(m;XfM+GP4))(SBj1PM~^=bOWeOp4Gr`h*3b~EmxyAnSGDT-$ZI@>!7C_2Uf;m;3%ANiIh zQGw=J*ofmSULuiBQoqTy(LhdHfoN%UF^ZJkMo1|eWjCqMXYkgq0N%3?oP~kqMAk7A z-I*H-E^Y*_th(VIRHrx`WCHoFF`1Gpe0Vg7X*+-5NoS}WBR7DFMb2*Q4Qcdjqd+jl zM3S9HG{ci~pg!>X@ee<)ee;OnhOxCmYHH6KV-917e@$5#diuMLZXE$~Pw2>B9XoS& zwSv6mmG+n)eqMEU0|QK*12*z?&rftevJDUk)PMe(N%`-|d_8bFMV*EBcWDkWiUQI< zf6^%g2GBxrBJ(eGPRy%`v|Y8Edu}slTjw0V^@Su)saes_Uyo*P7h3@~K=*QWd85Znb8 z_)ENMOY%do5g51IA$zzrhwdBjFwV5*Vu~dKY>LU?njO; z6l4f8J~O#`WZd0Bxvg-`j7PLn+h zzR@d=|hY1DdUO?ub23+yq0`P;Vu&thqEU$^$n*}FZ)Cd zaP!C1l{J?P8{>cdodZdU7ab$OkRe#@;cz|1ZbV?M0a6#ocH$>f__#43fR8_@Duvgx zz?I=o=kKIG`m9}{X)c)Ot2HnFQ45P@T#pA70#<4L@83a#-TCEllOlJfF2de$&4&O4 zZs4)6MG-~+D1YPbp#EEE<{h<^j)-(9D&c^N4*es>L9-psU}^bHqx)2ZX>h2z4Av8JA`HXCM~x*rW3KkNrcx-vCLl7xMg!5hx?bDDZ-i`5wgBNTxXz30Fdpb)sL zfxQf};}G%WW}jlltPOJ_oBHEf1&Txe`|jWFTW6Ilic-w~iD7Z`I;ZFpC?KvUn$G=v zlXt}XPK+Ha1+wh*k-np|Ns<9?r5K#sn|a(gn7ctZD?b|FA1%R`fn4kt1BhJK5eL=U z+XZ15RjW|eHap%?q*b1l+H_v8|55H?JX4gr-R$Ze&-B5%`{H+Z-_2jV7VIb*) zFF3pJHR?_#-jAB;*X!adlb-a()*Vh8Zi=lxHOF0ehR0H0k0G0cIc&;mwD@OMz%iBv zfW*1cy$iCqw5&3;<*l;JJm-lGzIIRvScKV~lx|KaZPJ&*m&u>~Le*qMe-%keUnGtsWt>5k| zJz~qKy|ad~+tI!0>M-`OD3<48$0G~&JeePAcJu%?{W-QQESnj1vBK%h+RrZoyfn(K ziO1)-*@LGl#eUqAGpQs2l|Wf^DfQ(!>~oA&%!@}>(5hK{IMUDmE|!;vQtXFWlKDOG zaWPIq^q6F>pGzkj9~#{7E7%TZOd&(R6z8(7bONflTfnAct?JW5~?g7nI`+R)sLk6O3VS6cXFDg4GCO+{i6F z{B;;n&cAm&b0T1`;_*wkwbv1%G_2lO`l9IVbew@cZN!T`T}|+(lfv@vXuAjXbBlAU z`MpB}wifC;X3{$k3B`JWm!Nm$4R=0Oq!xck6q-I1-ebK zTj7|2{L-LU5fv#|F*5P=n3rq4LyQiZxw2|8>4&Cs(;;L~{a}`KSgaPMI0_R819@wk zr~y3~?HAh|{Z&f4Zya0%_(E;X;wN!jD`uVN4)h<6FU4KgEB!t9{x+55zX3`8S#ECc za9z}(lHn38TryiBMGxf!yqY9b<4He~bvu$2U?hD4maBg;#C&_-^f~~yrFu=4bEz_; z@B0o;0LG81Sp*(y2eOKq(3fgQ zDQJAD;W6?ZC^EPp6Cd9>M#K@fIYI;vJ$QA)FUWRPQ-y3*WP`Mlnc>EO&Y0*JB;Id+ zHa`yML?aTe4%Bpr-U}&rF$Uju-&?_QvPOVS2Iy;dxpo{N+HE$C%7rtx^9m|#J$71i zNcs-ycl`Vfs>8hmKH8?|Hx{F>0?H`iheS`Z8&dFhI8(z!0CEG$KP1HBpD}ex&oYh> zCgTVD2?uA3HQp4Z+IM`N|J|`gsW>P;0TCKmRoKFWvnmwbmAG&*lKm3nYDwr=1~d?A z@fyy@8=(aXS;QCT<_|agO#Le1>cCZ-W6w2cz7hNCqhF;YY4#Vmv7FBA)!XidHBUw& zai*Z6@jP{Cj)&fZVm8v_JkvNkKhh$Cp#>r1s3i%vTTAPs8TkCG_hxovxT*`D z>XX0I^-b_g@|*Q7OAj#*G*7>uynQ;CPW>?J`fM)dy>*}k6T`O;c%JArWF5kX`wVl5 zrLi{2yaL(Ez*nuRXI(;A1_?h-jN^vP(eFbEAxc5clgw9WHOGH|n1n+pZBohaB42%8 z+|?TjBkvO_vv^Jvfs}tq z^qRFK8`Oc#ebwM{aHdp}fhr9cS=Nh>cXt_V^{_?(GdS9h%?433>qm{5awmP0O6zZ0 z#+2RRTYe5Y2u6qN1Jw-UiE*jf^FxnBuZcc8V{kK%C8G7aaG`1#<@e+1fC!?sNU1fP z58$B090ft6`I_vM(iYDj?L&w@eaXX99NPzB{eV=rY6s%eWcnU3V|h`&NY-ml#Ad14 z5S9QMh3HzSk2W>ftG^}1;ba3j$~qtuXYJzeqrieYoxq6ioFD>dT@-eNVJDdB0Pn@| zs;jBcE83Z1Z3TB~h-(tXJ7R)zLm!Jz;De-m^^cDlx6htATU-tP01awyqD^;wkL~EE z-ZX?%hYNoGVCFa;8HZX)r9eu`KoYGp%R+SfoZO}7v?rhPUC)4KX`~U}W)pZLqwnY= zwPN;8Q|`?w-Zgw0$GbE$xD6auG#8i0X)XeGFtvoQVE%`SggZ$+ab42M0D+@L+}|E< zUOZ`!0_n)}B(KB19?crQ8P3WVfEqctR^XkI+0vGvPh?N)MEwkTO?b-6fpOZlVtY)C zPxF@MTe)8x{0#Uq4R1EPr*{MDsBOKp?y3jV_X8(xEvLuHFP3n++*Y!Q986P+f$wHF zS`U&F^%5M{s?ksR6nVI!imy~vQV>{x`!XBQpe-{ertxE(z5%jic)!WmlkK1f;u8e1 zcr*KJEVW7F1;r~3Ez_;2@_p)i5_MN{)M;g%(xg~n(%6CprF&eCEYc+vO8=%md!y!R zZ=!o!AkmCU(P$EQ+#H&5-x=HcwLxVyL$+$?Z?j5f^=ZE96_2waH8GI227xG!uR*!j zKbmjU=7kr;z`>!)e|eS!%@B=REZdr|;RAw)W>HzZ&fG;enUKwr6^10? z=KFekgcXpwV#~^S(CUe1<7R&}6ImzpHr{BE$iGUJ_=FU;5$(27g}k#i08J2;Jk9(c zB2;j6FdEQ$CU+<2rg=JX?u$RYcX>x({0PAS78BcWHC3|J(@>(atph zCmZ_Gu^EYf*o@;B;NgE%Q>ZZD>^s``&yUwSAcler#~-y~dJEWdJ7yoHuVn%JtIyuA zgiVZ8c|mASh8c;O5G8eN`by3a)$D`9g%LG~?0zMB5n7WS(!oNjSGOXtI7O5RC8>J_ zr_6D37rhPfHP9#CgFP;6B73`)h)Br@8Og}HDQv}$~=Q+=_&$-U&9^ZH=4!LB4>{7QbkFi`(Ck7A2{*V`+sNQ_Iq!_D{nEDXpxV);6@u9!}D)eEA^f`2k-i^=7xHpXi)t zfM%`WqV**Y7h5Jh2>J&@keX`iG3DaV&%9YR`9f@-8iPNX@2`U+wE9r#4)$s_eG=KK z3}*82ktO*n6*b*g+VelUP3Q|-iWmZ^l>G!ydZW8V^S}GvZ+;RkBtub$4dy(BP!rxQ zx4a}mN@4Twp96eDWafLYATP;pzfCq7k`eVXufY^+Duti_Vh}BISCVR4_v#r>uT07Y zim-EJ2apk`A6pI&HsnDIuTr1>k$Cz;m<&ocH7QvnPU)}wBvp-RHO{p{ThvRjjQrE{ zyxmL=C8d5xZFTI?`Xhe&-Yef`IEAkQQXl_jJ_!Lg&bg+bS7z4_x3MwftKI?MT&r%& zRpCWwO5&_pDVR~ZD?<5Jtsa*3 zm-uDesVFodB>jmzvU`86@)e^TRv<76w5eusqHda{PE)?8XUB79A#L+KR5=5g@_5b8NeE#gX@4dY_+i@A}Lk z9VQrpcwao>r!!}WwyutJb5#)jCR`qL>S^767MwLA%jPd-e7}ZwJ=&I|46c`Ag{BvH z=-g^&qfp6&kS8a8=*v<=W98-f5O$K=u978}5JAG31YOJ-ah^ZBMO#RHeM&OfE*~tz z{d~Y=VMHh98Qw>8e`?+~0lQXHI<7<%YpMc1OaPV7gMUMKz3al(jmwj9pTMsZaHP#K z+ejdqZ0dRqaQLf=CwpqI&#u`oe;b}q=2X%o#EQG#L{+&%ZbsxQgF=W^+^ob1SmWQE z?of=KOJd0L{P&h=-g)dhL=0^V$9qWGK8Z}>LS0)v7QIkWTc*{6e9gJ7{n$^+@Il#s zwE&Bdf9n@)w_vn2QQH!JKEu>2g{Laoy`McQ^CZjjKT z^~uU>pY5EMh#VVrbQ>Ze6X3rn?PUQ58n3##(a*o!S=3NQ)Wn`v7*LC8BW$~Oe?@hF z&*qgV*S@s$;N^+DwbvQX$qg>~{}J(D9ga)S_ORZaa4ml7)pk_I0mN-9O{}DU@|6sN$ACJnzC%iJ%sEUVSXlu8b!+RlXhbg2f z(X$$RhmylcVAKhMyu$c2D9caSpjzKNbm9FqBXTrSs6%QxH0wUV$G%-jZlVe9 zgJ`$5Rz>XSr}5yzt}HpI?2Ee-8SKgSM~kaol1o_I{MX-xA2;Iaa2b6 zuU`pI+$prtG_#0Vo>Dw8-ew`TeoTM}!$m_qc9wKD(_iJl? z(wfU+_&ZvCk$jO6AxQda3ErN6(X_pehda_il0{#i+lLm#>_TKPnMEp393e{KcVuA; zKYR|xrW>L-t{-ew4*k5#^|HU3t@?enb@e6Ip#7zn^T|{fBDL*2a#Egja?fd7`9M*z zc4SLegK+&RwgMkZHSgl_&+d*C7YQM;B!-9(;Ut+V?M91+iyOkC0p2ZtBCj|H`M9lk zA|_-8LA;}rdgW1IZ_SrBJH@LTgCASEAoXI%d!Lk%f|0ab_PU=5-zvqb1BQsbW;|!z z`HhvDb=f9~WQ7-F*!?x|iw11_YlquW%r~gSadyWNhW=Nk zaAa54^zLqa=Yt2sJxRGSz%m4t9@BZVu3^8!ctJ;yFFH09nzeLr4()Du4l<@y*wy~L z3prd~5SOxJoz=|M=O41ORE-!E?XGKy^r|;m2sMjvKwl(D8BzbnuqwTLEe~N6vBqXm zkeKbIPCPSF4HurT60nOs)-JhaA~Zv9NA_=*`sD2cliX7R71DuOt@O-@$e>qL?eXcsswq|xJ1}|?_L)1Bn05lLS!Bq7&CWwX0U1q9rfx5=h#F2{4io_AH{ zp)J_;+7QMHrIMYmoDrQ$boV(G9X~`iON@SCS?UJGVOAQH(k6}XNhnNL{9DO&JHbIE zRFy0+*x3J6YTs!Rb$uMe?_@P9eoX1_1j1J2Rc)oV56sMFyK{v1&L}UNO3HlmdeFF( zh0P92HnAINGYWtFi)0lpbZB+ffnO3U@rM__H{cM?qsbCk>*HmZ>--``UGFAhqVl+} zS9VF_D+eLnzKitTy#*V78C%6;jIf%ga=WbPC`rW?yXu?YG{5U$0V9*qgDNFkfslJpJ<$Gw;HbXdM;bj~wMqZ4#_4bzRAOazPjKf|w;n()e> z8R9+$0(0nHih^o|eJJJpY*#hHSY$EjDJtzxCAF`KJ?z$-v2XXk^?V8f9TH!&Gsj0P zc}uQJ6tqi8JcYmqHEM>rotMzfN}e>(-8T>kgWS17PBhlL-Ad*eI^T9E_rYLk_(Iqb zFRjnbT@yq1p7e)yh!^NmK$FGeZY56xVgq+ilK1O##X6d=<`*R{1s{sB9L^Np4qJy( zvc&3WwdJ-!JAtuM&*^~Tfq?U}Tu0ppcCVPH;!Z=HO3CVc=}JV<8T^K++SZ)RqD;~? zsl35eRnx-`9WP5S$|yb)g|KC&34KJ)wn|sBpdyP}$ZJnJTNu8W*|iNaNYtn4$sYX~ zeZ{R3EY{E;ly-@YuWucEyq31);(b}8)3h%=%(-SHhaFRy+Y=z>sQ0g13&}qY+~ZHY zfx?&!3yCt8>QTBZ^_F^{zr*loK>C|Z)km_<8NQk9T5&C{xG-MGFOu6d71U|pVcMBa zSD;(V;Hs6bqpwo1B>r>w&$Y%PY_(7dFp|<1x}x&HlK$ZVJ`-IgQV^Q_)XZ=+Dpp*= zf6h)|a;KtM%xA?9wc;xSA}HSWYj&EEJFm}nbn2qmcTt6HTgI84%;)RBrER~hhYfLh zIC$_KIqtjeTtm#6oV(VXsFzzET$~OWHu7;x}G54@a%luP8i+8I`>8 z(zi8tx~rm@9ABXNX|Yp;K?>Mme=<_o6hA?JhKa5hYMKgP5}8T+O8pT}lSlL;*!bGI zwiDR&nfwN3x!tuOcJkc_(pqWGX^fP_9aM~E$u;Z4)7YEd=wmiTv-xucCsXMm$%HDs zQGL~?Wn?Ce%cj55Z(rQveokHg_!1_5fR9vRsXGW#X$^=89B`I^g?8&Ap)y!QSA8sq z)LXue53zdymE3~rD*E5MS2o`0+E}&msk^-edY4fAMtc@1A+Wt7EbNY2_Og;%(Jh)B zVt2VdtM&5vcXe_rrz0-HzTMQO)t;d`FXv>@1LQ7tWo4m4acp33=DHi&u2r)9rA%D+ z*qOZoBgQIM_l=rtudi-TILiuhr^lo`>yK@7q;6VC;!lL-n+Fd%gH_a7tbV00)#s@X zwn*1@9BoGrl80R-o!lM{dS=x0<`@*DQcja7M$k?;ta69KM8Z3QEwNCdZLyQ$`S`zs z%h#0D?ppZT)6gX=R?s?+4`x z<3wfOZ0f{4oEE5h!6PUPu`WlT7n;s_gb#k*tj6@@S2|Nup1Q!(Y`f_-TC%dzh^Qg@ftxbHx<{w^4h`G&Kd$7XMyR?|pb)11Z{^DKaWB zv^P2>E_`2Dtu%c8M8>y1vwcm(SlBA?%$sCL4b-cu=LGXYp7{tV5Dq`L*6ew~VeDfi zW4;BHbI7+eN(+0CQ1I{HDP35kGEOY{lpC_bjIh(`WBDZCJ5==UU~93NGhM7DJ?%%H zx@x_t9Pk;loo+zUOjWam`fLMO6i##6%)LBHnko>ulr7+QG*t)>-`Z1{{SB9th>VQTOK+E@+SOabh-9_0^m=|tsYCadj_wC;yE>`1 zt5YwiPvRZ5Rm1HFG8@I0-Z8f~{W&qPZSk+EwAcX>$(NAy>%i%4Rf7hyb;5L}p5`QV z)u<2NRvq;lyxCi726QzmN0259TfX?e5D`xE>o;`uUwe!uX%$P3gM&%J!N|<;7i6o* zFjKsapABf+{(ay$h3t)2TuD4SoHRJ9tMoiGGsNC}X1B|RZY!hzK>_wt`iP;rM<>r^ z=3yC-FDcW%k)$~#_#F8=!;I>!*%QHzE<%5`^5OoTSS0$r;;!=jeP+C;VIRMtWeNAu!l`GLM?)70QV&0A=Rby33z+d&e^yrVWs9d1?ihMlB^F;e zsM=bVsGOfaoZQ*FR`bg|fayBvsZ*v+6cQoV2*3ODYVqmj$r0BXWgTYc6h>tp=va00 z;2l}{4Zq%x#J1zx#7t1= zukaN=3bS%BJ=Z3|%5MFp>1HDD(FDO zL2k!lTG{t(sho1lO4*lr49){Qr#&z9EOiWbto z{d-FRO{ZY+8ph#y)cupRbCtAPUsVF@=|39A=uz7<`+H+pyekto7K-N!mPRkvKvP6C z>m#@BCXH?2YpNukT2YC z%~ed56$o8X?+g&W@|TDorfF-OIS}A3ZWG{UYp7S4%Ca5|Kq#pR=>X39^|z;IoXu@# zoU%>kEz5u;O0JVN(qoqlM+BO#j#@2|B{J#_)~Dl~8>Gn>qUWukxo`F=+bI;)jfCB? zJnXN#W1h73?@9MCZ@TzCkEN^T@(r4m;Xe~mO+osY}rCYq<( zAmGI0QF5`dchWN`c}yP=ZS8#f5G&2o1KsD*mPivS;sWa{7Cc{a0^d<`-SYQFpNf;r zt9+j#->laEMXXGiQ|QO>qvN&IDAuv;VF$%Hiteso{E@rTCn8>)#uB3Hgm`jdE!(f( z3M(%khCy~{ON7O!s2m*B6~hk;?W6TMQ ze*nRM>a+GW(5_!oD#XV2*}sR$8mv-( zt55IP!uT#!^_|A%?YWFPlCB&hA|Xq(6hJ}>ltCP{{O^Q~fd za0}-L%Zo(jgH0QWz0mJqh|!C?@>VCd_W z<=dR=MMe1=Eu}VkVkp*fI2?*AT)|{GndfZe@05*FVsG?2;2hbX!ZF{T%(T=#OqYyDc8B?pPlY@%Qg2NzXD)o{;^OI&5`ODRX1)ECZ9fq0yl5 zbD&~b259<-Vd<|}dA-H5W!VNLGlFbEutX53mF?->F#Y=5BJD%Hg(^J7o-_1U+!gY(l^hv#Wv&hoA@u9{igA@qK6}w1MQlAb$xRhq2Ca}ddaOVT_zcK{pPBX zWsrKuvkysy!YXh^^>jkkXB1rg>_JBOmsrNMw5;)2Y_yA#Z2ogdJ3z7iL}umCx$VZ= zaVWjfW$rC7Z6V#oTx*E;M%~EEX;AEV!Ktt_MuHlDx$T7_CAgwCz2FpCe?8z!De5%b z>=;S(Cf2<2S2(lp$~)u|89|J~jM-l`-uj+--!E_3DgJ?n;4*e72PL`;}K{}fBiZbtBXR9aWB@6_RIF5Py{xuM>)EW9A01<+F!q;tPX?o-OPo|#%GfX zO3J|;2}kFK2sZ^1h#e!H#@QZ2r>aP*!Tb4_ah!jN#$fawMppH1t}RD~`;eeSWmp5~ zLDH)rG^hxtee(=5HB~A~uVgwhx~>y&L0fjrrIUG=oA38 z+q$=BRqegM7b@7F#0kaqeYqtxV?4uZ#K=>3{erCvD2*l-mNNvbiU;Gbob`8h*)E!$ zxy6DZ`|%k55GmHFd$G6Q^XXf|wz;*TM>c3l4QT{9tk0J}yKPGq-C{Bj?OgnqK@2Z= z1*3lIqWUw#gKW=cRq>5nQPSV)-l}0hq0B>(t~Ep7sMB$tqh}HM{$<6cyLzONeh7OS z-u4IvNLJrbvevi1Wq%+L)(4#*wDd{zU|PW$nl00RHf+|QA2iv&2PYUtq`KHj;`{$h z14#Vz0Q)(?Ofx=qr3{n!JOVlkhwz-9ZigL-!f@B9hfV@^U5$i4s*`g zGVn$7OS5RkLL3j1mb|_eh=ZgJgo025uB#~{NB9D4MK&iJJc<+078ZR&(DfZb7wY-Z zdjEWvw0`f~uL{3NlC*&xxSXZVotCZg=oabwJj{?~T0svc0=jXGfC)v|+MhqZy|q5H zSLWR8p9V*7g7H+C>+2uRHp+)57<{tb!)0XzY)Zn4>N?Q0=xRaJwPnYZ4+|0JP1K{e z?Z9eDy8GM$)`*&-3mWmQU#hCAMnS0+-vlz!pqQ@2$sOPeIcAA8_~C#W{NfGg8JBV@ zHomsVxS%Jmp96)4Aw!z6n?G#~HWJtW{1(e}0c2#-5P;96_ob}&M!5FBNjaC{D4XHu zI@SmhXLs^Wq0Glz)v;R5QP1i7r2@8%P*Wgi(dgoAbt87Ad*rTt6wkZ6a5~=be03;L zB$_++Xx#Y0o!Op@41kmHBuEcZE}7;KpJ}{PED_atKqJ+8kIQuIO7EK~23sDG zIM?<~BUd{9!m;2as_D4c#vd*&@Q`5a>jaHa#c0RT zp%k_`zAo-ou=Pll;f7xf6qr80>>iI}5V5d+RCO{q+qfT0xN(1A3$A1tzP@agfg7E; zS_24clUgAQj7OtR$T+Lsw_Tc#PZxINQeQlAZ1H1i9TWd%SXMN}iiv>rekd$msyCQfKLH@E6T^)&`yA2 zdqbIrvS)^`E>i_u-Xy`JVBn*Fl}c8;4;r4x?oB`sF^ zlae&*b68jE^SK0ae4_E7#6deRaZ*!b{n_HXBIv0(DR z4Pec_%iPzesQKoJg3VG>L&WZN}K72yD4Ywe&{D+Tv5NsRP2(Tv6 ziVxPN_?dpc=~9ipat`jp8d*Q`i{Ckf!+GhEtw(qkJ?aH~mkL05@~T;BMAHFTQZ={{ zjFBAZ)2)w-Cr~&zhflpA znVKVKZC&*sUk;SJmT`jm*|Ri8IVh^v2>pgL$5a{F4*txtTaX8CTt#?dOcGznQ{0wY z*VMTchZ}TS-+2toON=xRWSgpVADs`^JyqH|81jx1wU3wsvS%z!>J&AX=na-Y4;MJ7 z77i2zyWj}WNn>;Zm?YQ5pO)RPvy-n}Fkjf>9RT{n5CPAl&)#K8cnIfh*Aqi<$l=9x zl4>Kt%`SSxz*$p|(z3~u9(A4ops*)+7T?k8H1~KZ6W3qrbB5XnMaT@uAkL8y7|OZO zGH*RSdm9i`i~=;;`{C0s49)1xd@=OAlQ@8NKyj&q9Y*E!eT%ubfkAB{nmrjvDT(f8 zJsGOb$$V6N`U6vk$%Q57NJ6wbB3Z`-E%y1PHt=dot?N%6Mm>mu@9!czpY^C?SYKxg z4F$`k#2%N$h-#vT;}NQL&+9hpJv$oDy)wKOk>KNr3lW^gzki-)@QH1f2=fMUGC3d5 zzb>2(5-oZ<9&V%5vFxqD$b`~B!T?nEYK#(JWu%TWI4s8-2A%r{-xP5r(1nGy84yNS#?ll3iK5-~vjTuN|S zjT-TWL+e_7=XN&FsU-1Nkwj=qgzc(h#FNR!nNbm!jzw&#mA%n=t6utznK~TY0vGuZ zGMRzu2^mQTJt_DXj7K`hc!*`1zyVdu3Kyh0kK&O#oMt{Q&uZ!dyEZ zy!ucv8Y~tby-^#Bw}1I%P@KrRrlyNZ>ZQSmSpfe<7#0*`YtHs7T#I?k#2?*#yOH4r3ds^y22L2u(W6|5`@ z-H&*>gp_o>v;gLDUw|%*F3sK1f(st|Ek;dJYwzNppW+q%mT-wj54 zM@!*OaVZww#*`}zC@NxLa8}aLIVN)s%aOAF!aM9=u(k}=3$2WtKjk5e<&V(S`CcU@ zO2yLAnN555YpDN5mp{@vc?W_C%e7J>rPCKVf0l~>M+CG@%KEHx@^G9^oiiv>N#r<$ zms3PV!V4U?&oXotr)4pscMwTH_U~27Md@6Nj4Ub?RWZcHAhN|?sKl2)_F*!%>S-KI zg>>V(3V=JhsKj2*;JpP1lY!H){tQ{tsa4ecnV!Db{;4ANy5vYZ0jvLW5TvGS98x@U zdeXTwAG7HG$BY-wR1l`79#y2QDE^^yn$-y&#K_nwD*tnr>ZQG~vAHahuzeb)8v`Mu zNf&wxW8bHIObcB6S1T499y4o2K&21lu{v5AJD znm)YSRw^GJUi83I{EC5k6+Shgcw1AC0W$^$)YvCRrENvLNn-D$BaKRjt?N<$i1$oe z$sYB8(~SM!KWhoubvtk^G}u-t;9PhOp$*Od70WNEL9+c-!M{l{*(*bv@>wIg)!zYoI4iIEj#*1Nyy8%O<(Ub$7bVB z&{B7PTmU6QHkRoTn63X!#r;VC=X!^t=3Z!z&t{8!YLCnpHg8QMTNHdkR=0vqBtH{T-|08)_@!d&1LH`KtZYyA5u(SfS{C7r#VtgzU7wWSbFL4O3U zK_&fq_Nk+uqwwbAqGv4~zyH}9O@Rjo{yDw$ha0ssn_kmEpoQ#q`7briZg@DQb%@u2 zNpUP*QHJl{56{QaNaVylsGdy9_UFr^A$aAW|bLr

    K_yO16k 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

    Ys63 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%0A8gQ;`iW;^uyR6mtX_fi+dy-;twOP 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Ⓢ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 Date: Wed, 15 May 2024 09:43:44 +0200 Subject: [PATCH 20/29] Some small corrections for "NL" translations --- core/language/nl.json | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/core/language/nl.json b/core/language/nl.json index b856aa86..5a88c2e5 100644 --- a/core/language/nl.json +++ b/core/language/nl.json @@ -98,42 +98,42 @@ "youraccounts": "Uw accounts", "clickto": "Klik op uw account om aan te melden", "needcreate": "U moet een account aanmaken of bewaren, alvorens U kan aanmelden!", - "upload": "Importeer uw Qortal Backup-bestand", + "upload": "Importeer uw Qortal-backup-bestand", "howlogin": "Hoe wenst U aan te melden?", "seed": "Memo-zin", "seedphrase": "memo-zin", "saved": "Opgeslagen account", - "qora": "QORA-adreszaad", - "backup": "Qortal-back-upbestand", - "decrypt": "Back-upbestand decoderen", + "qora": "QORA-adres-memo", + "backup": "Qortal-backup-bestand", + "decrypt": "Backup-bestand decoderen", "save": "Bewaren in deze browser.", "prepare": "Voorbereiding van uw account", - "areyousure": "Weet u zeker dat u deze portemonnee uit opgeslagen portemonnees wilt verwijderen? (Als het wordt verwijderd en er geen back-upbestand bestaat, kan het account voor altijd verloren gaan! Zorg ervoor dat u over een back-upbestand beschikt voordat 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", "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 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.", "createa": "Een willekeurige", "click": "Klik hier om uw memo-zin zichtbaar te maken", "confirmpass": "Wachtwoord bevestigen", - "willbe": "wordt willekeurig op de achtergrond gegenereerd. Als u de zaadzin wilt BEKIJKEN, klikt u op de gemarkeerde 'zaadzin' in deze tekst. Dit wordt gebruikt als uw privésleutelgenerator voor uw blockchain-account in Qortal. Uit veiligheidsoverwegingen worden zaadzinnen 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.", - "ready": "Uw account is nu klaar om te worden aangemaakt. Het wordt standaard in gecodeerde vorm opgeslagen in deze kopie van de Qortal-gebruikersinterface. Als u niet wilt dat uw nieuwe account hierin wordt opgeslagen, kunt u het onderstaande vakje uitschakelen. U kunt nog steeds inloggen met uw nieuwe account (na het uitloggen), met behulp van uw Qortal-back-upbestand dat u 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", "pleaseenter": "Geef een wachtwoord in!", "notmatch": "Oeps! Wachtwoorden komen niet overeen! Probeer het nog eens!", "lessthen8": "Uw wachtwoord is minder dan 5 karakters! Dat is niet aan te raden, maar je bent vrij om deze waarschuwing negeren.", "lessthen8-2": "Uw wachtwoord is minder dan 5 karakters!", "entername": "Geef een weergavenaam op!", - "downloaded": "Uw Qortal-back-upbestand is opgeslagen!", + "downloaded": "Uw Qortal-backup-bestand is opgeslagen!", "loading": "Bezig met laden. Even geduld...", "createdseed": "De memo-zin voor uw account:", "saveseed": "Memo-zin bewaren", "savein": "Bewaar in deze gebruikersinterface", - "backup2": "Dit bestand is de ENIGE manier (standaard) om toegang te krijgen tot uw account, tenzij het is opgeslagen in de gebruikersinterface. ZORG ERVOOR DAT U OP MEERDERE PLAATSEN EEN BACK-UP VAN DIT BESTAND MAAKT. Het bestand wordt zeer veilig gecodeerd en gedecodeerd met uw lokale wachtwoord dat u in de vorige stap heeft aangemaakt. Je kunt het overal veilig opslaan, maar doe dat wel op meerdere locaties.", - "savewallet": "Sla het Qortal-back-upbestand op", + "backup2": "Dit bestand is de ENIGE (standaard) manier om toegang te krijgen tot uw account, tenzij het is opgeslagen in de gebruikersinterface. ZORG ERVOOR DAT U OP MEERDERE PLAATSEN EEN BACKUP VAN DIT BESTAND BEWAARD. Dit bestand wordt uitermate veilig gecodeerd en gedecodeerd met het wachtwoord dat U in de vorige stap heeft aangemaakt. U kan dit bestand dus overal bewaren, en bij voorkeur zelfs op meerdere locaties.", + "savewallet": "Sla het Qortal-backup-bestand op", "created1": "Uw account werd aangemaakt", - "created2": " en opgeslagen in deze gebruikersinterface in gecodeerde vorm.", - "downloadbackup": "Sla het Qortal-back-upbestand op", + "created2": " en werd in gecodeerde vorm opgeslagen in deze gebruikersinterface.", + "downloadbackup": "Sla het Qortal-backup-bestand op", "passwordhint": "Het versleutelingswachtwoord moet minimaal 5 tekens lang zijn.", "lp1": "Scherm vergrendelen", "lp2": "Er werd nog geen wachtwoord voor schermvergrendeling vastgelegd!", @@ -163,8 +163,8 @@ "confirmlogout": "Wenst U echt af te melden?" }, "fragfile": { - "selectfile": "Selecteer Qortal back-upbestand", - "dragfile": "Sleep en zet neer of klik hier om het Qortal-back-upbestand te selecteren" + "selectfile": "Selecteer het Qortal-backup-bestand", + "dragfile": "Sleep uw Qortal-backup-bestand naar hier, of klik hier om het te selecteren" }, "settings": { "generalinfo": "Algemene account-informatie", @@ -181,8 +181,8 @@ "notifications": "Waarschuwingen", "accountsecurity": "Account-beveiliging", "password": "Wachtwoord", - "download": "Qortal back-upbestand exporteren/opslaan", - "choose": "Kies een wachtwoord om uw Qortal-back-upbestand te coderen. (Dit kan dezelfde zijn als waarmee u bent ingelogd, of een nieuwe.)", + "download": "Qortal-backup-bestand exporteren/opslaan", + "choose": "Kies een wachtwoord om uw Qortal-backup-bestand te versleutelen. (Dit kan hetzelfde wachtwoord zijn als waarmee U bent ingelogd, of een ander.)", "playsound": "Geluid afspelen", "shownotifications": "Toon waarschuwingen", "nodeurl": "Adres van de node", @@ -203,7 +203,7 @@ "snack5": "Lijst van nodes werd geïmporteerd", "snack6": "Manueel toegevoegde nodes werd verwijderd", "snack7": "Manueel toegevoegde nodes werd aangepast", - "exp1": "Master-privésleutel exporteren (xpriv)", + "exp1": "Master-privé-sleutel exporteren (xpriv)", "exp2": "Export/download jouw hoofdsleutel", "exp3": "Exporteren", "exp4": "Selecteer een portefeuille om de PRIVÉ hoofdsleutel te bewaren.", @@ -211,9 +211,9 @@ "qappNotification1": "Q-App waarschuwingen", "selectnode": "Gelieve een optie te selecteren", "arrr1": "ARRR portefeuille is niet geïnitialiseerd!", - "arrr2": "Ga naar het tabblad Portemonnees en open de ARRR-portemonnee om eerst de portemonnee te initialiseren.", + "arrr2": "Ga naar de portefeuille-tab en open de ARRR-portefeuille om deze te initialiseren.", "arrr3": "De 'core' heeft een update nodig!", - "arrr4": "Om de privésleutel van uw ARRR-portemonnee op te slaan, moet u eerst de Qortal Core updaten!", + "arrr4": "Om de privé-sleutel van uw ARRR-portefeuille op te slaan, moet U eerst de Qortal Core updaten!", "sync_indicator": "Synchronisatie-indicator pop-up uitschakelen" }, "appinfo": { @@ -283,15 +283,15 @@ }, "startminting": { "smchange1": "Minting-accounts kunnen niet opgehaald worden", - "smchange2": "Toewijzing van Qortal Minting-sleutel ongedaan maken is mislukt!", - "smchange3": "Het is niet gelukt om de Qortal Minting-sleutel toe te wijzen. Als de sleutel net is aangemaakt, wacht dan een paar blokken en voeg opnieuw toe", + "smchange2": "De Qortal-minting-sleutel kon niet verwijderd worden!", + "smchange3": "Het is niet gelukt om de Qortal-minting-sleutel toe te wijzen. Als de sleutel net is aangemaakt, wacht dan een paar blokken en voeg opnieuw toe", "smchange4": "Sponsor-sleutel kon niet aangemaakt worden", "smchange5": "Relatie wordt aangemaakt", "smchange6": "Even wachten op confirmatie van de blockchain", "smchange7": "Relatie wordt afgewerkt", "smchange8": "Mint-sleutel wordt op node toegevoegd", "smchange9": "Klaar", - "smchange10": "Per knooppunt zijn slechts 2 sleutels toegestaan. U probeert 3 sleutels toe te wijzen. Ga naar Knooppuntbeheer en verwijder eventuele onnodige sleutels, bedankt!" + "smchange10": "Per node zijn slechts 2 sleutels toegestaan. U probeert 3 sleutels toe te wijzen. Ga naar Node-beheer en verwijder eventuele onnodige sleutels; Dank U!" }, "mintingpage": { "mchange1": "Algemene Minting-details", @@ -507,7 +507,7 @@ "nchange23": "Verkoopprijs", "nchange24": "Geen namen om te verkopen", "nchange25": "Te verkopen naam", - "nchange26": "Weet u zeker dat u deze naam wilt verkopen? Als de naam wordt gekocht door een ander account, kunnen de gegevens die onder deze naam zijn gepubliceerd, niet langer door u worden gewijzigd!", + "nchange26": "Weet U zeker dat U deze naam wenst te verkopen? Als de naam wordt aangekocht door een andere account, kunnen de gegevens die onder deze naam zijn gepubliceerd, niet langer door U worden gewijzigd!", "nchange27": "Voor deze prijs in QORT", "nchange28": "Als je nu bevestigen kiest, dan wordt de verkoop-aanvraag verzonden!", "nchange29": "Te onderbreken naam-verkoop", @@ -948,12 +948,12 @@ "gchange59": "Ticker wel/niet tonen", "gchange60": "Voer de groepsnaam in", "gchange61": "Voer een beschrijving in", - "gchange62": "Weet je zeker dat je deze groep UPDATET?", - "gchange63": "Als u op BEVESTIGEN drukt, wordt het UPDATE_GROUP verzoek verzonden!", + "gchange62": "Weet je zeker dat je deze groep wil UPDATEN?", + "gchange63": "Bij confirmatie wordt het UPDATE_GROUP verzoek verzonden!", "gchange64": "Huidige eigenaar / nieuwe eigenaar", - "gchange65": "Vervang dit adres door EIGENDOM van de groep OVERDRAGEN!", - "gchange66": "Ongeldig adres van de eigenaar/nieuwe eigenaar", - "gchange67": "Groep UPDATE Geslaagd!", + "gchange65": "Vervang dit adres enkel als U de EIGENDOM van de groep wenst OVER TE DRAGEN!", + "gchange66": "Ongeldig adres van huidige of nieuwe eigenaar", + "gchange67": "Groep UPDATE succesvol uitgevoerd!", "gchange68": "Groepsavatar instellen" }, "puzzlepage": { @@ -1185,7 +1185,7 @@ "inf7": "Informatie over automatische aankoop", "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.", - "inf10": "Om een Auto Buy-bestelling te plaatsen, klikt u op de knop 'Auto Buy-bestelling 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 Auto Buy TOT dat bedrag QORT voor u, tegen TOT de prijs die u instelt (beginnend bij de laagste bestelling en hogerop in de boeken).", + "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!", "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", From 00e4eb765bfa5d6e3e6ce11368fe6ba4c109b40f Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 15 May 2024 11:08:43 +0200 Subject: [PATCH 21/29] Update dependencies --- package-lock.json | 204 +++++++++++++++++++++++----------------------- package.json | 6 +- 2 files changed, 105 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index 26ea2990..befcff20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,12 +104,12 @@ "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", - "electron": "30.0.3", + "electron": "30.0.5", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", - "eslint-plugin-lit": "1.12.0", - "eslint-plugin-wc": "2.0.4", + "eslint-plugin-lit": "1.13.0", + "eslint-plugin-wc": "2.1.0", "file-saver": "2.0.5", "highcharts": "11.1.0", "html-escaper": "3.0.3", @@ -519,9 +519,9 @@ } }, "node_modules/@electron/notarize": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.0.tgz", - "integrity": "sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", + "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -548,9 +548,9 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.2.0.tgz", - "integrity": "sha512-kOA3bAeDXFMj2JHj0R2fk/IT92qpu3tZHwM4l/PdksAuy7eA3/23QktCiAoQICwPdtxCYdt9ZLimKvnNyUpdSQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.0.tgz", + "integrity": "sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==", "dev": true, "dependencies": { "compare-version": "^0.1.2", @@ -3277,9 +3277,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.3.2.tgz", - "integrity": "sha512-dyXx1hHAW/0BSxCUNWcxc8UN+s0wRTdtH46u6IEf91z+IOWjJwmSxT00+UMYh6hdOYDDsJYxPe9gcuSWYCIkCg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.4.0.tgz", + "integrity": "sha512-nJJy4KsPgQqWTTDOWzFRdjCfG5+QExfZj44dulgDFNh+E66xhamnbM70PklllXJgEcge7xmT5oKM0gKls5XgFw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3289,9 +3289,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.3.2.tgz", - "integrity": "sha512-Mdc0qOPeJxxt5kSYKpNs7TzbQHeVpbpxwafUrxrvfD2iOnJlwlNxVWsVulc1t5EA8NpbTqYJTPmAtv2h/qmsfw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.4.0.tgz", + "integrity": "sha512-csnW6hMDEHoRfxcPRLSqeJn+j35Lgtt1YRiOwn7DlS66sAECGRuoGfCvQSPij0TCDp4VCR9if5Sf8EymhnQumQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3301,9 +3301,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.3.2.tgz", - "integrity": "sha512-nzvXSGxJuuZdQ6NE0gJ2GC+0gjXZTgU2+Z8TEKi7TYLUAjAoiU1Iniz1XA97cuFwVrNKp031IF1LivK085NqQA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.4.0.tgz", + "integrity": "sha512-9S5DLIvFRBoExvmZ+/ErpTvs4Wf1yOEs8WXlKYUCcZssK7brTFj99XDwpHFA29HKDwma5q9UHhr2OB2o0JYAdw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3313,9 +3313,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.3.2.tgz", - "integrity": "sha512-LyIRBFJCxbgi96ejoeewESvfUf5igfngamZJK+uegfTcznimP0AjSWs3whJwZ9QXUsQrB9tIrWIG4GBtatp6qw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.4.0.tgz", + "integrity": "sha512-wjhBukuiyJMq4cTcK3RBTzUPV24k5n1eEPlpmzku6ThwwkMdwynnMGMAmSF3fErh3AOyOUPoTTjgMYN2d10SJA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3325,9 +3325,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.3.2.tgz", - "integrity": "sha512-Ng5dh8+FMD3pxaqZEDSRxTjgjPCNdEEVUTJnuljZXQ9ZxI9wVsKsGs53Hunpita4Qgk0DYhlfAvGUKCM0nCH4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.4.0.tgz", + "integrity": "sha512-QWGdv1D56TBGbbJSj2cIiXGJEKguPiAl9ONzJ/Ql1ZksiQsYwx0YHriXX6TOC//T4VIf6NSClHEtwtxWBQ/Csg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3338,9 +3338,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.3.2.tgz", - "integrity": "sha512-EQcfkvA7lkZPKllhGo2jiEYLJyXhBFK7++oRatgbfgHEJ2uLBGv6ys7WLCeRA/ntcaWTH3rlS+HR/Y8/nnyQYg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.4.0.tgz", + "integrity": "sha512-3jRodQJZDGbXlRPERaloS+IERg/VwzpC1IO6YSJR9jVIsBO6xC29P3cKTQlg1XO7p6ZH/0ksK73VC5BzzTwoHg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3350,9 +3350,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.2.tgz", - "integrity": "sha512-r7JJn9dEnIRDdbnTCAUFCWX4OPsR48+4OEm5eGlysEaD2h4z0G1AaK5XXwOoQhP3WP2LHHjL4LahlYZvltzFzw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.4.0.tgz", + "integrity": "sha512-c46HoG2PEEpSZv5rmS5UX/lJ6/kP1iVO0Ax+6JrNfLEIiDULUoi20NqdjolEa38La2VhWvs+o20OviiTOKEE9g==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3363,9 +3363,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.2.tgz", - "integrity": "sha512-PSry4JHUIOhXytvYUQGtYgfIKCIhnmbKksZ8/CfCaKgGJpjOpnzqRG5FnYXZB7NiqouABreM7+IgkH0mOLq6HQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.4.0.tgz", + "integrity": "sha512-F4y/0J2lseohkFUw9P2OpKhrJ6dHz69ZScABUvcHxjznJLd6+0Zt7014Lw5PA8/m2d/w0fX8LZQ88pZr4quZPQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3376,9 +3376,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.3.2.tgz", - "integrity": "sha512-Oy/Dj75kw/tyNyrcFf97r872NZggISfvabTptH8j1gFPg/XzT5ERcT2fvgpbsBx0WWlXOaFkC1owta6kS6MZpg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.4.0.tgz", + "integrity": "sha512-3+Z6zxevtHza5IsDBZ4lZqvNR3Kvdqwxq/QKCKu9UhJN1DUjsg/l1Jn2NilSQ3NYkBYh2yJjT8CMo9pQIu776g==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3388,9 +3388,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.3.2.tgz", - "integrity": "sha512-KBew4QCnYASBPEJlZ4vKQnm4R9B206H8kE5+hq8OOyF3FVkR6FgF/AbY/E/4/+2blx82PGp+9gvPUVpEv36ifQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.4.0.tgz", + "integrity": "sha512-fYkyP/VMo7YHO76YVrUjd95Qeo0cubWn/Spavmwm1gLTHH/q7xMtbod2Z/F0wd6QHnc7+HGhO7XAjjKWDjldaw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3412,9 +3412,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.3.2.tgz", - "integrity": "sha512-LTon7ys+C6wLmN/nXYkr1pDxIiIv0Czn4US7I/1b8Ws2N6PU+nMm4r7Uj8hKrDYL8yPQUaS4gIs1hhOwJ8UjtA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.4.0.tgz", + "integrity": "sha512-gr5qsKAXEVGr1Lyk1598F7drTaEtAxqZiuuSwTCzZzkiwgEQsWMWTWc9F8FlneCEaqe1aIYg6WKWlmYPaFwr0w==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3425,9 +3425,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.2.tgz", - "integrity": "sha512-nz4GcYvZmJOX20GAjR5ymZgzQCbhnK/rmcunQf4zkl4LA5sXm70P70I9bDtrT/mgmz5dnBUTkVAkLTtKbovdDQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.4.0.tgz", + "integrity": "sha512-yDgxy+YxagcEsBbdWvbQiXYxsv3noS1VTuGwc9G7ZK9xPmBHJ5y0agOkB7HskwsZvJHoaSqNRsh7oZTkf0VR3g==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3450,9 +3450,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.3.2.tgz", - "integrity": "sha512-6RJmexu/E+JP2+lhzJLV+5KZJiTrJE+p/hnDk13CBK2VgiwcJYmcZSVk+Yk6Suwrb1qTAosu8paKIwVJa/VMUg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.4.0.tgz", + "integrity": "sha512-aaW/L9q+KNHHK+X73MPloHeIsT191n3VLd3xm6uUcFDnUNvzYJ/q65/1ZicdtCaOLvTutxdrEvhbkrVREX6a8g==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3462,9 +3462,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.3.2.tgz", - "integrity": "sha512-vgT7tkSZd99xAEph9quPlVdRkgPU4GJp9K7bNS8Y7GnSLU0KkDHbtDpb0pyz76HVpeOnt/QGmtqF14Il9T2IPQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.4.0.tgz", + "integrity": "sha512-reUVUx+2cI2NIAqMZhlJ9uK/+zvRzm1GTmlU2Wvzwc7AwLN4yemj6mBDsmBLEXAKPvitfLh6EkeHaruOGymQtg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3474,9 +3474,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.3.2.tgz", - "integrity": "sha512-eMnQDgWpaQ3sdlFg1M85oziFYl2h/GRBjUt4JhF5kyWpHOYDj1/bX1fndZOBQ5xaoNlbcaeEkIc53xVX4ZV9tw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.4.0.tgz", + "integrity": "sha512-Zo0c9M0aowv+2+jExZiAvhCB83GZMjZsxywmuOrdUbq5EGYKb7q8hDyN3hkrktVHr9UPXdPAYTmLAHztTOHYRA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3486,9 +3486,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.3.2.tgz", - "integrity": "sha512-bKzL4NXp0pDM/Q5ZCpjLxjQU4DwoWc6CDww1M4B4dp1sfiXiE2P7EOCMM2TfJOqNPUFpp5RcFKKcxC2Suj8W4w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.4.0.tgz", + "integrity": "sha512-+yse0Ow67IRwcACd9K/CzBcxlpr9OFnmf0x9uqpaWt1eHck1sJnti6jrw5DVVkyEBHDh/cnkkV49gvctT/NyCw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3511,9 +3511,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.3.2.tgz", - "integrity": "sha512-gi16YtLnXKPubxafvcGSAELac4i8S6Eb9Av0AaH6QH9H9zzSHN7qOrX930Tp2Pod5a/a82kk7kN7IB6htAeaYA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.4.0.tgz", + "integrity": "sha512-pE1uN/fQPOMS3i+zxPYMmPmI3keubnR6ivwM+KdXWOMnBiHl9N4cNpJgq1n2eUUGKLurC2qrQHpnVyGAwBS6Vg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3523,9 +3523,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.3.2.tgz", - "integrity": "sha512-a3whwDyyOsrmOQbfeY+Fm5XypSRgT3IGqWgz0r4U7oko57/X6Env08F1Ie2e2UkQw9B1MoW9cm3dC6jvrdzzYA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.4.0.tgz", + "integrity": "sha512-LV0bvE+VowE8IgLca7pM8ll7quNH+AgEHRbSrsI3SHKDCYB9gTHMjWaAkgkUVaO1u0IfCrjnCLym/PqFKa+vvg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3691,9 +3691,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", - "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "devOptional": true, "dependencies": { "undici-types": "~5.26.4" @@ -5018,9 +5018,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001617", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", - "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", + "version": "1.0.30001618", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", + "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", "dev": true, "funding": [ { @@ -5314,9 +5314,9 @@ } }, "node_modules/config-file-ts/node_modules/glob": { - "version": "10.3.14", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.14.tgz", - "integrity": "sha512-4fkAqu93xe9Mk7le9v0y3VrPDqLKHarNi2s4Pv7f2yOvfhWfhc7hRPHC/JyqMqb8B/Dt/eGS4n7ykwf3fOsl8g==", + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -5329,7 +5329,7 @@ "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5741,9 +5741,9 @@ } }, "node_modules/electron": { - "version": "30.0.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-30.0.3.tgz", - "integrity": "sha512-h+suwx6e0fnv/9wi0/cmCMtG+4LrPzJZa+3DEEpxcPcP+pcWnBI70t8QspxgMNIh2wzXLMD9XVqrLkEbiBAInw==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-30.0.5.tgz", + "integrity": "sha512-+a7PjcAq2HrfF1l+Ez8n0W9YeZIam7E9ERHEGs+L2dqKu7qxk8GNSEFoBEPCpLI00p/fc0d76L9IcLCQJdNFqA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -6032,9 +6032,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.763", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", - "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==", + "version": "1.4.769", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.769.tgz", + "integrity": "sha512-bZu7p623NEA2rHTc9K1vykl57ektSPQYFFqQir8BOYf6EKOB+yIsbFB9Kpm7Cgt6tsLr9sRkqfqSZUw7LP1XxQ==", "dev": true }, "node_modules/electron-updater": { @@ -6322,9 +6322,9 @@ } }, "node_modules/eslint-plugin-lit": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.12.0.tgz", - "integrity": "sha512-wADj+b6ZksWs1qqASYBYzi4U6k0Tvhtp4GJupveZ7Z5IfVHMixxFueSSwIl/4ksov4jsahWbyHnhOpvJ5Z8M7w==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.13.0.tgz", + "integrity": "sha512-vKc67q6YQ+naYO1QuFpqMoTs3535yp8+0WB/8bzZRLr5NSOb4C6vZrD4se7S9XZtym5TxSVlIqa9QTWYISykQg==", "dev": true, "dependencies": { "parse5": "^6.0.1", @@ -6339,9 +6339,9 @@ } }, "node_modules/eslint-plugin-wc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-2.0.4.tgz", - "integrity": "sha512-ORu7MBv0hXIvq894EJad70m+AvHGbmrDdKT6lcgtCVVhEbuIAyxg0ilfqqqHOmsh8PfcUBeEae3y7CElKvm1KQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-2.1.0.tgz", + "integrity": "sha512-s/BGOtmpgQ2yifR6EC1OM9t0DwYLgg4ZAL07Kw4eXvBb5TYaPafI+65tswvnZvhH8FqcjERLbBZPPvYsvinkfg==", "dev": true, "dependencies": { "is-valid-element-name": "^1.0.0", @@ -7430,9 +7430,9 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -8686,16 +8686,16 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.0.tgz", - "integrity": "sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8742,9 +8742,9 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -10464,9 +10464,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", - "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -10484,7 +10484,7 @@ ], "dependencies": { "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -10502,9 +10502,9 @@ } }, "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", "dev": true }, "node_modules/util-deprecate": { diff --git a/package.json b/package.json index c588627e..83e1a70a 100644 --- a/package.json +++ b/package.json @@ -126,12 +126,12 @@ "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", - "electron": "30.0.3", + "electron": "30.0.5", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", - "eslint-plugin-lit": "1.12.0", - "eslint-plugin-wc": "2.0.4", + "eslint-plugin-lit": "1.13.0", + "eslint-plugin-wc": "2.1.0", "file-saver": "2.0.5", "highcharts": "11.1.0", "html-escaper": "3.0.3", From 7d9cd5734011fa4e1a85ef5c6c5283913bcd0902 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 15 May 2024 14:05:33 +0200 Subject: [PATCH 22/29] Set sponsor ending to 9000 --- .../core/sponsorship-list/sponsorship-list.src.js | 14 ++++++++------ plugins/plugins/utils/functions.js | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/plugins/core/sponsorship-list/sponsorship-list.src.js b/plugins/plugins/core/sponsorship-list/sponsorship-list.src.js index 55441efd..b7819a66 100644 --- a/plugins/plugins/core/sponsorship-list/sponsorship-list.src.js +++ b/plugins/plugins/core/sponsorship-list/sponsorship-list.src.js @@ -227,7 +227,7 @@ class SponsorshipList extends LitElement {

    ${this.sponsorships.filter(s=> s.blocksRemaining <= 0).length} ${translate('sponsorshipspage.schange7')}!

    ${translate('sponsorshipspage.schange8')}

    ${this.sponsorships.filter(s=> s.blocksRemaining <= 0).map((ms)=> html` -

    ${ms.address}

    +

    ${ms.address}

    `)}

    G4(W9!vx}exarEm`=BR@107EnOm@#n~!cgI1L0Lb69-O zlHiX={FqgQmbpiiW*SC+^cufH(#8(m73T;G^cpnXxny)dDZK6O>st`@WX0N`p zdlg2RUT<&L{CrD*pw#SiZCP!|Ck69v~ z*g!z}Q)~7}O6MiUz=-zd*GP?T$~JVchDGV=qm@!Z1?qg(){C0XsT!g-KB8{ucfS?H zKuhQo-=zXKk9j^7|2{(-9P>5WPQqC3@Xne(FOLoECX@#Pt}AT; zPe|mDIaPYbnD=;tRg?0i|G+6PFzdYvv~CcoKrGRoEfldIFy2YW7Ny;7+SAg}ksMBw z{5K2G^Ud816llRDDNDt89#fCcrF{``p%$KM`QnS;?s0v)5~Y^o!Odm;U06aXmWUtc zmz~!kcOOr~S#B!M4%aT7<68q#0^!>&Y|G=hafTdrcx<^yi;GvODZ)$fFt2tv+&jim zjUHyYAn3aCXL%SnY?|f z0^t-teTBPOHXtc`kI&Any$q}EzlD!|`#j?a2Gk>6M6dyP^5KQm7eHM`RwpV>L@L#t zU*_?yVsfX4(6L0%ICXke9Ov_r>($Jj>tr-*|Gv=nE#ZX?*v@Yy6tmCik0@N&U*Cxs z-fZ4QkbAz#GhUZJ<+HTZnyPq#T%>M)VK!O2Fz{4@kIFW{?9TcxyORP%^g#$x!BO9}E&F3@7_6(G%k9_L37zK5-{~bXeHgHM#x*MXsn8x(Z3BV! zzEu4WjR9g}`GA(`dVJrQBV$qsqV^E!8l- znIbA2aeNeS>X$l8 znnsPtYKA3BP;*sgiqKrX2nIZ6^qFD&8wa<}>l1mA!Mhz4p~v&K%;8%Y;P5#QQYFtg`Br4GldQ)sZ(~j0-ADjsM0GeqiRc*?nK= zYnN-Y`E4Mp?h7>=i+R02#crK$Wt&O+ekh;k2EInAe>|#;*lXL=#AIpeh^a44*nHvG zwABUegLsqqP8g>emxJ&+55M>Fv&G@<=UL0-y`R@nN ziSD4RVTAsxbAa+!?@;v@W!I*0`npLvR_5Uw@tW!s>E5lmvZ4hl?>AxmcS(;={RCs5 z!%I^5Phkd;*9TfDC}WTDycoQCa`2JRVEf}ODszo$kIuqFLSy6-z-}Pj@}Db(yPfvm zWdn$dK_97`(Y!b0H&1oej?Wp^CKUDjx)8Lq)(nk#pCow-5sgzd?-PKj?O(_#SYWI^ zl05w~bS>V~#xcdFzAmvR=GB9}chqPpC`)GYz;BBitfpP1t0$bA64g6b( zY$E~5*=4i5twP5mQ;0YYitYYzRh{i+W$9-hSqaIFdC1s{yx-Zf_H!)<+kMpW*y5dE zF+KLt$W>a;Y&=E%GV^CR#QkQ^%m&=SH0aHt0jVSkJ;q#?=$58EhZ8u<91{BS?+ zl88*B{K)H#b$;X3P+#`v)DyJro$Ic#jZJFuT~zVeBp;q{3sNfi*3W#n;2G29sv z7xzO@J3|hl{89gZQ+Z#E;n9jr%J0pW7H4o&?;bI?2K};h9gcWwGRvE2kPm~G0Sy*~ z$lrkvkYm$BOwJGE1jAN~xW`lJOF${oFK}Qn1z7asWO3>_BHU9b@ge_NXFFP+mr9wy z`R=db#40$nZ|`k0wVQtTw;Ff8!I$yM{ODMmnCi)!AZF`mixJyKm|<`jKePbT2*rld zCgX2>x4bv8*BeG!qOL4HG!Pu~-)9#|N7P^MUW|o%4C&_VGsE_VQMM&^mt(hOlA4w29I4?Y!Ah8iCr3o0e`zrKx@W9<7| zQ;{vlliwp){_;vJ^e3J;Lf$nYe$?j&^n(w+J4=ZcL6QgYkWevKTkO|sJ)adurpBTQtBU;jRm>;;dhFZPeoCe3iJ?K7Cs%P?%gJ?Ar#2m-aTL7v zcgE)@gOQTiSMx(#?^|l~HDd@kk`?&8*>H9yN+HXu+Qa7w2j+|ho1Cw+wBT%6{fmwv zg1l6wMRN&U!Dhm<>Uuu!#8fCVxZZ#K#SLaZ@$ol@@4(bp$pRuD2@{M*?^BTihB>BS zh=;74eIK`PUYPe0KF?hj(kxAK(?Ki?!>x0RB~@f2((7UmG|y!{-f&zWT6F!J*|rl6 zfnuFw`kBtmI0jy+?Ti+wU6PGM9wRDO5PP4I!1e_R>Rfxj{fNyO`zT0=^D|rajgn!H z7mh3R22s)`#`>pRgPB*YTTj_=scO%*_&7ES2co#+M*!0h1d<=`shmW-38o|~?gs&v zt7PT4g*bkdJI*b)e4o4;=8d-FD*bCokbI4y z9Yz%wHvc1DM{t--{0XHVvD<)gX1;Oe_AKC_BMOFx@;$fBr{NPXa}W6G$3!uQimuZ& zecZd)Khsp=T!zcxy*z02%e$889X-Mu(K|#9y8p-1S4Ktker=zj8-|c>kp`9S5JW_} zy9A^`x(5jf6_ApKK|;DaMkxj9?vj@7e$M!N|L-T)a;@P$XWx5YyRN+tIpgbo5db75 z?eYN4k{2)Py-t2Ew5|2|1dikcC{4N5101qjTl!cyl2Lx=EBD9OD<2uf>IcB}#ui5{ zTSs%td=*}z?{3>MHzst9169Kkav3{`3a=gz{U~+u150A6oc}^tjhAmyb;jniEuLYq z6>*c+LbYxc;1(Hl+fkwP=Dorw)gq%eMvZ?@As|xa-@LVsxj9aL2JeVKe=6{c?dCat zqSObluZDTXJ0G7;OwaH6yRgykJg~`OXh}UIO`z=2iEqGgI-Nw~t4DlrczHmTWAi;H z=Ce;Xb*{T5yu-c?85Flxeh=quAsNeJ>cv)3H!U%j%bvYnJ!Dg2l%e0-$QdwX3!Kq| zabQcLp!#v}{}W_3yV}@GqL=zF^f9A&u!xQmr#E=)%P*uK-6Y>k-N*JC(M3Ydz1AFw7R-Bg&aNVS}w1w z`S#|cdm<|~e>S#r+Z(iM$e(|-x3OL6ANP2@ndBVmHOe`okioh(p>uni3bS^?S#q43 z5)6lHy(6+?%t8UV2*~)Hh7l|wON0~oVyR>PP(xoY@%%9{Y-&s)rfTv@xIlS7vs5iR zeOLk21r;G?F;o+HP?Y@c6G=;@^IbVWR1?&Sk-ZUoTdB=sqLMOK8$Wnpw=mwP%Qkog zy!M$aTkKflOkUL~U#vUoah6QSUxHJdn4>?riMNZb%HI?XtN_tkA<7s9)^uU5Oz~j> zSipEq%_eH{5ahl8M1l?c2TLfoR)FKwHph>IaWyT+8Utf!`;hn#0g?KSwI)>|_C>nW z1gGV_mBg;uKTYLVgcflUdm(G3*iVyLg{E%`Z8;k5^8&5;Uy zgO`(l-cU*pk~p}L;G%UA3NX-Q3)R3>Oz|~zw81y}dx<+zM53zSYSqdP3h7jWh$+%NF87DV(<0x#uLh^0`TUvs|gKlz&OIKFo1 zTPP~@rTPw)T|s7i7R4+F2UNlbptFOjLy2)h577RQZsJdx3)aFux~4t7cBrTeQe>JK zxVV=M2DPLgSm`WQ%4Zh929hks$jeubY?~FVd5{91Y=Wo8oHN<5M@2L)2+yT|ALXMEsDY8?eUCimS;$s=Jx+J$44j z86Av2Cpj;y9z_4bI@ywTY<9U@A^c=L&HnA7;d}WQcBv@Q(#c=c{0Q#@VGcz*_UsNY@L@PN5ODW)1rKi zBHrcD-@B7kxckoJ7_ZGo)V{YZxL60ZeYe zf*c1Df{;{04kFo2NB7vbpDR3Q0PR~D)r|^33B6NNMR_C4r=CVc;nJW#XhMs5U3buEQf9#W$c(*cC!Mw8pfl)kJ)qic(84;d=`e!o4b6w|`oblT}^@YZLZW^TkEXFID zaW@=LtopP_(~%VLT>FZ4}d*$MG2Mmx}d~TDb8a|B(LPp5Eim$iHTk zw%&3lO5HR7E91_uar2`e;Bxh+>9Ro8;`_%mud}~XZRK|enO2j%xk^fR(b^%^Xq?RH zl4UJ#{D;cYu&e z0sz@Z{mFsMwZNKv7LFo2o1Gt49v%NN8pYo>-N26o7(@lFn;E5&u=Isp9+>o#v*zO$ z4eVWf<-GFqbtHf4M65&i1s!LPb_{@KDgoQ7gFffL>4oxp#7hsm1U`-^K)7^vTan%M z(YC1P-b^A@;P%ZxwT-2Ts$vKJ1wrXMjkSByTK|oX^jbw8A5KOa!?kM?(Pf0MsPs@AFzb19^)COaPlf3E>Ly2huA_yl1L3Pv1txczrw;$c6KiI4pd%4m(;C zH){CWC923Cmyqy|Z-b|&Kc)H4a|1g&RsnGak*{`>Z{aniGQv%RvB@3Oh&Q}z1rpU^ z&$r+8aX8R^{MlDif0fgS5Ec%1Ftk;l5~~k>6cilaqw%8A z(3rxjTfD4AWaIk`e>)c7*x8(B@|lskIXY5`^`{SSIXXVD~D90?ixG4x~Ip8#t7`38C|Xy3xz|lAZD!Lf#Qn7O@7PWU8aAo z!2g5I-Cy6=liW}9ke2)U0>+R$Mh6GecWUC_x9&j4`0ih#u)>$86O_-@IH>NP`a*L>RuQCe5Xos5EAXlObOJ*CeU7mR2vQNHMvYDQ#e zS`OSG*JtL2J^5{&HhCwch^|$@yT8KfJzFZ=SBGr6k^^6dKiM8J&Aj z5wE^dPOI0u->8F8Js~g0J0TQ4`IYdC`BX)PKvw-C*u@pD7USwgOZ@>Q-+d${4@?scE0UDDN+U(dt@la%0`>LV_V`du+oVdPX@~wjyTX z43LfRl5L?2bmWS;((1c8+Xgr`gXCcgk7>^a@W-vZ9Non9!b@I;e)kMMaC%BKkQwx& zZ-eEq`(;lqCVB7BQsVH&plNDK0?PHUY^2x6>xPCK%n!A$RC|w^E>aH`8>AkgF*Q>fLdnqtOE9(f! zDG6oLc{VQa9xfV;qyck$|JU|FHX6TL$YDXWJut?|84`klHf?efvB=-QiH@U9rjyX$ zIM+W$eE|%~wA5sijO<@W$j~Rn?MTj2&{X`Op{YOtGN+GvaAFjBZ*7i$LT~*8{OycE zE@dfR_*R(mBbI`0d3ocv(^Udyi+6};lc?uBK~SL6ZLvQ2NzW;pb`En=i-4@*y-!)Y zbc1domgf5P(AL$n0xwkIc`(?>B=GM5@7@BC?uw-)ttAF4d4k>cYU8!Nyf*c}t`BpL z92XTNdz0HgEaCzdKNUhc4ekBwN{ijo>tE}(oXNM8M1I^$Oa=rz_?VM-Fk$W@A>8;y{Ka@fLyuqFgoRDP zLtBP2UzeKg8`o`WMx`@b>AHAgi-@(8D zKMp4+PY!!CQat7O2I{Qv{-D1@U-{4HYW-B*U6v*&ZrITmcB*7*=$&GNiy!?2$rN#5 zdDbHWW-o%twhd-uHrYj`5aDN7&!Fiz!;2kCI8c3x0&e0s^hzuSGCvTApuW%CrbGgn zdbKh>UPtzibqS@9g}EXhbuwh{$9E5&y>0<0_q9LMqnkf$;r?0#z}epm3F|%Q_WhSH z1w~q}W@b$t7JbC|7#S5)`=3@HsO~I|sL`N`v&Y3Iq!&3((|tZXERd4FZ+qRdw9!L2 z?K6~PSF(8-^?pk7o^SXjg)o~fgs5sg?t6O^$27)SnPcepi;op<=>*!lxH;ay(o$B5 z?BR9sLniwkN+bcB<~p7Xsy4;})1cEh4lY{cWSL;EW*W59+@3=wXSoB`fc0O)$69!o zh2mPb3@6@~XexUWlpcbQw?0my@IhWhe`xxs(}r(Hu(>!|t{y`54V+hV0%)TC{Cx>K zIpLxaCw<^4`t+<9{NfTX=B}wEJ}~5u0MyF^e0=uQ^3x>_L*{0R+;|ErYLCP7Ysq-> zOhe&gVQ?zkQ#2(1kMW->fX%Xr=M)TMO+)O7=tHzBdxm3+JS7RbOw2WdnTmZrHAZ|A z1c;bT(QnaDt-F(F27DrgD|aOTVQ7=*OytmU9axCZy+sx8lN_yHE$&Ypvv_g0s~adhjCFQ~pS`K@4C=vn zLbvn*WCSn)$UqL>fD7oeGty-9jlopz#YyuL3#TpOnwZSdpN{UO^&|zj54Ib-dFEPW z^&K1?5|?83$4bTcnc`i`{nWl!G`yJowFoq5m$d{~{z<96+nuR2F1O?^-`#y!Dp#w|s$S!2uhEp4^-G1fY&7;bHPdF*L z1!XZYp}@C^39y)ArI&Fwicul?T;X*`2An_ou-|~Q--%$>^6p0 zDhaJF?!4%X&r#sGe`yRMTn8X|@BdF0NwWkK5y4RyOoJDOsP**&D?FyMe@9`B=8yI3 zyivImSLq1B@f}U%C1~htcI5+;wReBs)e|tUtzQaowta-C?RG{+#Ce%e%+?1K8=!I~ zlotw%Oh4FTS7h^^MrsA{D<$0WNx%1!Q&6eV?dro;ckrDjkAxT7*)lr)Lw=v7OAQ7*TlR2tlrM;V+R1CAj=uH2S7wQW z;{df`txDR`3A(xuf6M7SZ{W8w8SU2ntwWCx&vW8{(RZa4b24!x8Ia~UnTJKxG`_9kl~@ME+4mVcc=;z%uyxG;%#MZC-cj@9<31jOyNE$6#; zs%QF@c72f6g@chYi5`{3htpUTg%R7^RQQx#lhTnIr5M|BH6J^E& zj?e>`inA$20FqdSjg)Q|7B~|9`IWjO;0}9aDC?|;-``@GLf?#O8;L!W;Hyta&tXIG z5gmA9y^c0~yEfqBQW_(vIT=Pf?MpT}n8~#&vi-ZUP{}luCbRMWGSbpX&`GVeW_SYQ zCHC!g9I?T3>-+~kf;#7;s!|hnvvqElKYtc}Sk2jaDtGVI7rpRIJUgXWn$0mxH{>MU zHdJ)~vr1}}xcUAZx<(+5HhaGZ7~RPQ(f`Xg%kB$^RfFL(kZrf2GzFZH3+2?O??8Ck z<(Jw|{Bms8c+sx~_$8Ff8ofSfa_)*fpX{a2ny(K!uM)fVVn&sY&ub6bInGkGcBUDs zw-n$lk8<&>;=HNmklv!q$JMoP*1B-J4jyuxJ)3*gnkC?L_@hm+aIrMs+frV{D3a#g zs7$=o(&u>Tv*L)WSu3*VhJKs)A48{aXxy*ph@xzu88{$!d;I?q>h#cJGpS^q`K9f6 zaWRtv)lRI&$gp?Jds`d>CywK|w`;uoCn0+8>nBu*P#5e!X^;tA&i zu&^+!y^;b;zP&};SEv`~bAG1ne9lyS?i58QOe0?-7zF?R(5$o+qO$n-T$$evJ}ehM zg)4_fqeZF)m5Y7UdcF{D?i+A?)w*%s!+fc)wvO-okoaMF?Y*qnWjYyPn6&HPvA$1LZW6cqbAPXH^3U|*iZ$S-?(;a0)=r<95e7! zod=j-;?i;q?($UzE(w;^;#~b^v&c~XEOxhX?)fuQ7TJ+mK58RS_^~Qn@y&l@Mpbuz z?!)-nniqGS{^Q3iB3q}&&++4Ul9_p$?Y@R`E_>HSS+bKbKpZb`na4lDNG*(1KZ zqV=hmp@+_gOLCNcQd}7j8U^0CN&2~Uq&X}57L4$o&h9mwugWWVr6x*B;jND0*t4*( zIMzE&&zvRST~9a~8YU$rWR66l5g(xMFVV^Wj|&j8e9$Z4M<9MQWg63VHgU4JKhtoe@6MNdPcKF%v+(K3A5;5_0$y7!g{4Ys(Ybb@%nEH(dG6@Dqm*<3Tl1 z$$aHqu<(D>lD?e|dV)?wH1Jk+Vd$q5a%A?xy|I>loYN;%; zbfJy;G{9_+MtbgIMf>UfP$~Sp(Do<=cjLY$AxFGkj-k|wNz0K)tIvvP#Q_=+B*BFw2rmZ*DyRz1EYCG#%bsxUHh%^u^7w-{N?sWdQ+5G>&E=U;Q}@_c(4h z&MVPxwms!FuJO9h8F$+#H<|=z7CTA}_#4rl_)GodWE(UAhrRn)IP2aoc&{Bs0&gMG zM&gIEg)@Ou#=kDEYNOXC%WuJr?sjoZ(Vsj>dCt9o`e)-KjA+dyU}9y5g$u}$Dj406 z+{O^0$ez5n*diEhAxf>2%SgY5m#`hBo_kzh`orq?Q+T??&19?xJ60xi^M7$io1#}> z*h}^W?4S0S1n!^ao3TM`RUQ>b^R($XCM`?a;>1Pd{Jyzq{$1X7gIJj z;$b-Pdtt4jc`{Yw)7^2r7iVhz%k)3I?uwD^7Rzv}i8aoNusZ>ti6x%hS$dS%Xc@~< zxzV#~xn!BepNVcsef9eR=LP3Q`?Tsg()GgfhlQV9hX3!lDKCL5aAF-1ozTtBbQ_Yqc4aYNgECY;HLQnZb42_Fri z1#d~p=$a(s3rJ{<94fKF@rtjD2sMaKSf~F+Ps%0Wu^=ME z8O!|tasvwY8x6rO)2>uirs zN&=JwohaVVId=cjn5$U{QCoqz=DuA>yK{94G`a5MrSuuvotU*tMTdp*L$brkiEi`lt3l zPLx0_%T0_B4pp^tm@u)Gs#T`(2?ohn^QdX6M1rU zCV6p|(GDO|_oaNS`_HqMt_(8=HisDbhN`TTNHmy)gfRD&ucSpPikB?SR`>KqI86mQ z*f7id{kPo3@301Z_M9~_1f3U*UT88=M45Gei1{sl{OBHE+C52Tmd}|aS^4k7YOg<0 zPS2#CvYyR&!5g-}S~{9nW)Lbjt31@he8zTj2d?AL!o2_{!%VWZ$ zZYT2eNXP7=T*fuMLOVifkMY+gpx4v#-~x!$X3y zm^M51Me?W@Bd;8nb1ohT>d&NK3nYv)Fn$73%;@uY8Z0Sl!&?>#Pl;W5un$2Vtk@$GHUu21v4n zul)S<`h@Nj>t=y4r)c(1da_cW_s662(G+>09X&7}1T145`BBT7IS| zKFPvJHm46Su$B)7P1NqRp1|;EOqYp<%b_qLo++9TMk|b0mPA^P!B-2zEF*>n)^~NY zF*uN;HTx(CX)zy17T=@WJKJH$O<(SkyZaYzql9DzFGDf}BD%?Y>_;ei(>>(O3fY z4kkH2wrz=_lAthaAMD6q8*Jqc4uNo`kFI4z>vua(;u01xzH#%A6ZSWpJREM0#J=}` z5NVqnc`{)xa(Y;x>K=C`W1{(@x_l@;Gt~HAg47WpP5g(XzVDDoDzvPI7HGQpIynFb zfw_bZ*uXMCJ7z^=7*na3nZ>rni}M|M>tXlnxclPIJZsb3&FE%wCy8kjQK18~Q{d$} zkl*`@knU3bXWIP&ad2-lZRj}YZ1mfj~3scRY0o9$Ao5Il?_QZ6(i?F{%E*oe&Lw^AS_UxhP( z_WA1&Je>z$>T53#>tHs#WoQ+ks=p=Z#qF^8-I=l}`sV=~PDMc1LvJM~SmsTr|9*X* z)UD$fdl=P^9MW$^;Lh>=5IeGaH5mvYzS^-(Hz)Htez6Q)a!a!WBQOg?PXt&bH+WJySLcq3u1_tsqjXZ24Locb< zvJ}oAsOqfwf-egA!>xVDAs1K(W!YZ)JQxWPjn+#oE0l^U_ZPJ805WYF4u z;-N9%OYuAtPfPCiqWkS)bkJHYt*kIHS)m=3|Jr;`fjBR0k0>hlffNKv%gREC@(?`M zHY;MK*IL`i|%gTlaGO?;yu(~GHR#wyL8+3;n5Ta4*fa)Ry69ZZxW^OIV5AD#>aQfQF)Im*hnVOR5kJM>T7f0^8Bd z-@(9p{EJq7cyYK;quKh%-?-{F-lJy%_lenJoP)dTMQ_D|rgGDO8-paT9JFrKP243B zzzGh0?mKj_nTGb57V!p9MV-Px(C?>5QVF9ElLKG?4TTCkMe5zhQGRp@u{=&2 zFOOp5G{ZI(FN)*Eo2sv-9v1TAzKDZOLr4q3k_HeDpsl3vg6axYf7Zzj$hjMw?k>Tk z-qZ>Dzn#I1juOgy$T}yOU!TV{Asnu7j&e|>zhDE$eG{ci1 z?H!+3vzUp*&j1g3*S+3AHW21fCUqSaA6XCa_dFDuG}dd z=!CR5xl&QyD+h0+KPbJfBTmk15-_!GykB5nOw=jBA_6Kf5w987_R|xs=-I9RumQ|_ zk>HE|4@pXiWf7%@a`yx}!(7AOEPu|Wt`1)=CRTPo5pUubZ~9;qU(s!ndLIgoVIjl; zh1D#9f3JJn0al>3SiiE&#wFqLyV?(8FterAHMkh{{2oglu;ZTSrYc?vmVBQ`ndl?i zn+Ob`x;%m10jWJ=NX9D@{OTR3qD7hp`LpJ!BlF_p+tU>VuP>_RbHvM~o|Y&UF}qkR zL5u8Y+|oI*mSR)aZix`dKsTy4AT8>BLy3F@0ogf__U-WrjwS4XgW;j%WT*4syb3FK z$dEF%#zk|8%$|$c*J0@iu#bAt`uHPz6qFq;hTtLc@aN&k!>dDq@UsB~;*)3e{E0Cu zQ(`&S6ludZ(Mr4+69?}TLWjV8%OCu7C8pxyb=-O*Kq1+U+zx*0R5MZ^9J@b*fuLfGUVMZZ;}x0O&k4MV>2%k0S;| z6q;1N!AZ@VaUK1+UiPX!y-X}&E+zWduXNrdW$lwp z0mDRqv-b)oo&V`5Mlk4dwaT#}C)-~l>b80rqVeu+MhAKcC+Ly}wOMt3=2C|%WMM2} z13~gN)Ubm8jtxO()dE;5&F{V&XEYR+-$n&s;?S8?jC)r$fkNKHJRpGK#@z2SRuCa0 zD!Ee{P@Bih!0RM7=HQ|J0)8(&n*Q$UnmHz*Hou|cWR2ws;VGYZ)8xVCEaV1)zykQ7 z+$b)B;KUiI%}Pka4Y8~)+Vp!)H9$Xhbg5&TB%$CI<$Sq$J@S1#(#rb;rz4kM?c+~+ z(hhGjgdG6=-@$nA0b=!#iPlnrW{$;U>h14?lez=W(_@$J?dwde6T(GMk%wf5q1d(L zFm-?j^YP<7?Eg%N=mB^s-*<*MAj=UBvt=nQmZy7BIZE}3ggj?6t;zTm&x@!!f}W+K z5vf9wXVB@B8u_PX((>9)Lw4K@>CsozKnv5o~RG00aEFyf&HGA!Wu5OUqx>M`p`$JTm^?zWW3IXOzJKH5`OsZn)l>|B3xOHwRO4* z7-ro<_DH$Gr;yda&`rD`Z79WbdrEac>TsJ!(P^wj=%W8dTFW*mWq3>94f4h)ls z8?6LA8bIopRy0!Ho2;U>%E7iTNt43L6su-xRCRpoO(oRsEj=tK=>n)>j&@1)Xovvd z3gzbqn>OU{O4_#y-znMC<2i|K%eCY8uw8?^RyQZsLluE%JeU=z2sR)W z@&Rq=smUcs)9>ieF$VV>gIW?17}j6(!#Yf~uKl`1`MUQiupv8JPqUV6^23XPNS05_ z!_2_ZIM+TNP!0JYUxW3SYB(qO-^l_|Ve(9Hju&Ix6f=FLnZvIxzj}~3Zg6JNw7fnO z4Jy!ErJ$3r@OCd>9%hAH(8A6E8kD7IuYrF*mO@tQ;1uc80_gedB%h7mddmOQyFH{@ zgnxb5GrHkHdZ%YeN!Kdff7FIzh7D5!jL;ZRVG;wj|8%1goB(9giDDYcb42m2sXV72 z{&iJYQfSoTTYvZ*DJu!^o6v3$arC9;W#E@E(lk2-$yT+=UHlqg=sHbIm7Ca+)lB zUH59yq)M5CB0L66xQwxJY%32#f+j9WHFU&>0q- zVZ1rtEt*$Y=s(cDv7Vuu0eau$a0OFtm>-mu^nwP~((p(LDW8u7pyflm;_}&rb8Atz z6z$@lHFkex$2~f4N6 z_1F_6D2~GtF(gf_XL91sH#h+_JM;&m1dvIjFn2gFQb^?L?8b2lzcZm@YLcJiC7FMw( z{^tddw=!%yCO#g;*!q-?iwDkWAyRgYb-&Ku@V>e)bGa)DIQqWb`Lw&~CMi28 zoU{QGu?pk^SX~0(RtFG{y{5p?PObM3MFrfQH)M<5XMNlz9}wJIl$PTWoRT!p8weJ) z7QR&t0znZX(C3GSzy#VbDrgXofk{}GDfk!Q&m&DyA|tjbl(l2G>sGGfY$qlZbLvOa zUzW8qIII1W7k&(#p!k(Kun%}sA@BeN$QM_YG^9Rk3nQhyT|u`yZy{~iKarPr41SjS zC0*b~F|$Mw3FrwP!6d-TX~0ML1I;U6IR1G)S7achMOfn;w^W8FXY!l()7-_@)5T1* zdDq>|1ttom534;GbQM-UgwNqUn4S<9Tv#w*fI@UQnEvljoPP>T!qXfsBcah`IyM+6 zZzcb$jjZ|i`D1gd-}j#|a}7}mP%bbKXma%!G!P;TL^UeX2T-y7`z5oEl6$L^b!>B2 z8*^fPpr_{b%F)h|jl1LGLw_B^$|p&nt;Ya`6*fMLgbJ$In}pz4CnfOrZ~$By3?`N2 zU|~Y{>Hd{x~M)%-CoiJhJ?;_!SqRiqZf@yaJx|Q~vWgP0@zn zX;iQWTPm-=rrO%n{7N73P*zM4V0jX>GZ3{5?tCYWKt@t-<6O>kFiW5X2uIlj5GVvV zNPk^akJOJb={H3v+GM|S2VU9jaN?XekILQpj=W1ZF)ibC>q7c04agZMLLwrQ6ihU% zU0yIC?XR^93B?%Cp$K^!5p@$vx;ECHxi5y+ZB?(!8-4UJtu(k?e+*lqvcSfXInW2Mb(1@WYpx$*D}p`X=~|ppID`C9&Ie?+H(w~)Ia(2K|p1p z^aU`=v2YTk>N+$G}N2U(0RK6}40CpeNptwh5tN{=A?7xnYOje%B3IwpeZ{&yr* zDG^K+5GTm~i+SHpJ4ZBO^@{ zyd{0eB{etAm;C3l--YvEj_Jt*TxbW6VLjSQ5zE7Ufd@Mk=9Lm_CrK)Gp&@q$1Bu|1 zVk2#ls#2~XYWOzogK)d)$}WA7Zj;R=!R6);Zj;%fRwz^n1Y69KzC48E-s1yh=#QZYY7}AOD9`zusl=q%(w0q5_Ri#_O;<|nDDA8?&56P--^y6qGGWfIJBXaInZ$IlTFSx8F;ed@GsFlzn-FF#5GSTC zk&J8BN(zz@l%%-Zno(6Jz^Mi*WIzPHeKC2)9;-3qZg?byp0_}2TF$9I{*c9dB_+jR z`q%zl5X-sy2L{oHE~2nv?eLJ! z|AbE#tHya*)>osVFR8W5_>7ior}a9*>t|KKQ|}!S>?gYdg5pi|u*IjX4me-AVDL|$ zWsT4opfCewdRU>;_5SO7X9yP%>+F3Zy_+xR0X_F1Qg1<~ZF22w->o_jnaYeTzKOc2 z@`|4K?=>Ijw#5GRq@@@&jQmDK)HY#keO7n+J)iwAJ_%~BWtd?d;!?RNBh7ceV;(`f_fjE57&6M*9v!Ei< zaFRP2yvPFlH4?kp6Gj;Gz*)p+K&hRe5*RRWA;C-TN#z@k8Ga820d*w~He6LnGv(iHcaOg$d3@MT#c`t*dw|YYy#&s8-yOrEg%s!JF#R0n3 zUxjfnJ&4G(KU#XblSt>Ju5qJO&>_Nr=KuvR11+pDj!;^QMx9wc7JPDf{*L8k)^#rR@hCr+qy7 ze(Z~D%2oNPo$?g*%QtHu8(j8ttd1{liVQ^2j0BFcBUWDYzEl$a;#@exnP1fAF2C zf;T+@jjvKSp(T%M8JozP7NH^+jVk96M?Wl;TWR?YPd5JzZ(>%fg^W*c8`JR2WH;!T7eA_e()+d&eu5q z#|4OpSm9Bxmqn?I#(Z=>*CZ8t`h9K=cODyCjF)<)Xk^$%>b3WY29Rf$bZ!o;Aw3@& zf`BKr(DO?Ko%tm8-)z>}L58 z%B$zq96rv2lD?|R1O1cuyIcfaRA91z9;v^usDmN_F^b;IMl3`~_UU0|kA6oZk~#U= zD-YyT(*+o6JBdrqw`0P4OcwAE`p-nb==GKf3C4xp_?szFE}g$!^hhKnjPzF3$z1=kSiEd)fmEjPe3Vek3#9zQx06>mH z5wV#q4c9{lO3*;`;)kfKdD=9aX*(roSOXNOOF3$2HVFyu<4kk1t6ESjF=_$8$m03f|F!@l)Sebj&u1?di~$2PHl`wNT0>TFt48$C6Gw%Y1YC1;DJe-Mcda&jaU@FV z_YY7&%q#}-QN2kK8B5ilEV9Ewpqko?d}O=mz~%Fk!Er^}pdBgVVa6a!0XG!R zOvBux*xJh1-@ByY1EXA9f57Mk?!B6f4B$vaYb%+V<@@Gb8&`LJUG*QcmbAu zqHyK090J+)!-}dzxH1HOV)1_!=%dfh!3_M?o+u+kUx+MqT#Sr~HA zm7cxRyq;dUZ^w)G!-|a9Jh8+?d|NqAi(o6$(w0UCn-A_@o^AV4IOPp1Z%htye6IgU z4LF;gI>BDJzc52X1OnG!K|&Ioj1Wi7_WSry^)w7k4KTxm>DIn*X}-@tF$UCpZYIkY zxbn~u0C0XO+fXuRKUGJEovp2bMvnjDx=a3kP!o(5^bT(Czkw=8dU&WTr^Oda^d@on zoi;9=>0$xijU zLUmZF|K3Y!^u7Y>Q7BB;`JT2f>O=`{@whwYXZtiYzkGrQq=nIj%E?t0UFpl5DCq&h zR@x%iUqFY%$vhs82Yf3_i1g_S9#Kt7T!_ouYnx2?uDs!1*K?u`mi3_mePZMY4Y>^z zJQNoZ*oO-n6%RE!*dWB8aLE!(tBZYe6GkF8>F)iQ9{HBfZ`3y>Fbr&O%0|s%$afx@ zyhPY;=ssqGf5C#h@7I~tAM^9SN@rr%4+p(Dtwy}V3s1xNcgrK+{oHUL6nt%ZD`l)L zcu)k{`>eMDmT=Ir_4vn`fqm1zyX+Jf1?==yEg)GfdsHl^V0b?FF_F4 zRgRRR%5QnC>+~~_t>D#(Q*o|sQFGKT$ZT}){VFG{l^3GFsapZKM1>m6Qi2gCT@=yg zDCoFEnGc&i8Y8!w?sgNp*_ZOtaS_&eRWfo@!`i`Qy}3w;E^BX*7$HFH%~mk=Vlj(eu88{s?tsJFDBPgPmqC9>_gI{sP+~a<$9pd};6z`mOloi3c>jyje~D<&A59!4_y`_u>3Z3xG%l zJ44KH=g4xj$E4Dj2O|2Wl)xE7)41g$7Pj|$IaT6+?OSxwwN5HvpTvkhdk;FKu)dreOI-XdC&!x^@WotL(p)95s%CPr^sziBHgM-Dnre?6bNzGN{$emQ~rZ((74zf_iHZ zeOuZ2RJ;k>tTc746&EaFfXI&fbD{(?CPD__KpjuBaLp98F>fHSgr`tMc17@e4i08! zT#hi|B;9w%S9!8fSpN8{=5G;OV}M=FMOpl25K3^Y&!x1NzT<}aVkJO?X?UKH?bq{X zMg^pveA=03$IefPT#l_WyN|2V)=a)Eqm=6Oc{~A%(@(_p$y5V7_)qpu9jk4y@!(UNx0h)d> ze=QotrJ5PMe(|h^HQ%*~thYHWmU4sHT$Ksr4&RI)_6wL`^c|zgf(WQGT~(W4E}_b& zp0hllxqFm^jO97eDskGHX5$Pzf0NVO0(G~TH_nuKshcWXhA-SkbvlU)jttI& z$a4a@`^3~yl%ceuLPXN401X*^&?ETn-7J)L?;H-iMP1eW(Ws5*;{VfB0jN*%`6$N8 z5wiEpC-B2&N+=rn`$Mn^Z^lgIsvu@_1!nNRpUfgEjF*6u>1_HNW)y0emE)TT5{FKEFRDrpA zg=iALND#9tbiduSdM9 zLBFVJoDzN}ZRJC)Pk-|-i=a+?aL4T);D%C~9B?|AL+B-<{=_)&l3Tp8p{AQJ-0s(S zNhaN7-WwT3R9`Z+thzhZh0dBX{&gDR%v>iw|)_mPt_H4PO%H>ZrCFe_%H%XZ_wr~8PC3fkn z&IKJHB4dX($VGx1L(fb{J?V_iwH5ibGIN(dp(-UT_uTskXsq)TYsQbz9xJxPpH!CG}16O#|w#PxV&O zx(h;qKgIeB_rL`Xq7|S+Q^mRXMhI{vMv1E8UL0{es=?_3k>M#SqVwkS!PK+H;4@`S zt~ZG}kQaq<|3}kT#zpx(Z{LK{T>{cACDM($NC~(~w}5m@Nu!7e2na}uAl=;^0@B?L z(%sGe&whW;^U4=~_U6RQHFeD#Q>4#Di0Z&LIZk%L&2J?h8yEnDqil*sSc|(`0~QYa zg4C-QkZWR~nGl{Pfx`PW()$KKOUf4=6Z^zEjMdK#Ms>qCl^d6aoQ{S-e8KEwELWvX2wbyquoQgd+L<5G?=$O7|0 zA-eNuy2`nx17E@VyHTulR8n`xIXP)%p$aHy47h1T_m*CEBiLUaD}vgb$j6O8*B#Fu zWq$ah4!`vsb8Y`uFMc$ot-~3uXbDFtwQ~oUb zhJG?Y4mL_p8XfrDcKY33;jRP~l`AyrhrgR(b%Xj0Hd=gQXA9R?(eoRDrO9yxW=vcPxoj2ev6WF zUyHlizU^0J_?7cZvoH5R9`*Z{vBku63eKmB*Gr7w82jZQ|P9we%C1Vc=R!`|3CoS%plX4_8Ikj%8SgNnzn%vY3E+c zbMPN2qPacf3d^6aZ#wAk-`(BoHB;dMt@u=rlchtQ=w2Dn);qweCM&1lW24(uI4;@~ zDg~uv?M+~G;Lp|Ko_8J$mCZGx+X_S-Cv zdQ|<*_74DgE}rki?A+n>gq4Ms6Rk=5GnWEtTxk;#D7$}Jv_sAf%1l>ETz(hBXEs6C zGv4+HAD-llNEFXb{7Eg7+T{>VvT0S09amf0I@$%b9~Lx^QH&+?SS4pXAce6{IVJ+( z-5w-i>waNM0m+_k2tUX}7 zgm!y<(u>|bv&~9sD^Gxj_NOHU&lfOen1u*#;>4asteo&}=Ye=a2qHm)VxC^WVnTng zPbAV@uh>Dq%e;M+4^J9Aw&c-oIq`?AEzy#O|4&+%P>l({K><+^h?nrL6wWCN>E23alAW-1KtzB2FxQf z%ApY)W5$efx-NqG#%r0b(NXl%C7y!(%Dvs$!~ZHA{=>nKHSD;PfKNEY9X>ZHwPudp z9+q)7@-K&4ELu|9dw_;)Uh#IhrJ$pl#O5a!sC)%&@Nnv>&@)X%HeNfdMr(6+V`nti zY*K!0|HLo*lG_+iP0)+MyDxSzfGswG5{F5T5_H`g5BYgRX3$^a<|R-G@1!#AC(rq2 zVSf@|mU{3F-MYF>_I6~>H4jyNX(b{kyW~6Z0S2SfQ0+1={_2api?+U``ii7CCN21W zBO8a-;vP65-kQBvQs(f_;cTGXEGYC0s(tf3xqpw<LE3DAQlElSXQF>Y_b6gILI2L6Pyf3xh25iT zAGL*ljcr!~E_FMPkeS+VqeJ!By#_H=>_va7m)#~R|1Bc~j8PT^u6JD;LcgtY4lSX}jv8WD( zKx%FWq3ED+CXe^UpaR{C0AvE#K*p`*!TF^U$DH_C>;fewx^QOQM-q^O9Np27Wk>RW z1$8nxN^a#hj$8da?&dTr7j=h5LUkdl7U>Rcrlt>wNoC4fuQL7G>Pr0{^z290d|(go zk8j$V3%g=9@3*gdd;P}Ykz${~v*I)e6I5XqV}1-sI#O6E{C*TrD6}XuhI2>U>;c(B z7Y6K;G}TfKI)?qgkL;x7#9tUJOS&~qY?le1fhRo%<#w64%s)$d(u}W@q^|PQ>-s6E z76Qjn3&pIvn(S>g4B(VC=NA4&+Z0Nr=T!IE(1-zTi9-Ruyt_El5LO5O`|*3O z`4SemiIv6lYnrP-g9MB)fRgL^Zyfp?KuxYUDIabU1fe|*zb@2C%4#X@%yvYs_i(9~ zdG(kk^~V|K5yT6UDp!RvfxK4W_rX_I2?CamzZ|X}*~IHJn)6Ok*1W;ob;d2qATdHo zA^%1*ly3S*yU*<*C&4+w!*&hUO89GF`a{A?=C+SH zX=yLbjg@__vHLZ-Wu9)<&GSK}ygc=R|jpO=PAeo;TR4=JY=+42?Z zep$rZT6UAD5jU zCs$)|FLu#wHNm=-vky)jhLQGrmQhPto+-$G*|wq_vu^obGQz zV0`nr_wJust;5(K`nTB??4E$1k~?=fx4k=`PPn7IY?|Z1f|2aLE_tztiBt+$i2ykUM3F8yWq@=KM*l$oM^_Vzu?VsAm zh`J_b@(&R(@4k{$mHH#~w?~%Wyy$Y@oA{04b?0#Hgy+A^oA>h~+w+BYE_W5Rk~wnN zJ`-%Z!hL3ZC;cy1myRU{{Mi`4=qn zwtv`4{B~g#^X7t5d+UeRNFbH^y7t(KY1)JzzqUL%c>63WbZ{3@P++h_xuVzz8{rgZ z3!U!i<%6TY z8;^?tUAAmC9Yym)r*ARqAb?I#57G&jITgejI(a{vW|(eXZEbRxA*4IVr;PZHh5W(U z3RYndzCK;|TE>TEIUvwIc2royhkWuKWhiGT(Sp(@938)(Gmc{|fiJDTQ1f!KvV0=eqHspdfj1A&3Hn{hmVx z;qnWGNUFvU{)DaAi>%PO0z^j*Z|3{zb1rs48tBQd9Cj$hl;2xicYDwJEnX)|q#;f% zSBkO-6ymhvY?apxR2WmMC*X&?D2x2>z6LGFNzy?RS?;3MmxV8*tQ3)~Z^aroiHUA1+IwW}wE+OV;H5rpT3T^U#g{J+IKSGJW>s|t98FBI@=Q@VO0 zM9GN-?1xm-!*Opy>B^R>xWxNc8^igN9c%q*@ium{HP@49c1Ffv6dJPsdP3S$j9zv8 z4%Vn9%`1NJ@ADTb+4dh%Ph72&Ldx5pLs+rls#8g({Ji$g==|ffnDd4URFN}DJ{M@E zNKwqTc0>gnT72}6kESK8iaX5hur_fiG(?qqihf4-w@ZWnRjD<03d2qzYu=ZdT~o?0 z$l+*k*D18|fU zVx*hW0_oS4`V(%zBBbe#W)@`{^NN)dOm-{RJ|9caSHZ*&A|{d*w*#-G1oJ(E^4uzy z-ShT1IQumV zhU8KF6dIZS?L2E9tVhdJD{NG60?Ex&42zr#RshL#b0s$_i2eR()kO-X{`EZe`8Un} zm!5Ll5~Pw^&>&@vm&ctrHRoq|g<@KQ*A+t15{I61EZ>C-l;b4-la1G;LJpZNJ);XCmP#~ONAb(H2@Ww+Q^ROeK?e{?U_FQm#km0m#CdVwk42<*#x)xw= z$#RABVkV`x1?u+=#z!Iw6WWK{Nk*iin7XkT94TQ`9w4GIm026reUO%F1| zXdsody zI_k!$c6-V={Ph6SHab!L`lsR;6`%vuxW>b{2e??gmkjz4~bE< zvywxjw&Y;~f5nnc{#3lbVz$d0ZMYq;t)1JYz2~2j>LLKZuN@0`UYLu=UkEXC9Ng9G zn|{ALUvs*hiB;)W#_irBd4FHAbo`Rt)e-oTd6u6FP$4rse#5&VpYK5Y6g(N3zwb<{s4<%aCGZw0~$tHC6#o4SC_lRi?5^D5Cv}K;b~kgnWhn` zP#K1zEgCjSQJ&k|r9CROU5T|(F_0RoUqXk7zIS|N@b_b=@mL|6c&EfVwSRZMoXq}E z1V!epAhTgE%B$lR1D7)GC#1fW3st3VrB*vp$wtFs)I{)yi{NJ90Sj>@Psvb;nI9G% z-U~0^c-CIiA-XHIxsil}y$!JS@Cyl){`JEr7Z>t6+uN=2%0DaI9T+-#ip{G(eq%R| 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 Fe*tM-*be{z literal 124886 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

    7~{ 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

    {this.saveToClipboard(this.privateRewardShareKey, this.renderCopyMsg())}} > - ${translate('sponsorshipspage.schange11')} + ${translate('sponsorshipspage.schange11')}
  • ` : ''} @@ -355,7 +355,7 @@ class SponsorshipList extends LitElement { icon='content_copy' @click=${()=> {this.saveToClipboard(this.lookupPublicAddressValue, this.renderCopyMsg())}} > - ${translate('sponsorshipspage.schange11')} + ${translate('sponsorshipspage.schange11')}
    ` : ''} @@ -504,11 +504,13 @@ class SponsorshipList extends LitElement { if(getNames.length > 0 ) { const avatarNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] const avatarUrl = avatarNode.protocol + '://' + avatarNode.domain + ':' + avatarNode.port - url = `${avatarUrl}/arbitrary/THUMBNAIL/${getNames[0].name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}` + url = `${avatarUrl}/arbitrary/THUMBNAIL/${getNames[0].name}/qortal_avatar?async=true}` } let blocksRemaining = this._levelUpBlocks(addressInfo) - blocksRemaining = +blocksRemaining > 0 ? +blocksRemaining : 0 + + blocksRemaining = blocksRemaining > 0 ? blocksRemaining : 0 + return { ...addressInfo, ...rs, @@ -553,7 +555,7 @@ class SponsorshipList extends LitElement { } _levelUpBlocks(accountInfo) { - return (blocksNeed(0) - (accountInfo.blocksMinted + accountInfo.blocksMintedAdjustment)).toString() + return (blocksNeed('sponsor') - (accountInfo.blocksMinted + accountInfo.blocksMintedAdjustment)).toString() } async removeRewardShare(rewardShareObject) { diff --git a/plugins/plugins/utils/functions.js b/plugins/plugins/utils/functions.js index 138a7b7b..df85fed0 100644 --- a/plugins/plugins/utils/functions.js +++ b/plugins/plugins/utils/functions.js @@ -34,6 +34,8 @@ export const blocksNeed = (level) => { return '3037600' } else if (level === 9) { return '4074400' + } else if (level === 'sponsor') { + return 9000 } } From 7c0948886fee3f1abe53a3aebff9d610e1ac61c5 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 15 May 2024 17:54:38 +0200 Subject: [PATCH 23/29] Bump version 4.5.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index befcff20..6a7982f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "qortal-ui", - "version": "4.5.1", + "version": "4.5.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "qortal-ui", - "version": "4.5.1", + "version": "4.5.2", "license": "GPL-3.0", "dependencies": { "@hapi/hapi": "21.3.9", diff --git a/package.json b/package.json index 83e1a70a..ce4f2996 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "qortal-ui", - "version": "4.5.1", + "version": "4.5.2", "description": "Qortal Project - decentralize the world - Data storage, communications, web hosting, decentralized trading, complete infrastructure for the future blockchain-based Internet", "keywords": [ "QORT", From c95dfa6edd53069f1a86ce991b5185c73b267336 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 18 May 2024 10:14:43 +0200 Subject: [PATCH 24/29] Check if Tab ;emu have broken links and replace them Simple find and replace broken links without a new function and without update registered urls which are fixed and dont have broken links --- core/src/components/show-plugin.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/src/components/show-plugin.js b/core/src/components/show-plugin.js index 8885a5fa..df2fd077 100644 --- a/core/src/components/show-plugin.js +++ b/core/src/components/show-plugin.js @@ -1225,6 +1225,34 @@ class NavBar extends connect(store)(LitElement) { this.myMenuPlugins = JSON.parse(localStorage.getItem('myMenuPlugs') || '[]') } else { + let newPluginMenu = JSON.parse(localStorage.getItem('myMenuPlugs') || '[]') + + const oldQchat = 'messaging/q-chat/index.html' + const newQchat = 'q-chat/index.html' + const oldMinting = 'minting/index.html' + const newMinting = 'minting-info/index.html' + const oldWebsites = 'qdn/index.html' + const newWebsites = 'q-website/index.html' + const oldDatamanager = 'qdn/data-management/index.html' + const newDatamanager = 'data-management/index.html' + + // Check if local storage have broken links and replace them + newPluginMenu.find(a => { + if (a.page === oldQchat) { + a.page = newQchat + } else if (a.page === oldMinting) { + a.page = newMinting + } else if (a.page === oldWebsites) { + a.page = newWebsites + } else if (a.page === oldDatamanager) { + a.page = newDatamanager + } else {} + }) + + localStorage.setItem('myMenuPlugs', JSON.stringify(newPluginMenu)) + + await appDelay(250) + this.myMenuPlugins = JSON.parse(localStorage.getItem('myMenuPlugs') || '[]') } } From 564981fb4c5b12f954cea6f81b686c776372fadd Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Sat, 18 May 2024 16:23:22 -0400 Subject: [PATCH 25/29] Allow uppercase in poll description --- crypto/api/transactions/polls/CreatePollTransaction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/api/transactions/polls/CreatePollTransaction.js b/crypto/api/transactions/polls/CreatePollTransaction.js index 07815458..c4af34bb 100644 --- a/crypto/api/transactions/polls/CreatePollTransaction.js +++ b/crypto/api/transactions/polls/CreatePollTransaction.js @@ -74,7 +74,7 @@ export default class CreatePollTransaction extends TransactionBase { set rPollDesc(rPollDesc) { this._rPollDesc = rPollDesc - this._rPollDescBytes = this.constructor.utils.stringtoUTF8Array(this._rPollDesc.toLocaleLowerCase()) + this._rPollDescBytes = this.constructor.utils.stringtoUTF8Array(this._rPollDesc) this._rPollDescLength = this.constructor.utils.int32ToBytes(this._rPollDescBytes.length) } From 30439a9cf3e971d9f61cab74b9a31aa8208b21bf Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 19 May 2024 21:08:00 +0200 Subject: [PATCH 26/29] Added tabs for tx type on qort wallet TX types now divorced with shorter limit and their types for better overview --- core/language/us.json | 4 +- package-lock.json | 74 ++- package.json | 6 +- .../plugins/core/components/plugins-css.js | 2 +- plugins/plugins/core/wallet/wallet-app.src.js | 431 ++++++++++++++++-- 5 files changed, 458 insertions(+), 59 deletions(-) diff --git a/core/language/us.json b/core/language/us.json index c1832904..16ebdcf6 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -248,7 +248,9 @@ "balance": "Balance", "balances": "YOUR WALLET BALANCES", "update": "UPDATE WALLET BALANCES", - "view": "View" + "view": "View", + "all": "All", + "page": "Page" }, "gifs": { "gchange1": "Gif Explorer", diff --git a/package-lock.json b/package-lock.json index 6a7982f5..82571064 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.6", - "sass": "1.77.1", + "sass": "1.77.2", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, @@ -101,10 +101,12 @@ "@vaadin/grid": "24.2.9", "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", + "@vaadin/tabs": "24.2.9", + "@vaadin/tabsheet": "24.2.9", "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", - "electron": "30.0.5", + "electron": "30.0.6", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", @@ -3965,6 +3967,50 @@ "@vaadin/vaadin-themable-mixin": "~24.2.9" } }, + "node_modules/@vaadin/scroller": { + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@vaadin/scroller/-/scroller-24.2.9.tgz", + "integrity": "sha512-CFAaJ6hGzncq46wARiu+B+AoSBiW+qJ4mJ4jmn2gIeTEAbv/IhMPv7GeuF2zKO6/eW6YyHm6wJRTMWcJszOYaQ==", + "dev": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.2.9", + "@vaadin/component-base": "~24.2.9", + "@vaadin/vaadin-lumo-styles": "~24.2.9", + "@vaadin/vaadin-material-styles": "~24.2.9", + "@vaadin/vaadin-themable-mixin": "~24.2.9" + } + }, + "node_modules/@vaadin/tabs": { + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@vaadin/tabs/-/tabs-24.2.9.tgz", + "integrity": "sha512-cmiFzWyhEKXPGk7r3ExvZLiHJ7aVrN2fN//6PCPwag2ofLqNXvL2xw9RJrCDx1n8/aabNpRvYz0mAf+ucuE1Sw==", + "dev": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.2.9", + "@vaadin/component-base": "~24.2.9", + "@vaadin/item": "~24.2.9", + "@vaadin/vaadin-lumo-styles": "~24.2.9", + "@vaadin/vaadin-material-styles": "~24.2.9", + "@vaadin/vaadin-themable-mixin": "~24.2.9" + } + }, + "node_modules/@vaadin/tabsheet": { + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@vaadin/tabsheet/-/tabsheet-24.2.9.tgz", + "integrity": "sha512-M5Wn60dEJepSQR6BmLveHVQqeZ+OiaoHBG4KAl8cAg3xFRy7peO3w6fVJfn5XhHO1BEoGx5rqAa31YXguV9hiw==", + "dev": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.2.9", + "@vaadin/scroller": "~24.2.9", + "@vaadin/tabs": "~24.2.9", + "@vaadin/vaadin-lumo-styles": "~24.2.9", + "@vaadin/vaadin-material-styles": "~24.2.9", + "@vaadin/vaadin-themable-mixin": "~24.2.9" + } + }, "node_modules/@vaadin/text-field": { "version": "24.2.9", "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.2.9.tgz", @@ -5018,9 +5064,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001618", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", - "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", + "version": "1.0.30001620", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", + "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", "dev": true, "funding": [ { @@ -5741,9 +5787,9 @@ } }, "node_modules/electron": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-30.0.5.tgz", - "integrity": "sha512-+a7PjcAq2HrfF1l+Ez8n0W9YeZIam7E9ERHEGs+L2dqKu7qxk8GNSEFoBEPCpLI00p/fc0d76L9IcLCQJdNFqA==", + "version": "30.0.6", + "resolved": "https://registry.npmjs.org/electron/-/electron-30.0.6.tgz", + "integrity": "sha512-PkhEPFdpYcTzjAO3gMHZ+map7g2+xCrMDedo/L1i0ir2BRXvAB93IkTJX497U6Srb/09r2cFt+k20VPNVCdw3Q==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -6032,9 +6078,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.769", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.769.tgz", - "integrity": "sha512-bZu7p623NEA2rHTc9K1vykl57ektSPQYFFqQir8BOYf6EKOB+yIsbFB9Kpm7Cgt6tsLr9sRkqfqSZUw7LP1XxQ==", + "version": "1.4.774", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz", + "integrity": "sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==", "dev": true }, "node_modules/electron-updater": { @@ -9701,9 +9747,9 @@ } }, "node_modules/sass": { - "version": "1.77.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz", - "integrity": "sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==", + "version": "1.77.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", + "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", diff --git a/package.json b/package.json index ce4f2996..7bf362f3 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.6", - "sass": "1.77.1", + "sass": "1.77.2", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, @@ -123,10 +123,12 @@ "@vaadin/grid": "24.2.9", "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", + "@vaadin/tabs": "24.2.9", + "@vaadin/tabsheet": "24.2.9", "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", "axios": "1.6.8", - "electron": "30.0.5", + "electron": "30.0.6", "electron-builder": "24.13.3", "epml": "0.3.3", "eslint": "8.57.0", diff --git a/plugins/plugins/core/components/plugins-css.js b/plugins/plugins/core/components/plugins-css.js index e4b00fb1..3ad72b2a 100644 --- a/plugins/plugins/core/components/plugins-css.js +++ b/plugins/plugins/core/components/plugins-css.js @@ -13205,7 +13205,7 @@ export const multiWalletStyles = css` } #transactions { - margin-top: 30px; + margin-top: 25px; margin-left: 20px; margin-right: 20px; border-top: 1px solid var(--border); diff --git a/plugins/plugins/core/wallet/wallet-app.src.js b/plugins/plugins/core/wallet/wallet-app.src.js index a49333d4..d2fc024f 100644 --- a/plugins/plugins/core/wallet/wallet-app.src.js +++ b/plugins/plugins/core/wallet/wallet-app.src.js @@ -29,6 +29,8 @@ import '@vaadin/grid' import '@vaadin/icon' import '@vaadin/icons' import '@vaadin/password-field' +import '@vaadin/tabs' +import '@vaadin/tabsheet' // Multi language support import { get, registerTranslateConfig, translate, use } from '../../../../core/translate' @@ -127,7 +129,12 @@ class MultiWallet extends LitElement { bookDogecoinAddress: { type: String }, bookDigibyteAddress: { type: String }, bookRavencoinAddress: { type: String }, - bookPiratechainAddress: { type: String } + bookPiratechainAddress: { type: String }, + visitedTab: { type: Number }, + searchOffset: { type: Number }, + searchLimit: { type: Number }, + counter: { type: Number }, + pageButtonsHidden: { type: Boolean } } } @@ -235,6 +242,11 @@ class MultiWallet extends LitElement { this.bookDigibyteAddress = '' this.bookRavencoinAddress = '' this.bookPiratechainAddress = '' + this.visitedTab = 0 + this.searchOffset = 0 + this.searchLimit = 10 + this.counter = 1 + this.pageButtonsHidden = false this.wallets = new Map() let coinProp = { @@ -387,6 +399,7 @@ class MultiWallet extends LitElement {
    + ${this.renderTabTransactions()}
    ${this.loading ? html` @@ -2246,7 +2259,7 @@ class MultiWallet extends LitElement { this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') - this.showWallet() + this.showNewQortWallet() window.addEventListener('storage', () => { const checkLanguage = localStorage.getItem('qortalLanguage') @@ -2282,6 +2295,38 @@ class MultiWallet extends LitElement { }, 600000) } + async myTabChanged(value) { + this.pageButtonsHidden = false + this.visitedTab = value + this.searchOffset = 0 + this.searchLimit = 10 + this.counter = 1 + await this.renderNewDom() + } + + renderTabTransactions() { + if (this._selectedWallet == 'qort') { + return html` +
    + + ${translate("walletpage.wchange6")} : + this.myTabChanged(0)}>PAYMENT + this.myTabChanged(1)}>ARBITARY + this.myTabChanged(2)}>AT + this.myTabChanged(3)}>GROUP + this.myTabChanged(4)}>NAME + this.myTabChanged(5)}>ASSET + this.myTabChanged(6)}>POLL + this.myTabChanged(7)}>REWARDSHARE + this.myTabChanged(8)}>MISC + +
    + ` + } else { + return html`` + } + } + async paymentFee() { const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port @@ -2499,7 +2544,11 @@ class MultiWallet extends LitElement { tabWalletQort() { this._selectedWallet = 'qort' - this.showWallet() + this.visitedTab = 0 + this.searchOffset = 0 + this.searchLimit = 10 + this.pageButtonsHidden = false + this.showNewQortWallet() } tabWalletBtc() { @@ -3538,19 +3587,18 @@ class MultiWallet extends LitElement { renderCAB() { return html` - ${this.selectedTransaction.aTAddress} - - - ` + ${this.selectedTransaction.aTAddress} + + ` } renderFetchText() { @@ -3857,7 +3905,7 @@ class MultiWallet extends LitElement { } } await validateReceiver(recipient) - await this.showWallet() + await this.showNewQortWallet() } async sendBtc() { @@ -4139,15 +4187,21 @@ class MultiWallet extends LitElement { if (this._selectedWallet == 'qort') { if (!window.parent.reduxStore.getState().app.blockInfo.height) { - await parentEpml.request('apiCall', { url: `/blocks/height`, type: 'api' }) - .then(height => parentEpml.request('updateBlockInfo', { height })) + await parentEpml.request('apiCall', { + url: `/blocks/height`, + type: 'api' + }).then(height => parentEpml.request('updateBlockInfo', { + height + })) } } + const coin = this._selectedWallet + await this.fetchWalletAddress(this._selectedWallet) - await this.fetchWalletServer(this._selectedWallet) await this.fetchWalletDetails(this._selectedWallet) await this.fetchWalletServer(this._selectedWallet) + if (this._selectedWallet == coin) { await this.renderTransactions() await this.getTransactionGrid(this._selectedWallet) @@ -4157,32 +4211,314 @@ class MultiWallet extends LitElement { } } + + async showNewQortWallet() { + this.pageButtonsHidden = false + this.transactionsDOM.hidden = true + this.loading = true + + if (!window.parent.reduxStore.getState().app.blockInfo.height) { + await parentEpml.request('apiCall', { + url: `/blocks/height`, + type: 'api' + }).then(height => parentEpml.request('updateBlockInfo', { + height + })) + } + + const coin = this._selectedWallet + + this.balanceString = this.renderFetchText() + + parentEpml.request('apiCall', { + url: `/addresses/balance/${this.wallets.get('qort').wallet.address}` + }).then((res) => { + if (isNaN(Number(res))) { + let snack4string = get("walletpage.wchange32") + parentEpml.request('showSnackBar', `${snack4string}`) + } else { + if (this._selectedWallet == coin) { + this.wallets.get(coin).balance = Number(res).toFixed(8) + this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() + this.balance = this.wallets.get(this._selectedWallet).balance + } + } + }) + + await this.fetchWalletDetails(this._selectedWallet) + await this.fetchWalletServer(this._selectedWallet) + + this.shadowRoot.getElementById('type').selected = false + this.shadowRoot.getElementById('payment-tab').selected = true + this.shadowRoot.getElementById('arbitary-tab').selected = false + this.shadowRoot.getElementById('at-tab').selected = false + this.shadowRoot.getElementById('group-tab').selected = false + this.shadowRoot.getElementById('name-tab').selected = false + this.shadowRoot.getElementById('asset-tab').selected = false + this.shadowRoot.getElementById('poll-tab').selected = false + this.shadowRoot.getElementById('rewarshare-tab').selected = false + this.shadowRoot.getElementById('misc-tab').selected = false + + if (this._selectedWallet == coin) { + await this.renderTransactions() + await this.getTransactionGrid(this._selectedWallet) + this.loading = false + this.transactionsDOM.hidden = false + } + } + + async renderNewDom() { + this.transactionsDOM.hidden = true + this.loading = true + + if (!window.parent.reduxStore.getState().app.blockInfo.height) { + await parentEpml.request('apiCall', { + url: `/blocks/height`, + type: 'api' + }).then(height => parentEpml.request('updateBlockInfo', { + height + })) + } + + const coin = this._selectedWallet + + await this.fetchWalletDetails(this._selectedWallet) + + if (this._selectedWallet == coin) { + await this.renderTransactions() + await this.getTransactionGrid(this._selectedWallet) + this.loading = false + this.transactionsDOM.hidden = false + } + } + + goBackwardTX() { + if (this.searchOffset === 0) { + this.pageButtonsHidden = false + this.searchLimit = 10 + this.counter = 1 + } else { + this.pageButtonsHidden = false + this.searchLimit = 10 + this.counter = this.searchOffset / 10 + this.searchOffset = this.searchOffset - 10 + this.renderNewDom() + } + } + + goForwardTX() { + this.pageButtonsHidden = false + this.searchLimit = 10 + this.searchOffset = this.searchOffset + 10 + this.counter = (this.searchOffset / 10) + 1 + this.renderNewDom() + } + + showAllTX() { + this.pageButtonsHidden = true + this.searchLimit = 0 + this.searchOffset = 0 + this.counter = 1 + this.renderNewDom() + } + async fetchWalletDetails(coin) { switch (coin) { case 'qort': - this.balanceString = this.renderFetchText() - parentEpml.request('apiCall', { - url: `/addresses/balance/${this.wallets.get('qort').wallet.address}?apiKey=${this.getApiKey()}` - }).then((res) => { - if (isNaN(Number(res))) { - let snack4string = get("walletpage.wchange32") - parentEpml.request('showSnackBar', `${snack4string}`) - } else { - if (this._selectedWallet == coin) { - this.wallets.get(coin).balance = Number(res).toFixed(8) - this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() - this.balance = this.wallets.get(this._selectedWallet).balance - } - } + const paymentTxsQort = 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 + ` }) - const txsQort = await parentEpml.request('apiCall', { - url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true&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 pendingPaymentTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=PAYMENT + ` }) - const pendingTxsQort = await parentEpml.request('apiCall', { - url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true&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 arbitaryTxsQort = 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=ARBITRARY + ` + }) + const pendingArbitaryTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=ARBITRARY + ` + }) + const atTxsQort = 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=AT + &txType=DEPLOY_AT + &txType=MESSAGE + ` + }) + const pendingAtTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=AT + &txType=DEPLOY_AT + &txType=MESSAGE + ` + }) + const groupTxsQort = 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=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 + ` + }) + const pendingGroupTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &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 + ` + }) + const nameTxsQort = 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=REGISTER_NAME + &txType=UPDATE_NAME + &txType=SELL_NAME + &txType=CANCEL_SELL_NAME + &txType=BUY_NAME + ` + }) + const pendingNameTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=REGISTER_NAME + &txType=UPDATE_NAME + &txType=SELL_NAME + &txType=CANCEL_SELL_NAME + &txType=BUY_NAME + ` + }) + const assetTxsQort = 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=ISSUE_ASSET + &txType=TRANSFER_ASSET + &txType=CREATE_ASSET_ORDER + &txType=CANCEL_ASSET_ORDER + &txType=UPDATE_ASSET + ` + }) + const pendingAssetTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=ISSUE_ASSET + &txType=TRANSFER_ASSET + &txType=CREATE_ASSET_ORDER + &txType=CANCEL_ASSET_ORDER + &txType=UPDATE_ASSET + ` + }) + const pollTxsQort = 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=CREATE_POLL + &txType=VOTE_ON_POLL + ` + }) + const pendingPollTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=CREATE_POLL + &txType=VOTE_ON_POLL + ` + }) + const rewardshareTxsQort = 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=REWARD_SHARE + ` + }) + const pendingRewardshareTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=REWARD_SHARE + ` + }) + const miscTxsQort = 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=TRANSFER_PRIVS + &txType=PRESENCE + ` + }) + const pendingMiscTxsQort = await parentEpml.request('apiCall', { + url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true + &limit=${this.searchLimit} + &offset=${this.searchOffset} + &txType=TRANSFER_PRIVS + &txType=PRESENCE + ` }) if (this._selectedWallet == coin) { - this.wallets.get(coin).transactions = pendingTxsQort.concat(txsQort) + if (this.visitedTab === 0) { + this.wallets.get(coin).transactions = pendingPaymentTxsQort.concat(paymentTxsQort) + } else if (this.visitedTab === 1) { + this.wallets.get(coin).transactions = pendingArbitaryTxsQort.concat(arbitaryTxsQort) + } else if (this.visitedTab === 2) { + this.wallets.get(coin).transactions = pendingAtTxsQort.concat(atTxsQort) + } else if (this.visitedTab === 3) { + this.wallets.get(coin).transactions = pendingGroupTxsQort.concat(groupTxsQort) + } else if (this.visitedTab === 4) { + this.wallets.get(coin).transactions = pendingNameTxsQort.concat(nameTxsQort) + } else if (this.visitedTab === 5) { + this.wallets.get(coin).transactions = pendingAssetTxsQort.concat(assetTxsQort) + } else if (this.visitedTab === 6) { + this.wallets.get(coin).transactions = pendingPollTxsQort.concat(pollTxsQort) + } else if (this.visitedTab === 7) { + this.wallets.get(coin).transactions = pendingRewardshareTxsQort.concat(rewardshareTxsQort) + } else if (this.visitedTab === 8) { + this.wallets.get(coin).transactions = pendingMiscTxsQort.concat(miscTxsQort) + } } break case 'btc': @@ -4643,7 +4979,7 @@ class MultiWallet extends LitElement { } return html`
    ${translate("walletpage.wchange38")}
    - + -
    +
    + this.goBackwardTX()}> + << ${translate("general.back")} + +  ${translate("general.page")} ${this.counter}  + this.goForwardTX()}> + ${translate("general.next")} >> + +
    + this.showAllTX()}> + ${translate("general.view")} ${translate("general.all")} + +
    +
    ` } From 78a0c31cf3dfc5d8324763e62a031e7281552c63 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 20 May 2024 19:22:26 +0200 Subject: [PATCH 27/29] Fix broken links in q-chat Replaced by correct regex pattern --- plugins/plugins/core/components/ChatScroller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/plugins/core/components/ChatScroller.js b/plugins/plugins/core/components/ChatScroller.js index 913447c6..14963901 100644 --- a/plugins/plugins/core/components/ChatScroller.js +++ b/plugins/plugins/core/components/ChatScroller.js @@ -87,7 +87,7 @@ const extractComponents = async (url) => { } function processText(input) { - const linkRegex = /(qortal:\/\/S+)/g + const linkRegex = /(qortal:\/\/\s+$|\S+.+)/gm function processNode(node) { if (node.nodeType === Node.TEXT_NODE) { const parts = node.textContent.split(linkRegex) From 555aa1bc07c0684aabeeafc6ce20fa03eb4a7421 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 20 May 2024 20:24:40 +0200 Subject: [PATCH 28/29] Added vaadin scroller for mac os compatibility --- package-lock.json | 9 +++++---- package.json | 3 ++- plugins/plugins/core/components/plugins-css.js | 18 +----------------- plugins/plugins/core/q-chat/q-chat.src.js | 12 +++++++++--- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 82571064..6a5daa9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -101,11 +101,12 @@ "@vaadin/grid": "24.2.9", "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", + "@vaadin/scroller": "24.2.9", "@vaadin/tabs": "24.2.9", "@vaadin/tabsheet": "24.2.9", "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", - "axios": "1.6.8", + "axios": "1.7.1", "electron": "30.0.6", "electron-builder": "24.13.3", "epml": "0.3.3", @@ -4665,9 +4666,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", + "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", diff --git a/package.json b/package.json index 7bf362f3..528edea7 100644 --- a/package.json +++ b/package.json @@ -123,11 +123,12 @@ "@vaadin/grid": "24.2.9", "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", + "@vaadin/scroller": "24.2.9", "@vaadin/tabs": "24.2.9", "@vaadin/tabsheet": "24.2.9", "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.44", - "axios": "1.6.8", + "axios": "1.7.1", "electron": "30.0.6", "electron-builder": "24.13.3", "epml": "0.3.3", diff --git a/plugins/plugins/core/components/plugins-css.js b/plugins/plugins/core/components/plugins-css.js index 3ad72b2a..6ee176c2 100644 --- a/plugins/plugins/core/components/plugins-css.js +++ b/plugins/plugins/core/components/plugins-css.js @@ -6791,8 +6791,6 @@ export const qchatStyles = css` --_lumo-grid-border-color: var(--border); --_lumo-grid-secondary-border-color: var(--border2); --mdc-dialog-min-width: 750px; - scrollbar-width: thin; - scrollbar-color: #6a6c75 #a1a1a1; } paper-spinner-lite { @@ -6824,7 +6822,7 @@ export const qchatStyles = css` float: left; height: 100vh; overflow-y: hidden; - border-right: 3px #ddd solid; + border-right: 2px #ddd solid; } .people-list .blockedusers { @@ -6972,20 +6970,6 @@ export const qchatStyles = css` overflow-x: hidden; } - .people-list ul::-webkit-scrollbar-track { - background: #a1a1a1; - } - - .people-list ul::-webkit-scrollbar { - width: 11px; - } - - .people-list ul::-webkit-scrollbar-thumb { - background-color: #6a6c75; - border-radius: 6px; - border: 3px solid #a1a1a1; - } - .chat { width: 80vw; height: 100vh; diff --git a/plugins/plugins/core/q-chat/q-chat.src.js b/plugins/plugins/core/q-chat/q-chat.src.js index a2cdfd96..7a5b75d1 100644 --- a/plugins/plugins/core/q-chat/q-chat.src.js +++ b/plugins/plugins/core/q-chat/q-chat.src.js @@ -24,6 +24,7 @@ import '@material/mwc-icon' import '@material/mwc-snackbar' import '@polymer/paper-spinner/paper-spinner-lite.js' import '@vaadin/grid' +import '@vaadin/scroller' import '@vaadin/tooltip' // Multi language support @@ -149,9 +150,14 @@ class Chat extends LitElement {
    -
      - ${this.isEmptyArray(this.chatHeads) ? this.renderLoadingText() : this.renderChatHead(this.chatHeads)} -
    + +
      + ${this.isEmptyArray(this.chatHeads) ? this.renderLoadingText() : this.renderChatHead(this.chatHeads)} +
    +
    this.scrollToBottom()}> From e7fa83dfde182f084c41639577f7ad768dddab05 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 20 May 2024 20:49:21 +0200 Subject: [PATCH 29/29] Added missing translations --- core/language/de.json | 4 +++- core/language/es.json | 4 +++- core/language/et.json | 4 +++- core/language/fi.json | 4 +++- core/language/fr.json | 4 +++- core/language/hindi.json | 4 +++- core/language/hr.json | 4 +++- core/language/hu.json | 4 +++- core/language/it.json | 4 +++- core/language/jp.json | 4 +++- core/language/ko.json | 4 +++- core/language/nl.json | 4 +++- core/language/no.json | 4 +++- core/language/pl.json | 4 +++- core/language/pt.json | 4 +++- core/language/ro.json | 4 +++- core/language/rs.json | 4 +++- core/language/ru.json | 4 +++- core/language/zhc.json | 4 +++- core/language/zht.json | 4 +++- 20 files changed, 60 insertions(+), 20 deletions(-) diff --git a/core/language/de.json b/core/language/de.json index 073b4316..d412d3d3 100644 --- a/core/language/de.json +++ b/core/language/de.json @@ -248,7 +248,9 @@ "balance": "Guthaben", "balances": "IHR WALLET-GUTHABEN", "update": "AKTUALISIERE WALLET-GUTHABEN", - "view": "Ansehen" + "view": "Ansehen", + "all": "Alle", + "page": "Seite" }, "gifs": { "gchange1": "GIF-Explorer", diff --git a/core/language/es.json b/core/language/es.json index 8a61f827..d3dbce32 100644 --- a/core/language/es.json +++ b/core/language/es.json @@ -248,7 +248,9 @@ "balance": "Saldo", "balances": "LOS SALDOS DE TU BILLETERA", "update": "ACTUALIZAR SALDOS DE CARTERA", - "view": "Vista" + "view": "Vista", + "all": "Todo", + "page": "Página" }, "gifs": { "gchange1": "Explorador de gifs", diff --git a/core/language/et.json b/core/language/et.json index 378bafc6..e71dff39 100644 --- a/core/language/et.json +++ b/core/language/et.json @@ -248,7 +248,9 @@ "balance": "Saldo", "balances": "Sinu saldoseisud", "update": "Saldoseisude uuendamine", - "view": "Vaata" + "view": "Vaata", + "all": "Kõik", + "page": "Lehekülg" }, "gifs": { "gchange1": "Gif avastaja", diff --git a/core/language/fi.json b/core/language/fi.json index 4ec24b80..cf3d198b 100644 --- a/core/language/fi.json +++ b/core/language/fi.json @@ -248,7 +248,9 @@ "balance": "Saldosi", "balances": "Sinun saldosi", "update": "Saldot päivitetään", - "view": "Katso" + "view": "Katso", + "all": "Kaikki", + "page": "Sivu" }, "gifs": { "gchange1": "Gif tutkija", diff --git a/core/language/fr.json b/core/language/fr.json index 986f4069..5fda13d4 100644 --- a/core/language/fr.json +++ b/core/language/fr.json @@ -248,7 +248,9 @@ "balance": "Solde", "balances": "VOS SOLDES DE PORTEFEUILLE", "update": "METTRE À JOUR LES SOLDES DES PORTEFEUILLES", - "view": "Voir" + "view": "Voir", + "all": "Tous", + "page": "Page" }, "gifs": { "gchange1": "Explorateur GIF", diff --git a/core/language/hindi.json b/core/language/hindi.json index f37c22fe..73e43e23 100644 --- a/core/language/hindi.json +++ b/core/language/hindi.json @@ -248,7 +248,9 @@ "balance": "संतुलन", "balances": "आपका वॉलेट बैलेंस", "update": "अपडेट वॉलेट बैलेंस", - "view": "देखना" + "view": "देखना", + "all": "सभी", + "page": "पृष्ठ" }, "gifs": { "gchange1": "जीआईएफ एक्सप्लोरर", diff --git a/core/language/hr.json b/core/language/hr.json index 43c7c244..a85b01ae 100644 --- a/core/language/hr.json +++ b/core/language/hr.json @@ -248,7 +248,9 @@ "balance": "Kreditna", "balances": "VAŠ NOVČANIK JE NA SALJU", "update": "AŽURIRAJTE STANJE NOVČANIKA", - "view": "Pogled" + "view": "Pogled", + "all": "svi", + "page": "Stranica" }, "gifs": { "gchange1": "Gif Explorer", diff --git a/core/language/hu.json b/core/language/hu.json index 8a7ef20f..3854e294 100644 --- a/core/language/hu.json +++ b/core/language/hu.json @@ -248,7 +248,9 @@ "balance": "Hitel", "balances": "A PÉNZTÁRCSA EGYENLEGEK", "update": "FRISSÍTSE A PÉNZTÁRCSA-EGYENLEGEKET", - "view": "Kilátás" + "view": "Kilátás", + "all": "Minden", + "page": "Oldal" }, "gifs": { "gchange1": "Gif Explorer", diff --git a/core/language/it.json b/core/language/it.json index d8e5e55c..a4b1207f 100644 --- a/core/language/it.json +++ b/core/language/it.json @@ -248,7 +248,9 @@ "balance": "Saldo", "balances": "I SALDI DEL TUO PORTAFOGLIO", "update": "AGGIORNA I SALDI DEL PORTAFOGLIO", - "view": "Vedere" + "view": "Vedere", + "all": "Tutto", + "page": "Pagina" }, "gifs": { "gchange1": "Esplora Gif", diff --git a/core/language/jp.json b/core/language/jp.json index 27f7f200..8934fce9 100644 --- a/core/language/jp.json +++ b/core/language/jp.json @@ -248,7 +248,9 @@ "balance": "残高", "balances": "あなたのウォレット残高", "update": "ウォレット残高を更新", - "view": "表示" + "view": "表示", + "all": "全て", + "page": "ページ" }, "gifs": { "gchange1": "GIF エクスプローラー", diff --git a/core/language/ko.json b/core/language/ko.json index dfbed137..24291d55 100644 --- a/core/language/ko.json +++ b/core/language/ko.json @@ -248,7 +248,9 @@ "balance": "균형", "balances": "지갑 잔액", "update": "월렛 잔액 업데이트", - "view": "보다" + "view": "보다", + "all": "모두", + "page": "페이지" }, "gifs": { "gchange1": "Gif 탐색기", diff --git a/core/language/nl.json b/core/language/nl.json index 5a88c2e5..4ff80b78 100644 --- a/core/language/nl.json +++ b/core/language/nl.json @@ -248,7 +248,9 @@ "balance": "Saldo", "balances": "SALDI VAN UW PORTEFEUILLES", "update": "SALDI VAN PORTEFEUILLES HEROPVRAGEN", - "view": "Bekijken" + "view": "Bekijken", + "all": "Alle", + "page": "Bladzijde" }, "gifs": { "gchange1": "GIF-Explorer", diff --git a/core/language/no.json b/core/language/no.json index 229e6968..f07f29bc 100644 --- a/core/language/no.json +++ b/core/language/no.json @@ -248,7 +248,9 @@ "balance": "Saldo", "balances": "DIN WALLET-SALDO", "update": "OPPDATERT WALLET-SALDOER", - "view": "Utsikt" + "view": "Utsikt", + "all": "Alle", + "page": "Side" }, "gifs": { "gchange1": "Gif Explorer", diff --git a/core/language/pl.json b/core/language/pl.json index 7c6b7ee6..f30ee4a2 100644 --- a/core/language/pl.json +++ b/core/language/pl.json @@ -248,7 +248,9 @@ "balance": "Saldo", "balances": "SALDO TWOJEGO PORTFELA", "update": "AKTUALIZUJ SALDA W PORTFELU", - "view": "Pogląd" + "view": "Pogląd", + "all": "Wszystko", + "page": "Strona" }, "gifs": { "gchange1": "Eksplorator gifów", diff --git a/core/language/pt.json b/core/language/pt.json index 7cff6741..6d7450ed 100644 --- a/core/language/pt.json +++ b/core/language/pt.json @@ -248,7 +248,9 @@ "balance": "Saldo", "balances": "SEUS SALDOS DE CARTEIRA", "update": "ATUALIZAR SALDOS DA CARTEIRA", - "view": "Ver" + "view": "Ver", + "all": "Todos", + "page": "Página" }, "gifs": { "gchange1": "Gif Explorer", diff --git a/core/language/ro.json b/core/language/ro.json index 3fba32a0..01be225f 100644 --- a/core/language/ro.json +++ b/core/language/ro.json @@ -248,7 +248,9 @@ "balance": "Credit", "balances": "SOLDELE PORTOTELULUI DVS", "update": "ACTUALIZAȚI SOLDELE PORTOTELULUI", - "view": "Vedere" + "view": "Vedere", + "all": "Toate", + "page": "Pagină" }, "gifs": { "gchange1": "Explorator GIF", diff --git a/core/language/rs.json b/core/language/rs.json index a1e70f56..b731873a 100644 --- a/core/language/rs.json +++ b/core/language/rs.json @@ -248,7 +248,9 @@ "balance": "Kredit", "balances": "VAŠI STANJE U NOVČANIKU", "update": "AŽURIRAJTE STANJE NOVČANIKA", - "view": "Pogled" + "view": "Pogled", + "all": "Sve", + "page": "Strana" }, "gifs": { "gchange1": "Gif Ekplorer", diff --git a/core/language/ru.json b/core/language/ru.json index 871ec655..aa2d98b9 100644 --- a/core/language/ru.json +++ b/core/language/ru.json @@ -248,7 +248,9 @@ "balance": "кредит", "balances": "БАЛАНС ВАШЕГО КОШЕЛЬКА", "update": "ОБНОВИТЬ БАЛАНС КОШЕЛЬКА", - "view": "Вид" + "view": "Вид", + "all": "Все", + "page": "Страница" }, "gifs": { "gchange1": "Проводник гифок", diff --git a/core/language/zhc.json b/core/language/zhc.json index 5149f748..aa8626d4 100644 --- a/core/language/zhc.json +++ b/core/language/zhc.json @@ -248,7 +248,9 @@ "balance": "余额", "balances": "您的钱包余额", "update": "更新钱包余额", - "view": "看法" + "view": "看法", + "all": "全部", + "page": "页" }, "gifs": { "gchange1": "Gif 浏览器", diff --git a/core/language/zht.json b/core/language/zht.json index 01dba82e..79e555e6 100644 --- a/core/language/zht.json +++ b/core/language/zht.json @@ -248,7 +248,9 @@ "balance": "餘額", "balances": "您的錢包餘額", "update": "更新錢包餘額", - "view": "看法" + "view": "看法", + "all": "全部", + "page": "頁" }, "gifs": { "gchange1": "Gif 瀏覽器",