diff --git a/src/components/ChainDataSections.tsx b/src/components/ChainDataSections.tsx
index ea9b2d0..f844aa5 100644
--- a/src/components/ChainDataSections.tsx
+++ b/src/components/ChainDataSections.tsx
@@ -5,6 +5,7 @@ import type {
SuiChainData,
CosmosChainData,
EthereumChainData,
+ PolkadotChainData,
} from '@/types/api';
// --- Styles (matching ValidatorProfile patterns) ---
@@ -699,6 +700,38 @@ function EthereumChainSections({
);
}
+function PolkadotChainSections({
+ data,
+ isMobile,
+}: {
+ data: PolkadotChainData;
+ isMobile: boolean;
+}) {
+ // Replaces the demoted dot_not_elected feed event. Badge renders
+ // only when the worker has populated chain_data.is_elected — during
+ // the deploy gap window where worker is_elected hasn't reached prod
+ // yet, undefined would render falsy and incorrectly show "No". Better
+ // to render nothing than to show wrong data.
+ if (typeof data.is_elected !== 'boolean') {
+ return null;
+ }
+ return (
+
+
+ {data.is_elected ? 'Yes' : 'No'}
+
+ }
+ />
+ {data.observed_at_block != null && (
+
+ )}
+
+ );
+}
+
// --- Main export ---
interface ChainDataSectionsProps {
@@ -721,6 +754,8 @@ export function ChainDataSections({ chainData, isMobile }: ChainDataSectionsProp
return (
);
+ case 'polkadot':
+ return ;
default:
return null;
}
diff --git a/src/types/api.ts b/src/types/api.ts
index cf30689..379be55 100644
--- a/src/types/api.ts
+++ b/src/types/api.ts
@@ -478,6 +478,11 @@ export interface EthereumChainData {
slashed: boolean;
}
+export interface PolkadotChainData {
+ is_elected: boolean;
+ observed_at_block: number;
+}
+
// --- Scan Analysis ---
export interface ScanAnalysisSummary {