Skip to content

Commit 34532de

Browse files
committed
change cus message format
1 parent 57f6a89 commit 34532de

File tree

6 files changed

+102
-61
lines changed

6 files changed

+102
-61
lines changed

src/api/entities.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,25 @@ export const startupProgressSchema = z.object({
209209
waiting_for_supermajority_stake_percent: z.number().nullable(),
210210
});
211211

212-
export const computeUnitsSchema = z.object({
213-
max_compute_units: z.number(),
212+
export const slotTransactionsSchema = z.object({
214213
start_timestamp_nanos: z.coerce.bigint(),
215214
target_end_timestamp_nanos: z.coerce.bigint(),
216-
compute_unit_timestamps_nanos: z.coerce.bigint().array(),
217-
compute_units_deltas: z.number().array(),
218-
active_bank_count: z.number().array(),
215+
txn_mb_start_timestamps_nanos: z.coerce.bigint().array(),
216+
txn_mb_end_timestamps_nanos: z.coerce.bigint().array(),
217+
txn_compute_units_requested: z.number().array(),
218+
txn_max_compute_units: z.number().array(),
219+
txn_compute_units_consumed: z.number().array(),
220+
txn_priority_fee: z.coerce.bigint().array(),
221+
txn_tips: z.coerce.bigint().array(),
222+
txn_error_code: z.number().array(),
223+
txn_from_bundle: z.boolean().array(),
224+
txn_is_simple_vote: z.boolean().array(),
225+
txn_bank_idx: z.number().array(),
226+
txn_start_timestamps_nanos: z.coerce.bigint().array(),
227+
txn_load_end_timestamps_nanos: z.coerce.bigint().array(),
228+
txn_end_timestamps_nanos: z.coerce.bigint().array(),
229+
txn_microblock_id: z.number().array(),
230+
txn_landed: z.boolean().array(),
219231
});
220232

221233
export const slotLevelSchema = z.enum([
@@ -237,6 +249,7 @@ export const slotPublishSchema = z.object({
237249
priority_fee: z.coerce.bigint().nullable(),
238250
transaction_fee: z.coerce.bigint().nullable(),
239251
tips: z.coerce.bigint().nullable(),
252+
max_compute_units: z.number().nullable(),
240253
compute_units: z.number().nullable(),
241254
duration_nanos: z.number().nullable(),
242255
completed_time_nanos: z.coerce.bigint().nullable(),
@@ -436,7 +449,7 @@ export const slotResponseSchema = z.object({
436449
waterfall: txnWaterfallSchema.nullable().optional(),
437450
tile_primary_metric: tilePrimaryMetricSchema.nullable().optional(),
438451
tile_timers: tsTileTimersSchema.array().nullable().optional(),
439-
compute_units: computeUnitsSchema.nullable().optional(),
452+
transactions: slotTransactionsSchema.nullable().optional(),
440453
});
441454

442455
export const slotSkippedHistorySchema = z.number().array();

src/api/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
versionSchema,
3737
voteDistanceSchema,
3838
voteStateSchema,
39-
computeUnitsSchema,
39+
slotTransactionsSchema,
4040
voteBalanceSchema,
4141
} from "./entities";
4242

@@ -114,7 +114,7 @@ export interface Peer extends z.infer<typeof peerUpdateSchema> {
114114

115115
export type PeerRemove = z.infer<typeof peerRemoveSchema>;
116116

117-
export type ComputeUnits = z.infer<typeof computeUnitsSchema>;
117+
export type ComputeUnits = z.infer<typeof slotTransactionsSchema>;
118118

119119
export type SlotPublish = z.infer<typeof slotPublishSchema>;
120120

src/atoms.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export const setSlotResponseAtom = atom(
155155
(_, set, response: SlotResponse) => {
156156
const slot = response.publish.slot;
157157
set(slotResponseAtom, (draft) => {
158-
response.compute_units ??= draft[slot]?.compute_units;
158+
response.transactions ??= draft[slot]?.transactions;
159159
response.tile_primary_metric ??= draft[slot]?.tile_primary_metric;
160160
response.tile_timers ??= draft[slot]?.tile_timers;
161161
response.waterfall ??= draft[slot]?.waterfall;

src/features/Overview/SlotPerformance/ComputeUnitsCard/Chart.tsx

Lines changed: 74 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { AxisDomain, Coordinate } from "recharts/types/util/types";
4343

4444
interface ChartProps {
4545
computeUnits: ComputeUnits;
46+
maxComputeUnits: number;
4647
bankTileCount: number;
4748
}
4849

@@ -79,33 +80,52 @@ const tickLabelWidth = 110;
7980
const minTickCount = 3;
8081

8182
function getChartData(computeUnits: ComputeUnits): ChartData[] {
82-
const data: ChartData[] = [
83-
{ timestampNanos: 0, computeUnits: 0, activeBankCount: 0 },
84-
];
85-
86-
for (let i = 0; i < computeUnits.compute_unit_timestamps_nanos.length; i++) {
87-
const prev = data[data.length - 1];
88-
89-
if (
90-
prev &&
91-
computeUnits.compute_unit_timestamps_nanos[i - 1] ===
92-
computeUnits.compute_unit_timestamps_nanos[i]
93-
) {
94-
prev.computeUnits += computeUnits.compute_units_deltas[i];
95-
prev.activeBankCount = computeUnits.active_bank_count[i];
96-
} else {
97-
data.push({
98-
timestampNanos: Number(
99-
computeUnits.compute_unit_timestamps_nanos[i] -
100-
computeUnits.start_timestamp_nanos,
101-
),
102-
computeUnits: prev.computeUnits + computeUnits.compute_units_deltas[i],
103-
activeBankCount: computeUnits.active_bank_count[i],
104-
});
105-
}
106-
}
107-
108-
return data;
83+
const events = [
84+
...computeUnits.txn_start_timestamps_nanos.map((timestamp, i) => ({
85+
timestampNanos: timestamp,
86+
txn_idx: i,
87+
start: true,
88+
})),
89+
...computeUnits.txn_end_timestamps_nanos.map((timestamp, i) => ({
90+
timestampNanos: timestamp,
91+
txn_idx: i,
92+
start: false,
93+
})),
94+
].sort((a, b) => Number(a.timestampNanos - b.timestampNanos));
95+
96+
const activeBanks = Array(64).fill(false);
97+
return events.reduce<ChartData[]>(
98+
(chartData, event, i) => {
99+
const txn_idx = event.txn_idx;
100+
const cus_delta = computeUnits.txn_landed[txn_idx]
101+
? event.start
102+
? computeUnits.txn_max_compute_units[txn_idx]
103+
: -computeUnits.txn_max_compute_units[txn_idx] +
104+
computeUnits.txn_compute_units_consumed[txn_idx]
105+
: 0;
106+
107+
const prev = chartData[chartData.length - 1];
108+
activeBanks[computeUnits.txn_bank_idx[txn_idx]] = event.start;
109+
const activeBankCount = activeBanks.filter(
110+
(is_active) => is_active,
111+
).length;
112+
113+
if (i > 0 && events[i - 1].timestampNanos === event.timestampNanos) {
114+
prev.computeUnits += cus_delta;
115+
prev.activeBankCount = activeBankCount;
116+
} else {
117+
chartData.push({
118+
timestampNanos: Number(
119+
event.timestampNanos - computeUnits.start_timestamp_nanos,
120+
),
121+
computeUnits: prev.computeUnits + cus_delta,
122+
activeBankCount,
123+
});
124+
}
125+
return chartData;
126+
},
127+
[{ timestampNanos: 0, computeUnits: 0, activeBankCount: 0 }],
128+
);
109129
}
110130

111131
const getXTicks = memoize(function getXTicks(
@@ -202,6 +222,7 @@ function getBankCount({
202222

203223
function getSegments(
204224
computeUnits: ComputeUnits,
225+
maxComputeUnits: number,
205226
bankTileCount: number,
206227
xDomain: Domain,
207228
yDomain: Domain,
@@ -219,24 +240,24 @@ function getSegments(
219240
ts,
220241
bankCount,
221242
tEnd,
222-
maxComputeUnits: computeUnits.max_compute_units,
243+
maxComputeUnits: maxComputeUnits,
223244
});
224245
};
225246

226247
for (let bankCount = 1; bankCount <= bankTileCount; bankCount++) {
227248
const y0Ts = getTsByCu({
228249
computeUnits: yDomain[0],
229250
tEnd,
230-
maxComputeUnits: computeUnits.max_compute_units,
251+
maxComputeUnits: maxComputeUnits,
231252
bankCount,
232253
});
233254
const t0X = withinDomain(xDomain, y0Ts) ? y0Ts : xDomain[0];
234255
const t0Y = getCusAtTs(t0X, bankCount);
235256

236257
const y1Ts = getTsByCu({
237-
computeUnits: Math.min(yDomain[1], computeUnits.max_compute_units),
258+
computeUnits: Math.min(yDomain[1], maxComputeUnits),
238259
tEnd,
239-
maxComputeUnits: computeUnits.max_compute_units,
260+
maxComputeUnits: maxComputeUnits,
240261
bankCount,
241262
});
242263

@@ -287,7 +308,11 @@ function getPolygonPoints(
287308
return resPoints;
288309
}
289310

290-
export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
311+
export default function Chart({
312+
computeUnits,
313+
maxComputeUnits,
314+
bankTileCount,
315+
}: ChartProps) {
291316
const isMouseDownRef = useRef(false);
292317
const [isModKeyDown, setIsModKeyDown] = useState(false);
293318
const [isPanning, setIsPanning] = useState(false);
@@ -352,20 +377,25 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
352377

353378
const cuDomain = useMemo(
354379
() =>
355-
fitYToData
356-
? getDataDomain(data, computeUnits.max_compute_units, zoomRange)
357-
: undefined,
358-
[computeUnits.max_compute_units, data, fitYToData, zoomRange],
380+
fitYToData ? getDataDomain(data, maxComputeUnits, zoomRange) : undefined,
381+
[maxComputeUnits, data, fitYToData, zoomRange],
359382
);
360383

361384
const yDomain = useMemo<Domain>(
362-
() => cuDomain ?? [0, computeUnits.max_compute_units + 1_000_000],
363-
[computeUnits.max_compute_units, cuDomain],
385+
() => cuDomain ?? [0, maxComputeUnits + 1_000_000],
386+
[maxComputeUnits, cuDomain],
364387
);
365388

366389
const segments = useMemo(
367-
() => getSegments(computeUnits, bankTileCount, xDomain, yDomain),
368-
[bankTileCount, computeUnits, xDomain, yDomain],
390+
() =>
391+
getSegments(
392+
computeUnits,
393+
maxComputeUnits,
394+
bankTileCount,
395+
xDomain,
396+
yDomain,
397+
),
398+
[bankTileCount, computeUnits, maxComputeUnits, xDomain, yDomain],
369399
);
370400

371401
const activeBankCountTicks = new Array(bankTileCount)
@@ -694,12 +724,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
694724
const useActiveBanksMdStroke =
695725
!useActiveBanksLargeStroke && xDomain[1] - xDomain[0] < mdNanosThreshold;
696726

697-
const tEnd =
698-
0.95 *
699-
Number(
700-
computeUnits.target_end_timestamp_nanos -
701-
computeUnits.start_timestamp_nanos,
702-
);
727+
const tEnd = 0.95 * slotDurationNanos;
703728

704729
const prevPolyPoints = useRef<[Coordinate, Coordinate][]>([]);
705730
prevPolyPoints.current = [];
@@ -770,7 +795,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
770795
x1={xDomain[0]}
771796
x2={xDomain[1]}
772797
y1={yDomain[0]}
773-
y2={Math.min(yDomain[1], computeUnits.max_compute_units)}
798+
y2={Math.min(yDomain[1], maxComputeUnits)}
774799
shape={(props) => {
775800
graphRectProps.current = props as RectangleProps;
776801
return <></>;
@@ -835,7 +860,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
835860
computeUnits: yDomain[1] - yDomain[0] + yDomain[0],
836861
ts: xDomain[1] - xDomain[0] + xDomain[0],
837862
tEnd,
838-
maxComputeUnits: computeUnits.max_compute_units,
863+
maxComputeUnits: maxComputeUnits,
839864
}),
840865
),
841866
);
@@ -884,7 +909,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
884909
}}
885910
/>
886911
<ReferenceLine
887-
y={computeUnits.max_compute_units}
912+
y={maxComputeUnits}
888913
stroke="#2a7edf"
889914
strokeDasharray="3 3"
890915
yAxisId={cuAxisId}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default function ComputeUnitsCard() {
1616
const tileCount = useAtomValue(tileCountAtom);
1717
const bankTileCount = tileCount["bank"];
1818

19-
if (!slot || !query.response?.compute_units) return null;
19+
if (!slot || !query.response?.transactions) return null;
2020

2121
return (
2222
<Card style={{ marginTop: "8px" }}>
@@ -27,7 +27,10 @@ export default function ComputeUnitsCard() {
2727
</Flex>
2828
<div className={styles.chart}>
2929
<Chart
30-
computeUnits={query.response.compute_units}
30+
computeUnits={query.response.transactions}
31+
maxComputeUnits={
32+
query.response.publish.max_compute_units ?? 48_000_000
33+
}
3134
bankTileCount={bankTileCount}
3235
/>
3336
<Legend bankTileCount={bankTileCount} />

src/hooks/useSlotQuery.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export function useSlotQueryResponse(slot?: number) {
7777
const response = useAtomValue(
7878
useMemo(() => getSlotResponseAtom(slot), [slot]),
7979
);
80-
const skipQuery = !!response?.compute_units;
80+
const skipQuery = !!response?.transactions;
8181

8282
const { hasWaitedForData } = useSlotQuery(slot, true, skipQuery);
8383

0 commit comments

Comments
 (0)