A UI bugfix release, correcting three places where missing data was displayed as a measurement. No contract or nodemgr changes — the protocol is untouched and node runners need take no action.
Fixes
-
Every validator's Status column read "Not active". The 24h voting performance score comes from Nodely, which serializes the uint64 columns of its
poolvotingperformancefeed as bare JSON numbers. The dashboard comparedvalidatoridstrictly against a string, so no row ever matched and no validator had a score. The lookup now coerces both sides — the feed has flipped these columns between quoted strings and raw numbers once already, and a strict comparison turns that into a silent blank for every row rather than a visible failure. -
A validator with no performance data looked identical to one performing badly. The branch that renders "Not active" was only reachable when the score was
NaN, so a lookup that stopped matching presented as a confident red indicator instead of as missing data. Absence is now tested directly, and the score's tooltip is formatted — it previously rendered as99.87096774193549%. -
A pool whose state came back partial reported "Payouts stopped". The bulk read introduced in v1.5.0 fell back to a per-pool read based on whether it had an entry for that pool, not on what the entry held. A partial decode yields an empty object, which passed that test and left the pool with no
lastPayout. The fallback now tests the field itself. -
A pool the bulk read missed reported its node version as "--" permanently.
algodVerhad no per-pool fallback left after v1.5.0. The validator detail page now recovers it for just that pool.Both fallbacks key on
lastPayoutrather than on the field being displayed. Every pool has alastPayoutfrom the moment it is created — the contract sets it to the creation round to establish the first epoch's baseline — so its absence can only mean an incomplete read.algodVeris only written once a node daemon reports in, and 88 of MainNet's 283 pools legitimately have none, so keying on it would re-read a third of all pools on every visit and still show nothing. -
The status indicator treated a pool that had just paid out as one that had stopped, for the single round where the count of rounds since the last payout is zero.
Testing
The UI suite goes from 200 to 206 tests, covering the performance lookup across both serializations and the pool state fallback in both directions. A test fixture that modeled a missing lastPayout as "a pool that has never paid out" was corrected — the contract never produces that state.