From b01c6861f5ea214c8c684b14f463c8f04e09a907 Mon Sep 17 00:00:00 2001 From: JoaquinBN Date: Thu, 12 Mar 2026 17:52:11 +0100 Subject: [PATCH 1/3] Fix per-network leaderboard filtering and validator counts - Add network filter to leaderboard endpoint for validators (filters by validator wallet network via user relationship) - Use full leaderboard response per network for both display (top 5) and count, so Asimov and Bradbury show distinct data - Remove unused statsAPI import --- backend/leaderboard/views.py | 5 +++++ .../src/components/GlobalDashboard.svelte | 21 ++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/backend/leaderboard/views.py b/backend/leaderboard/views.py index 0a8727c6..5822a60e 100644 --- a/backend/leaderboard/views.py +++ b/backend/leaderboard/views.py @@ -102,6 +102,11 @@ def get_queryset(self): # Default to validator leaderboard only when not filtering by user queryset = queryset.filter(type='validator') + # Handle network filtering for validators + network = self.request.query_params.get('network') + if network and leaderboard_type == 'validator': + queryset = queryset.filter(user__validator__validator_wallets__network=network).distinct() + # Handle rank ordering order = self.request.query_params.get('order', 'asc') if order == 'desc': diff --git a/frontend/src/components/GlobalDashboard.svelte b/frontend/src/components/GlobalDashboard.svelte index 9c85b490..5412338f 100644 --- a/frontend/src/components/GlobalDashboard.svelte +++ b/frontend/src/components/GlobalDashboard.svelte @@ -4,7 +4,7 @@ import { format } from "date-fns"; import TopLeaderboard from "./TopLeaderboard.svelte"; import CategoryIcon from "./portal/CategoryIcon.svelte"; - import { leaderboardAPI, validatorsAPI, statsAPI } from "../lib/api"; + import { leaderboardAPI, validatorsAPI } from "../lib/api"; import { showError } from "../lib/toastStore"; // State management @@ -24,29 +24,27 @@ asimovLeaderboardRes, bradburyLeaderboardRes, waitlistLeaderboardRes, - validatorStatsRes, networksRes, ] = await Promise.all([ leaderboardAPI.getLeaderboardByType("validator", "asc", { - limit: 5, network: "asimov", }), leaderboardAPI.getLeaderboardByType("validator", "asc", { - limit: 5, network: "bradbury", }), leaderboardAPI.getWaitlistTop(5), - statsAPI.getDashboardStats("validator"), validatorsAPI.getNetworks().catch(() => ({ data: [] })), // Handle if not found ]); - // Process leaderboards - asimovLeaderboard = Array.isArray(asimovLeaderboardRes.data) + // Process leaderboards — full list for count, top 5 for display + const asimovFull = Array.isArray(asimovLeaderboardRes.data) ? asimovLeaderboardRes.data : []; - bradburyLeaderboard = Array.isArray(bradburyLeaderboardRes.data) + const bradburyFull = Array.isArray(bradburyLeaderboardRes.data) ? bradburyLeaderboardRes.data : []; + asimovLeaderboard = asimovFull.slice(0, 5); + bradburyLeaderboard = bradburyFull.slice(0, 5); waitlistLeaderboard = Array.isArray(waitlistLeaderboardRes.data) ? waitlistLeaderboardRes.data : []; @@ -68,11 +66,10 @@ bradbury.explorer_url = "https://explorer-bradbury.genlayer.com/"; networks = [asimov, bradbury]; - // Validator count from leaderboard stats — same source as Validators page - const validatorCount = validatorStatsRes.data?.participant_count || 0; + // Validator count from leaderboard entries per network networkStats = { - asimov: { total: validatorCount }, - bradbury: { total: 0 }, + asimov: { total: asimovFull.length }, + bradbury: { total: bradburyFull.length }, }; loading = false; From da1ce999e6e78491eb57cffea830f15009dd217d Mon Sep 17 00:00:00 2001 From: JoaquinBN Date: Thu, 12 Mar 2026 17:58:15 +0100 Subject: [PATCH 2/3] Use per-network leaderboard for validator counts Validator count shows active on-chain validators per network (27 for Asimov) rather than total leaderboard entries (35 which includes 8 users with no active wallet). --- frontend/src/components/GlobalDashboard.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/GlobalDashboard.svelte b/frontend/src/components/GlobalDashboard.svelte index 5412338f..6a088f11 100644 --- a/frontend/src/components/GlobalDashboard.svelte +++ b/frontend/src/components/GlobalDashboard.svelte @@ -66,7 +66,7 @@ bradbury.explorer_url = "https://explorer-bradbury.genlayer.com/"; networks = [asimov, bradbury]; - // Validator count from leaderboard entries per network + // Validator count per network from leaderboard entries (active on-chain validators) networkStats = { asimov: { total: asimovFull.length }, bradbury: { total: bradburyFull.length }, From eafb297429ce29be65e131e7d0fe0a7208b11f79 Mon Sep 17 00:00:00 2001 From: JoaquinBN Date: Thu, 12 Mar 2026 18:06:55 +0100 Subject: [PATCH 3/3] Fix validator count per network and label on Testnets page Filter leaderboard by network using wallet relationship, including wallet-less validators in asimov (default network) to match the Validators page count. Update label to 'Active Validators'. --- backend/leaderboard/views.py | 7 ++++++- frontend/src/components/GlobalDashboard.svelte | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/leaderboard/views.py b/backend/leaderboard/views.py index 5822a60e..94030cf8 100644 --- a/backend/leaderboard/views.py +++ b/backend/leaderboard/views.py @@ -103,9 +103,14 @@ def get_queryset(self): queryset = queryset.filter(type='validator') # Handle network filtering for validators + # Include validators with wallets on the specified network. + # For asimov (default network), also include validators with no wallets. network = self.request.query_params.get('network') if network and leaderboard_type == 'validator': - queryset = queryset.filter(user__validator__validator_wallets__network=network).distinct() + network_q = Q(user__validator__validator_wallets__network=network) + if network == 'asimov': + network_q = network_q | ~Q(user__validator__validator_wallets__isnull=False) + queryset = queryset.filter(network_q).distinct() # Handle rank ordering order = self.request.query_params.get('order', 'asc') diff --git a/frontend/src/components/GlobalDashboard.svelte b/frontend/src/components/GlobalDashboard.svelte index 6a088f11..2a555e7c 100644 --- a/frontend/src/components/GlobalDashboard.svelte +++ b/frontend/src/components/GlobalDashboard.svelte @@ -240,7 +240,7 @@ style="letter-spacing: -0.96px;" >{networkStats.asimov.total} - Validators + Active Validators