useTradingStats
Get trading statistics for an address.Copy
import { useTradingStats } from '@zkscore/react';
function TradingStats({ address }: { address: string }) {
const { stats, loading, error } = useTradingStats(address);
if (loading) return <div>Loading stats...</div>;
if (error) return <div>Error: {error.message}</div>;
if (!stats) return <div>No trading data</div>;
return (
<div className="trading-stats">
<div className="stat-card">
<h3>Total Volume</h3>
<p>${parseFloat(stats.totalVolume).toLocaleString()}</p>
</div>
<div className="stat-card">
<h3>Total Trades</h3>
<p>{stats.totalTrades.toLocaleString()}</p>
</div>
<div className="stat-card">
<h3>Win Rate</h3>
<p>{(stats.winRate * 100).toFixed(1)}%</p>
</div>
<div className="stat-card">
<h3>P&L</h3>
<p className={stats.profitLoss.startsWith('+') ? 'profit' : 'loss'}>
{stats.profitLoss}
</p>
</div>
</div>
);
}
Parameters
Ethereum address to query
useTradingHistory
Get trading history with pagination.Copy
import { useTradingHistory } from '@zkscore/react';
import { useState } from 'react';
function TradingHistory({ address }: { address: string }) {
const [page, setPage] = useState(0);
const { history, loading, pagination } = useTradingHistory(address, {
limit: 20,
offset: page * 20,
});
if (loading) return <div>Loading trades...</div>;
return (
<div className="trading-history">
<table>
<thead>
<tr>
<th>Date</th>
<th>Type</th>
<th>From</th>
<th>To</th>
<th>Value</th>
<th>DEX</th>
</tr>
</thead>
<tbody>
{history?.trades.map((trade) => (
<tr key={trade.txHash}>
<td>{new Date(trade.timestamp).toLocaleDateString()}</td>
<td>{trade.type}</td>
<td>{trade.tokenIn.symbol}</td>
<td>{trade.tokenOut.symbol}</td>
<td>${trade.tokenIn.valueUsd}</td>
<td>{trade.dex}</td>
</tr>
))}
</tbody>
</table>
{pagination && (
<div className="pagination">
<button
onClick={() => setPage(p => Math.max(0, p - 1))}
disabled={page === 0}
>
Previous
</button>
<span>Page {page + 1}</span>
<button
onClick={() => setPage(p => p + 1)}
disabled={!pagination.hasMore}
>
Next
</button>
</div>
)}
</div>
);
}
useTradingLeaderboard
Get the trading leaderboard.Copy
import { useTradingLeaderboard } from '@zkscore/react';
function TradingLeaderboard() {
const { leaders, loading, userRank } = useTradingLeaderboard({
metric: 'volume',
timeRange: '30d',
limit: 100,
});
if (loading) return <div>Loading leaderboard...</div>;
return (
<div className="leaderboard">
{userRank && (
<div className="user-rank">
Your Rank: #{userRank.rank} (${userRank.value})
</div>
)}
<table>
<thead>
<tr>
<th>Rank</th>
<th>Trader</th>
<th>Volume</th>
<th>24h Change</th>
</tr>
</thead>
<tbody>
{leaders?.map((leader) => (
<tr key={leader.address}>
<td>{leader.rank}</td>
<td>{leader.username || leader.address.slice(0, 8)}</td>
<td>${parseFloat(leader.value).toLocaleString()}</td>
<td className={leader.change24h > 0 ? 'up' : 'down'}>
{leader.change24h > 0 ? '+' : ''}{leader.change24h.toFixed(2)}%
</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
useTokenStats
Get trading stats for a specific token.Copy
import { useTokenStats } from '@zkscore/react';
function TokenStats({ address, tokenSymbol }: Props) {
const { stats, loading } = useTokenStats(address, tokenSymbol);
if (loading) return <div>Loading token stats...</div>;
if (!stats) return null;
return (
<div className="token-stats">
<h3>{tokenSymbol} Trading Stats</h3>
<div className="stats-grid">
<div>
<label>Trades</label>
<span>{stats.trades}</span>
</div>
<div>
<label>Volume</label>
<span>${stats.volume}</span>
</div>
<div>
<label>Net Position</label>
<span className={stats.netPosition.startsWith('+') ? 'positive' : 'negative'}>
{stats.netPosition} {tokenSymbol}
</span>
</div>
<div>
<label>Realized P&L</label>
<span className={stats.realizedPnL.startsWith('+') ? 'profit' : 'loss'}>
{stats.realizedPnL}
</span>
</div>
</div>
</div>
);
}
Advanced Examples
Trading Dashboard
Copy
import { useTradingStats, useTradingHistory, useTradingLeaderboard } from '@zkscore/react';
function TradingDashboard({ address }: { address: string }) {
const { stats } = useTradingStats(address, { timeRange: '30d' });
const { history } = useTradingHistory(address, { limit: 5 });
const { userRank } = useTradingLeaderboard({
metric: 'volume',
timeRange: '30d',
userAddress: address,
});
return (
<div className="dashboard">
<div className="overview">
<h2>Trading Overview (30d)</h2>
<div className="stats-grid">
<StatCard label="Volume" value={`$${stats?.totalVolume || 0}`} />
<StatCard label="Trades" value={stats?.totalTrades || 0} />
<StatCard label="Win Rate" value={`${((stats?.winRate || 0) * 100).toFixed(1)}%`} />
<StatCard label="Rank" value={`#${userRank?.rank || '-'}`} />
</div>
</div>
<div className="recent-trades">
<h3>Recent Trades</h3>
<TradesList trades={history?.trades || []} />
</div>
<div className="top-tokens">
<h3>Top Tokens</h3>
<TokensList tokens={stats?.topTokens || []} />
</div>
</div>
);
}
Real-Time Trading Monitor
Copy
import { useTradingHistory } from '@zkscore/react';
import { useEffect, useState } from 'react';
function RealTimeTrades({ address }: { address: string }) {
const { history, refetch } = useTradingHistory(address, {
limit: 10,
refreshInterval: 30000, // Poll every 30 seconds
});
return (
<div className="real-time-trades">
<div className="header">
<h3>Recent Trades</h3>
<span className="live-indicator">● LIVE</span>
</div>
{history?.trades.map((trade) => (
<div key={trade.txHash} className="trade-item">
<span className="time">
{new Date(trade.timestamp).toLocaleTimeString()}
</span>
<span className="swap">
{trade.tokenIn.amount} {trade.tokenIn.symbol} → {trade.tokenOut.amount} {trade.tokenOut.symbol}
</span>
<span className="value">${trade.tokenIn.valueUsd}</span>
</div>
))}
</div>
);
}
Performance Metrics
Copy
import { useTradingStats } from '@zkscore/react';
function PerformanceMetrics({ address }: { address: string }) {
const timeRanges = ['7d', '30d', '90d', '1y'] as const;
return (
<div className="performance-metrics">
<h2>Performance Over Time</h2>
<table>
<thead>
<tr>
<th>Period</th>
<th>Volume</th>
<th>Trades</th>
<th>Win Rate</th>
<th>P&L</th>
</tr>
</thead>
<tbody>
{timeRanges.map((range) => (
<PerformanceRow key={range} address={address} timeRange={range} />
))}
</tbody>
</table>
</div>
);
}
function PerformanceRow({ address, timeRange }: Props) {
const { stats } = useTradingStats(address, { timeRange });
return (
<tr>
<td>{timeRange}</td>
<td>${stats?.totalVolume || 0}</td>
<td>{stats?.totalTrades || 0}</td>
<td>{((stats?.winRate || 0) * 100).toFixed(1)}%</td>
<td className={stats?.profitLoss.startsWith('+') ? 'profit' : 'loss'}>
{stats?.profitLoss || '$0'}
</td>
</tr>
);
}
TypeScript Types
Copy
interface TradingStats {
address: string;
totalTrades: number;
totalVolume: string;
uniqueTokens: number;
uniqueDexs: number;
winRate: number;
profitLoss: string;
topTokens: TokenStats[];
topDexs: DexStats[];
}
interface Trade {
txHash: string;
timestamp: string;
dex: string;
type: 'swap' | 'add_liquidity' | 'remove_liquidity';
tokenIn: TokenAmount;
tokenOut: TokenAmount;
gasUsed: string;
profit?: string;
status: 'success' | 'failed';
}
interface TradingHistory {
trades: Trade[];
pagination: {
total: number;
limit: number;
offset: number;
hasMore: boolean;
};
}