Skip to content

Commit 3d5762d

Browse files
committed
gui: send txn counts, boot timestamp
1 parent c82cc96 commit 3d5762d

File tree

8 files changed

+89
-49
lines changed

8 files changed

+89
-49
lines changed

src/api/atoms.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
EstimatedTps,
1212
EstimatedSlotDuration,
1313
IdentityBalance,
14-
UptimeNanos,
14+
StartupTimeNanos,
1515
LiveTxnWaterfall,
1616
StartupProgress,
1717
LiveTilePrimaryMetric,
@@ -23,7 +23,6 @@ import {
2323
BlockEngineUpdate,
2424
VoteBalance,
2525
} from "./types";
26-
import { DateTime } from "luxon";
2726
import { rafAtom } from "../atomUtils";
2827

2928
export const versionAtom = atom<Version | undefined>(undefined);
@@ -34,8 +33,8 @@ export const commitHashAtom = atom<CommitHash | undefined>(undefined);
3433

3534
export const identityKeyAtom = atom<IdentityKey | undefined>(undefined);
3635

37-
export const uptimeAtom = atom<
38-
{ uptimeNanos: UptimeNanos; ts: DateTime } | undefined
36+
export const startupTimeAtom = atom<
37+
{ startupTimeNanos: StartupTimeNanos } | undefined
3938
>(undefined);
4039

4140
export const tilesAtom = atom<Tile[] | undefined>(undefined);

src/api/entities.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const commitHashSchema = z.string();
4444

4545
export const identityKeySchema = z.string();
4646

47-
export const uptimeNanosSchema = z.coerce.bigint();
47+
export const startupTimeNanosSchema = z.coerce.bigint();
4848

