FlareWatch प्रत्येक P-Chain वेलिडेटर को 9 आयामों में 0–100 कम्पोज़िट स्कोर प्रदान करता है। गणित नियतात्मक है, इनपुट सार्वजनिक चेन डेटा [Flare Explorer] [FSE] [Flaremetrics] हैं, और नेटवर्क पर प्रत्येक वेलिडेटर पर यही एल्गोरिदम लागू होता है — जिसमें FlareWatch का अपना वेलिडेटर नोड भी शामिल है, जिसे इसी सटीक फ़ंक्शन द्वारा कोई विशेष व्यवहार दिए बिना स्कोर किया जाता है। यह पृष्ठ प्रत्येक आयाम और थ्रेसहोल्ड को दस्तावेज़ित करता है ताकि ऑपरेटर और स्टेकर्स बिल्कुल देख सकें कि स्कोर कैसे परिकलित होता है और प्रत्येक मान को क्यों चुना गया था। यहां हर दावा अपने प्राथमिक ऑन-चेन या अपस्ट्रीम स्रोत से जुड़ा है — नीचे स्रोत और संदर्भ देखें।
स्टेकिंग मोड में देखते हैं (VRM + MIRROR पुरस्कारों के लिए FLR को P-Chain वेलिडेटर को डेलीगेट करना)। डेलीगेशन मोड में दिखाया गया FTSO प्रदाता स्कोर (WFLR को FTSO डेटा प्रदाताओं को डेलीगेट करना) डेटा-प्रदाता प्रदर्शन पर केंद्रित एक अलग 13-आयामी एल्गोरिदम का उपयोग करता है — सटीकता, V2 प्रोटोकॉल भागीदारी, आदि। ये अलग ऑन-चेन भूमिकाएं हैं अलग पुरस्कारों के साथ, अलग स्कोर किए गए। डेलीगेशन पक्ष के लिए FTSO प्रदाता स्कोर पद्धति देखें।स्टेकिंग टेबल पर APY वह ऑल-इन दर है जो डेलीगेटर प्राप्त करता है — एक संख्या, मानसिक गणित नहीं। यह Flare के रिवार्ड-स्क्रिप्ट्स से मापी गई है (वास्तविक भुगतान, सूत्र नहीं), वेलिडेटर की फीस के बाद, और यह हर एपोक वास्तविक रिवार्ड्स के साथ चलती है। FlareWatch पर हर जगह, APY का अर्थ फीस के बाद है और APY का अर्थ पहले है।
Flare Systems Explorer से तुलना? FSE और अन्य एक्सप्लोरर्स केवल डेलीगेशन दर दिखाते हैं — वे MIRROR नहीं जोड़ते — इसलिए हमारा कुल APY किसी भी MIRROR-सक्रिय वेलिडेटर पर अधिक पढ़ता है (अंतर बिल्कुल ऊपर MIRROR लाइन है)। दोनों आंकड़े उसी रिवार्ड-स्क्रिप्ट्स डेटा से ~8-एपोक ट्रेलिंग एवरेज हैं, इसलिए वेलिडेटर के मध्य-विंडो फीस परिवर्तन को किसी भी साइट पर वर्तमान-फीस स्नैपशॉट तक पिछड़ते हैं जब तक यह विंडो के माध्यम से उम्र तक नहीं।
APY टूलटिप में दो अन्य आंकड़े दिखाई देते हैं और नहीं डेलीगेटर की दर हैं: सैद्धांतिक बेसलाइन (नेटवर्क सकल APY × (1 − फीस), केवल स्टेकिंग — पर्याप्त मापी गई इतिहास से पहले फॉलबैक के रूप में उपयोग किया जाता है), और ऑपरेटर की स्व-बॉन्ड यील्ड (वेलिडेटर के अपने स्टेक रिटर्न, फीस कैप्चर द्वारा प्रवर्धित — एक ऑपरेटर मेट्रिक, वह नहीं जो आप कमाते हैं)।
स्कोरिंग के लिए: नेट यील्ड आयाम केवल VRM डेलीगेशन दर को स्कोर करता है, और MIRROR को अपने आयाम में स्कोर किया जाता है — इसलिए MIRROR कभी डबल-गिनती नहीं किया जाता है, भले ही यह प्रदर्शित कुल APY में शामिल हो।
| 90+ | शीर्ष स्तर — ऑपरेटर्स के शीर्ष ~10–20%। विशिष्ट प्रोफ़ाइल: पूर्ण-स्टैक वेलिडेटर + FTSO + FDC, कम-अंत फीस, MIRROR-सक्रिय, सुसंगत FIP-10 विश्वसनीयता, स्वस्थ डेलीगेटर बेस, सार्थक स्व-बॉन्ड। कोई एकल आयाम आवश्यक नहीं — ऑपरेटर्स अधिकांश श्रेणियों में शक्ति को स्टैक करके शीर्ष स्तर तक पहुंचते हैं। |
| 80–89 | मजबूत — अधिकांश प्रमुख बेंचमार्क को पूरा करता है; शीर्ष स्तर से एक या दो आयाम कम है। |
| 70–79 | अच्छा — सभी आधारभूत मानदंड को पूरा करता है; कोई बड़ा अंतर नहीं। |
| 60–69 | स्वीकार्य — उपयोग योग्य लेकिन अलग नहीं है। |
| <60 | माध्यिका के नीचे — एक या अधिक आयामों में महत्वपूर्ण अंतर। गणितीय तथ्य, गुणवत्ता निर्णय नहीं। |
if (uptime >= 99.5) raw = 17 + (uptime - 99.5) * 6
else if (uptime >= 99) raw = 13 + (uptime - 99) * 8
else if (uptime >= 95) raw = 4 + (uptime - 95) * 2.25 // v3.9: was (u - 95) * 3.25 starting at 0
else raw = max(0, uptime - 90) * 0.8 // 90 → 0, 95 → 4 (continuity)
raw = clamp(raw, 0, 20)
reliability = epochsIncluded / epochsObserved // last ~8 epochs · v4.2: the
// FULL FIP-10 minimums set
// (uptime + FSP + FTSO + FDC),
// not RPC-uptime alone
score = raw * clamp(reliability, 0, 1) // dimension max 20scoreAPR = delegationAPY > 0 ? delegationAPY : baseAPR // VRM, net of fee medianAPR = median(scoreAPR across all validators) cappedAPR = min(scoreAPR, 25) // APY_DISPLAY_CAP if (medianAPR > 0): ratio = cappedAPR / medianAPR score = clamp(((ratio - 0.6) / 0.6) * 18, 0, 18) else: score = min(18, (cappedAPR / 8) * 18) // fallback: BASE_APY = 8
// anchor = max(observed minimum active fee, 20% protocol floor) d = fee - anchor // distance above market best if (d <= 0) score = 7 // at/below best available else if (d <= 5) score = 7 - d * 0.2 // 0 → 5 over: 7 → 6 else if (d <= 10) score = 6 - (d - 5) * 0.3 // 5 → 10 over: 6 → 4.5 else if (d <= 15) score = 4.5 - (d - 10) * 0.4 // 10 → 15 over: 4.5 → 2.5 else if (d <= 20) score = 2.5 - (d - 15) * 0.5 // 15 → 20 over: 2.5 → 0 else score = 0 // fees > anchor+20 saturate at 0/7 — the v4.5 extreme-fee // penalty below takes over from there
// Verification baseline (v3.10 hybrid) isCurated = (in KNOWN_VALIDATORS) OR ( daysObserved >= 90 AND operatorDelegatorCount >= 25 AND retention30d >= -15% AND selfBondFLR >= 1_000_000 ) if (isCurated) verification = 7 else if (name auto-discovered) verification = 3 else verification = 0 // FTSO-derived (only when ftsoOperatorScore is a number) clamped = clamp(ftsoOperatorScore, 50, 100) ftsoDerived = 4 + (clamped - 50) * (8/50) // FTSO 50 → 4, FTSO 100 → 12 // Final score score = max(verification, ftsoDerived)
passthrough = max(0, 1 - fee / 100) if (mirrorStatus == "active") base = 10 * passthrough else if (mirrorStatus == "paused") base = 5 * passthrough else if (mirrorStatus == "inactive") base = 0 else base = 5 * passthrough // no data yet // v4.6 — capped, median-anchored bonus for delivered MIRROR yield. // Only mirror-active validators paying ABOVE 1.2x the network median // delivered rate (mirrorAPY, net of fee) earn it; size-neutral. ratio = mirrorAPY / networkMedianMirrorAPY bonus = clamp((ratio - 1.2) * 5, 0, 2) // active only, else 0 score = base + bonus // dimension max 12
utilization = clamp(1 - freeSpaceFLR / maxDelegationFLR, 0, 1) if (utilization <= 0.70): score = 1.75 + (utilization / 0.70) * 5.25 // 1.75 → 7 ramp else: score = 7 - ((utilization - 0.70) / 0.30) * 1.75 // 7 → 5.25 ramp
// Count signal (max 6)
if (delegatorCount <= 5) countScore = 0
else if (delegatorCount >= 500) countScore = 6
else countScore = clamp(log(delegatorCount / 5) / log(100) * 6, 0, 6)
// Concentration adjustment (-1 to +1) — skip if <3 delegators
avgFLR = delegatedFLR / delegatorCount
if (avgFLR < 500_000) concentrationAdj = +1
else if (avgFLR < 5_000_000) concentrationAdj = +0.5
else if (avgFLR > 50_000_000) concentrationAdj = -1
else if (avgFLR > 20_000_000) concentrationAdj = -0.5
else concentrationAdj = 0
// Longevity bonus (0 to +1)
daysObserved = (now - firstObservedAtMs) / 86400000
if (daysObserved >= 90) longevityBonus = +1
else if (daysObserved >= 30) longevityBonus = +0.5
else longevityBonus = 0
// Self-bond alignment (-1 to +2, two-axis since v4.7)
if (selfBondFLR < 1_000_000) selfBondAdj = -1 // hollow-operator floor
else:
ratio = selfBondFLR / totalStake // totalStake = selfBond + delegated
proportional = ratio >= 0.10 ? +2 : ratio >= 0.05 ? +1 : 0
absolute = min(1, selfBondFLR / 20_000_000) * 2 // saturates at top-decile bond
selfBondAdj = max(proportional, absolute) // the better of the two axes
// Retention (-0.5 to +0.5, v3.7) — skip if no 30-day baseline yet
delta = (delegatedFLR - delegatedFLR30dAgo) / delegatedFLR30dAgo
if (delta >= +0.10) retentionAdj = +0.5
else if (delta <= -0.15) retentionAdj = -0.5
else retentionAdj = 0
// Self-bond trajectory (-0.5 to +0.5, v3.7) — skip if no baseline
sbDelta = (selfBondFLR - selfBondFLR30dAgo) / selfBondFLR30dAgo
if (sbDelta >= +0.20) selfBondTrajectoryAdj = +0.5
else if (sbDelta <= -0.10) selfBondTrajectoryAdj = -0.5
else selfBondTrajectoryAdj = 0
score = clamp(countScore + concentrationAdj + longevityBonus + selfBondAdj
+ retentionAdj + selfBondTrajectoryAdj, 0, 11)// Time-weighted rate is computed upstream from per-epoch // reward-scripts data with decay = 0.85 per epoch back. r = deliveryRatio // capped at 1.0 if (r >= 1.00) base = 10 else if (r >= 0.97) base = 9 + (r - 0.97) * (1 / 0.03) // 0.97 → 9, 1.00 → 10 else if (r >= 0.95) base = 8 + (r - 0.95) * (1 / 0.02) // 0.95 → 8, 0.97 → 9 else if (r >= 0.90) base = 6 + (r - 0.90) * (2 / 0.05) // 0.90 → 6, 0.95 → 8 else if (r >= 0.85) base = 4 + (r - 0.85) * (2 / 0.05) // 0.85 → 4, 0.90 → 6 else if (r >= 0.80) base = 2 + (r - 0.80) * (2 / 0.05) // 0.80 → 2, 0.85 → 4 else base = max(0, r * 2.5) // 0 → 0, 0.80 → 2 // Variance penalty (CoV = std-dev / mean across per-epoch rates) variancePenalty = min(0.30, coefficientOfVariation * 0.5) score = base * (1 - variancePenalty) // Sample-size confidence dampener for < 3 epochs if (totalStakesCompleted < 3): confidence = totalStakesCompleted / 3 score = 5 + (score - 5) * confidence
daysLeft = (endTimeMs - now) / 86_400_000 if (daysLeft < 14) score = 0 else if (daysLeft < 30) score = 0 + (daysLeft - 14) * (2 / 16) // 14 → 0, 30 → 2 else if (daysLeft < 60) score = 2 + (daysLeft - 30) * (1 / 30) // 30 → 2, 60 → 3 else if (daysLeft < 120) score = 3 + (daysLeft - 60) * (2 / 60) // 60 → 3, 120 → 5 else score = 5
consecutiveMisses = 0 for entry in participation.recent (newest-first): if entry.eligible: break consecutiveMisses++ if consecutiveMisses < 2: penalty = 0 elif consecutiveMisses == 2: penalty = 3 elif consecutiveMisses == 3: penalty = 6 else: penalty = 10 // 4+ score = max(0, positiveDimensionsSum - penalty)
// v4.5 — fees beyond the Fee dimension's range (anchor+20)
if fee <= 50: penalty = 0
else: fraction = min(1, (fee - 50) / 50) * 0.75
penalty = positiveDimensionsSum * fraction
// fee 50% → no change · 75% → −37.5% of score · 100% → −75%
score = max(0, positiveDimensionsSum - outagePenalty - penalty)delegationFee, selfBond, delegatedStake, और FTSO score (अगर आप एक data provider भी हैं) note करें।generated-files/reward-epoch-N/nodes-data.json के अंतर्गत। Count करें कितने epochs आपके nodeID का uptimeEligible: true था। यह ratio आपके Uptime dimension multiplier को drive करता है।RewardClaimed events के लिए claimType=3 के साथ अपने nodeID को reference करते हुए देखें। अगर कोई recent नहीं हैं, तो आप MIRROR-inactive दिखेंगे।GET /api/validators/{nodeID}/score-breakdown को hit करें persisted breakdown retrieve करने के लिए — हर dimension की value, algorithm version जिसने इसे produced किया, और recent score history — JSON के रूप में। UI में score-breakdown panel यही same source से read करता है।// Step 1 — Raw composite (sum of dimensions, minus the two penalties)
positive = uptime + netYield + fee + operatorQuality
+ mirror + capacity + trust + delivery + timeRemaining
// Penalties (see the two penalty cards above):
// v4.3 active-outage streak — 0-1 missed epochs → 0, 2 → 3, 3 → 6, 4+ → 10
// v4.5 extreme fee (>50%) — positive × min(1, (fee - 50) / 50) × 0.75
raw = clamp(positive - streakPenalty - extremeFeePenalty, 0, 100)
// Step 2 — Smooth across recent cron snapshots (v3.5)
// Weights: current 0.5, prev1 0.3, prev2 0.15, prev3 0.05
smoothed = 0.5*raw + 0.3*prev1 + 0.15*prev2 + 0.05*prev3
// Step 3 — Apply sudden-change penalty if flagged this run
// Triggers: fee +50% or +5pt jump, self-bond -20% drop, uptime -5% crash
// Magnitude: -10 pts on detection, decays -7, -4, -1 over 3 runs
suddenPenalty = -10 if any flag triggered else (decaying remainder)
// Step 4 — Final score
score = clamp(smoothed + suddenPenalty, 0, 100)services/validators/scoring.ts में implemented है। Operators या researchers जो implementation को सीधे inspect करना चाहते हैं (ऊपर दिए गए prose + formulas को पढ़ने के बजाय) — या अपने स्वयं के उपयोग के लिए इसे fork करना चाहते हैं — access के लिए request करने के लिए [email protected] को email कर सकते हैं। यदि वास्तविक मांग है तो हम फ़ाइल को एक standalone open-source package के रूप में प्रकाशित करेंगे।/api/cron/refresh-validators पर cron हर सक्रिय validator के स्कोर को हर 5 मिनट में recompute करता है। Inputs (P-Chain RPC reads, Flaremetrics, FSE, reward-scripts) हर run पर fresh fetch किए जाते हैं।Flare validator stake को slash नहीं करता। validator misbehavior के लिए पूरी penalty mechanism reward forfeiture plus FIP-10 passes system है। कोई double-signing slash नहीं, कोई equivocation slash नहीं, कोई stake-destruction event नहीं जिसे हमें track करने की जरूरत है। FIP-10 minimum conditions को fail करने वाले validators उस epoch के rewards lose करते हैं (full forfeit अगर zero passes पर हैं, अन्यथा प्रत्येक protocol के लिए एक pass lose करें जिसे वे fail करते हैं); उनका staked principal untouched है।
इसका मतलब है कि score के पास कोई "slashing history" dimension नहीं है — ऐसा कोई history track करने के लिए नहीं है। जो हम DO track करते हैं वह हर minimum failure का consequence है: validator उस epoch में zero earned, जो epochsIncluded / epochsObserved में captured है। 2026-05-14 पर v4.2 update ने score के reliability multiplier को widen किया ताकि पूरे FIP-10 minimums set (uptime, FSP signing, FTSO submission rate, FDC participation) के पार उस ratio का उपयोग किया जाए ताकि कोई भी minimum fail करने वाला validator Uptime dimension में proportionally penalized हो regardless of कि कौन सी axis fail हुई।
FIP-10 minimum thresholds, sourced from dev.flare.network/network/fsp/rewarding: staking को 80% uptime + 1M FLR active self-bond की जरूरत है; FTSO anchor feeds को estimates की जरूरत है जो 80% of rounds में consensus median के 0.5% के भीतर हैं; FTSO block-latency feeds को expected updates का 80% submit करने की जरूरत है; FDC को voting rounds का 60% में participate करने की जरूरत है। 80% uptime + 1M self-bond floor meet करने वाले लेकिन 3M / 15M earn thresholds से नीचे validators अभी भी rewards receive करते हैं लेकिन passes accumulate नहीं कर सकते — gray zone इस card के passEligibility: "at-risk" classification के via surfaced है।