From b5189ecfcb5020a74175356f2de53d0b5e36a203 Mon Sep 17 00:00:00 2001
From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com>
Date: Sat, 19 Nov 2022 22:00:23 +0100
Subject: [PATCH] Auto Buy V2, Balances Ticker
---
package.json | 4 +-
qortal-ui-core/language/de.json | 10 +-
qortal-ui-core/language/es.json | 10 +-
qortal-ui-core/language/fr.json | 10 +-
qortal-ui-core/language/hindi.json | 10 +-
qortal-ui-core/language/hr.json | 13 +-
qortal-ui-core/language/hu.json | 10 +-
qortal-ui-core/language/it.json | 10 +-
qortal-ui-core/language/ko.json | 10 +-
qortal-ui-core/language/no.json | 10 +-
qortal-ui-core/language/pl.json | 10 +-
qortal-ui-core/language/pt.json | 10 +-
qortal-ui-core/language/ro.json | 10 +-
qortal-ui-core/language/rs.json | 10 +-
qortal-ui-core/language/ru.json | 10 +-
qortal-ui-core/language/us.json | 10 +-
qortal-ui-core/language/zhc.json | 10 +-
qortal-ui-core/language/zht.json | 10 +-
qortal-ui-core/package.json | 8 +-
qortal-ui-core/src/components/app-view.js | 1784 ++++++++-
qortal-ui-core/src/components/main-app.js | 2 +-
qortal-ui-core/src/components/sidenav-menu.js | 21 +-
.../src/tradebot/addTradeBotRoutes.js | 7 +
.../src/tradebot/trade-bot-routes.js | 253 ++
qortal-ui-plugins/build-config.js | 12 +-
qortal-ui-plugins/package.json | 6 +-
.../plugins/core/trade-bot/index.html | 4 +-
.../core/trade-bot/trade-bot-btc/index.html | 55 -
.../trade-bot-btc/trade-bot-btc.src.js | 2155 ----------
.../core/trade-bot/trade-bot-doge/index.html | 55 -
.../trade-bot-doge/trade-bot-doge.src.js | 2155 ----------
.../core/trade-bot/trade-bot-ltc/index.html | 55 -
.../trade-bot-ltc/trade-bot-ltc.src.js | 2155 ----------
.../core/trade-bot/trade-bot-portal.src.js | 3518 +++++++++++++++++
34 files changed, 5696 insertions(+), 6726 deletions(-)
create mode 100644 qortal-ui-core/src/tradebot/addTradeBotRoutes.js
create mode 100644 qortal-ui-core/src/tradebot/trade-bot-routes.js
delete mode 100644 qortal-ui-plugins/plugins/core/trade-bot/trade-bot-btc/index.html
delete mode 100644 qortal-ui-plugins/plugins/core/trade-bot/trade-bot-btc/trade-bot-btc.src.js
delete mode 100644 qortal-ui-plugins/plugins/core/trade-bot/trade-bot-doge/index.html
delete mode 100644 qortal-ui-plugins/plugins/core/trade-bot/trade-bot-doge/trade-bot-doge.src.js
delete mode 100644 qortal-ui-plugins/plugins/core/trade-bot/trade-bot-ltc/index.html
delete mode 100644 qortal-ui-plugins/plugins/core/trade-bot/trade-bot-ltc/trade-bot-ltc.src.js
create mode 100644 qortal-ui-plugins/plugins/core/trade-bot/trade-bot-portal.src.js
diff --git a/package.json b/package.json
index a2e16766..e3a24dfd 100644
--- a/package.json
+++ b/package.json
@@ -36,11 +36,11 @@
"electron-updater": "5.3.0"
},
"devDependencies": {
- "electron": "21.2.3",
+ "electron": "21.3.0",
"electron-builder": "23.6.0",
"electron-packager": "17.1.1",
"@electron/notarize": "1.2.3",
- "shelljs": "^0.8.5"
+ "shelljs": "0.8.5"
},
"engines": {
"node": ">=16.15.0"
diff --git a/qortal-ui-core/language/de.json b/qortal-ui-core/language/de.json
index ebbe5c20..fb8ab542 100644
--- a/qortal-ui-core/language/de.json
+++ b/qortal-ui-core/language/de.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GRUPPENMANAGEMENT",
"puzzles":"RÄTSEL",
- "nodemanagement":"KNOTENVERWALTUNG"
+ "nodemanagement":"KNOTENVERWALTUNG",
+ "trading":"HANDELN"
},
"login":{
"login":"Einloggen",
@@ -150,7 +151,9 @@
"next":"Weiter",
"create":"Erstellen",
"continue":"Fortsetzen",
- "save":"Speichern"
+ "save":"Speichern",
+ "balance":"Guthaben",
+ "balances":"IHR WALLET-GUTHABEN"
},
"startminting":{
"smchange1":"Prägekonten können nicht abgerufen werden",
@@ -322,7 +325,8 @@
"tchange44":"Automatischer Kaufauftrag erfolgreich hinzugefügt!",
"tchange45":"AUTO KAUFEN MIT",
"tchange46":"AUTOKAUF",
- "tchange47":"Verkaufe für diesen Preis"
+ "tchange47":"Verkaufe für diesen Preis",
+ "tchange48":"NICHT GENUG"
},
"rewardsharepage":{
"rchange1":"Belohnungsanteile",
diff --git a/qortal-ui-core/language/es.json b/qortal-ui-core/language/es.json
index 4bc2e336..47c84b8a 100644
--- a/qortal-ui-core/language/es.json
+++ b/qortal-ui-core/language/es.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GESTIÓN DE GRUPO",
"puzzles":"ROMPECABEZAS",
- "nodemanagement":"GESTIÓN DE NODO"
+ "nodemanagement":"GESTIÓN DE NODO",
+ "trading":"COMERCIO"
},
"login":{
"login":"Iniciar sesión",
@@ -150,7 +151,9 @@
"next":"Siguiente",
"create":"Crear",
"continue":"Continuar",
- "save":"Guardar"
+ "save":"Guardar",
+ "balance":"Saldo",
+ "balances":"LOS SALDOS DE TU BILLETERA"
},
"startminting":{
"smchange1":"No se pueden obtener cuentas de acuñación",
@@ -322,7 +325,8 @@
"tchange44":"Orden de compra automática agregada con éxito!",
"tchange45":"AUTO COMPRAR CON",
"tchange46":"COMPRA AUTOMÁTICA",
- "tchange47":"Vender por este precio"
+ "tchange47":"Vender por este precio",
+ "tchange48":"NO ES SUFICIENTE"
},
"rewardsharepage":{
"rchange1":"Rewardshares",
diff --git a/qortal-ui-core/language/fr.json b/qortal-ui-core/language/fr.json
index 728bc3f1..94cedf06 100644
--- a/qortal-ui-core/language/fr.json
+++ b/qortal-ui-core/language/fr.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GESTION DE GROUPES",
"puzzles":"PUZZLES",
- "nodemanagement":"GESTION DE NOEUDS"
+ "nodemanagement":"GESTION DE NOEUDS",
+ "trading":"COMMERCE"
},
"login":{
"login":"Connexion",
@@ -150,7 +151,9 @@
"next":"Suivant",
"create":"Créer",
"continue":"Continuer",
- "save":"Sauvegarder"
+ "save":"Sauvegarder",
+ "balance":"Solde",
+ "balances":"VOS SOLDES DE PORTEFEUILLE"
},
"startminting":{
"smchange1":"Impossible de récupérer les comptes de frappe",
@@ -322,7 +325,8 @@
"tchange44":"Commande d'achat automatique ajoutée avec succès !",
"tchange45":"ACHAT AUTO AVEC",
"tchange46":"ACHAT AUTOMATIQUE",
- "tchange47":"Vendre à ce prix"
+ "tchange47":"Vendre à ce prix",
+ "tchange48":"PAS ASSEZ"
},
"rewardsharepage":{
"rchange1":"Récompenses",
diff --git a/qortal-ui-core/language/hindi.json b/qortal-ui-core/language/hindi.json
index 2a2feb50..714e82fa 100644
--- a/qortal-ui-core/language/hindi.json
+++ b/qortal-ui-core/language/hindi.json
@@ -35,7 +35,8 @@
"qchat":"क्यू-चैट",
"groupmanagement":"समूह प्रबंधन",
"puzzles":"पहेलि",
- "nodemanagement":"नोड प्रबंधन"
+ "nodemanagement":"नोड प्रबंधन",
+ "trading":"व्यापार"
},
"login":{
"login":"लॉग इन करें",
@@ -151,7 +152,9 @@
"next":"अगला",
"create":"बनाएं",
"continue":"जारी रखें",
- "save":"सहेजें"
+ "save":"सहेजें",
+ "balance":"संतुलन",
+ "balances":"आपका वॉलेट बैलेंस"
},
"startminting":{
"smchange1":"खनन खाते नहीं लाए जा सकते",
@@ -323,7 +326,8 @@
"tchange44":"स्वतः खरीद आदेश सफलतापूर्वक जोड़ा गया!",
"tchange45":"ऑटो के साथ खरीदें",
"tchange46":"ऑटो खरीदें",
- "tchange47":"इस कीमत पर बेचें"
+ "tchange47":"इस कीमत पर बेचें",
+ "tchange48":"पर्याप्त नहीं"
},
"rewardsharepage":{
"rchange1":"रिवॉर्डशेयर",
diff --git a/qortal-ui-core/language/hr.json b/qortal-ui-core/language/hr.json
index d83f334d..7ca85c71 100644
--- a/qortal-ui-core/language/hr.json
+++ b/qortal-ui-core/language/hr.json
@@ -34,7 +34,8 @@
"qchat":"Q-ČAVRLJANJE",
"groupmanagement":"UPRAVLJANJE GRUPAMA",
"puzzles":"ZAGONETKE",
- "nodemanagement":"UPRAVLJANJE ČVOROVIMA"
+ "nodemanagement":"UPRAVLJANJE ČVOROVIMA",
+ "trading":"TRGOVANJE"
},
"login":{
"login":"Prijavi se",
@@ -133,7 +134,8 @@
"uiversion":"Verzija upravljačkog sučelja - UI",
"coreversion":"Verzija jezgre - Core",
"minting":"(Mintanje)",
- "synchronizing":"Sinkroniziranje"
+ "synchronizing":"Sinkroniziranje",
+ "balance":"Balance"
},
"walletprofile":{
"minterlevel":"Minter Level",
@@ -150,7 +152,9 @@
"next":"Sljedeće",
"create":"Stvori",
"continue":"Nastavi",
- "save":"Spremi"
+ "save":"Spremi",
+ "balance":"Kreditna",
+ "balances":"VAŠ NOVČANIK JE NA SALJU"
},
"startminting":{
"smchange1":"Nije moguće dohvatiti račune za kovanje",
@@ -322,7 +326,8 @@
"tchange44":"Uspješno dodana automatska narudžba za kupnju!",
"tchange45":"AUTO KUPITE SA",
"tchange46":"AUTO OTKUP",
- "tchange47":"Prodaj za ovu cijenu"
+ "tchange47":"Prodaj za ovu cijenu",
+ "tchange48":"NEDOVOLJNO"
},
"rewardsharepage":{
"rchange1":"Nagradni udio (Rewardshares)",
diff --git a/qortal-ui-core/language/hu.json b/qortal-ui-core/language/hu.json
index a71fd60e..ed3abedd 100644
--- a/qortal-ui-core/language/hu.json
+++ b/qortal-ui-core/language/hu.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"CSOPORTKEZELÉS",
"puzzles":"REJTVÉNYEK",
- "nodemanagement":"CSOMÓPONTKEZELÉS"
+ "nodemanagement":"CSOMÓPONTKEZELÉS",
+ "trading":"KERESKEDÉS"
},
"login":{
"login":"Bejelentkezés",
@@ -150,7 +151,9 @@
"next":"Következő",
"create":"Létrehozáshoz",
"continue":"Folytatódik/folytatáshoz",
- "save":"Mentéshez"
+ "save":"Mentéshez",
+ "balance":"Hitel",
+ "balances":"A PÉNZTÁRCSA EGYENLEGEK"
},
"startminting":{
"smchange1":"Nem lehet lekérni a pénzverési számlákat",
@@ -322,7 +325,8 @@
"tchange44":"Az automatikus vásárlási rendelés sikeresen hozzáadva!",
"tchange45":"AUTOMATIKUS VÁSÁRLÁS",
"tchange46":"AUTOMATIKUS VÁSÁRLÁS",
- "tchange47":"Eladni ezen az áron"
+ "tchange47":"Eladni ezen az áron",
+ "tchange48":"NEM ELÉG"
},
"rewardsharepage":{
"rchange1":"Jutalommegosztások",
diff --git a/qortal-ui-core/language/it.json b/qortal-ui-core/language/it.json
index 6c1acd65..b8cb7332 100644
--- a/qortal-ui-core/language/it.json
+++ b/qortal-ui-core/language/it.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GESTIONE DEI GRUPPI",
"puzzles":"PUZZLES",
- "nodemanagement":"GESTIONE DEI NODI"
+ "nodemanagement":"GESTIONE DEI NODI",
+ "trading":"COMMERCIO"
},
"login":{
"login":"Login",
@@ -150,7 +151,9 @@
"next":"Avanti",
"create":"Creare",
"continue":"Continua",
- "save":"Salva"
+ "save":"Salva",
+ "balance":"Saldo",
+ "balances":"IL TUO SALDO DEL PORTAFOGLIO"
},
"startminting":{
"smchange1":"Impossibile recuperare i conti di conio",
@@ -322,7 +325,8 @@
"tchange44":"Ordine di acquisto automatico aggiunto con successo!",
"tchange45":"ACQUISTA AUTO CON",
"tchange46":"ACQUISTO AUTO",
- "tchange47":"Vendi a questo prezzo"
+ "tchange47":"Vendi a questo prezzo",
+ "tchange48":"NON ABBASTANZA"
},
"rewardsharepage":{
"rchange1":"Quote di ricompensa",
diff --git a/qortal-ui-core/language/ko.json b/qortal-ui-core/language/ko.json
index 791fac74..2dabfd6b 100644
--- a/qortal-ui-core/language/ko.json
+++ b/qortal-ui-core/language/ko.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"그룹 관리",
"puzzles":"퍼즐",
- "nodemanagement":"노드 관리"
+ "nodemanagement":"노드 관리",
+ "trading":"무역"
},
"login":{
"login":"로그인",
@@ -150,7 +151,9 @@
"next":"다음",
"create":"생성",
"continue":"계속하다",
- "save":"저장"
+ "save":"저장",
+ "balance":"균형",
+ "balances":"지갑 잔액"
},
"startminting":{
"smchange1":"발행 계정을 가져올 수 없습니다",
@@ -322,7 +325,8 @@
"tchange44":"자동 구매 주문을 성공적으로 추가했습니다!",
"tchange45":"자동 구매",
"tchange46":"자동 구매",
- "tchange47":"이 가격에 팔아요"
+ "tchange47":"이 가격에 팔아요",
+ "tchange48":"부족한"
},
"rewardsharepage":{
"rchange1":"보상 공유",
diff --git a/qortal-ui-core/language/no.json b/qortal-ui-core/language/no.json
index 39d3da2c..9b6d8151 100644
--- a/qortal-ui-core/language/no.json
+++ b/qortal-ui-core/language/no.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GRUPPEADMINISTRASJON",
"puzzles":"PUZZLES",
- "nodemanagement":"NODEADMINISTRASJON"
+ "nodemanagement":"NODEADMINISTRASJON",
+ "trading":"HANDEL"
},
"login":{
"login":"Logg på",
@@ -150,7 +151,9 @@
"next":"Neste",
"create":"Opprett",
"continue":"Fortsett",
- "save":"Lagre"
+ "save":"Lagre",
+ "balance":"Saldo",
+ "balances":"DIN WALLET-SALDO"
},
"startminting":{
"smchange1":"Kan ikke hente myntingkontoer",
@@ -322,7 +325,8 @@
"tchange44":"Autokjøpsordre er lagt til!",
"tchange45":"AUTOKJØP MED",
"tchange46":"AUTOKJØP",
- "tchange47":"Selges for denne prisen"
+ "tchange47":"Selges for denne prisen",
+ "tchange48":"IKKE NOK"
},
"rewardsharepage":{
"rchange1":"Belønningsdel",
diff --git a/qortal-ui-core/language/pl.json b/qortal-ui-core/language/pl.json
index bc93b764..6e04b1a3 100644
--- a/qortal-ui-core/language/pl.json
+++ b/qortal-ui-core/language/pl.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"ZARZĄDZANIE GRUPAMI",
"puzzles":"PUZZLE",
- "nodemanagement":"ZARZĄDZANIE WĘZŁAMI"
+ "nodemanagement":"ZARZĄDZANIE WĘZŁAMI",
+ "trading":"HANDLOWY"
},
"login":{
"login":"Zaloguj się",
@@ -150,7 +151,9 @@
"next":"Następny",
"create":"Utwórz",
"continue":"Kontynuuj",
- "save":"Zapisz"
+ "save":"Zapisz",
+ "balance":"Saldo",
+ "balances":"SALDO TWOJEGO PORTFELA"
},
"startminting":{
"smchange1":"Nie można pobrać kont menniczych",
@@ -322,7 +325,8 @@
"tchange44":"Pomyślnie dodano automatyczne zamówienie zakupu!",
"tchange45":"AUTO KUP Z",
"tchange46":"AUTO KUP",
- "tchange47":"Sprzedaj za tę cenę"
+ "tchange47":"Sprzedaj za tę cenę",
+ "tchange48":"NIEWYSTARCZAJĄCO"
},
"rewardsharepage":{
"rchange1":"Podział nagród",
diff --git a/qortal-ui-core/language/pt.json b/qortal-ui-core/language/pt.json
index 513ff6ac..9563d8a9 100644
--- a/qortal-ui-core/language/pt.json
+++ b/qortal-ui-core/language/pt.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GESTÃO DE GRUPOS",
"puzzles":"ENIGMAS",
- "nodemanagement":"GERENCIAMENTO DO NÓDULO"
+ "nodemanagement":"GERENCIAMENTO DO NÓDULO",
+ "trading":"NEGOCIAÇÃO"
},
"login":{
"login":"Login",
@@ -150,7 +151,9 @@
"next":"Próximo",
"create":"Criar",
"continue":"Continuar",
- "save":"Salvar"
+ "save":"Salvar",
+ "balance":"Saldo",
+ "balances":"SEUS SALDOS DE CARTEIRA"
},
"startminting":{
"smchange1":"Não é possível buscar contas de cunhagem",
@@ -322,7 +325,8 @@
"tchange44":"Pedido de compra automática adicionado com sucesso!",
"tchange45":"COMPRA AUTOMÁTICA COM",
"tchange46":"COMPRA AUTOMÁTICA",
- "tchange47":"Vendo por este preço"
+ "tchange47":"Vendo por este preço",
+ "tchange48":"INSUFICIENTE"
},
"rewardsharepage":{
"rchange1":"Ações de recompensa",
diff --git a/qortal-ui-core/language/ro.json b/qortal-ui-core/language/ro.json
index cee5d56e..a7ba9caf 100644
--- a/qortal-ui-core/language/ro.json
+++ b/qortal-ui-core/language/ro.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GESTIONARE GRUP",
"puzzles":"PUZZLE-URI",
- "nodemanagement":"GESTIONARE NOD"
+ "nodemanagement":"GESTIONARE NOD",
+ "trading":"COMERCIAL"
},
"login":{
"login":"Login",
@@ -150,7 +151,9 @@
"next":"Inainte",
"create":"Creaza",
"continue":"Continua",
- "save":"Salveza"
+ "save":"Salveza",
+ "balance":"Credit",
+ "balances":"SOLDELE PORTOTELULUI DVS"
},
"startminting":{
"smchange1":"Nu se pot prelua conturile de batere",
@@ -322,7 +325,8 @@
"tchange44":"Comanda de cumparare automata a fost adaugata cu succes!",
"tchange45":"CUMPARA AUTOMATA CU",
"tchange46":"CUMPARARE AUTOMATA",
- "tchange47":"Vinde la acest pret"
+ "tchange47":"Vinde la acest pret",
+ "tchange48":"INSUFICIENT"
},
"rewardsharepage":{
"rchange1":"Cote de recompensa",
diff --git a/qortal-ui-core/language/rs.json b/qortal-ui-core/language/rs.json
index 819fc931..98adcb95 100644
--- a/qortal-ui-core/language/rs.json
+++ b/qortal-ui-core/language/rs.json
@@ -34,7 +34,8 @@
"qchat":"Q-ĆASKANJE",
"groupmanagement":"MENADŽMENT GRUPA",
"puzzles":"SLAGALICE",
- "nodemanagement":"MENADŽMENT ČVORIŠTA"
+ "nodemanagement":"MENADŽMENT ČVORIŠTA",
+ "trading":"TRADING"
},
"login":{
"login":"Prijava",
@@ -150,7 +151,9 @@
"next":"Dalje",
"create":"Napravite",
"continue":"Nastavite",
- "save":"Sačuvajte"
+ "save":"Sačuvajte",
+ "balance":"Kredit",
+ "balances":"VAŠI STANJE U NOVČANIKU"
},
"startminting":{
"smchange1":"Nije moguće preuzeti naloge za kovanje",
@@ -322,7 +325,8 @@
"tchange44":"Narudžbina za automatsku kupovinu je uspešno dodata!",
"tchange45":"AUTO KUPI SA",
"tchange46":"AUTO BUI",
- "tchange47":"Prodaj za ovu cenu"
+ "tchange47":"Prodaj za ovu cenu",
+ "tchange48":"NEDOVOLJNO"
},
"rewardsharepage":{
"rchange1":"Udeo nagrade",
diff --git a/qortal-ui-core/language/ru.json b/qortal-ui-core/language/ru.json
index bf0cf3cc..5e89430f 100644
--- a/qortal-ui-core/language/ru.json
+++ b/qortal-ui-core/language/ru.json
@@ -34,7 +34,8 @@
"qchat":"Q-ЧАТ",
"groupmanagement":"УПРАВЛЕНИЕ ГРУППАМИ",
"puzzles":"ГОЛОВОЛОМКИ",
- "nodemanagement":"УПРАВЛЕНИЕ УЗЛАМИ"
+ "nodemanagement":"УПРАВЛЕНИЕ УЗЛАМИ",
+ "trading":"ТОРГОВЛЯ"
},
"login":{
"login":"Войти",
@@ -150,7 +151,9 @@
"next":"Следующий",
"create":"Создать",
"continue":"Продолжить",
- "save":"Сохранить"
+ "save":"Сохранить",
+ "balance":"кредит",
+ "balances":"БАЛАНС ВАШЕГО КОШЕЛЬКА"
},
"startminting":{
"smchange1":"Не удается получить учетные записи минтинга",
@@ -322,7 +325,8 @@
"tchange44":"Заказ на автоматическую покупку успешно добавлен!",
"tchange45":"АВТО КУПИТЬ С",
"tchange46":"АВТО КУПИТЬ",
- "tchange47":"Продать по этой цене"
+ "tchange47":"Продать по этой цене",
+ "tchange48":"НЕДОСТАТОЧНО"
},
"rewardsharepage":{
"rchange1":"Вознаграждения",
diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json
index e89fe59b..10413d15 100644
--- a/qortal-ui-core/language/us.json
+++ b/qortal-ui-core/language/us.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"GROUP MANAGEMENT",
"puzzles":"PUZZLES",
- "nodemanagement":"NODE MANAGEMENT"
+ "nodemanagement":"NODE MANAGEMENT",
+ "trading":"TRADING"
},
"login":{
"login":"Login",
@@ -150,7 +151,9 @@
"next":"Next",
"create":"Create",
"continue":"Continue",
- "save":"Save"
+ "save":"Save",
+ "balance":"Balance",
+ "balances":"YOUR WALLET BALANCES"
},
"startminting":{
"smchange1":"Cannot fetch minting accounts",
@@ -322,7 +325,8 @@
"tchange44":"Successfully added auto buy order!",
"tchange45":"AUTO BUY WITH",
"tchange46":"AUTO BUY",
- "tchange47":"Sell for this price"
+ "tchange47":"Sell for this price",
+ "tchange48":"NOT ENOUGH"
},
"rewardsharepage":{
"rchange1":"Rewardshares",
diff --git a/qortal-ui-core/language/zhc.json b/qortal-ui-core/language/zhc.json
index 770f63cd..d81132d4 100644
--- a/qortal-ui-core/language/zhc.json
+++ b/qortal-ui-core/language/zhc.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"群组管理",
"puzzles":"益智游戏",
- "nodemanagement":"节点管理"
+ "nodemanagement":"节点管理",
+ "trading":"贸易"
},
"login":{
"login":"登入",
@@ -150,7 +151,9 @@
"next":"下一步",
"create":"新建",
"continue":"继续",
- "save":"保存"
+ "save":"保存",
+ "balance":"信用",
+ "balances":"您的钱包余额"
},
"startminting":{
"smchange1":"无法获取铸币帐户",
@@ -322,7 +325,8 @@
"tchange44":"成功添加自动买单!",
"tchange45":"自动购买",
"tchange46":"自动购买",
- "tchange47":"以这个价格出售"
+ "tchange47":"以这个价格出售",
+ "tchange48":"不够"
},
"rewardsharepage":{
"rchange1":"铸币密钥",
diff --git a/qortal-ui-core/language/zht.json b/qortal-ui-core/language/zht.json
index 4ff9cd53..b82cfe0c 100644
--- a/qortal-ui-core/language/zht.json
+++ b/qortal-ui-core/language/zht.json
@@ -34,7 +34,8 @@
"qchat":"Q-CHAT",
"groupmanagement":"群組管理",
"puzzles":"益智遊戲",
- "nodemanagement":"節點管理"
+ "nodemanagement":"節點管理",
+ "trading":"貿易"
},
"login":{
"login":"登入",
@@ -150,7 +151,9 @@
"next":"下一步",
"create":"創建",
"continue":"繼續",
- "save":"保存"
+ "save":"保存",
+ "balance":"信用",
+ "balances":"您的錢包餘額"
},
"startminting":{
"smchange1":"無法獲取鑄幣帳戶",
@@ -322,7 +325,8 @@
"tchange44":"成功添加自動買單!",
"tchange45":"自動購買",
"tchange46":"自動購買",
- "tchange47":"以這個價格出售"
+ "tchange47":"以這個價格出售",
+ "tchange48":"不夠"
},
"rewardsharepage":{
"rchange1":"鑄幣密鑰",
diff --git a/qortal-ui-core/package.json b/qortal-ui-core/package.json
index 0e14cc33..24f76cf9 100644
--- a/qortal-ui-core/package.json
+++ b/qortal-ui-core/package.json
@@ -58,16 +58,16 @@
"@rollup/plugin-commonjs": "23.0.2",
"@rollup/plugin-node-resolve": "15.0.1",
"@rollup/plugin-replace": "5.0.1",
- "@vaadin/grid": "23.2.8",
- "@vaadin/icons": "23.2.8",
- "@vaadin/password-field": "23.2.8",
+ "@vaadin/grid": "23.2.9",
+ "@vaadin/icons": "23.2.9",
+ "@vaadin/password-field": "23.2.9",
"asmcrypto.js": "2.3.2",
"bcryptjs": "2.4.3",
"epml": "0.3.3",
"file-saver": "2.0.5",
"lit": "2.4.1",
"lit-translate": "2.0.1",
- "postcss": "8.4.18",
+ "postcss": "8.4.19",
"pwa-helpers": "0.9.1",
"random-sentence-generator": "0.0.8",
"redux": "4.2.0",
diff --git a/qortal-ui-core/src/components/app-view.js b/qortal-ui-core/src/components/app-view.js
index 43d962f0..88a7e2ae 100644
--- a/qortal-ui-core/src/components/app-view.js
+++ b/qortal-ui-core/src/components/app-view.js
@@ -1,7 +1,9 @@
import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../store.js'
-import { translate, translateUnsafeHTML } from 'lit-translate'
+import { Epml } from '../epml.js'
+import { addTradeBotRoutes } from '../tradebot/addTradeBotRoutes.js'
+import { get, translate, translateUnsafeHTML } from 'lit-translate'
import '@polymer/paper-icon-button/paper-icon-button.js'
import '@polymer/iron-icons/iron-icons.js'
@@ -21,12 +23,78 @@ import './settings-view/user-settings.js'
import './logout-view/logout-view.js'
import './user-info-view/user-info-view.js'
+const parentEpml = new Epml({type: 'WINDOW', source: window.parent})
+
class AppView extends connect(store)(LitElement) {
static get properties() {
return {
config: { type: Object },
theme: { type: String, reflect: true },
- searchContentString: { type: String }
+ searchContentString: { type: String },
+ 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 },
+ tradesOpenBtcQortal: { type: Array },
+ tradesOpenLtcQortal: { type: Array },
+ tradesOpenDogeQortal: { type: Array },
+ tradesOpenDgbQortal: { type: Array },
+ tradesOpenRvnQortal: { type: Array },
+ tradesOpenArrrQortal: { 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 }
}
}
@@ -94,13 +162,134 @@ class AppView extends connect(store)(LitElement) {
}
#sideBar::-webkit-scrollbar-track {
- background-color: transparent;
+ background-color: transparent;
}
#sideBar::-webkit-scrollbar-thumb {
- background-color: #333;
- border-radius: 6px;
- border: 3px solid #333;
+ background-color: #333;
+ border-radius: 6px;
+ border: 3px solid #333;
+ }
+
+ #balanceheader {
+ flex: 0 0 24px;
+ padding: 12px;
+ border-bottom: 1px solid var(--border);
+ background: var(--sidetopbar);
+ }
+
+ .balanceheadertext {
+ position: absolute;
+ margin: auto;
+ font-size: 16px;
+ 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; }
}
`
]
@@ -110,6 +299,74 @@ class AppView extends connect(store)(LitElement) {
super()
this.searchContentString = ''
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
+ 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.tradesOpenBtcQortal = []
+ this.tradesOpenLtcQortal = []
+ this.tradesOpenDogeQortal = []
+ this.tradesOpenDgbQortal = []
+ this.tradesOpenRvnQortal = []
+ this.tradesOpenArrrQortal = []
+ 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`
+
+ `
}
render() {
@@ -122,6 +379,10 @@ class AppView extends connect(store)(LitElement) {
+
+ ${this.balanceTicker}
@@ -177,7 +438,1498 @@ class AppView extends connect(store)(LitElement) {
`
}
- firstUpdated() {
+ async firstUpdated() {
+
+ addTradeBotRoutes(parentEpml)
+ parentEpml.imReady()
+
+ 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
+ await this.updateQortWalletBalance()
+
+ this.botBtcWallet = store.getState().app.selectedAddress.btcWallet.address
+ await this.updateBtcWalletBalance()
+
+ this.botLtcWallet = store.getState().app.selectedAddress.ltcWallet.address
+ await this.updateLtcWalletBalance()
+
+ this.botDogeWallet = store.getState().app.selectedAddress.dogeWallet.address
+ await this.updateDogeWalletBalance()
+
+ this.botDgbWallet = store.getState().app.selectedAddress.dgbWallet.address
+ await this.updateDgbWalletBalance()
+
+ this.botRvnWallet = store.getState().app.selectedAddress.rvnWallet.address
+ await this.updateRvnWalletBalance()
+
+ this.botArrrWallet = store.getState().app.selectedAddress.arrrWallet.address
+ await this.fetchArrrWalletAddress()
+ await this.updateArrrWalletBalance()
+
+ await this.botBtcTradebook()
+ await this.botLtcTradebook()
+ await this.botDogeTradebook()
+ await this.botDgbTradebook()
+ await this.botRvnTradebook()
+ await this.botArrrTradebook()
+
+ window.addEventListener('storage', async () => {
+ this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]")
+ await appDelay(500)
+ this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]")
+ await appDelay(500)
+ this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]")
+ await appDelay(500)
+ this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]")
+ await appDelay(500)
+ this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]")
+ await appDelay(500)
+ this.tradeBotArrrBook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]")
+ await appDelay(500)
+ })
+
+ this.renderBalances()
+
+ const getOpenTradesBTC = async () => {
+ let timerBTC
+
+ if (this.isEmptyArray(this.tradeBotBtcBook) === true) {
+ clearTimeout(timerBTC)
+ timerBTC = setTimeout(getOpenTradesBTC, 150000)
+ } else {
+ 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
+ }
+ }
+ }).filter(item => !!item)
+
+ await this.updateBtcWalletBalance()
+ filterMyBotPriceTradesBTC()
+ setTimeout(getOpenTradesBTC, 150000)
+ }
+ }
+
+ const filterMyBotPriceTradesBTC = async () => {
+ const tradeBotBtcUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=BITCOIN&apiKey=${this.getApiKey()}`
+
+ const tradeBotBtcAt = await fetch(tradeBotBtcUrl).then(response => {
+ return response.json()
+ })
+
+ this.tradeBotBtcAt = tradeBotBtcAt
+
+ await appDelay(1000)
+
+ this.tradeBotAvailableBtcQortal = this.tradesOpenBtcQortal.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
+ }
+ }
+ }).filter(item => !!item)
+
+ this.tradeBotAvailableBtcQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price))
+
+ if (this.isEmptyArray(this.tradeBotAvailableBtcQortal) === true) {
+ return
+ } else {
+ this.checkBtcAlice = this.tradeBotAvailableBtcQortal[0].qortalAtAddress
+ }
+
+ await appDelay(1000)
+
+ if (this.tradeBotBtcAt.some(item => item.atAddress === this.checkBtcAlice)) {
+ return
+ } else {
+ this.tradeBotAvailableBtcQortal = this.tradeBotAvailableBtcQortal
+ }
+
+ await appDelay(1000)
+
+ if (this.isEmptyArray(this.tradeBotAvailableBtcQortal) === true) {
+ return
+ } 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))
+
+ this.reAddBtcAmount = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount))
+ this.reAddBtcPrice = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcPrice))
+
+ localStorage.removeItem(this.botBtcWallet)
+ localStorage.setItem(this.botBtcWallet, "")
+
+ var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]")
+
+ const newBtcTradebookItem = {
+ botBtcQortAmount: newbtcamount,
+ botBtcPrice: botbtcprice
+ }
+
+ oldBtcTradebook.push(newBtcTradebookItem)
+
+ localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook))
+
+ this.tradeBotBtcBook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]")
+
+ await appDelay(1000)
+
+ this.botBtcBuyAtAddress = tradebtcataddress
+
+ this.buyBtcAction()
+
+ if (this.isEmptyArray(this.tradeBotBtcBook) === true) {
+ return
+ } else {
+ const botamount = parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount)
+
+ if (Number(botamount) === 0) {
+ this.removeBotBTCTradebook()
+ } else {
+ this.tradeBotBtcBook = this.tradeBotBtcBook
+ }
+ }
+
+ if (this.isEmptyArray(this.tradeBotBtcBook) === true) {
+ return
+ } else {
+ await this.updateBtcWalletBalance()
+ const checkBotBtcFunds = this.round(parseFloat(this.tradeBotBtcBook[0].botBtcQortAmount) * parseFloat(this.tradeBotBtcBook[0].botBtcPrice))
+ const myBotBtcFunds = this.round(parseFloat(this.btcWalletBalance))
+
+ if (Number(myBotBtcFunds) < Number(checkBotBtcFunds)) {
+ this.removeBotBTCTradebook()
+ } else {
+ this.tradeBotBtcBook = this.tradeBotBtcBook
+ }
+ }
+ }
+ }
+
+ const getOpenTradesLTC = async () => {
+ let timerLTC
+
+ if (this.isEmptyArray(this.tradeBotLtcBook) === true) {
+ clearTimeout(timerLTC)
+ timerLTC = setTimeout(getOpenTradesLTC, 150000)
+ } else {
+ const tradesOpenLtcQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=LITECOIN&limit=0`
+
+ const tradesOpenLtcQortal = await fetch(tradesOpenLtcQortalUrl).then(response => {
+ return response.json()
+ })
+
+ this.tradesOpenLtcQortal = tradesOpenLtcQortal.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
+ }
+ }
+ }).filter(item => !!item)
+
+ await this.updateLtcWalletBalance()
+ filterMyBotPriceTradesLTC()
+ setTimeout(getOpenTradesLTC, 150000)
+ }
+ }
+
+ const filterMyBotPriceTradesLTC = async () => {
+ const tradeBotLtcUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=LITECOIN&apiKey=${this.getApiKey()}`
+
+ const tradeBotLtcAt = await fetch(tradeBotLtcUrl).then(response => {
+ return response.json()
+ })
+
+ this.tradeBotLtcAt = tradeBotLtcAt
+
+ await appDelay(1000)
+
+ this.tradeBotAvailableLtcQortal = this.tradesOpenLtcQortal.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
+ }
+ }
+ }).filter(item => !!item)
+
+ this.tradeBotAvailableLtcQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price))
+
+ if (this.isEmptyArray(this.tradeBotAvailableLtcQortal) === true) {
+ return
+ } else {
+ this.checkLtcAlice = this.tradeBotAvailableLtcQortal[0].qortalAtAddress
+ }
+
+ await appDelay(1000)
+
+ if (this.tradeBotLtcAt.some(item => item.atAddress === this.checkLtcAlice)) {
+ return
+ } else {
+ this.tradeBotAvailableLtcQortal = this.tradeBotAvailableLtcQortal
+ }
+
+ await appDelay(1000)
+
+ if (this.isEmptyArray(this.tradeBotAvailableLtcQortal) === true) {
+ return
+ } 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))
+
+ this.reAddLtcAmount = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount))
+ this.reAddLtcPrice = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcPrice))
+
+ localStorage.removeItem(this.botLtcWallet)
+ localStorage.setItem(this.botLtcWallet, "")
+
+ var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]")
+
+ const newLtcTradebookItem = {
+ botLtcQortAmount: newltcamount,
+ botLtcPrice: botltcprice
+ }
+
+ oldLtcTradebook.push(newLtcTradebookItem)
+
+ localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook))
+
+ this.tradeBotLtcBook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]")
+
+ await appDelay(1000)
+
+ this.botLtcBuyAtAddress = tradeltcataddress
+
+ this.buyLtcAction()
+
+ if (this.isEmptyArray(this.tradeBotLtcBook) === true) {
+ return
+ } else {
+ const botamount = parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount)
+
+ if (Number(botamount) === 0) {
+ this.removeBotLTCTradebook()
+ } else {
+ this.tradeBotLtcBook = this.tradeBotLtcBook
+ }
+ }
+
+ if (this.isEmptyArray(this.tradeBotLtcBook) === true) {
+ return
+ } else {
+ await this.updateLtcWalletBalance()
+ const checkBotLtcFunds = this.round(parseFloat(this.tradeBotLtcBook[0].botLtcQortAmount) * parseFloat(this.tradeBotLtcBook[0].botLtcPrice))
+ const myBotLtcFunds = this.round(parseFloat(this.ltcWalletBalance))
+
+ if (Number(myBotLtcFunds) < Number(checkBotLtcFunds)) {
+ this.removeBotLTCTradebook()
+ } else {
+ this.tradeBotLtcBook = this.tradeBotLtcBook
+ }
+ }
+ }
+ }
+
+ const getOpenTradesDOGE = async () => {
+ let timerDOGE
+
+ if (this.isEmptyArray(this.tradeBotDogeBook) === true) {
+ clearTimeout(timerDOGE)
+ timerDOGE = setTimeout(getOpenTradesDOGE, 150000)
+ } else {
+ const tradesOpenDogeQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=DOGECOIN&limit=0`
+
+ const tradesOpenDogeQortal = await fetch(tradesOpenDogeQortalUrl).then(response => {
+ return response.json()
+ })
+
+ 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
+ }
+ }
+ }).filter(item => !!item)
+
+ await this.updateDogeWalletBalance()
+ filterMyBotPriceTradesDOGE()
+ setTimeout(getOpenTradesDOGE, 150000)
+ }
+ }
+
+ const filterMyBotPriceTradesDOGE = async () => {
+ const tradeBotDogeUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=DOGECOIN&apiKey=${this.getApiKey()}`
+
+ const tradeBotDogeAt = await fetch(tradeBotDogeUrl).then(response => {
+ return response.json()
+ })
+
+ this.tradeBotDogeAt = tradeBotDogeAt
+
+ await appDelay(1000)
+
+ this.tradeBotAvailableDogeQortal = this.tradesOpenDogeQortal.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
+ }
+ }
+ }).filter(item => !!item)
+
+ this.tradeBotAvailableDogeQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price))
+
+ if (this.isEmptyArray(this.tradeBotAvailableDogeQortal) === true) {
+ return
+ } else {
+ this.checkDogeAlice = this.tradeBotAvailableDogeQortal[0].qortalAtAddress
+ }
+
+ await appDelay(1000)
+
+ if (this.tradeBotDogeAt.some(item => item.atAddress === this.checkDogeAlice)) {
+ return
+ } else {
+ this.tradeBotAvailableDogeQortal = this.tradeBotAvailableDogeQortal
+ }
+
+ await appDelay(1000)
+
+ if (this.isEmptyArray(this.tradeBotAvailableDogeQortal) === true) {
+ return
+ } 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))
+
+ this.reAddDogeAmount = this.round(parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount))
+ this.reAddDogePrice = this.round(parseFloat(this.tradeBotDogeBook[0].botDogePrice))
+
+ localStorage.removeItem(this.botDogeWallet)
+ localStorage.setItem(this.botDogeWallet, "")
+
+ var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]")
+
+ const newDogeTradebookItem = {
+ botDogeQortAmount: newdogeamount,
+ botDogePrice: botdogeprice
+ }
+
+ oldDogeTradebook.push(newDogeTradebookItem)
+
+ localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook))
+
+ this.tradeBotDogeBook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]")
+
+ await appDelay(1000)
+
+ this.botDogeBuyAtAddress = tradedogeataddress
+
+ this.buyDogeAction()
+
+ if (this.isEmptyArray(this.tradeBotDogeBook) === true) {
+ return
+ } else {
+ const botamount = parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount)
+
+ if (Number(botamount) === 0) {
+ this.removeBotDOGETradebook()
+ } else {
+ this.tradeBotDogeBook = this.tradeBotDogeBook
+ }
+ }
+
+ if (this.isEmptyArray(this.tradeBotDogeBook) === true) {
+ return
+ } else {
+ await this.updateDogeWalletBalance()
+ const checkBotDogeFunds = this.round(parseFloat(this.tradeBotDogeBook[0].botDogeQortAmount) * parseFloat(this.tradeBotDogeBook[0].botDogePrice))
+ const myBotDogeFunds = this.round(parseFloat(this.dogeWalletBalance))
+
+ if (Number(myBotDogeFunds) < Number(checkBotDogeFunds)) {
+ this.removeBotDOGETradebook()
+ } else {
+ this.tradeBotDogeBook = this.tradeBotDogeBook
+ }
+ }
+ }
+ }
+
+ const getOpenTradesDGB = async () => {
+ let timerDGB
+
+ if (this.isEmptyArray(this.tradeBotDgbBook) === true) {
+ clearTimeout(timerDGB)
+ timerDGB = setTimeout(getOpenTradesDGB, 150000)
+ } else {
+ const tradesOpenDgbQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=DIGIYBYTE&limit=0`
+
+ const tradesOpenDgbQortal = await fetch(tradesOpenDgbQortalUrl).then(response => {
+ return response.json()
+ })
+
+ 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
+ }
+ }
+ }).filter(item => !!item)
+
+ setTimeout(getOpenTradesDGB, 150000)
+ }
+ }
+
+ const filterMyBotPriceTradesDGB = async () => {
+ const tradeBotDgbUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=DIGIBYTE&apiKey=${this.getApiKey()}`
+
+ const tradeBotDgbAt = await fetch(tradeBotDgbUrl).then(response => {
+ return response.json()
+ })
+
+ this.tradeBotDgbAt = tradeBotDgbAt
+
+ await appDelay(1000)
+
+ this.tradeBotAvailableDgbQortal = this.tradesOpenDgbQortal.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
+ }
+ }
+ }).filter(item => !!item)
+
+ this.tradeBotAvailableDgbQortal.sort((a, b) => parseFloat(a.price) - parseFloat(b.price))
+
+ if (this.isEmptyArray(this.tradeBotAvailableDgbQortal) === true) {
+ return
+ } else {
+ this.checkDgbAlice = this.tradeBotAvailableDgbQortal[0].qortalAtAddress
+ }
+
+ await appDelay(1000)
+
+ if (this.tradeBotDgbAt.some(item => item.atAddress === this.checkDgbAlice)) {
+ return
+ } else {
+ this.tradeBotAvailableDgbQortal = this.tradeBotAvailableDgbQortal
+ }
+
+ await appDelay(1000)
+
+ if (this.isEmptyArray(this.tradeBotAvailableDgbQortal) === true) {
+ return
+ } 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))
+
+ this.reAddDgbAmount = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount))
+ this.reAddDgbPrice = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbPrice))
+
+ localStorage.removeItem(this.botDgbWallet)
+ localStorage.setItem(this.botDgbWallet, "")
+
+ var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]")
+
+ const newDgbTradebookItem = {
+ botDgbQortAmount: newdgbamount,
+ botDgbPrice: botdgbprice
+ }
+
+ oldDgbTradebook.push(newDgbTradebookItem)
+
+ localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook))
+
+ this.tradeBotDgbBook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]")
+
+ await appDelay(1000)
+
+ this.botDgbBuyAtAddress = tradedgbataddress
+
+ this.buyDgbAction()
+
+ if (this.isEmptyArray(this.tradeBotDgbBook) === true) {
+ return
+ } else {
+ const botamount = parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount)
+
+ if (Number(botamount) === 0) {
+ this.removeBotDGBTradebook()
+ } else {
+ this.tradeBotDgbBook = this.tradeBotDgbBook
+ }
+ }
+
+ if (this.isEmptyArray(this.tradeBotDgbBook) === true) {
+ return
+ } else {
+ await this.updateDgbWalletBalance()
+ const checkBotDgbFunds = this.round(parseFloat(this.tradeBotDgbBook[0].botDgbQortAmount) * parseFloat(this.tradeBotDgbBook[0].botDgbPrice))
+ const myBotDgbFunds = this.round(parseFloat(this.dgbWalletBalance))
+
+ if (Number(myBotDgbFunds) < Number(checkBotDgbFunds)) {
+ this.removeBotDGBTradebook()
+ } else {
+ this.tradeBotDgbBook = this.tradeBotDgbBook
+ }
+ }
+ }
+ }
+
+ const getOpenTradesRVN = async () => {
+ let timerRVN
+
+ if (this.isEmptyArray(this.tradeBotRvnBook) === true) {
+ clearTimeout(timerRVN)
+ timerRVN = setTimeout(getOpenTradesRVN, 150000)
+ } else {
+ const tradesOpenRvnQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=RAVENCOIN&limit=0`
+
+ const tradesOpenRvnQortal = await fetch(tradesOpenRvnQortalUrl).then(response => {
+ return response.json()
+ })
+
+ 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
+ }
+ }
+ }).filter(item => !!item)
+
+ setTimeout(getOpenTradesRVN, 150000)
+ }
+ }
+
+ const filterMyBotPriceTradesRVN = async () => {
+ const tradeBotRvnUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=RAVENCOIN&apiKey=${this.getApiKey()}`
+
+ const tradeBotRvnAt = await fetch(tradeBotRvnUrl).then(response => {
+ return response.json()
+ })
+
+ this.tradeBotRvnAt = tradeBotRvnAt
+
+ await appDelay(1000)
+
+ this.tradeBotAvailableRvnQortal = this.tradesOpenRvnQortal.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
+ }
+ }
+ }).filter(item => !!item)
+
+ 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
+ }
+
+ await appDelay(1000)
+
+ if (this.tradeBotRvnAt.some(item => item.atAddress === this.checkRvnAlice)) {
+ return
+ } else {
+ this.tradeBotAvailableRvnQortal = this.tradeBotAvailableRvnQortal
+ }
+
+ await appDelay(1000)
+
+ if (this.isEmptyArray(this.tradeBotAvailableRvnQortal) === true) {
+ return
+ } 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))
+
+ localStorage.removeItem(this.botRvnWallet)
+ localStorage.setItem(this.botRvnWallet, "")
+
+ var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]")
+
+ const newRvnTradebookItem = {
+ botRvnQortAmount: newrvnamount,
+ botRvnPrice: botrvnprice
+ }
+
+ oldRvnTradebook.push(newRvnTradebookItem)
+
+ localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook))
+
+ this.tradeBotRvnBook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]")
+
+ await appDelay(1000)
+
+ this.botRvnBuyAtAddress = tradervnataddress
+
+ this.buyRvnAction()
+
+ if (this.isEmptyArray(this.tradeBotRvnBook) === true) {
+ return
+ } else {
+ const botamount = parseFloat(this.tradeBotRvnBook[0].botRvnQortAmount)
+
+ if (Number(botamount) === 0) {
+ this.removeBotRVNTradebook()
+ } else {
+ this.tradeBotRvnBook = this.tradeBotRvnBook
+ }
+ }
+
+ if (this.isEmptyArray(this.tradeBotRvnBook) === true) {
+ return
+ } else {
+ await this.updateRvnWalletBalance()
+ 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()
+ } else {
+ this.tradeBotRvnBook = this.tradeBotRvnBook
+ }
+ }
+ }
+ }
+
+ const getOpenTradesARRR = async () => {
+ let timerARRR
+
+ if (this.isEmptyArray(this.tradeBotArrrBook) === true) {
+ clearTimeout(timerARRR)
+ timerARRR = setTimeout(getOpenTradesARRR, 150000)
+ } else {
+ const tradesOpenArrrQortalUrl = `${nodeAppUrl}/crosschain/tradeoffers?foreignBlockchain=PIRATECHAIN&limit=0`
+
+ 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
+ }
+ }
+ }).filter(item => !!item)
+
+ setTimeout(getOpenTradesARRR, 150000)
+ }
+ }
+
+ const filterMyBotPriceTradesARRR = async () => {
+ const tradeBotArrrUrl = `${nodeAppUrl}/crosschain/tradebot?foreignBlockchain=PIRATECHAIN&apiKey=${this.getApiKey()}`
+
+ const tradeBotArrrAt = await fetch(tradeBotArrrUrl).then(response => {
+ return response.json()
+ })
+
+ this.tradeBotArrrAt = tradeBotArrrAt
+
+ await appDelay(1000)
+
+ this.tradeBotAvailableArrrQortal = this.tradesOpenArrrQortal.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
+ }
+ }
+ }).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
+ } else {
+ this.tradeBotAvailableArrrQortal = this.tradeBotAvailableArrrQortal
+ }
+
+ await appDelay(1000)
+
+ if (this.isEmptyArray(this.tradeBotAvailableArrrQortal) === true) {
+ return
+ } 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) || "[]")
+
+ await appDelay(1000)
+
+ this.botArrrBuyAtAddress = tradearrrataddress
+
+ this.buyArrrAction()
+
+ if (this.isEmptyArray(this.tradeBotArrrBook) === true) {
+ return
+ } else {
+ const botamount = parseFloat(this.tradeBotArrrBook[0].botArrrQortAmount)
+
+ if (Number(botamount) === 0) {
+ this.removeBotARRRTradebook()
+ } else {
+ this.tradeBotArrrBook = this.tradeBotArrrBook
+ }
+ }
+
+ if (this.isEmptyArray(this.tradeBotArrrBook) === true) {
+ return
+ } else {
+ await this.updateArrrWalletBalance()
+ 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()
+ } else {
+ this.tradeBotArrrBook = this.tradeBotArrrBook
+ }
+ }
+ }
+ }
+
+ 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()
+ }
+
+ async renderBalances() {
+ const tickerTime = ms => new Promise(res => setTimeout(res, ms))
+ clearTimeout(this.updateBalancesTimeout)
+ this.balanceTicker = html`
+
+ `
+ await tickerTime(1000)
+ this.balanceTicker = html`
+
+
+ QORT ${translate("general.balance")}: ${this.qortWalletBalance}
+ BTC ${translate("general.balance")}: ${this.btcWalletBalance}
+ LTC ${translate("general.balance")}: ${this.ltcWalletBalance}
+ DOGE ${translate("general.balance")}: ${this.dogeWalletBalance}
+ DGB ${translate("general.balance")}: ${this.dgbWalletBalance}
+ RVN ${translate("general.balance")}: ${this.rvnWalletBalance}
+ ARRR ${translate("general.balance")}: ${this.arrrWalletBalance}
+
+
+ `
+ this.updateBalancesTimeout = setTimeout(() => this.renderBalances(), 45000)
+ }
+
+ async fetchArrrWalletAddress() {
+ let res = await parentEpml.request('apiCall', {
+ url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`,
+ method: 'POST',
+ body: `${store.getState().app.selectedAddress.arrrWallet.seed58}`,
+ })
+ if (res != null && res.error != 1201) {
+ this.arrrWalletAddress = res
+ }
+ }
+
+ async updateQortWalletBalance() {
+ clearTimeout(this.updateQortBalanceTimeout)
+ let qortAddress = store.getState().app.selectedAddress.address
+ await parentEpml.request('apiCall', {
+ url: `/addresses/balance/${qortAddress}?apiKey=${this.getApiKey()}`,
+ }).then((res) => {
+ this.qortWalletBalance = res
+ this.updateQortBalanceTimeout = setTimeout(() => this.updateQortWalletBalance(), 120000)
+ })
+ }
+
+ async updateBtcWalletBalance() {
+ clearTimeout(this.updateBtcBalanceTimeout)
+ 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))) {
+ let snack1string = get("tradepage.tchange30")
+ parentEpml.request('showSnackBar', `${snack1string}`)
+ } else {
+ this.btcWalletBalance = (Number(res) / 1e8).toFixed(8)
+ }
+ })
+ this.updateBtcBalanceTimeout = setTimeout(() => this.updateBtcWalletBalance(), 120000)
+ }
+
+ async updateLtcWalletBalance() {
+ clearTimeout(this.updateLtcBalanceTimeout)
+ 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))) {
+ let snack1string = get("tradepage.tchange30")
+ parentEpml.request('showSnackBar', `${snack1string}`)
+ } else {
+ this.ltcWalletBalance = (Number(res) / 1e8).toFixed(8)
+ }
+ })
+ this.updateLtcBalanceTimeout = setTimeout(() => this.updateLtcWalletBalance(), 120000)
+ }
+
+ async updateDogeWalletBalance() {
+ clearTimeout(this.updateDogeBalanceTimeout)
+ 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))) {
+ let snack1string = get("tradepage.tchange30")
+ parentEpml.request('showSnackBar', `${snack1string}`)
+ } else {
+ this.dogeWalletBalance = (Number(res) / 1e8).toFixed(8)
+ }
+ })
+ this.updateDogeBalanceTimeout = setTimeout(() => this.updateDogeWalletBalance(), 120000)
+ }
+
+ async updateDgbWalletBalance() {
+ clearTimeout(this.updateDgbBalanceTimeout)
+ 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))) {
+ let snack1string = get("tradepage.tchange30")
+ parentEpml.request('showSnackBar', `${snack1string}`)
+ } else {
+ this.dgbWalletBalance = (Number(res) / 1e8).toFixed(8)
+ }
+ })
+ this.updateDgbBalanceTimeout = setTimeout(() => this.updateDgbWalletBalance(), 120000)
+ }
+
+ async updateRvnWalletBalance() {
+ clearTimeout(this.updateRvnBalanceTimeout)
+ 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))) {
+ let snack1string = get("tradepage.tchange30")
+ parentEpml.request('showSnackBar', `${snack1string}`)
+ } else {
+ this.rvnWalletBalance = (Number(res) / 1e8).toFixed(8)
+ }
+ })
+ this.updateRvnBalanceTimeout = setTimeout(() => this.updateRvnWalletBalance(), 120000)
+ }
+
+ async updateArrrWalletBalance() {
+ clearTimeout(this.updateArrrBalanceTimeout)
+ 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))) {
+ let snack1string = get("tradepage.tchange30")
+ parentEpml.request('showSnackBar', `${snack1string}`)
+ } else {
+ this.arrrWalletBalance = (Number(res) / 1e8).toFixed(8)
+ }
+ })
+ this.updateArrrBalanceTimeout = setTimeout(() => this.updateArrrWalletBalance(), 120000)
+ }
+
+ 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 () => {
+ const response = await parentEpml.request('tradeBotRespondRequest', {
+ atAddress: this.botBtcBuyAtAddress,
+ foreignKey: store.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey,
+ receivingAddress: store.getState().app.selectedAddress.address,
+ })
+ return response
+ }
+
+ 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) || "[]")
+
+ const newBtcTradebookItem = {
+ botBtcQortAmount: this.reAddBtcAmount,
+ botBtcPrice: this.reAddBtcPrice
+ }
+
+ oldBtcTradebook.push(newBtcTradebookItem)
+
+ localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook))
+
+ 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, "")
+
+ var oldBtcTradebook = JSON.parse(localStorage.getItem(this.botBtcWallet) || "[]")
+
+ const newBtcTradebookItem = {
+ botBtcQortAmount: this.reAddBtcAmount,
+ botBtcPrice: this.reAddBtcPrice
+ }
+
+ oldBtcTradebook.push(newBtcTradebookItem)
+
+ localStorage.setItem(this.botBtcWallet, JSON.stringify(oldBtcTradebook))
+
+ 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)
+ }
+
+ async buyLtcAction() {
+ const makeRequest = async () => {
+ const response = await parentEpml.request('tradeBotRespondRequest', {
+ atAddress: this.botLtcBuyAtAddress,
+ foreignKey: store.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey,
+ receivingAddress: store.getState().app.selectedAddress.address,
+ })
+ return response
+ }
+
+ 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) || "[]")
+
+ const newLtcTradebookItem = {
+ botLtcQortAmount: this.reAddLtcAmount,
+ botLtcPrice: this.reAddLtcPrice
+ }
+
+ oldLtcTradebook.push(newLtcTradebookItem)
+
+ localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook))
+
+ 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, "")
+
+ var oldLtcTradebook = JSON.parse(localStorage.getItem(this.botLtcWallet) || "[]")
+
+ const newLtcTradebookItem = {
+ botLtcQortAmount: this.reAddLtcAmount,
+ botLtcPrice: this.reAddLtcPrice
+ }
+
+ oldLtcTradebook.push(newLtcTradebookItem)
+
+ localStorage.setItem(this.botLtcWallet, JSON.stringify(oldLtcTradebook))
+
+ 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)
+ }
+
+ async buyDogeAction() {
+ const makeRequest = async () => {
+ const response = await parentEpml.request('tradeBotRespondRequest', {
+ atAddress: this.botDogeBuyAtAddress,
+ foreignKey: store.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey,
+ receivingAddress: store.getState().app.selectedAddress.address,
+ })
+ return response
+ }
+
+ 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) || "[]")
+
+ const newDogeTradebookItem = {
+ botDogeQortAmount: this.reAddDogeAmount,
+ botDogePrice: this.reAddDogePrice
+ }
+
+ oldDogeTradebook.push(newDogeTradebookItem)
+
+ localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook))
+
+ 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, "")
+
+ var oldDogeTradebook = JSON.parse(localStorage.getItem(this.botDogeWallet) || "[]")
+
+ const newDogeTradebookItem = {
+ botDogeQortAmount: this.reAddDogeAmount,
+ botDogePrice: this.reAddDogePrice
+ }
+
+ oldDogeTradebook.push(newDogeTradebookItem)
+
+ localStorage.setItem(this.botDogeWallet, JSON.stringify(oldDogeTradebook))
+
+ 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)
+ }
+
+ async buyDgbAction() {
+ const makeRequest = async () => {
+ const response = await parentEpml.request('tradeBotRespondRequest', {
+ atAddress: this.botDgbBuyAtAddress,
+ foreignKey: store.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey,
+ receivingAddress: store.getState().app.selectedAddress.address,
+ })
+ return response
+ }
+
+ 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) || "[]")
+
+ const newDgbTradebookItem = {
+ botDgbQortAmount: this.reAddDgbAmount,
+ botDgbPrice: this.reAddDgbPrice
+ }
+
+ oldDgbTradebook.push(newDgbTradebookItem)
+
+ localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook))
+
+ 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, "")
+
+ var oldDgbTradebook = JSON.parse(localStorage.getItem(this.botDgbWallet) || "[]")
+
+ const newDgbTradebookItem = {
+ botDgbQortAmount: this.reAddDgbAmount,
+ botDgbPrice: this.reAddDgbPrice
+ }
+
+ oldDgbTradebook.push(newDgbTradebookItem)
+
+ localStorage.setItem(this.botDgbWallet, JSON.stringify(oldDgbTradebook))
+
+ 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)
+ }
+
+ async buyRvnAction() {
+ const makeRequest = async () => {
+ const response = await parentEpml.request('tradeBotRespondRequest', {
+ atAddress: this.botRvnBuyAtAddress,
+ foreignKey: store.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey,
+ receivingAddress: store.getState().app.selectedAddress.address,
+ })
+ return response
+ }
+
+ 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) || "[]")
+
+ const newRvnTradebookItem = {
+ botRvnQortAmount: this.reAddRvnAmount,
+ botRvnPrice: this.reAddRvnPrice
+ }
+
+ oldRvnTradebook.push(newRvnTradebookItem)
+
+ localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook))
+
+ 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, "")
+
+ var oldRvnTradebook = JSON.parse(localStorage.getItem(this.botRvnWallet) || "[]")
+
+ const newRvnTradebookItem = {
+ botRvnQortAmount: this.reAddRvnAmount,
+ botRvnPrice: this.reAddRvnPrice
+ }
+
+ oldRvnTradebook.push(newRvnTradebookItem)
+
+ localStorage.setItem(this.botRvnWallet, JSON.stringify(oldRvnTradebook))
+
+ 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)
+ }
+
+ async buyArrrAction() {
+ const makeRequest = async () => {
+ const response = await parentEpml.request('tradeBotRespondRequest', {
+ atAddress: this.botArrrBuyAtAddress,
+ foreignKey: store.getState().app.selectedAddress.arrrWallet.seed58,
+ receivingAddress: store.getState().app.selectedAddress.address,
+ })
+ return response
+ }
+
+ 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) || "[]")
+
+ const newArrrTradebookItem = {
+ botArrrQortAmount: this.reAddArrrAmount,
+ botArrrPrice: this.reAddArrrPrice
+ }
+
+ oldArrrTradebook.push(newArrrTradebookItem)
+
+ localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook))
+
+ 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, "")
+
+ var oldArrrTradebook = JSON.parse(localStorage.getItem(this.botArrrWallet) || "[]")
+
+ const newArrrTradebookItem = {
+ botArrrQortAmount: this.reAddArrrAmount,
+ botArrrPrice: this.reAddArrrPrice
+ }
+
+ oldArrrTradebook.push(newArrrTradebookItem)
+
+ localStorage.setItem(this.botArrrWallet, JSON.stringify(oldArrrTradebook))
+
+ 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)
}
stateChanged(state) {
@@ -210,6 +1962,24 @@ class AppView extends connect(store)(LitElement) {
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]
+ let apiKey = apiNode.apiKey
+ return apiKey
+ }
+
+ isEmptyArray(arr) {
+ if (!arr) {
+ return true
+ }
+ return arr.length === 0
+ }
+
+ round(number) {
+ let result = (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8)
+ return result
+ }
}
window.customElements.define('app-view', AppView)
diff --git a/qortal-ui-core/src/components/main-app.js b/qortal-ui-core/src/components/main-app.js
index 0d09d1ef..36574cea 100644
--- a/qortal-ui-core/src/components/main-app.js
+++ b/qortal-ui-core/src/components/main-app.js
@@ -12,7 +12,7 @@ import './login-view/login-view.js'
import './app-view.js'
import copyTextMenu from '../functional-components/copy-text-menu.js'
-import framePasteMenu from '../functional-components/frame-paste-menu.js';
+import framePasteMenu from '../functional-components/frame-paste-menu.js'
installRouter((location) => store.dispatch(doNavigate(location)))
diff --git a/qortal-ui-core/src/components/sidenav-menu.js b/qortal-ui-core/src/components/sidenav-menu.js
index f36f0796..69118c91 100644
--- a/qortal-ui-core/src/components/sidenav-menu.js
+++ b/qortal-ui-core/src/components/sidenav-menu.js
@@ -162,22 +162,13 @@ class SidenavMenu extends connect(store)(LitElement) {
>
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
{
+ Object.entries(routes).forEach(([route, handler]) => {
+ epmlInstance.route(route, handler)
+ })
+}
diff --git a/qortal-ui-core/src/tradebot/trade-bot-routes.js b/qortal-ui-core/src/tradebot/trade-bot-routes.js
new file mode 100644
index 00000000..aecb989f
--- /dev/null
+++ b/qortal-ui-core/src/tradebot/trade-bot-routes.js
@@ -0,0 +1,253 @@
+import { store } from '../store.js'
+import * as api from 'qortal-ui-crypto'
+import snackbar from '../functional-components/snackbar.js'
+
+const createTransaction = api.createTransaction
+const processTransaction = api.processTransaction
+const tradeBotCreateRequest = api.tradeBotCreateRequest
+const tradeBotRespondRequest = api.tradeBotRespondRequest
+const signTradeBotTxn = api.signTradeBotTxn
+const deleteTradeOffer = api.deleteTradeOffer
+const cancelAllOffers = api.cancelAllOffers
+const sendBtc = api.sendBtc
+const sendLtc = api.sendLtc
+const sendDoge = api.sendDoge
+const sendDgb = api.sendDgb
+const sendRvn = api.sendRvn
+const sendArrr = api.sendArrr
+
+export const routes = {
+ apiCall: async (req) => {
+ const url = req.data.url
+ delete req.data.url
+ return api.request(url, req.data)
+ },
+
+ transaction: async (req) => {
+ let response
+ try {
+ const tx = createTransaction(
+ req.data.type,
+ store.getState().app.wallet._addresses[req.data.nonce].keyPair,
+ req.data.params
+ )
+
+ if (!req.disableModal && !req.data.disableModal) {
+ await requestTransactionDialog.requestTransaction(tx)
+ }
+
+ const res = await processTransaction(tx.signedBytes)
+ let extraData = {}
+ if(req.data.type === 38 && tx && tx._rewardShareKeyPair && tx._rewardShareKeyPair.secretKey){
+ extraData.rewardSharePrivateKey = Base58.encode(tx._rewardShareKeyPair.secretKey)
+ }
+
+
+ response = {
+ success: true,
+ data: res,
+ extraData
+ }
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+ response = {
+ success: false,
+ message: e.message,
+ }
+ }
+ return response
+ },
+
+ standaloneTransaction: async (req) => {
+ const rebuildUint8Array = (obj) => {
+ let _array = new Uint8Array(Object.keys(obj).length)
+ for (let i = 0; i < _array.byteLength; ++i) {
+ _array.set([obj[i]], i)
+ }
+ return _array
+ }
+
+ let response
+ try {
+ let _keyPair = {}
+ for (let _keyName in req.data.keyPair) {
+ _keyPair[_keyName] = rebuildUint8Array(
+ req.data.keyPair[_keyName]
+ )
+ }
+ const tx = createTransaction(
+ req.data.type,
+ _keyPair,
+ req.data.params
+ )
+ const res = await processTransaction(tx.signedBytes)
+ response = {
+ success: true,
+ data: res,
+ }
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+ response = {
+ success: false,
+ message: e.message,
+ }
+ }
+ return response
+ },
+
+ showSnackBar: async (req) => {
+ snackbar.add({
+ labelText: req.data,
+ dismiss: true,
+ })
+ },
+
+ tradeBotCreateRequest: async (req) => {
+ let response
+ try {
+ const unsignedTxn = await tradeBotCreateRequest(req.data)
+
+ const signedTxnBytes = await signTradeBotTxn(
+ unsignedTxn,
+ store.getState().app.selectedAddress.keyPair
+ )
+
+ const res = await processTransaction(signedTxnBytes)
+ response = res
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+ response = e.message
+ }
+ return response
+ },
+
+ tradeBotRespondRequest: async (req) => {
+ let response
+ try {
+ const res = await tradeBotRespondRequest(req.data)
+ response = res
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+ response = e.message
+ }
+ return response
+ },
+
+ deleteTradeOffer: async (req) => {
+ let response
+ try {
+ const unsignedTxn = await deleteTradeOffer(req.data)
+
+ const signedTxnBytes = await signTradeBotTxn(
+ unsignedTxn,
+ store.getState().app.selectedAddress.keyPair
+ )
+
+ const res = await processTransaction(signedTxnBytes)
+
+ response = res
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+ response = e.message
+ }
+ return response
+ },
+
+ cancelAllOffers: async (req) => {
+ let response
+ try {
+ const res = await cancelAllOffers(
+ store.getState().app.selectedAddress
+ )
+ response = res
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+ response = e.message
+ }
+ 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
+ },
+
+ 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
+ },
+
+ 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
+ },
+
+ 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
+ },
+
+ 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
+ },
+
+ 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
+ },
+}
diff --git a/qortal-ui-plugins/build-config.js b/qortal-ui-plugins/build-config.js
index 5595e9db..e21fa127 100644
--- a/qortal-ui-plugins/build-config.js
+++ b/qortal-ui-plugins/build-config.js
@@ -70,16 +70,8 @@ const generateForPlugins = () => {
out: 'plugins/core/trade-portal/trade-portal.js',
},
{
- in: 'plugins/core/trade-bot/trade-bot-btc/trade-bot-btc.src.js',
- out: 'plugins/core/trade-bot/trade-bot-btc/trade-bot-btc.js',
- },
- {
- in: 'plugins/core/trade-bot/trade-bot-ltc/trade-bot-ltc.src.js',
- out: 'plugins/core/trade-bot/trade-bot-ltc/trade-bot-ltc.js',
- },
- {
- in: 'plugins/core/trade-bot/trade-bot-doge/trade-bot-doge.src.js',
- out: 'plugins/core/trade-bot/trade-bot-doge/trade-bot-doge.js',
+ in: 'plugins/core/trade-bot/trade-bot-portal.src.js',
+ out: 'plugins/core/trade-bot/trade-bot-portal.js',
},
{
in: 'plugins/core/wallet/wallet-app.src.js',
diff --git a/qortal-ui-plugins/package.json b/qortal-ui-plugins/package.json
index ce8ec663..8d95633e 100644
--- a/qortal-ui-plugins/package.json
+++ b/qortal-ui-plugins/package.json
@@ -46,9 +46,9 @@
"@rollup/plugin-commonjs": "23.0.2",
"@rollup/plugin-node-resolve": "15.0.1",
"@rollup/plugin-replace": "5.0.1",
- "@vaadin/button": "23.2.8",
- "@vaadin/grid": "23.2.8",
- "@vaadin/icons": "23.2.8",
+ "@vaadin/button": "23.2.9",
+ "@vaadin/grid": "23.2.9",
+ "@vaadin/icons": "23.2.9",
"epml": "0.3.3",
"file-saver": "2.0.5",
"html-escaper": "3.0.3",
diff --git a/qortal-ui-plugins/plugins/core/trade-bot/index.html b/qortal-ui-plugins/plugins/core/trade-bot/index.html
index 79f7583b..5fc2b1c9 100644
--- a/qortal-ui-plugins/plugins/core/trade-bot/index.html
+++ b/qortal-ui-plugins/plugins/core/trade-bot/index.html
@@ -48,8 +48,8 @@
-
-
+
+