+ ? 'Generate a new ENR to use to create or join an existing cluster'
+ : 'Create/join an Obol Cluster solo or with a group using the Distributed Validator Launchpad.'
+ }`"
+ :btn-name="`${!headerStore.continueForExistENR ? 'GENERATE' : 'OPEN IN BROWSER'}`"
+ :btn-bg-color="`#192d31`"
+ :btn-name-color="`#2fe4ab`"
+ @confirmPluginClick="topBlock"
+ />
+ ? 'Generate a new ENR to use to create or join an existing cluster'
+ : 'Create/join an Obol Cluster solo or with a group using the Distributed Validator Launchpad.'
+ }`"
+ :btn-name="`COPY`"
+ :second-btn-name="`REMOVE`"
+ :btn-bg-color="`#494949`"
+ :second-btn-bg-color="`#eb5353`"
+ :btn-name-color="`#dbdbdb`"
+ img-url="/img/icon/service-icons/copy1.png"
+ @confirmPluginClick="copyHandler"
+ @secBtnPluginClick="removeHandler"
+ />
-
-
- {{ headerStore.depositFile ? "BACKUP DEPOSIT FILE" : "START THE DKG" }}
- {{
- headerStore.depositFile
- ? "Export your backup deposit file from the server to back it up"
- : "When all ENRs are signed, you will be presented with a command. All Node Operators have to run this command at the same time!"
- }}
-
-
{
+ const stakingStore = useStakingStore();
+
+ const listGroups = async () => {
+ const existingKeys = await ControlService.readKeys();
+ const groups = {};
+
+ if (existingKeys) {
+ for (const [pubkey, keyData] of Object.entries(existingKeys)) {
+ if (keyData.groupName && keyData.groupID) {
+ if (!groups[keyData.groupID]) {
+ groups[keyData.groupID] = {
+ id: keyData.groupID,
+ name: keyData.groupName,
+ keys: [],
+ validatorClientID: keyData.validatorClientID,
+ };
+ }
+ const matchingKey = stakingStore.filteredKeys.find((key) => key.key === pubkey);
+ if (matchingKey) {
+ groups[keyData.groupID].keys.push(matchingKey);
+ }
+ }
+ }
+
+ stakingStore.validatorKeyGroups = Object.values(groups);
+ // console.log(stakingStore.validatorKeyGroups);
+ } else {
+ console.error("Error fetching keys from server");
+ }
+ };
+
+ return { listGroups };
+};
diff --git a/launcher/src/composables/services.js b/launcher/src/composables/services.js
index cd006cd55c..e4f5812d01 100644
--- a/launcher/src/composables/services.js
+++ b/launcher/src/composables/services.js
@@ -136,12 +136,12 @@ async function useConnectionCheck() {
const nodeHeaderStore = useNodeHeader();
const footerStore = useFooter();
- if (!nodeHeaderStore.updating) {
+ if (!nodeHeaderStore.updating && nodeHeaderStore.refresh) {
let connected = await ControlService.checkConnection();
if (!connected) {
- console.log("Reconnecting...");
+ console.log("Connection lost");
+ nodeHeaderStore.refresh = false;
footerStore.stereumStatus = false;
- await ControlService.reconnect();
} else {
footerStore.stereumStatus = true;
}
diff --git a/launcher/src/composables/utils.js b/launcher/src/composables/utils.js
index 92b5c0bf4a..d6430cf65b 100644
--- a/launcher/src/composables/utils.js
+++ b/launcher/src/composables/utils.js
@@ -1,3 +1,14 @@
export function useDeepClone(obj) {
return JSON.parse(JSON.stringify(obj));
-}
\ No newline at end of file
+}
+
+export function useTruncate(str, frontChars, endChars) {
+ if (typeof str !== "string" || str.length === 0) {
+ return "";
+ }
+
+ if (str.length <= frontChars + endChars) {
+ return str;
+ }
+ return `${str.substring(0, frontChars)} ... ${str.substring(str.length - endChars)}`;
+}
diff --git a/launcher/src/composables/validators.js b/launcher/src/composables/validators.js
index 60488b66cf..275b7ad1aa 100644
--- a/launcher/src/composables/validators.js
+++ b/launcher/src/composables/validators.js
@@ -8,19 +8,12 @@ export async function useListKeys(forceRefresh) {
const serviceStore = useServices();
const nodeManageStore = useNodeManage();
const stakingStore = useStakingStore();
- let numRunningValidatorService = 0;
let keyStats = [];
let clients = serviceStore.installedServices.filter(
(s) => s.category == "validator" && s.service != "CharonService" && s.service != "SSVNetworkService"
);
- if (clients && clients.length > 0 && nodeManageStore.currentNetwork.network != "") {
- for (let client of clients) {
- if (client.state === "running" && client.service.includes("ValidatorService")) {
- numRunningValidatorService++;
- }
- }
-
+ if ((clients && clients.length > 0 && nodeManageStore.currentNetwork.network != "") || forceRefresh) {
for (let client of clients) {
//if there is already a list of keys ()
if (
@@ -28,10 +21,9 @@ export async function useListKeys(forceRefresh) {
client.state === "running"
) {
//refresh validaotr list
- let result = await ControlService.listValidators(client.config.serviceID, numRunningValidatorService);
- if (
- !client.service.includes("Web3Signer")
- ) {
+ let result = await ControlService.listValidators(client.config.serviceID);
+
+ if (!client.service.includes("Web3Signer")) {
let resultRemote = await ControlService.listRemoteKeys(client.config.serviceID);
let remoteKeys = resultRemote.data
? resultRemote.data.map((e) => {
@@ -39,6 +31,13 @@ export async function useListKeys(forceRefresh) {
})
: [];
result.data = result.data ? result.data.concat(remoteKeys) : remoteKeys;
+
+ //make sure there are no duplicates
+ let validating_pubkeys = result.data.map(obj => obj.validating_pubkey);
+ result.data = result.data.filter((obj, index) => {
+ return validating_pubkeys.indexOf(obj.validating_pubkey) === index;
+ });
+
}
//update service config (pinia)
@@ -75,14 +74,31 @@ export async function useListKeys(forceRefresh) {
}
}
let alias = await ControlService.readKeys();
+ let keysToWrite = {};
+ keyStats.forEach((key) => {
+ if (alias[key.key]) {
+ keysToWrite[key.key] = alias[key.key];
+ }
+ });
+ for (let key in alias) {
+ if (keysToWrite[key] === undefined && serviceStore.installedServices.some((s) => s.config?.serviceID === alias[key].validatorID)) {
+ keysToWrite[key] = alias[key];
+ }
+ }
+ keysToWrite.overwrite = true;
+ await ControlService.writeKeys(keysToWrite);
+
stakingStore.keys = keyStats.map((key) => {
return {
...key,
- displayName: alias[key.key].keyName,
+ displayName: alias[key.key]?.keyName,
showGrafitiText: false,
showCopyText: false,
showRemoveText: false,
showExitText: false,
+ selected: false,
+ groupName: alias[key.key]?.groupName,
+ groupID: alias[key.key]?.groupID,
};
});
if (stakingStore.keys && stakingStore.keys.length > 0) useUpdateValidatorStats();
@@ -142,6 +158,7 @@ export async function useUpdateValidatorStats() {
} else {
d.setMilliseconds(d.getMilliseconds() - (latestEpoch - activationEpoch) * 384000);
}
+ key.index = info.validatorindex;
key.status = info.status;
key.balance = info.balance / 1000000000;
key.activeSince = ((now.getTime() - d.getTime()) / 86400000).toFixed(1) + " Days";
diff --git a/launcher/src/languages/ar.json b/launcher/src/languages/ar.json
index a14c253a6f..5c151eb039 100755
--- a/launcher/src/languages/ar.json
+++ b/launcher/src/languages/ar.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/bg.json b/launcher/src/languages/bg.json
index 4cb965f9ac..bc80ac4994 100755
--- a/launcher/src/languages/bg.json
+++ b/launcher/src/languages/bg.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/cs.json b/launcher/src/languages/cs.json
index d95b8287b3..1e6c0d2fbf 100755
--- a/launcher/src/languages/cs.json
+++ b/launcher/src/languages/cs.json
@@ -400,6 +400,11 @@
"logOutQuestion": "JSTE SI JISTÝ(Á), ŽE SE CHCETE ODHLÁSIT ZE SVÉHO SERVERU S UZLEM?",
"logOutBtn": "Odhlásit se"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH během svého provozu zvětšuje používaný úložný prostor. Vyčištění GETH databáze, odstranění nepotřebných dat a uvolnění části využívaného úložného prostoru, trvá NĚKOLIK HODIN. Tento úkon musí být proveden, když Geth není spuštěný. BĚHEM ČIŠTĚNÍ PROSTORU BUDE VÁŠ UZEL ODPOJEN OD SÍTĚ A NEBUDE MOCI PLNIT POTENCIÁLNÍ POKYNY K ATESTACI.",
"prunningChecked": "PŘEČETL(A) JSEM TEXT A JSEM SI VĚDOM(Á) NÁSLEDKŮ",
diff --git a/launcher/src/languages/de.json b/launcher/src/languages/de.json
index 0b4fdb3d9d..9d7105dc28 100755
--- a/launcher/src/languages/de.json
+++ b/launcher/src/languages/de.json
@@ -287,8 +287,8 @@
"syncClient": "SYNCHRONISIERT IHREN CLIENT VOM BEGINN DER BLOCKCHAIN AN",
"plugin": "INSTALLIERTE DIENSTE",
"addOpt": "ADDITIONAL OPTIONS",
- "installOpt": "INSTALLATION OPTIONEN",
- "startOnInstall": "Starte den Client nach der Installation?",
+ "installOpt": "INSTALLATION OPTIONS",
+ "startOnInstall": "Start up client after installation?",
"monitor": "MONITORING",
"instMonit": "Install Monitoring?",
"back": "ZURÜCK",
@@ -400,6 +400,11 @@
"logOutQuestion": "SIND SIE SICH SICHER DASS SIE SICH VON IHREM NODE SERVER ABMELDEN WOLLEN?",
"logOutBtn": "Abmelden"
},
+ "reconnectModal": {
+ "reconnectTitle": "Verbindung verloren",
+ "reconnectMessage": "Überprüfe deine verbindung und versuche es erneut.",
+ "reconnectBtn": "Verbinden"
+ },
"prunningModal": {
"prunningText": "GETH verbraucht Speicherplatz, der im Laufe seiner Betriebszeit wächst. Das Löschen unnötiger Daten und das Freigeben von Speicherplatz aus der Geth-Datenbank kann mehrere Stunden dauern. Dies muss durchgeführt werden, wenn Geth nicht ausgeführt wird. WENN DER LÖSCHVORGANG GESTARTET WIRD, WIRD IHR NODE OFFLINE GEHEN UND POTENZIELLE ATTESTATIONSPFLICHTEN NICHT MEHR ERFÜLLEN.",
"prunningChecked": "ICH HABE DEN TEXT GELESEN UND BIN MIR DEN KONSEQUENZEN BEWUSST",
diff --git a/launcher/src/languages/en.json b/launcher/src/languages/en.json
index abbe8e25e8..f08a90425b 100755
--- a/launcher/src/languages/en.json
+++ b/launcher/src/languages/en.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/es.json b/launcher/src/languages/es.json
index e5d685b1c3..ec87a726fc 100755
--- a/launcher/src/languages/es.json
+++ b/launcher/src/languages/es.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/fa.json b/launcher/src/languages/fa.json
index 5cc65ab5e6..2c955b156d 100755
--- a/launcher/src/languages/fa.json
+++ b/launcher/src/languages/fa.json
@@ -400,6 +400,11 @@
"logOutQuestion": "آیا مطمئن هستید که می خواهید از سرور نود خود خارج شوید?",
"logOutBtn": "خروج"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "من متن را خواندم و از عواقب آن آگاهم",
diff --git a/launcher/src/languages/fr.json b/launcher/src/languages/fr.json
index 4653ddf6a3..9a9a66583e 100755
--- a/launcher/src/languages/fr.json
+++ b/launcher/src/languages/fr.json
@@ -28,9 +28,9 @@
"stop": "stop",
"machineIp": "Machine IP Address",
"machineName": "Machine Name",
- "clkEdit": "click to edit your node",
- "clkOn": "click to turn on your node",
- "clkOff": "click to turn off your node",
+ "clkEdit": "Click to edit your node",
+ "clkOn": "Click to turn your node on",
+ "clkOff": "Click to turn your node off",
"clkLog": "Click to open the panel so that the log for clients and services is available to you separately",
"clkSwitch": "Click to open the panel so that the on/off switch for clients and services is available to you separately",
"clkRestart": "Click to open the panel so that you can restart clients and services separately",
@@ -158,18 +158,18 @@
"usage": "Usage",
"netSel": "The selected network is",
"machineName": "Machine Name",
- "storVol": "Storage Volume",
- "stor": "the storage",
- "diskSpeed": "Disk Speed",
- "p2p": "peer to peer networks",
+ "storVol": "Server storage volume",
+ "stor": "Server storage overview",
+ "diskSpeed": "Disk speed",
+ "p2p": "Peer to peer connections",
"cpuUse": "CPU Usage",
"syncInfo": "Synchronization status",
"ramUse": "RAM Usage",
"netSpeed": "Network Speed",
- "listPort": "list of ports",
+ "listPort": "List of service ports",
"endPoint": "endpoint",
"data": "data",
- "enteredKeys": "The number of entered validator keys",
+ "enteredKeys": "The number of imported validator keys",
"ttlBal": "Total balance",
"finEPOCH": "Finalized EPOCH",
"pending": "service is pending",
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
@@ -697,16 +702,16 @@
"srvice": "service"
},
"clientButtons": {
- "turnOn": "Turn on the service",
- "turnOff": "Turn off the service",
+ "turnOn": "Turn the service on",
+ "turnOff": "Turn the service off",
"restart": "Restart the service",
- "pending": "service is pending",
- "settings": "service settings",
- "logs": "open logs",
- "docs": "open docs",
- "removeLock": "remove lock files",
- "pruning": "pruning the service",
- "resync": "resync the service"
+ "pending": "Service is pending",
+ "settings": "Access the settings of the service",
+ "logs": "Open the logs of the service",
+ "docs": "Open the documentation of the service in your browser",
+ "removeLock": "Remove Lock files of the service",
+ "pruning": "Prune the service database",
+ "resync": "Resync the service from a selected source"
},
"clientLay": {
"client": "client",
@@ -721,7 +726,7 @@
"clickToCancel": "Click here to cancel this change"
},
"editClientLay": {
- "clkEdit": "click to edit your service"
+ "clkEdit": "Click to edit your service"
},
"generalMenu": {
"modify": "modify",
@@ -739,13 +744,13 @@
"clkConfirm": "Click here to confirm change(s)"
},
"sidebarSect": {
- "toNode": "To the Node Page",
- "toEdit": "To the Edit Node",
- "setchNet": "Switch Network",
- "nukTheNud": "Nuke the Node",
+ "toNode": "Return to the Node Page",
+ "toEdit": "Go to the Edit Node Page",
+ "setchNet": "Switch Network in the configuration of the Node",
+ "nukTheNud": "Nuke the Stereum Node and all its services",
"nukNod": "Nuke Node",
- "trnOn": "Turn Node On",
- "trnOff": "Turn Node Off",
- "expNode": "Export Node Config"
+ "trnOn": "Turn your node on",
+ "trnOff": "Turn your node off",
+ "expNode": "Export your Node Configuration"
}
}
diff --git a/launcher/src/languages/it.json b/launcher/src/languages/it.json
index abbe8e25e8..f08a90425b 100755
--- a/launcher/src/languages/it.json
+++ b/launcher/src/languages/it.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/ja.json b/launcher/src/languages/ja.json
index abbe8e25e8..f08a90425b 100755
--- a/launcher/src/languages/ja.json
+++ b/launcher/src/languages/ja.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/mn.json b/launcher/src/languages/mn.json
index 5cbb756488..060a09f329 100755
--- a/launcher/src/languages/mn.json
+++ b/launcher/src/languages/mn.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Системээс гарах"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/nl.json b/launcher/src/languages/nl.json
index abbe8e25e8..f08a90425b 100755
--- a/launcher/src/languages/nl.json
+++ b/launcher/src/languages/nl.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/pt.json b/launcher/src/languages/pt.json
index abbe8e25e8..f08a90425b 100755
--- a/launcher/src/languages/pt.json
+++ b/launcher/src/languages/pt.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/ru.json b/launcher/src/languages/ru.json
index f951a4416c..d1eb7c118c 100755
--- a/launcher/src/languages/ru.json
+++ b/launcher/src/languages/ru.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "ПРОЧИТАЛ ТЕКСТ И ОСОЗНАЮ ПОСЛЕДСТВИЯ",
diff --git a/launcher/src/languages/sr.json b/launcher/src/languages/sr.json
index 6706172716..fd47ccf493 100755
--- a/launcher/src/languages/sr.json
+++ b/launcher/src/languages/sr.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/tr.json b/launcher/src/languages/tr.json
index 5ea59e903f..e3ea524018 100755
--- a/launcher/src/languages/tr.json
+++ b/launcher/src/languages/tr.json
@@ -400,6 +400,11 @@
"logOutQuestion": "DÜĞÜM SUNUCUSUNUZDAN ÇIKIŞ YAPMAK İSTEDİĞİNİZDEN EMİN MİSİNİZ?",
"logOutBtn": "Çıkış yap"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH'in çalışma süresi boyunca kullandığı depolama alanı BÜYÜR. Geth veritabanını budamak, gereksiz verileri kaldırmak ve kullanılan depolama alanının bir kısmını boşaltmak ÇOK UZUN sürer. Bu Geth çalışmıyorken yapılmalıdır. BUDAMA SÜRECİNİ BAŞLATIRSANIZ DÜĞÜMÜNÜZ ÇEVRİMDIŞI OLACAK VE OLASI ONAY/DOĞRULAMA GÖREVLERİNİ DURDURACAKTIR!",
"prunningChecked": "METİNİ OKUDUM VE SONUÇLARININ FARKINDAYIM",
diff --git a/launcher/src/languages/vi.json b/launcher/src/languages/vi.json
index abbe8e25e8..f08a90425b 100755
--- a/launcher/src/languages/vi.json
+++ b/launcher/src/languages/vi.json
@@ -400,6 +400,11 @@
"logOutQuestion": "ARE YOU SURE YOU WANT TO LOG OUT OF YOUR NODE SERVER?",
"logOutBtn": "Log out"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH used up storage space GROWs over its operational time. It takes MULTIPLE HOURS to prune the Geth database, removing unnecessary data and freeing up some of the used storage space. This has to be done while Geth is not running. STARTING THE PRUNING PROCESS YOUR NODE WILL GO OFFLINE AND STOP POTENTIAL ATTESTATION DUTIES.",
"prunningChecked": "I READ THE TEXT AND I AM AWARE OF THE CONSEQUENCES",
diff --git a/launcher/src/languages/zh.json b/launcher/src/languages/zh.json
index 74961c5af8..01de8bfd7a 100755
--- a/launcher/src/languages/zh.json
+++ b/launcher/src/languages/zh.json
@@ -400,6 +400,11 @@
"logOutQuestion": "确定想要登出您的服务器节点吗?",
"logOutBtn": "登出"
},
+ "reconnectModal": {
+ "reconnectTitle": "Connection lost",
+ "reconnectMessage": "Check your connection and try again.",
+ "reconnectBtn": "Reconnect"
+ },
"prunningModal": {
"prunningText": "GETH 在操作时间内使用的存储空间一直增加。 需要多小时来修剪它数据库,删除不必要的数据并释放一些使用过的储存空间。 必须在GETH不运作的时候完成这项工作。开始修建过程您的节点会下线并停止潜在性见证工作。",
"prunningChecked": "我已阅读且了解后果",
diff --git a/launcher/src/main.js b/launcher/src/main.js
index f0d4c857ba..ca6ead822c 100755
--- a/launcher/src/main.js
+++ b/launcher/src/main.js
@@ -9,28 +9,15 @@ import i18n from "./includes/i18n";
import BaseLayout from "./components/base/BaseLayout.vue";
import InstallationLayout from "../src/components/base/InstallationLayout.vue";
import TaskManager from "./components/UI/task-manager/TaskManager.vue";
-import BackgroundPage from "./components/layers/BackgroundPage.vue";
-import TheTrapezium from "./components/UI/the-node/TheTrapezium.vue";
-import NodeBg from "./components/UI/the-node/NodeBg.vue";
-import NodeHeader from "./components/layers/NodeHeader";
-import ServicePlugin from "./components/UI/node-manage/ServicePlugin.vue";
-import NodeService from "./components/UI/the-node/NodeService.vue";
-import CommingSoon from "./components/layers/CommingSoon.vue";
-import TheNodePanelBtn from "./components/UI/the-node/TheNodePanelBtn.vue";
+import StakingCustomModal from "./components/UI/staking-page/components/modals/StakingCustomModal.vue";
const app = createApp(App);
const pinia = createPinia();
-app.component("CommingSoon", CommingSoon);
-app.component("TheNodePanelBtn", TheNodePanelBtn);
-app.component("BackgroundPage", BackgroundPage);
-app.component("TheTrapezium", TheTrapezium);
-app.component("NodeBg", NodeBg);
-app.component("NodeHeader", NodeHeader);
-app.component("ServicePlugin", ServicePlugin);
-app.component("NodeService", NodeService);
+
app.component("BaseLayout", BaseLayout);
app.component("InstallationLayout", InstallationLayout);
app.component("TaskManager", TaskManager);
+app.component("StakingCustomModal", StakingCustomModal);
app.use(router);
app.use(pinia);
diff --git a/launcher/src/pages/StakingPage.vue b/launcher/src/pages/StakingPage.vue
index 77b496012d..348f244707 100644
--- a/launcher/src/pages/StakingPage.vue
+++ b/launcher/src/pages/StakingPage.vue
@@ -2,5 +2,5 @@
diff --git a/launcher/src/store/ControlService.js b/launcher/src/store/ControlService.js
index a2694a0e13..878cca9870 100755
--- a/launcher/src/store/ControlService.js
+++ b/launcher/src/store/ControlService.js
@@ -206,11 +206,8 @@ class ControlService extends EventEmitter {
return await this.promiseIpc.send("deleteValidators", args);
}
- async listValidators(serviceID, numRunningValidatorService) {
- return await this.promiseIpc.send("listValidators", {
- serviceID: serviceID,
- numRunningValidatorService: numRunningValidatorService,
- });
+ async listValidators(args) {
+ return await this.promiseIpc.send("listValidators", args);
}
async listServices() {
@@ -407,7 +404,6 @@ class ControlService extends EventEmitter {
async exitValidatorAccount(args) {
return await this.promiseIpc.send("exitValidatorAccount", {
pubkey: args.pubkey,
- password: args.password,
serviceID: args.serviceID,
});
}
@@ -462,6 +458,24 @@ class ControlService extends EventEmitter {
async dumpDockerLogs() {
return await this.promiseIpc.send("dumpDockerLogs");
}
+ async getCurrentEpochandSlot() {
+ return await this.promiseIpc.send("getCurrentEpochandSlot");
+ }
+ async getValidatorDuties(args) {
+ return await this.promiseIpc.send("getValidatorDuties", args);
+ }
+
+ async getAttestationRewards(args) {
+ return await this.promiseIpc.send("getAttestationRewards", args);
+ }
+
+ async getBlockRewards(args) {
+ return await this.promiseIpc.send("getBlockRewards", args);
+ }
+
+ async getSyncCommitteeRewards(validators, slot) {
+ return await this.promiseIpc.send("getSyncCommitteeRewards", { validators, slot });
+ }
}
if (!instance) {
instance = new ControlService(window.electron);
diff --git a/launcher/src/store/clickInstallation.js b/launcher/src/store/clickInstallation.js
index 6e77605bd4..d81207b522 100755
--- a/launcher/src/store/clickInstallation.js
+++ b/launcher/src/store/clickInstallation.js
@@ -3,9 +3,9 @@ import { defineStore } from "pinia";
export const useClickInstall = defineStore("clickInstallation", {
state: () => {
return {
+ startServicesAfterInstall: false,
isConfigButtonEnbabled: false,
installMonitoring: false,
- startServicesAfterInstall: true,
relayURL: "",
checkPointSync: "",
currentSlide: 0,
@@ -186,7 +186,7 @@ export const useClickInstall = defineStore("clickInstallation", {
url: "https://beaconstate.info/",
},
],
- georli: [
+ goerli: [
{
id: 1,
name: "Sigma Prime",
@@ -289,12 +289,6 @@ export const useClickInstall = defineStore("clickInstallation", {
icon: "/img/icon/service-icons/ef-devops.png",
url: "https://checkpoint-sync.holesky.ethpandaops.io",
},
- {
- id: 4,
- name: "Flashbots",
- icon: "/img/icon/click-installation/flashbot-icon.png",
- url: "https://boost-relay-holesky.flashbots.net/",
- },
],
};
},
diff --git a/launcher/src/store/nodeHeader.js b/launcher/src/store/nodeHeader.js
index 2f76701473..81f0b4362f 100755
--- a/launcher/src/store/nodeHeader.js
+++ b/launcher/src/store/nodeHeader.js
@@ -2,6 +2,10 @@ import { defineStore } from "pinia";
export const useNodeHeader = defineStore("nodeHeader", {
state: () => {
return {
+ importBoxModel: "",
+ passwordBoxModel: "",
+ selectedValidatorFromNodeAlert: {},
+ openModalFromNodeAlert: false,
depositFile: false,
enrIsGenerating: true,
generatedENR: "",
diff --git a/launcher/src/store/nodeManage.js b/launcher/src/store/nodeManage.js
index 470f384f10..0a384c3bdc 100755
--- a/launcher/src/store/nodeManage.js
+++ b/launcher/src/store/nodeManage.js
@@ -31,6 +31,8 @@ export const useNodeManage = defineStore("nodeManage", {
"https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-goerli.flashbots.net",
sepolia:
"https://0x845bd072b7cd566f02faeb0a4033ce9399e42839ced64e8b2adcfc859ed1e8e1a5a293336a49feac6d9a5edb779be53a@boost-relay-sepolia.flashbots.net",
+ holesky:
+ "https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-holesky.flashbots.net",
id: 1,
isSelected: false,
isRemoved: false,
@@ -189,7 +191,7 @@ export const useNodeManage = defineStore("nodeManage", {
icon: "/img/icon/click-installation/testnet-icon.png",
currencyIcon: "/img/icon/control/goETH_Currency_Symbol.png",
dataEndpoint: "https://sepolia.beaconcha.in/api/v1",
- support: ["staking", "mev boost", "stereum on arm"],
+ support: ["staking", "mev boost", "stereum on arm", "archive"],
},
{
id: 4,
@@ -198,7 +200,7 @@ export const useNodeManage = defineStore("nodeManage", {
icon: "/img/icon/click-installation/gnosis_mainnet_icon.png",
currencyIcon: "/img/icon/control/gno_currency_symbol.png",
dataEndpoint: "https://beacon.gnosischain.com/api/v1",
- support: ["staking", "stereum on arm"],
+ support: ["staking", "stereum on arm", "archive"],
},
{
id: 5,
@@ -207,7 +209,7 @@ export const useNodeManage = defineStore("nodeManage", {
icon: "/img/icon/click-installation/testnet-icon.png",
currencyIcon: "/img/icon/control/goETH_Currency_Symbol.png",
dataEndpoint: "https://holesky.beaconcha.in/api/v1",
- support: ["staking", "ssv.network", "stereum on arm", "mev boost"],
+ support: ["staking", "ssv.network", "stereum on arm", "mev boost", "archive", "obol"],
},
],
currentNetwork: {},
diff --git a/launcher/src/store/theNode.js b/launcher/src/store/theNode.js
index 7daee51668..aa1aa142b9 100755
--- a/launcher/src/store/theNode.js
+++ b/launcher/src/store/theNode.js
@@ -10,6 +10,9 @@ export const useNodeStore = defineStore("theNode", {
lineThree: null,
infoAlarm: true,
runNodePowerModal: false,
+ clientToLogs: null,
+ logs: [],
+ searchLogs: "",
serviceLogs: [],
consensusItems: [],
executionItems: [],
diff --git a/launcher/src/store/theStaking.js b/launcher/src/store/theStaking.js
index 274543e9c6..8f2a347289 100755
--- a/launcher/src/store/theStaking.js
+++ b/launcher/src/store/theStaking.js
@@ -3,6 +3,69 @@ import { defineStore } from "pinia";
export const useStakingStore = defineStore("theStaking", {
state: () => {
return {
+ currentEpoch: 0,
+ currentSlot: 0,
+ secondsPerSlot: null,
+ slotsPerEpoch: null,
+ // ***** Staking List
+ selectedServiceToFilter: null,
+ filteredKeys: null,
+ searchedKeys: [],
+ activePanel: "insert",
+ searchContent: "",
+ isOverDropZone: false,
+ inputWrongKey: false,
+ isPreviewListActive: false,
+ importEnteredPassword: null,
+ importKeyMessage: "",
+ checkActiveValidatorsResponse: [],
+ previewKeys: [],
+ keyNumbers: 0,
+ //***** End Staking List
+
+ // ***** Staking Modals *****
+ activeModal: null,
+ // ***** End Staking Modals *****
+
+ // ***** Staking Groups *****
+ mode: "create",
+ groupName: null,
+ currentGroup: null,
+ isGroupListActive: false,
+ isGroupingAllowed: false,
+ validatorKeyGroups: [],
+ filteredGroups: [],
+ selectedGroup: null,
+ selectedValidatorKeys: [],
+ // ***** End Staking Groups *****
+
+ // ***** Staking Remote Keys *****
+ isRemoteListActive: false,
+ previewRemoteKeys: [], // Remote Keys List to display
+ remoteKeys: [], // Remote Keys List
+ remoteUrl: "",
+ remoteResponse: null,
+ remoteResponseMessage: null,
+
+ // ***** End Staking Remote Keys *****
+
+ // ***** Validator Keys *****
+ isPubkeyVisible: false,
+ removeResponse: [],
+ removeKeys: [],
+ pickedSlashing: "no",
+ slashingDB: "", // Slashing DB
+ selectedKeyToRemove: null,
+ selectKeyToRename: null,
+ selectKeyForFee: null,
+ validatorDisplayName: "",
+ enteredFeeRecipientAddress: "",
+ feeRecepientAddress: "",
+ // ***** End Validator Keys *****
+ selectedSingleKeyToWithdraw: null,
+ withdrawAndExitResponse: null,
+ withdrawIsChecked: false,
+
exitMultiValidatorKeys: false,
doppelgangerStatus: true,
selectedIcon: "",
@@ -18,9 +81,6 @@ export const useStakingStore = defineStore("theStaking", {
insertKeyBoxActive: true,
enterPasswordBox: false,
importRemoteKeysActive: false,
- exitChainForMultiValidatorsActive: false,
- removeForMultiValidatorsActive: false,
- grafitiForMultiValidatorsActive: false,
display: true,
isDragOver: false,
keyFiles: [],
@@ -31,5 +91,18 @@ export const useStakingStore = defineStore("theStaking", {
keyCounter: 0,
};
},
- actions: {},
+ actions: {
+ setActivePanel(panelName) {
+ this.activePanel = panelName;
+ },
+ setActiveModal(modalName) {
+ this.activeModal = modalName;
+ },
+ setMode(mode) {
+ this.mode = mode;
+ },
+ setValidatorName(newName) {
+ this.validatorDisplayName = newName;
+ },
+ },
});
diff --git a/launcher/tailwind.config.js b/launcher/tailwind.config.js
index aab927cfc5..1a09aba399 100755
--- a/launcher/tailwind.config.js
+++ b/launcher/tailwind.config.js
@@ -5,6 +5,9 @@ module.exports = {
backgroundImage: {
drop: "url('/img/icon/manage-node-icons/drag.png')",
},
+ fontSize: {
+ "2xs": "10px",
+ },
gridTemplateRows: {
7: "repeat(7 , minmax(0,1fr))",
8: "repeat(8 , minmax(0,1fr))",