/** * Comparison Metrics Utility * * Provides normalization, ranking, and comparison functions for multi-vault analysis */ import { RiskScoreBreakdown } from './risk-scoring.js'; /** * Vault data structure for comparison */ export interface VaultComparisonData { address: string; name: string; symbol: string; chainId: number; tvl: number; apr: number; sustainableNetApr?: number; incentiveContribution?: number; twrrNetApr?: number | null; totalShares?: string; totalAssets?: string; ageInDays?: number; inceptionApr?: number; averageSettlementDays?: number; riskScore?: number; riskLevel?: 'Low' | 'Medium' | 'High' | 'Critical'; riskBreakdown?: RiskScoreBreakdown; fees?: { managementFee: number; performanceFee: number; }; } /** * Normalized vault metrics with rankings */ export interface NormalizedVault extends VaultComparisonData { rank: number; tvlPercentile: number; aprPercentile: number; sustainableAprPercentile?: number; sustainableAprDelta?: number; riskPercentile?: number; aprDelta: number; tvlDelta: number; riskDelta?: number; overallScore: number; } /** * Ranking strategy for normalizeAndRankVaults. * - 'totalApr' (default): rank by total net APR (including airdrops/incentives). * - 'sustainableApr': rank by APR excluding extra yields — gives a fair * comparison when some vaults are incentive-heavy. */ export type RankBy = 'totalApr' | 'sustainableApr'; /** * Comparison summary statistics */ export interface ComparisonSummary { totalVaults: number; averageTvl: number; averageApr: number; averageRisk?: number; bestPerformer: { address: string; name: string; apr: number; }; worstPerformer: { address: string; name: string; apr: number; }; highestTvl: { address: string; name: string; tvl: number; }; lowestTvl: { address: string; name: string; tvl: number; }; safestVault?: { address: string; name: string; riskScore: number; riskLevel: string; }; riskiestVault?: { address: string; name: string; riskScore: number; riskLevel: string; }; oldestVault?: { address: string; name: string; ageInDays: number; }; newestVault?: { address: string; name: string; ageInDays: number; }; } /** * Calculate percentile rank for a value in an array * @param value The value to calculate percentile for * @param arr Array of all values * @returns Percentile (0-100) */ export declare function calculatePercentile(value: number, arr: number[]): number; /** * Calculate delta from average * @param value The value to calculate delta for * @param average The average value * @returns Delta as percentage */ export declare function calculateDelta(value: number, average: number): number; /** * Calculate overall score based on weighted metrics * @param aprPercentile APR percentile (0-100) * @param tvlPercentile TVL percentile (0-100) * @param weights Optional weights for metrics * @returns Overall score (0-100) */ export declare function calculateOverallScore(aprPercentile: number, tvlPercentile: number, weights?: { apr: number; tvl: number; }): number; /** * Normalize and rank vaults for comparison. * * Note: ageInDays and inceptionApr are displayed in the table but intentionally * excluded from the overallScore. Track record data is presented for the AI to * reason about qualitatively (per system prompt: "track record is primary trust signal") * rather than baked into a single numeric score where the weighting would be arbitrary. * * @param vaults Array of vault data * @returns Array of normalized vaults with rankings */ export declare function normalizeAndRankVaults(vaults: VaultComparisonData[], rankBy?: RankBy): NormalizedVault[]; /** * Generate comparison summary statistics * @param vaults Array of vault data * @returns Summary statistics or null if no vaults */ export declare function generateComparisonSummary(vaults: VaultComparisonData[]): ComparisonSummary | null; /** * Format comparison output as markdown table * @param vaults Normalized vaults with rankings * @returns Markdown formatted table */ export declare function formatComparisonTable(vaults: NormalizedVault[]): string; //# sourceMappingURL=comparison-metrics.d.ts.map