import { useEffect, useState } from "react"; import styles from "../styles/Leaderboard.module.css"; import { TopEarnersResponse, TopRaidersResponse, PlayerResponse, } from "../types/leaderboard"; import { formatUnits } from "viem"; const SUBGRAPH_URL = "https://api.studio.thegraph.com/query/75782/slay-the-moloch-base-mainnet/version/latest"; const Leaderboard = () => { const [topEarners, setTopEarners] = useState(); const [topRaiders, setTopRaiders] = useState(); const [activeTab, setActiveTab] = useState< "earners" | "raiders" | "bosses" | "prestige" >("earners"); const [bossesDefeated, setBossesDefeated] = useState(); const [playerPrestige, setPlayerPrestige] = useState(); useEffect(() => { const fetchLeaderboards = async () => { try { // Fetch top earners const earnersResponse = await fetch(SUBGRAPH_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: `{ armies(first: 10, orderBy: profitPerSecond, orderDirection: desc) { player { id totalMinted currentBalance numberOfRaids } profitPerSecond molochDenierLevel apprenticeLevel anointedLevel championLevel } }`, }), }); const earnersData = await earnersResponse.json(); setTopEarners({ armies: earnersData.data.armies }); // Fetch top raiders const raidersResponse = await fetch(SUBGRAPH_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: `{ players(first: 10, orderBy: numberOfRaids, orderDirection: desc) { id numberOfRaids totalMinted currentBalance } }`, }), }); const raidersData = await raidersResponse.json(); setTopRaiders({ players: raidersData.data.players }); // Fetch bosses defeated const bossesDefeatedResponse = await fetch(SUBGRAPH_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: `{ players(first: 10, orderBy: bossesDefeated, orderDirection: desc) { id bossesDefeated } }`, }), }); const bossesDefeatedData = await bossesDefeatedResponse.json(); setBossesDefeated({ players: bossesDefeatedData.data.players }); // Fetch player prestige const playerPrestigeResponse = await fetch(SUBGRAPH_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: `{ players(first: 10, orderBy: prestigeLevel, orderDirection: desc) { id prestigeLevel } }`, }), }); const playerPrestigeData = await playerPrestigeResponse.json(); setPlayerPrestige({ players: playerPrestigeData.data.players }); } catch (error) { console.error("Error fetching leaderboard:", error); } }; fetchLeaderboards(); const interval = setInterval(fetchLeaderboards, 30000); // Refresh every 30 seconds return () => clearInterval(interval); }, []); return (

Leaderboard

{activeTab === "earners" && (
{topEarners?.armies.map((army, index) => (
#{index + 1} {army.player.id.slice(0, 6)}... {army.player.id.slice(-4)} {formatUnits(BigInt(army.profitPerSecond), 4)}{" "} GELD/s
))}
)} {activeTab === "raiders" && (
{topRaiders?.players.map((player, index) => (
#{index + 1} {player.id.slice(0, 6)}...{player.id.slice(-4)} {player.numberOfRaids} raids
))}
)} {activeTab === "bosses" && (
{bossesDefeated?.players.map((player, index) => (
#{index + 1} {player.id.slice(0, 6)}...{player.id.slice(-4)} {player.bossesDefeated} Bosses Slain
))}
)} {activeTab === "prestige" && (
{playerPrestige?.players.map((player, index) => (
#{index + 1} {player.id.slice(0, 6)}...{player.id.slice(-4)} {player.prestigeLevel} Prestige Level
))}
)}
); }; export default Leaderboard;