NFT Marketplace 6.2.0
2 August 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
NFT Marketplace v6.2.0
Release Date: August 2, 2026 Tags: ADMIN, MODERATION, DASHBOARD, QUEUES, DISPUTES, COLLECTIONS, AUCTIONS, ESCROW, SETTLEMENTS, CATALOGUE, SLA, TRANSLATIONS, LOCALES, ANALYTICS, CHARTS, LOADING-STATES, LICENSING, RELIABILITY, BUG-FIXES
Overview
This release rebuilds one screen: the front page of the NFT admin area. It was a scoreboard, and it is now a moderation console.
The seven counters it opened with were not decisions, and there was no moderation queue on it at all — nothing about collections waiting to be let in, nothing about open disputes, nothing about sales holding somebody's money with the marketplace unable to complete them. Five of the seven carried a trend line that was invented on the spot, redrawn differently on every single load underneath a real number. And every word on the page was written into the source in English, on a platform that ships 90 languages.
In its place: five queues, each of which is a real row somebody wrote deliberately, each with a count, the age of the oldest item still waiting, and — where money is frozen behind it — the amount, per currency.
Requires Core v6.6.1.
Two of the five queues have been filling with nothing anywhere reporting them, and two figures you may have been reading were never real — read Upgrade Notes before you compare anything against last week.
Update Instructions
pnpm updatorThen restart the backend. The moderation figures are served by a new endpoint, and the route list is built at boot.
pm2 restart allNo database migration, no configuration change and no settings to review. Nothing about the marketplace itself changes — no money moves differently, no customer-facing screen is touched.
One thing to check if the page does not load. It requires the NFT admin permission, access.nft, which the core release notes as one that had never taken effect in any earlier version. If you have not yet granted it per role in Admin → Roles after updating core, this page will be reachable by Super Admin only — and because Super Admin bypasses permission checks entirely, testing from the owner account will look fine.
Upgrade Notes
Two queues holding customer money have never been reported anywhere — look at them first
Blocked auction settlements and flagged escrow both existed before this release. Neither had a count, an age or an alert anywhere in the product.
- A blocked settlement is an auction that ended with a winning bid, where the scheduler refused to complete the sale because no contract is holding the funds. A winner exists, the money is somewhere, and nothing moves until a person acts.
- Flagged escrow is an accepted offer whose buyer's funds could not be released. Their money is locked and they hold no NFT.
- Changed: both now carry a count, the age of the oldest one, and the amount frozen behind them broken out per currency — never summed across chains, because adding an ETH bid to a BNB one and printing one figure would be a lie with eighteen decimal places on it. Blocked settlements also raise an alert at the top of the page.
Five of the seven headline figures carried a fabricated trend line
The sparkline drawn under Collections, NFTs, Active Listings, Sales Volume and Activity (24h) was not a measurement. It was fourteen points generated by multiplying the current total by a random factor, produced fresh on every page load — a different shape each time, under a real total.
- Changed: the front page draws no trend lines at all, and no longer reads the endpoint that produced them. The only series it charts now is dispute inflow against dispute resolution, which is a real count of real rows.
- Note, and this matters: Admin → NFT → Analytics is not changed in this release and still draws them. The same generated series still backs the eight tiles on that screen. Treat every sparkline there as decoration until it is dealt with. The category distribution chart on that screen also still falls back to a fixed Art / Gaming / Music / Sports quartet when the real grouping comes back empty — four categories that look like data and are not.
The marketplace totals are no longer on the front page
- Changed: Collections, NFTs, Active Listings, Sales Volume, Platform Revenue, Activity (24h) and Average Price are gone from the front page. Every one of them, and more besides, remains on Admin → NFT → Analytics, which is where a scoreboard belongs.
Added
The decision queue
A band across the top of the page, above everything else, carrying all five queues with their depth and the age of the oldest item in each. Each cell links to the registry that owns the decision.
- Added collections awaiting approval, with the count of suspended collections beside it.
- Added open disputes, with the urgent and the unassigned subsets called out separately — a dispute nobody has picked up is a different problem from a dispute in progress, and the page now says which is which.
- Added auction settlements the scheduler could not complete, with the winning-bid value frozen behind them.
- Added escrow flagged for manual release, with the buyer funds locked behind it.
- Added catalogue defects, which deliberately carry no age. Those rows were never queued for anything — they are simply wrong — so the page draws no clock for them rather than inventing a "waiting since".
- Added ages measured against the platform's shared budgets: 24 hours for a dispute, 72 hours for an approval. These are the same numbers the core queues and the system health card use.
- Added the word "past SLA" beside a breached age, as well as the colour. Amber, red and green are not separable at 11px for a colour-blind reader, so the duration and the word carry the fact and the colour is only the glance.
Dispute flow
- Added a chart of disputes opened against disputes resolved, over the last 24 hours, 7 days or 30 days.
The four queues that arrive as a stream, with the money behind them
- Added four headline tiles — pending collections, open disputes, blocked settlements and flagged escrow — each linking straight to the registry that owns it.
- Added colour that means something: a tile is neutral while its queue is clear and turns amber the moment it has work in it, so the colour on that row is a reading of the marketplace rather than four decorative hues.
The two queues you can act on from the page
- Added a table of collections awaiting approval and a table of open disputes, oldest first — a decision queue that opens on newest-first shows you the work that has waited least.
- Added the eight oldest of each, with the creator or the reporter, the chain, the priority and the age. When a queue is deeper than its preview, the page says so explicitly rather than letting eight rows read as "this is everything".
Catalogue integrity
- Added three counters for rows that cannot do what the product asks of them: listed tokens with no metadata or no image (a blank card in the marketplace with nothing to show a buyer), tokens marked minted with no on-chain id (rejected outright by transfer, approval and listing — the token looks minted and can never move), and drafts never minted past the 72-hour approval budget.
- Added the count of minted tokens missing metadata and missing an image as a secondary reading beneath the first.
Marketplace contract state
- Added the deployed marketplace contracts with their chain, network, fee and status.
- Added an alert when no contract is deployed at all, which is the one condition under which nothing on the marketplace can trade, and a warning naming the chains when a contract is paused.
Provenance on every figure
- Added a line above the title stating that the counters are exact totals computed by the database and that only the two preview tables are capped. The page it replaced declared nothing at all about where its numbers came from.
- Added a live indicator that tells the truth: it reads live, updating or stale, and goes stale the moment a refresh fails — a green pulse over a clock that stopped advancing is the easiest lie to ship.
- Added a last-updated clock in your own timezone, a manual refresh, and an automatic refresh every 30 seconds that pauses while the tab is in the background.
- Added a 15-second reuse window on the server, so several moderators with the page open do not multiply the query load on your database.
Three things deliberately absent
Worth knowing, because their absence is a decision rather than an oversight:
- Royalties owed and unpaid. The royalty table has a full pending / paid / failed lifecycle and nothing writes a row to it. Royalties are paid in cash at settlement, so there is no debt to read — a "royalties owed" figure here could only ever be zero, which is a claim rather than a measurement.
- Stuck or failed sales. Every sale in the product is written as completed, so pending and failed are unreachable states. A counter for them would always read zero for the same reason.
- Reviews awaiting moderation. Real, countable, and left off — because this build has no admin screen on which to act on one. A count with no door is a poster.
Changed
A failure is now said, not drawn as zero
- Changed the front page to report unreadable data rather than render a console of zeros. Five empty queues and four empty tiles under a red banner is a page asserting a clean marketplace it explicitly cannot see; the queue band is now withheld entirely in that state and the reason is printed in its place.
- Changed a failed automatic refresh so it no longer throws away a working console. The figures you already have stay on screen, timestamped, with a notice that the refresh failed — instead of the whole page being replaced over one bad request.
- Changed the error state to keep the range picker and a retry reachable, and to offer the collection registry, which still opens even when the aggregate does not.
The NFT admin screens keep their own shape while they load
- Changed the front page, the analytics dashboard, the marketplace contracts screen, the admin onboarding checklist and the activity feed so that headings, labels, borders, tiles and column headers render immediately and only the figures wait. Each of those screens previously replaced itself with a hand-built imitation of its own layout — six independent guesses on the analytics screen alone, none of which could follow a change to the thing it imitated.
- Changed the analytics dashboard, which returned a blank page behind its spinner: the loading branch was the only thing standing between an operator and nothing at all. It now renders its own chrome with measured placeholders in it.
- Changed the analytics KPI row, where the eight tiles stood 46px shorter while pending and grew the moment the trends arrived — twice over, once per row.
- Changed the activity feed's Load more button, which was withheld for the duration of every page fetch. Sixty pixels of control vanished and came back on each scroll-triggered load, dragging everything below it up and then down again. It now stays put and is simply disabled while the next page is on its way.
- Changed the admin onboarding checklist so the page renders once. Almost all of it is fixed content — the phases, their tasks, the estimated times — and only the two progress figures ever depended on a request.
The front page makes one request
- Changed the four separate requests the old page fired — marketplace statistics, recent activity, analytics and a customer-facing onboarding endpoint — into a single call for the figures this page actually shows.
Fixed
The NFT admin front page was in English in all 89 other languages
- Fixed every label on the page being written into the source in English. The page loaded the translation helper and then never used it once: the title, all seven statistic labels, every caption beneath them, the activity feed, the empty state, the onboarding panel and the error message were literal English strings. The operator's language setting made no difference to any of it. Every string on the replacement is translated, in all 90 languages.
- Fixed the failure message in particular, which read "Failed to load dashboard data" in every locale. The error state now resolves its words at the point where the language is known, so a request that fails with no message says so in the operator's own language.
A licence check blanked the entire NFT admin area
- Fixed the licence gate wrapping the whole NFT admin layout rather than its content. The site header, the navigation and the footer are not licensed, and all three sat inside the gate — so while a licence check was in flight, the entire page including the navigation was replaced by one centred spinner, leaving nowhere to click.
- Fixed the footer's position depending on how tall the data made the page, so it no longer slides down the screen as the figures arrive.
The activity feed jumped when it loaded
- Fixed the placeholder rows in the admin activity feed being a different shape from the rows they stood in for — roughly 113px against a real row of roughly 130px, so the feed grew by about 85px across five rows at the moment the data landed. The placeholder is now built from the real row's own structure.
- Fixed a third, shorter copy of that row shape used when appending the next page, which made a page arriving change the height of what had been standing in for it.