Staking 6.1.7
2 August 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
Staking v6.1.7
Release Date: August 2, 2026 Tags: ADMIN, DASHBOARD, MONEY, ACCURACY, POSITIONS, WITHDRAWALS, POOLS, CAPACITY, APR, SETTLEMENT, SOLVENCY, ANALYTICS, LOADING-STATES, BUG-FIXES, OPERATIONS
Overview
Two bodies of work: the staking admin overview, rebuilt because the numbers at the top of it were wrong, and a pass over the remaining staking admin screens so they stop replacing themselves while they load.
Every headline figure on the overview changes, three of them because the old value was wrong — read Upgrade Notes before comparing anything against what you recorded.
Requires Core v6.6.1.
Update Instructions
pnpm updatorPost-update: rebuild the backend and restart, so the new dashboard route is registered.
No migration, and nothing new is stored. Every figure on the console is counted from tables you already have, at the moment you ask for it.
No permission needs granting. The console reads through the same staking access permission the old overview's analytics already required, so any role that could open this page can still open it.
Highlights
The overview reported a sample and called it a total
The page read its figures from the first page of the position list — a hundred rows — kept that page in the browser, and then counted and summed it there. Active positions, withdrawal requests and total earnings were therefore capped at whatever those hundred positions happened to hold, and stopped moving once the platform passed a hundred positions. Nothing on the page said it was reading a sample, so a book of four thousand positions reported the same figures as a book of a hundred and one.
Total earnings was wrong a second way. It was printed with a dollar sign over a sum of every pool's rewards, so a BTC pool, an ETH pool and a USDT pool were added into a single number and presented as money.
Beside them sat a tile reading "Earnings distribution — scheduled for today". It summed platform fee records already marked as acknowledged: money the platform had already taken, labelled as rewards about to go out. Both the direction and the timing were the opposite of what the figure was.
Every figure now comes from one request whose totals are counted by the database over every row, and money is only ever printed inside a row that carries a single token. The page it replaces is gone entirely — in its place is a console built around the question the staking desk actually has, which is not "how much have we earned" but "what does the platform owe, to whom, and by when": a maturity ladder of live principal, an alarm when settlement has stalled, the withdrawal queue oldest first, capacity and promised-versus-paying APR per pool, and a per-asset ledger of principal held, rewards owed and platform fees booked.
The other admin screens stop blanking themselves
The pool detail, pool edit, pool analytics and earnings screens each swapped themselves for a placeholder tree that had drifted from the page it stood in for. One of them opened a blank page on a pool that no longer exists.
Upgrade Notes
Three headline figures were wrong above a hundred positions — do not compare the new ones against your history
The old overview's Active Positions, Withdrawal Requests and Total Earnings were computed in the browser from the first hundred positions the server returned. Past a hundred positions all three understated the truth, silently, and no part of the page mentioned a cap.
- Changed: every figure is now a total over the whole position table. On a platform with more than a hundred positions the new numbers will be higher, and on a large book substantially higher.
- How to tell whether you were affected: if Active Positions on the old page ever sat at or near 100 and stopped moving, it was capped. A platform that has never held more than a hundred positions at once was reading the truth all along and has nothing to reconcile.
"Earnings distribution — scheduled for today" was neither
- Changed: the tile is removed. It summed platform fee records already marked as claimed — revenue the platform had taken — under a heading describing rewards about to be paid out to stakers today. Nothing about it was a forecast, and the money moved in the other direction.
The tiles are different questions now, not the same questions corrected
- Changed: the four tiles are Awaiting your decision, Due this week, Pools at capacity and Pools underpaying. Each is a count of things that need a human, and each opens the rows that produced it. Active position counts now live in the maturity ladder at the top of the page; money lives in the per-asset ledger.
- Why counts: a count is summable across denominations and a principal is not. Rolling a headline money figure across pools in different tokens is exactly the defect above.
Added
A console that answers when the platform has to hand principal back
- Added a maturity ladder across the top of the page, splitting the live book three ways: matured and unsettled, due within 30 days, and locked beyond that. Matured comes first because it is the only band that is already a problem — those positions passed their end date and the platform is still holding the staker's money.
- Added a provenance line above the title stating that the figures are totals and not a page, how many position rows they cover, how fresh they are, and which denomination the book is in. The page whose entire defect history is a sample presented as a total now leads with which of the two it is.
An alarm when settlement has stalled
- Added an escalation when positions have been past their end date for more than 24 hours and are still running. Maturity settlement runs on a schedule, so a position that matured an hour ago is simply waiting for the next run — past a day, the schedule is not running and stakers' principal is being held beyond the term they agreed to.
Promised versus paying, per pool
- Added a measured realised APR for every pool, shown against what the pool has actually promised its stakers.
- Added the comparison net of the pool's admin fee, which is the only way it means anything. A pool advertising 12% with a 20% admin fee pays the staker 9.6% by design — measuring credited rewards against the advertised rate would mark every correctly running pool as underpaying by exactly the fee.
- Added a 5% tolerance before a pool is called underpaying. Every accrual rounds to the token's own precision, and a long book accumulates a fraction of a percent of rounding dust that is not a fault.
Capacity pressure
- Added a capacity bar and headroom figure per pool, and a count of pools that are at or above 90% full — the point at which you can still raise the limit before stakes start being refused, rather than the point at which they are.
The withdrawal queue, oldest first
- Added the ten oldest requests awaiting a decision, with the staker, the pool, the principal, what the exit will cost, how early it was filed and how long it has been waiting. Oldest first, because a request is work that arrived without you asking for it.
- Added an exit cost priced from the date the staker asked to leave, which is the date approval actually charges from. A request filed inside the lock period that sits in review until after the end date still costs the staker the full early-exit fee on approval — the queue states the real amount instead of reporting the exit as free.
- Added a separate line on any row whose term ran out while it waited. It does not make the exit cheaper — the fee was fixed when the staker asked — but "filed early, matured since" is a different decision from "filed early, still locked", and the row is the only place that can say so.
The book by asset
- Added a per-token ledger: principal held, rewards owed to stakers, and platform fees booked and not yet acknowledged — one row per denomination, with every denomination listed rather than a top few.
- Added the age of the oldest unclaimed platform fee beside each figure. A balance with no age gives no reason to open the earnings page today rather than next month.
Flow counters
- Added four counters over a window you choose — 24 hours, 7 days or 30 days: positions opened, exits requested, positions settled and positions cancelled.
A page that says when it cannot answer
- Added an explicit unavailable state. If the aggregation fails, the console says so and offers a retry, instead of rendering a full page of zeros. Every one of those zeros is a claim the page cannot support.
- Added the same honesty to the freshness indicator: it reports stale rather than live whenever the clock has stopped, whether the request failed in transit or the totals could not be read.
- Added a notice whenever the two lists are capped — 24 pools and 10 requests — naming both limits. The figures are totals; only the lists are ranked and cut, and the page that preceded this one never mentioned its 100-row cap anywhere.
Changed
The overview keeps itself up to date
- Changed the page to refresh every 30 seconds while its tab is visible, and to stop while it is not. It previously loaded once and then went stale in front of whoever left it open.
- Changed four separate requests into one. Repeat polls inside 15 seconds reuse the last computation, so several admins with the page open do not each re-aggregate the position table.
The overview is on the standard admin frame
- Changed the page from a decorated marketing hero — gradient orbs, floating particles, a coloured drop shadow on the button — to the frame the rest of the admin uses.
- Removed three stacked entrance animations, a two-column grid holding a single card so half of every row was empty, and a bare "Loading." line printed above content that rendered anyway.
Pools are ranked by what needs you, not by display order
- Changed the pool list on the console to rank by pending requests, then unsettled matured positions, then underpaying, then at capacity, then what is due this week. The display order stored on a pool is the sequence chosen for the public pool list; on a console it puts a dormant promoted pool above the one that is full and paying under its rate.
The staking back office keeps its own chrome while the licence check runs
- Changed the licence check to cover the page content only. The header, the navigation and the footer sat inside it, so while one licence call was in flight the entire staking back office was replaced by a single centred spinner and then rebuilt into something a different size.
The pool and earnings screens keep their shape while they load
- Changed the pool detail, pool analytics and earnings screens so their pending state is the same page with its figures waiting, rather than a separate tree of grey boxes. The earnings screen's placeholder had drifted furthest: it reserved nothing for the page's own banner, so the whole page sat roughly 260px too high and then dropped into place.
- Changed the pool analytics tab, which carried three copies of its own heading and controls — one in the pending branch, one in the error branch, one in the real page. They had already drifted from each other, and the tab measured about 700px while waiting against about 1,900px once loaded.
- Changed Save and Delete on the pool edit form to stay disabled until the pool's stored values have arrived. The form now appears immediately and fills in, so without the guard an operator could submit it while it still held the platform defaults — writing a default APR and default fees over a configured pool.
Fixed
The overview's headline numbers were a hundred-row sample
- Fixed active positions, withdrawal requests and total earnings being counted in the browser from the first page of the position list. Past a hundred positions all three understated the book, and the page named no cap. They are now totals over every row. See Upgrade Notes.
Total earnings added different tokens together and put a dollar sign on it
- Fixed the earnings figure summing rewards across every pool regardless of denomination and printing the result as dollars. A platform with pools in more than one asset was shown a number with no unit and no meaning. Money is now only printed inside a row that carries a single token, and a book-level figure is given a unit only when the whole live book really is one asset. See Upgrade Notes.
"Earnings distribution — scheduled for today" reported money already taken
- Fixed a tile that summed platform fee records already marked as acknowledged and labelled them as rewards scheduled to go out that day. It named the wrong direction of money and the wrong point in time. See Upgrade Notes.
A failed request produced a console of confident zeros
- Fixed the overview having no failure state at all. When any of its four requests failed it kept its empty defaults and rendered them as fact — zero active positions, zero earnings, nothing pending — on a page whose entire job is to be believed. It now states that it could not read the figures, and offers a retry and a way through to pool configuration, which does not depend on them.
A pool that no longer exists opened as a blank page
- Fixed the pool detail screen rendering nothing at all — no message, no navigation, no error — when the pool could not be found. Opening a stale link to a deleted pool gave an admin an empty white page with no indication of what had happened. It is now a stated result with a way back.
The pool edit form carried two loading screens, one of them unreachable
- Fixed the same condition being written twice in the same file, returning two different full-page replacements. The second could never run, which is the failure mode a duplicated pending state has: nobody noticed, because nobody could see it.