import { useEffect, useState } from 'react' import styles from '../styles/Leaderboard.module.css' import { TopEarnersResponse, TopRaidersResponse } from '../types/leaderboard' import { formatUnits } from 'viem' const SUBGRAPH_URL = 'https://api.studio.thegraph.com/query/75782/slay-the-moloch-base-sepolia/version/latest' const Leaderboard = () => { const [topEarners, setTopEarners] = useState() const [topRaiders, setTopRaiders] = useState() const [activeTab, setActiveTab] = useState<'earners' | 'raiders'>('earners') 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 }) } 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
))}
)}
) } export default Leaderboard