From 57732597ee1291403a57e7446c3622b26522d7c6 Mon Sep 17 00:00:00 2001 From: mateumiralles Date: Fri, 17 Apr 2026 11:16:53 +0200 Subject: [PATCH] update Gnosis explorer to beacon.gnosisscan.io --- .../src/modules/config/networks/gnosis.ts | 2 +- .../fetchValidatorIndex.unit.test.ts | 2 +- .../ValidatorList/KeystoresDataGrid.tsx | 18 ++++++------- packages/ui/src/params.ts | 2 +- .../ui/src/utils/buildValidatorSummaryURL.ts | 25 +++++++++++++------ packages/ui/test/testBuildSummaryUrl.test.ts | 6 ++--- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/packages/brain/src/modules/config/networks/gnosis.ts b/packages/brain/src/modules/config/networks/gnosis.ts index 3baca687..cd7794fd 100644 --- a/packages/brain/src/modules/config/networks/gnosis.ts +++ b/packages/brain/src/modules/config/networks/gnosis.ts @@ -1,6 +1,6 @@ export const gnosisBrainConfig = () => { return { - blockExplorerUrl: "https://gnosischa.in", + blockExplorerUrl: "https://beacon.gnosisscan.io", minGenesisTime: 1638968400, // Dec 8, 2021, 13:00 UTC secondsPerSlot: 5, slotsPerEpoch: 16 diff --git a/packages/brain/test/unit/modules/apiClients/fetchValidatorIndex.unit.test.ts b/packages/brain/test/unit/modules/apiClients/fetchValidatorIndex.unit.test.ts index 38baeae2..8588cc17 100644 --- a/packages/brain/test/unit/modules/apiClients/fetchValidatorIndex.unit.test.ts +++ b/packages/brain/test/unit/modules/apiClients/fetchValidatorIndex.unit.test.ts @@ -95,7 +95,7 @@ const beaconchaApiParamsMap = new Map([ [ "gnosis", { - baseUrl: "https://gnosischa.in", + baseUrl: "https://beacon.gnosisscan.io", apiPath: "/api/v1/" } ], diff --git a/packages/ui/src/components/ValidatorList/KeystoresDataGrid.tsx b/packages/ui/src/components/ValidatorList/KeystoresDataGrid.tsx index 3e15d344..f03d114a 100644 --- a/packages/ui/src/components/ValidatorList/KeystoresDataGrid.tsx +++ b/packages/ui/src/components/ValidatorList/KeystoresDataGrid.tsx @@ -57,16 +57,16 @@ export default function KeystoresDataGrid({ }): JSX.Element { const [pageSize, setPageSize] = useState(rows.length > 10 ? 10 : rows.length); const beaconchaBaseUrl = beaconchaApiParamsMap.get(network)?.baseUrl; - const [validatorSummaryURL, setValidatorSummaryURL] = useState(""); + const [validatorSummaryURLs, setValidatorSummaryURLs] = useState([]); useEffect(() => { setSummaryUrlBuildingStatus(BeaconchaUrlBuildingStatus.NotStarted); - setValidatorSummaryURL(""); + setValidatorSummaryURLs([]); }, [selectedRows]); useEffect(() => { openDashboardTab(); - }, [validatorSummaryURL]); + }, [validatorSummaryURLs]); const [validatorsSubscriptionMap, setValidatorsSubscriptionMap] = useState(null); @@ -384,7 +384,7 @@ export default function KeystoresDataGrid({ async function getValidatorSummaryURL() { if (!beaconchaApiParamsMap?.get(network)) { - setValidatorSummaryURL(""); + setValidatorSummaryURLs([]); setSummaryUrlBuildingStatus(BeaconchaUrlBuildingStatus.Error); return; } @@ -401,22 +401,22 @@ export default function KeystoresDataGrid({ } catch (e) { console.error(`Error fetching all validators info: ${e}`); setSummaryUrlBuildingStatus(BeaconchaUrlBuildingStatus.NoIndexes); - setValidatorSummaryURL(""); + setValidatorSummaryURLs([]); return; } - const summaryUrlBuilt = buildValidatorSummaryURL({ + const summaryUrlsBuilt = buildValidatorSummaryURL({ allValidatorsInfo, network }); - setValidatorSummaryURL(summaryUrlBuilt); + setValidatorSummaryURLs(summaryUrlsBuilt); setSummaryUrlBuildingStatus(BeaconchaUrlBuildingStatus.Success); } async function openDashboardTab() { - if (validatorSummaryURL) { - window.open(validatorSummaryURL, "_blank", "noopener, noreferrer"); + for (const url of validatorSummaryURLs) { + window.open(url, "_blank", "noopener, noreferrer"); } } diff --git a/packages/ui/src/params.ts b/packages/ui/src/params.ts index 29409831..af6a56f6 100644 --- a/packages/ui/src/params.ts +++ b/packages/ui/src/params.ts @@ -4,7 +4,7 @@ import type { ApiParams } from "@stakingbrain/brain"; export const beaconchaApiParamsMap = new Map>([ ["mainnet", { baseUrl: "https://beaconcha.in", apiPath: "/api/v1/" }], ["prater", { baseUrl: "https://prater.beaconcha.in", apiPath: "/api/v1/" }], - ["gnosis", { baseUrl: "https://gnosischa.in", apiPath: "/api/v1/" }], + ["gnosis", { baseUrl: "https://beacon.gnosisscan.io", apiPath: "/api/v1/" }], [ "lukso", { diff --git a/packages/ui/src/utils/buildValidatorSummaryURL.ts b/packages/ui/src/utils/buildValidatorSummaryURL.ts index 01c25bbe..4cfd581b 100644 --- a/packages/ui/src/utils/buildValidatorSummaryURL.ts +++ b/packages/ui/src/utils/buildValidatorSummaryURL.ts @@ -1,26 +1,37 @@ import type { BeaconchaGetResponse } from "@stakingbrain/brain"; import { beaconchaApiParamsMap } from "../params"; +// Networks where the explorer does not support multi-validator dashboard URLs +const singleValidatorNetworks = ["gnosis, lukso"]; + export default function buildValidatorSummaryURL({ allValidatorsInfo, network }: { allValidatorsInfo: BeaconchaGetResponse[]; network: string; -}): string { +}): string[] { if (!beaconchaApiParamsMap.has(network)) { throw new Error(`Invalid network: ${network}`); } const baseUrl = beaconchaApiParamsMap.get(network)?.baseUrl; - if (!baseUrl) return ""; - - let summaryValidatorURL = baseUrl + "/dashboard?validators="; + if (!baseUrl) return []; + const allIndexes: number[] = []; allValidatorsInfo.forEach((validatorChunk) => { - const chunkIndexes = validatorChunk.data.map((validator) => validator.validatorindex); - summaryValidatorURL += chunkIndexes.join(","); + validatorChunk.data.forEach((validator) => { + if (validator.validatorindex !== undefined) allIndexes.push(validator.validatorindex); + }); }); - return summaryValidatorURL; + if (allIndexes.length === 0) return []; + + if (singleValidatorNetworks.includes(network)) { + // These explorers only support one validator per URL + return allIndexes.map((index) => `${baseUrl}/validator/${index}`); + } + + // Networks that support multi-validator dashboard URLs + return [`${baseUrl}/dashboard?validators=${allIndexes.join(",")}`]; } diff --git a/packages/ui/test/testBuildSummaryUrl.test.ts b/packages/ui/test/testBuildSummaryUrl.test.ts index 354225ee..c3e9660c 100644 --- a/packages/ui/test/testBuildSummaryUrl.test.ts +++ b/packages/ui/test/testBuildSummaryUrl.test.ts @@ -24,12 +24,12 @@ describe("Test the building of a unique URL for all the validators", () => { } const network = "mainnet"; - const summaryValidatorURL = buildValidatorSummaryURL({ + const summaryValidatorURLs = buildValidatorSummaryURL({ allValidatorsInfo, network }); - expect(summaryValidatorURL).to.equal( + expect(summaryValidatorURLs).to.deep.equal([ "https://beaconcha.in/dashboard?validators=" + "1,".repeat(100) + "101,102,103" - ); + ]); }); });