Skip to content

Commit 57cae81

Browse files
authored
feat(guardian-prover-health-check-ui): add node info and fix error (#16772)
1 parent 0ee78b9 commit 57cae81

File tree

7 files changed

+129
-29
lines changed

7 files changed

+129
-29
lines changed

packages/guardian-prover-health-check-ui/src/components/GuardianProver/DataPoint.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
{:else}
1616
<div class="f-row justify-between w-full">
1717
<div class="font-bold">{headline}</div>
18-
<div>{dataPoint}</div>
18+
<div class="text-right">{dataPoint}</div>
1919
</div>
2020
{/if}
2121

packages/guardian-prover-health-check-ui/src/components/GuardianProver/GuardianProverTableRow.svelte

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,13 @@
9696
<div class="font-bold">
9797
{guardianProver.name}
9898
</div>
99-
<div class="text-secondary-content">{shortenAddress(guardianProver.address)}</div>
99+
<div class="text-secondary-content">
100+
{#if isDesktopOrLarger}
101+
{guardianProver.address}
102+
{:else}
103+
{shortenAddress(guardianProver.address)}
104+
{/if}
105+
</div>
100106
</div>
101107
{#if !single && !$loading}
102108
<IconFlipper
@@ -110,31 +116,59 @@
110116
{/if}
111117
</div>
112118
<div class="collapse-content bg-grey-10">
113-
<div class="{isDesktopOrLarger ? 'f-row' : 'f-col space-y-[5px] py-[16px]'} items-center">
114-
<div class="min-w-[150px]" />
119+
<div
120+
class="{isDesktopOrLarger
121+
? 'f-row flex-wrap space-x-[16px]'
122+
: 'f-col space-y-[5px] py-[16px]'} items-center"
123+
>
124+
<div class="min-w-[134px]" />
115125

116126
<DataPoint
117127
headline={$t('overview.table.balance')}
118128
dataPoint={truncateDecimal(Number(guardianProver.balance), 3).toString() + ' ETH'}
119129
/>
120130

121131
<DataPoint
122-
headline={$t('overview.detail.table.uptime')}
123-
dataPoint={truncateDecimal(guardianProver.uptime, 2).toString() + '%'}
132+
headline={$t('overview.table.no_blocks_created')}
133+
dataPoint="{signedBlocksPerGuardian(guardianProver.id)}/{$signedBlocks.length}"
124134
/>
125135

126136
<DataPoint
127-
headline={$t('overview.table.no_blocks_created')}
128-
dataPoint="{signedBlocksPerGuardian(guardianProver.id)}/{$signedBlocks.length}"
137+
headline={$t('overview.table.latest_l1_block')}
138+
dataPoint={guardianProver?.blockInfo?.latestL1BlockNumber.toString()}
129139
/>
130140

131-
<DataPoint headline="L1 Node Version" dataPoint={guardianProver?.nodeInfo?.l1NodeVersion} />
132-
<DataPoint headline="L2 Node Version" dataPoint={guardianProver?.nodeInfo?.l2NodeVersion} />
133-
<DataPoint headline="Revision" dataPoint={guardianProver?.nodeInfo?.revision} />
141+
<DataPoint
142+
headline={$t('overview.table.latest_l2_block')}
143+
dataPoint={guardianProver?.blockInfo?.latestL2BlockNumber.toString()}
144+
/>
145+
146+
<DataPoint
147+
headline={$t('overview.detail.table.uptime')}
148+
dataPoint={truncateDecimal(guardianProver.uptime, 2).toString() + '%'}
149+
/>
150+
151+
<DataPoint headline="Revision" dataPoint={guardianProver?.versionInfo?.revision} />
134152
<DataPoint
135153
headline="Last restart"
136154
dataPoint={formatISODateTime(guardianProver?.lastRestart)}
137155
/>
156+
</div>
157+
<div
158+
class="{isDesktopOrLarger
159+
? 'f-row flex-wrap space-x-[16px]'
160+
: 'f-col space-y-[5px] py-[16px]'} items-center"
161+
>
162+
<div class="min-w-[134px]" />
163+
164+
<DataPoint
165+
headline="L1 Node Version"
166+
dataPoint={guardianProver?.versionInfo?.l1NodeVersion}
167+
/>
168+
<DataPoint
169+
headline="L2 Node Version"
170+
dataPoint={guardianProver?.versionInfo?.l2NodeVersion}
171+
/>
138172

139173
{#if !single}
140174
<div class="f-row md:w-auto w-full justify-end pt-[20px] md:pt-[0]">

packages/guardian-prover-health-check-ui/src/i18n/en.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@
4343
"address": "Address",
4444
"balance": "Balance",
4545
"guardian_prover": "Guardian Prover",
46-
"no_blocks_created": "Signed",
46+
"latest_l1_block": "Latest L1 Block",
47+
"latest_l2_block": "Latest L2 Block",
48+
"no_blocks_created": "Signed Blocks",
4749
"status": "Status",
48-
"view_details": "View details"
50+
"view_details": "View Healthchecks"
4951
}
5052
},
5153
"page": {

packages/guardian-prover-health-check-ui/src/lib/api/guardianProverApiCalls.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
1-
import { healthCheckRoute, livenessRoute, mostRecentStartupRoute, uptimeRoute } from '$lib/routes';
2-
import type { HealthCheck, PageResponse, StartupResponse, UptimeResponse } from '$lib/types';
1+
import {
2+
healthCheckRoute,
3+
livenessRoute,
4+
mostRecentStartupRoute,
5+
nodeInfoRoute,
6+
uptimeRoute
7+
} from '$lib/routes';
8+
import type {
9+
HealthCheck,
10+
NodeInfoResponse,
11+
PageResponse,
12+
StartupResponse,
13+
UptimeResponse
14+
} from '$lib/types';
315
import axios from 'axios';
416

517
export async function fetchGuardianProverHealthChecksFromApi(
@@ -54,3 +66,11 @@ export async function fetchStartupDataFromApi(baseURL: string, guardianProverId:
5466

5567
return resp.data;
5668
}
69+
70+
export async function fetchNodeInfoFromApi(baseURL: string, guardianProverId: number) {
71+
const url = `${baseURL}/${nodeInfoRoute}/${guardianProverId}`;
72+
73+
const resp = await axios.get<NodeInfoResponse>(url);
74+
75+
return resp.data;
76+
}

packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
import { GuardianProverStatus, type Guardian, type NodeInfo, type SignedBlocks } from './types';
1+
import {
2+
GuardianProverStatus,
3+
type BlockInfo,
4+
type Guardian,
5+
type SignedBlocks,
6+
type VersionInfo
7+
} from './types';
28
import { fetchSignedBlocksFromApi } from './api/signedBlocksApiCalls';
39
import { getGuardianProverIdsPerBlockNumber } from './blocks/getGuardianProverIdsPerBlockNumber';
410
import { sortSignedBlocksDescending } from './blocks/sortSignedBlocks';
511
import { publicClient } from './wagmi/publicClient';
612
import { formatEther, type Address } from 'viem';
713
import {
814
fetchLatestGuardianProverHealthCheckFromApi,
15+
fetchNodeInfoFromApi,
916
fetchStartupDataFromApi,
1017
fetchUptimeFromApi
1118
} from './api';
@@ -80,14 +87,15 @@ async function initializeGuardians() {
8087
const rawGuardians: Guardian[] = Object.entries(guardiansMap).map(([address, name], index) => ({
8188
name: name,
8289
address: address,
83-
id: index,
90+
id: index + 1, // add +1 as guardian contract numbers starts at 1
8491
latestHealthCheck: null,
8592
alive: GuardianProverStatus.UNKNOWN,
8693
balance: null,
8794
lastRestart: null,
8895
uptime: null,
8996
nodeInfo: null
9097
}));
98+
9199
guardianProvers.set(rawGuardians);
92100
}
93101

@@ -175,23 +183,40 @@ async function fetchStats(): Promise<void> {
175183
const guardians = get(guardianProvers);
176184

177185
const updatedGuardiansPromises = guardians.map(async (guardian) => {
178-
const data = await fetchStartupDataFromApi(
186+
const startupDataFetch = fetchStartupDataFromApi(
187+
import.meta.env.VITE_GUARDIAN_PROVER_API_URL,
188+
guardian.id
189+
);
190+
191+
const nodeInfoFetch = fetchNodeInfoFromApi(
179192
import.meta.env.VITE_GUARDIAN_PROVER_API_URL,
180193
guardian.id
181194
);
182-
const info: NodeInfo = {
183-
guardianProverAddress: data.guardianProverAddress,
184-
guardianProverID: data.guardianProverID,
185-
guardianVersion: data.version,
186-
l1NodeVersion: data.revision,
187-
l2NodeVersion: data.revision,
188-
revision: data.revision
195+
196+
const [startupData, nodeInfo] = await Promise.all([startupDataFetch, nodeInfoFetch]);
197+
198+
const versions: VersionInfo = {
199+
guardianProverAddress: startupData.guardianProverAddress,
200+
guardianProverID: startupData.guardianProverID,
201+
guardianVersion: nodeInfo.guardianVersion,
202+
l1NodeVersion: nodeInfo.l1NodeVersion,
203+
l2NodeVersion: nodeInfo.l2NodeVersion,
204+
revision: startupData.revision
205+
};
206+
207+
console.log('versions', versions);
208+
209+
const blockInfo: BlockInfo = {
210+
latestL1BlockNumber: nodeInfo.latestL1BlockNumber,
211+
latestL2BlockNumber: nodeInfo.latestL2BlockNumber
189212
};
190213

191214
return {
192215
...guardian,
193-
nodeInfo: info,
194-
lastRestart: data.createdAt
216+
id: versions.guardianProverID,
217+
versionInfo: versions,
218+
lastRestart: startupData.createdAt,
219+
blockInfo: blockInfo
195220
};
196221
});
197222

packages/guardian-prover-health-check-ui/src/lib/routes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export const livenessRoute = 'liveness';
44
export const signedBlocksRoute = 'signedBlocks';
55
export const uptimeRoute = 'uptime';
66
export const mostRecentStartupRoute = 'mostRecentStartup';
7+
export const nodeInfoRoute = 'nodeInfo';

packages/guardian-prover-health-check-ui/src/lib/types.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ export type StartupResponse = {
3737
createdAt: string;
3838
};
3939

40+
export type NodeInfoResponse = {
41+
guardianProverID: number;
42+
guardianProverAddress: string;
43+
l1NodeVersion: string;
44+
l2NodeVersion: string;
45+
revision: string;
46+
guardianVersion: string;
47+
createdAt: string;
48+
latestL1BlockNumber: number;
49+
latestL2BlockNumber: number;
50+
};
51+
4052
export type PageResponse<T> = {
4153
items: T[];
4254
page: number;
@@ -58,10 +70,16 @@ export type Guardian = {
5870
balance?: string;
5971
lastRestart?: string;
6072
uptime?: number;
61-
nodeInfo?: NodeInfo;
73+
versionInfo?: VersionInfo;
74+
blockInfo?: BlockInfo;
75+
};
76+
77+
export type BlockInfo = {
78+
latestL1BlockNumber: number;
79+
latestL2BlockNumber: number;
6280
};
6381

64-
export type NodeInfo = {
82+
export type VersionInfo = {
6583
guardianProverAddress: string;
6684
guardianProverID: number;
6785
guardianVersion: string;

0 commit comments

Comments
 (0)