Files
zeekay 0ac8927c3d The P-Chain is read through typed GETs, from the P-Chain that secures the chain
luxd serves no P-Chain JSON-RPC, so every platform.* read the explorer sent
answered 404 and the validators, chains and heights widgets were empty on Lux
and Zoo. Each read is now GET /v1/chain/P/ops/{validators,blockchains,height},
coded against the node's OpenAPI 3.1 document, through GET
/v1/node/p-chain?op=<op>. The proxy's fixed table allows those three ops and one
NodeID parameter; a POST there answers 405.

ChainEntry.pChain is where the P-Chain that secures a chain is read: Lux reads
its own; Zoo, an L2 carried by Lux's validator set, reads Lux's and never its
own node's; Hanzo, on its own committee until hanzod joins as an L2, has none.
P-Chain UI names whose it is ("Lux primary network validators securing Zoo
Network") and prices stake in LUX. The cross-network validator sum is gone: it
counted Lux's validators again under Zoo.

The top bar shows a link only where its page has content: Chains, Bridge and
DEX on the Lux C-Chain host (their pages now 404 elsewhere), Validators where a
P-Chain secures the chain, Stats where there is a P-Chain panel or a stats
service. A P-Chain at genesis renders height #0 rather than nothing. The chain
page's uptime is no longer multiplied by 100.

Claude-Session: https://claude.ai/code/session_011Ge9UnfkEK37Lapx5nfPQK
2026-09-23 20:04:11 -07:00

42 lines
1.1 KiB
TypeScript

// Every blockchain registered on the P-Chain: GET /v1/chain/P/ops/blockchains.
import { useQuery } from '@tanstack/react-query';
import React from 'react';
import type { GetBlockchainsResponse, PChainBlockchain } from './types';
import { getPChain } from 'configs/app/chainRegistry';
import { read } from './read';
const BLOCKCHAINS_STALE_TIME_MS = 300_000;
const BLOCKCHAINS_QUERY_KEY = 'pchain:blockchains' as const;
const EMPTY_BLOCKCHAINS: ReadonlyArray<PChainBlockchain> = [];
async function fetchBlockchains(): Promise<ReadonlyArray<PChainBlockchain>> {
return (await read<GetBlockchainsResponse>('blockchains')).blockchains ?? [];
}
export function useBlockchains() {
const query = useQuery({
queryKey: [ BLOCKCHAINS_QUERY_KEY ],
queryFn: fetchBlockchains,
staleTime: BLOCKCHAINS_STALE_TIME_MS,
retry: 2,
enabled: Boolean(getPChain()),
});
const blockchains = React.useMemo(
() => query.data ?? EMPTY_BLOCKCHAINS,
[ query.data ],
);
return {
blockchains,
isLoading: query.isLoading,
isError: query.isError,
error: query.error,
refetch: query.refetch,
};
}