4949
export const tileTypeSchema = z.enum([
5050
"sock",
@@ -247,9 +247,10 @@ export const slotPublishSchema = z.object({
247247
mine: z.boolean(),
248248
skipped: z.boolean(),
249249
level: slotLevelSchema,
250-
transactions: z.number().nullable(),
251-
vote_transactions: z.number().nullable(),
252-
failed_transactions: z.number().nullable(),
250+
success_user_transaction_cnt: z.number().nullable(),
251+
failed_user_transaction_cnt: z.number().nullable(),
252+
success_vote_transaction_cnt: z.number().nullable(),
253+
failed_vote_transaction_cnt: z.number().nullable(),
253254
priority_fee: z.coerce.bigint().nullable(),
254255
transaction_fee: z.coerce.bigint().nullable(),
255256
tips: z.coerce.bigint().nullable(),
@@ -302,8 +303,8 @@ export const summarySchema = z.discriminatedUnion("key", [
302303
value: identityKeySchema,
303304
}),
304305
summaryTopicSchema.extend({
305-
key: z.literal("uptime_nanos"),
306-
value: uptimeNanosSchema,
306+
key: z.literal("startup_time_nanos"),
307+
value: startupTimeNanosSchema,
307308
}),
308309
summaryTopicSchema.extend({
309310
key: z.literal("tiles"),

src/api/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
txnWaterfallInSchema,
3333
txnWaterfallOutSchema,
3434
txnWaterfallSchema,
35-
uptimeNanosSchema,
35+
startupTimeNanosSchema,
3636
versionSchema,
3737
voteDistanceSchema,
3838
voteStateSchema,
@@ -48,7 +48,7 @@ export type CommitHash = z.infer<typeof commitHashSchema>;
4848

4949
export type IdentityKey = z.infer<typeof identityKeySchema>;
5050

51-
export type UptimeNanos = z.infer<typeof uptimeNanosSchema>;
51+
export type StartupTimeNanos = z.infer<typeof startupTimeNanosSchema>;
5252

5353
export type Tile = z.infer<typeof tileSchema>;
5454

src/api/useSetAtomWsData.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
tilesAtom,
1515
tileTimerAtom,
1616
tpsHistoryAtom,
17-
uptimeAtom,
17+
startupTimeAtom,
1818
versionAtom,
1919
voteDistanceAtom,
2020
voteStateAtom,
@@ -58,8 +58,7 @@ import {
5858
waterfallDebounceMs,
5959
} from "./consts";
6060
import { rateLiveWaterfallAtom } from "../features/Overview/SlotPerformance/atoms";
61-
62-
const minuteNanos = 1_000_000 * 60 * 1_000;
61+
import { slowDateTimeNow } from "../utils";
6362

6463
export function useSetAtomWsData() {
6564
const setVersion = useSetAtom(versionAtom);
@@ -72,9 +71,18 @@ export function useSetAtomWsData() {
7271
const setIdentityBalance = useSetAtom(identityBalanceAtom);
7372
const setVoteBalance = useSetAtom(voteBalanceAtom);
7473

75-
const [uptime, setUptime] = useAtom(uptimeAtom);
74+
const [startupTime, setStartupTime] = useAtom(startupTimeAtom);
75+
76+
const uptimeDuration =
77+
startupTime !== undefined
78+
? slowDateTimeNow.diff(
79+
DateTime.fromMillis(
80+
Math.floor(Number(startupTime.startupTimeNanos) / 1_000_000),
81+
),
82+
)
83+
: undefined;
7684
const uptimeMins =
77-
uptime !== undefined ? Number(uptime.uptimeNanos) / minuteNanos : undefined;
85+
uptimeDuration !== undefined ? uptimeDuration.get("minutes") : undefined;
7886

7987
const setEstimatedSlotDuration = useSetAtom(estimatedSlotDurationAtom);
8088
const setDbEstimatedSlotDuration = useThrottledCallback(
@@ -180,8 +188,8 @@ export function useSetAtomWsData() {
180188
setVoteBalance(value);
181189
break;
182190
}
183-
case "uptime_nanos": {
184-
setUptime({ uptimeNanos: value, ts: DateTime.now() });
191+
case "startup_time_nanos": {
192+
setStartupTime({ startupTimeNanos: value });
185193
break;
186194
}
187195
case "tiles": {

src/features/Header/IdentityKey.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { useAtomValue } from "jotai";
22
import {
33
identityBalanceAtom,
4-
uptimeAtom,
4+
startupTimeAtom,
55
voteBalanceAtom,
66
} from "../../api/atoms";
77
import { Text, Flex, Tooltip } from "@radix-ui/themes";
88
import styles from "./identityKey.module.css";
99
import PeerIcon from "../../components/PeerIcon";
1010
import { myStakePctAtom, myStakeAmountAtom } from "../../atoms";
1111
import { PropsWithChildren, useEffect } from "react";
12-
import { Duration } from "luxon";
12+
import { DateTime } from "luxon";
1313
import { getFmtStake, getTimeTillText, slowDateTimeNow } from "../../utils";
1414
import { formatNumber } from "../../numUtils";
1515
import { useInterval, useMedia, useUpdate } from "react-use";
@@ -56,7 +56,7 @@ export default function IdentityKey() {
5656
)}
5757
{isNarrowScreen && (
5858
<>
59-
<Uptime />
59+
<StartupTime />
6060
<Commission />
6161
<IdentityBalance />
6262
</>
@@ -98,7 +98,7 @@ function DropdownMenu() {
9898
</Flex>
9999
<StakeValue />
100100
<StakePct />
101-
<Uptime />
101+
<StartupTime />
102102
<Commission />
103103
<IdentityBalance />
104104
<VotePubkey />
@@ -206,18 +206,18 @@ function Commission() {
206206
);
207207
}
208208

209-
function Uptime() {
210-
const uptime = useAtomValue(uptimeAtom);
209+
function StartupTime() {
210+
const startupTime = useAtomValue(startupTimeAtom);
211211

212212
const getValue = () => {
213-
if (!uptime) return "-";
214-
215-
const uptimeDuration = Duration.fromMillis(
216-
Number(uptime.uptimeNanos) / 1_000_000,
213+
if (!startupTime) return "-";
214+
const uptimeDuration = slowDateTimeNow.diff(
215+
DateTime.fromMillis(
216+
Math.floor(Number(startupTime.startupTimeNanos) / 1_000_000),
217+
),
217218
);
218-
const diffDuration = slowDateTimeNow.diff(uptime.ts);
219219

220-
const text = getTimeTillText(uptimeDuration.plus(diffDuration).rescale(), {
220+
const text = getTimeTillText(uptimeDuration.rescale(), {
221221
showSeconds: false,
222222
});
223223
return text;

src/features/LeaderSchedule/Slots/SlotCardGrid.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ function SlotText({
187187

188188
interface RowValues {
189189
voteTxns: string;
190-
nonVoteTxns: string;
190+
userTxns: string;
191191
totalFees: string;
192192
transactionFeeFull: string;
193193
priorityFeeFull: string;
@@ -205,9 +205,10 @@ interface SlotCardRowProps {
205205

206206
function getRowValues(publish: SlotPublish): RowValues {
207207
// TODO: fix backend
208-
const voteTxns = fixValue(publish.vote_transactions ?? 0);
209-
const totalTxns = fixValue(publish.transactions ?? 0);
210-
const nonVoteTxns = totalTxns - voteTxns;
208+
const voteTxnsSuccess = fixValue(publish.success_vote_transaction_cnt ?? 0);
209+
const userTxnsSuccess = fixValue(publish.success_user_transaction_cnt ?? 0);
210+
const voteTxnsFailure = fixValue(publish.failed_vote_transaction_cnt ?? 0);
211+
const userTxnsFailure = fixValue(publish.failed_user_transaction_cnt ?? 0);
211212
const totalFees = formatNumberLamports(
212213
(publish.transaction_fee ?? 0n) + (publish.priority_fee ?? 0n),
213214
3,
@@ -250,8 +251,8 @@ function getRowValues(publish: SlotPublish): RowValues {
250251
: 0;
251252

252253
return {
253-
voteTxns: voteTxns.toLocaleString(),
254-
nonVoteTxns: nonVoteTxns.toLocaleString(),
254+
voteTxns: (voteTxnsSuccess + voteTxnsFailure).toLocaleString(),
255+
userTxns: (userTxnsSuccess + userTxnsFailure).toLocaleString(),
255256
totalFees,
256257
transactionFeeFull,
257258
priorityFeeFull,
@@ -324,7 +325,7 @@ function SlotCardRow({ slot, active }: SlotCardRowProps) {
324325
className={`${styles.rowText} ${active ? styles.active : ""}`}
325326
align="right"
326327
>
327-
{getText(values?.nonVoteTxns)}
328+
{getText(values?.userTxns)}
328329
</Text>
329330
<Tooltip
330331
content={

src/features/Overview/SlotPerformance/SankeyControls.tsx

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,18 @@ function SlotStats() {
5858
const values = useMemo(() => {
5959
if (!query.response?.publish) return;
6060

61-
const voteTxns = fixValue(query.response.publish.vote_transactions ?? 0);
62-
const totalTxns = fixValue(query.response.publish.transactions ?? 0);
63-
const nonVoteTxns = totalTxns - voteTxns;
61+
const successfulVoteTxns = fixValue(
62+
query.response.publish.success_vote_transaction_cnt ?? 0,
63+
);
64+
const successfulUserTxns = fixValue(
65+
query.response.publish.success_user_transaction_cnt ?? 0,
66+
);
67+
const failedVoteTxns = fixValue(
68+
query.response.publish.failed_vote_transaction_cnt ?? 0,
69+
);
70+
const failedUserTxns = fixValue(
71+
query.response.publish.failed_user_transaction_cnt ?? 0,
72+
);
6473

6574
const transactionFee3Decimals = query.response.publish.transaction_fee
6675
? formatNumber(
@@ -106,8 +115,10 @@ function SlotStats() {
106115

107116
return {
108117
computeUnits,
109-
voteTxns,
110-
nonVoteTxns,
118+
successfulVoteTxns,
119+
successfulUserTxns,
120+
failedVoteTxns,
121+
failedUserTxns,
111122
transactionFeeFull,
112123
transactionFee3Decimals,
113124
priorityFeeFull,
@@ -152,10 +163,22 @@ function SlotStats() {
152163
<div style={{ gridColumn: "span 2" }}>
153164
<RowSeparator my="0" />
154165
</div>
155-
<Text>Vote Transactions</Text>
156-
<Text align="right">{values?.voteTxns?.toLocaleString() ?? "-"}</Text>
157-
<Text>Non-vote Transactions</Text>
158-
<Text align="right">{values?.nonVoteTxns?.toLocaleString() ?? "-"}</Text>
166+
<Text>Successful Vote Transactions</Text>
167+
<Text align="right">
168+
{values?.successfulVoteTxns?.toLocaleString() ?? "-"}
169+
</Text>
170+
<Text>Failed Vote Transactions</Text>
171+
<Text align="right">
172+
{values?.failedVoteTxns.toLocaleString() ?? "-"}
173+
</Text>
174+
<Text>Successful User Transactions</Text>
175+
<Text align="right">
176+
{values?.successfulUserTxns?.toLocaleString() ?? "-"}
177+
</Text>
178+
<Text>Failed User Transactions</Text>
179+
<Text align="right">
180+
{values?.failedUserTxns?.toLocaleString() ?? "-"}
181+
</Text>
159182
<div style={{ gridColumn: "span 2" }}>
160183
<RowSeparator my="0" />
161184
</div>

src/features/Overview/SlotPerformance/SlotSankey/index.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,16 @@ function SlotSankey({ slot }: { slot?: number }) {
359359
waterfall,
360360
displayType,
361361
query.response?.publish.duration_nanos,
362-
query.response?.publish.transactions,
363-
query.response?.publish.failed_transactions,
362+
query.response?.publish.success_user_transaction_cnt &&
363+
query.response?.publish.success_vote_transaction_cnt
364+
? query.response?.publish.success_user_transaction_cnt +
365+
query.response?.publish.success_vote_transaction_cnt
366+
: undefined,
367+
query.response?.publish.failed_user_transaction_cnt &&
368+
query.response?.publish.failed_vote_transaction_cnt
369+
? query.response?.publish.failed_user_transaction_cnt +
370+
query.response?.publish.failed_vote_transaction_cnt
371+
: undefined,
364372
);
365373

366374
const linkNodes = links.flatMap((l) => [l.source, l.target]);

0 commit comments

Comments
 (0)