50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import ofetch from '@/utils/ofetch';
|
|
|
|
export interface TraderData {
|
|
address: string;
|
|
account_value: number;
|
|
main_position: {
|
|
coin: string;
|
|
value: number;
|
|
side: 'LONG' | 'SHORT';
|
|
};
|
|
direction_bias: number;
|
|
perp_day_pnl: number;
|
|
perp_week_pnl: number;
|
|
perp_month_pnl: number;
|
|
perp_alltime_pnl: number;
|
|
}
|
|
|
|
export async function fetchTopTraders(): Promise<TraderData[]> {
|
|
const apiUrl = 'https://hyperdash.info/api/hyperdash/top-traders-cached';
|
|
|
|
const traders: TraderData[] = await ofetch(apiUrl, {
|
|
headers: {
|
|
'x-api-key': 'hyperdash_public_7vN3mK8pQ4wX2cL9hF5tR1bY6gS0jD',
|
|
},
|
|
});
|
|
|
|
return traders;
|
|
}
|
|
|
|
export function formatCurrency(value: number | null): string {
|
|
if (value === null || value === undefined) {
|
|
return 'N/A';
|
|
}
|
|
if (Math.abs(value) >= 1e6) {
|
|
return `$${(value / 1e6).toFixed(2)}M`;
|
|
}
|
|
if (Math.abs(value) >= 1e3) {
|
|
return `$${(value / 1e3).toFixed(2)}K`;
|
|
}
|
|
return `$${value.toFixed(2)}`;
|
|
}
|
|
|
|
export function formatPnL(value: number | null): string {
|
|
if (value === null || value === undefined) {
|
|
return 'N/A';
|
|
}
|
|
const formatted = formatCurrency(value);
|
|
return value >= 0 ? `+${formatted}` : formatted;
|
|
}
|