+ ? '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 cd006cd55..e4f5812d0 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 92b5c0bf4..d6430cf65 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 60488b66c..275b7ad1a 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 a14c253a6..5c151eb03 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 4cb965f9a..bc80ac499 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 d95b8287b..1e6c0d2fb 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 0b4fdb3d9..9d7105dc2 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 abbe8e25e..f08a90425 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 e5d685b1c..ec87a726f 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 5cc65ab5e..2c955b156 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 4653ddf6a..9a9a66583 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 abbe8e25e..f08a90425 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 abbe8e25e..f08a90425 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 5cbb75648..060a09f32 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 abbe8e25e..f08a90425 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 abbe8e25e..f08a90425 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 f951a4416..d1eb7c118 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 670617271..fd47ccf49 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 5ea59e903..e3ea52401 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 abbe8e25e..f08a90425 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 74961c5af..01de8bfd7 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 f0d4c857b..ca6ead822 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 77b496012..348f24470 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 a2694a0e1..878cca987 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 6e77605bd..d81207b52 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 2f7670147..81f0b4362 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 470f384f1..0a384c3bd 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 7daee5166..aa1aa142b 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 274543e9c..8f2a34728 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 aab927cfc..1a09aba39 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))",