NFT Marketplace 6.2.2
11 August 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
NFT Marketplace v6.2.2
Release Date: August 11, 2026 Tags: MARKETPLACE, LISTINGS, AUCTIONS, BIDS, OFFERS, ESCROW, FEES, MINTING, METADATA, COLLECTIONS, RELIABILITY, PERFORMANCE, BUG-FIXES
Overview
Version 6.2.2 repairs several defects that blocked, moved or misreported money, and speeds up the public collection list.
Every stablecoin purchase, and every stablecoin bid from someone with a connected wallet, was refused outright. A balance check measured what the buyer held of the chain's own coin and compared it against a price in USDT, so a 120 USDT listing on a BSC collection demanded 120 BNB. No buyer can satisfy that on purpose, so stablecoin buy-now and stablecoin bidding were impossible.
Two escrow defects need you to look at records you already hold. An operator cancelling an offer that a seller had already accepted left the buyer's funds held with nothing anywhere that would return them, and changing the marketplace fee while an offer was live made the payout and the escrow disagree. Both are in Upgrade Notes, together with a collection currency that was stored wrong on every chain but Ethereum and a repair to run for tokens already minted, whose traits your public token pages could not draw.
The shared transaction cleanup these routes now call lives in Core, so update Core first. Requires Core v6.6.3.
Update Instructions
pnpm updatorNo settings to change. There is data to inspect and a repair to run — see Upgrade Notes.
Upgrade Notes
- Buyers whose accepted offer was cancelled from the admin offer list are still short. Before this update, switching an already-accepted offer off wrote it straight to cancelled and released nothing, so the buyer's escrow stayed reserved in their wallet and the sweep that rescues abandoned sales could no longer see the row. This release fixes the door but cannot find the buyers it already caught. If support has ever voided an accepted sale that way, look for wallets carrying held funds with no live offer behind them and release those amounts by hand.
- Settlements that ran while you were changing the marketplace fee did not balance. An offer's escrow is reserved at the fee in force when the offer is made, but the payout was recomputed at the fee in force when it settled. Raising the fee mid-offer paid the seller, the creator and the platform more in total than escrow released — the difference came from nowhere. Lowering it left the difference reserved in the buyer's wallet, credited to nobody. If you changed
nftMarketplaceFeePercentagewhile offers were outstanding, reconcile the offers that settled in that window. - Collections created on any chain other than Ethereum carry the wrong currency. The create form posted
ETHregardless of the chain the creator had picked, and that stored value is what labels the collection's floor price, its volume and every listing under it. New collections are correct from this release; existing rows are not, and nothing repairs them automatically. Review your collections and correct the currency on any that are not on Ethereum. - Tokens minted before this update still show no traits on your public token pages, because this release corrects how traits are written and does not touch what is already stored. Core v6.6.3 ships the repair, and it is the same command Core's own note names: once both are updated, run
pnpm db:migrate:6.6.3to count the affected records without changing anything, thenpnpm db:migrate:6.6.3:applyto repair them. It leaves any record that is already correct exactly as it is, so it is safe to run twice, and the same pass repairs the stored detail carried on collections, listings, offers, bids, sales, activity and disputes, which was written the same way. It does not touch the collection currency above — that one is still yours to correct by hand.
Changed
Browsing collections
Every page of the public collection list carried more than the page itself. For each collection shown, the platform also loaded every minted token in that collection and each of those tokens' completed sales from the last thirty days. Nothing on any screen read them — the floor price, volume and owner counts on a collection come from that collection's own statistics — so the work was done, sent, and thrown away, and its size followed how large the collections were rather than the ten rows being displayed.
- Changed the collection list to load only what it draws: the collection, its creator and its category. The rows, their order and every figure on them are unchanged; a collection holding ten thousand minted tokens now costs the same to list as one holding ten. The token and sale arrays are no longer part of what the endpoint returns, which matters only to a custom integration that was reading them.
A failure after the record was written reported the wrong cause
Every route here writes its record, commits, and then keeps working — logging the action, clearing caches, reading the record back, assembling the answer. If any of that stumbled, the error handler tried to undo a transaction that had already been committed. That attempt fails in its own right, and its failure replaced the real one: what was written to the log — and, on the routes that stream their progress back, the message the caller was shown — named a database transaction state instead of the thing that had actually gone wrong. The record itself was already durable.
- Changed the cleanup that runs after a failure on the seven routes a customer drives — buying a listing, placing a bid, settling an auction, deploying an auction, batch listing, minting a token and transferring one — so it no longer fires against a transaction that has already finished. Each now logs and reports the failure it actually hit.
- Changed the same shape in the marketplace controls — pausing, unpausing, updating the configuration, changing the whitelist and withdrawing proceeds — and in the admin edit of a marketplace listing. Thirteen routes carried it in all.
- Changed the collection backup service onto the same cleanup step. No case of it misreporting has been observed; it is listed because the exposure was identical and is now closed.
- A stumble after the record is written is still answered as an error, on these routes as before: nothing re-reads the saved row to tell the customer their purchase, bid or mint went through. If a buyer reports a purchase that errored, check their activity before letting them buy again — on a marketplace the second attempt meets a listing that is no longer available.
Fixed
Stablecoin purchases and bids were refused outright
A balance gate on both money doors read one number and one number only: how much of the chain's own coin the buyer's connected address held. Both doors handed it the listing price, whatever currency that price was in. A 120 USDT auction on a BSC collection therefore refused with "You need 120.000009 BNB but only have 0.0 BNB" — the bid re-denominated into an unrelated asset, roughly seventy thousand dollars of a token the sale had nothing to do with, plus a real network fee quote. Listings in USDT, USDC and BUSD are explicitly supported, and every one of them was unbuyable. Bidding was refused the same way for any bidder with a connected wallet address; a bidder without one skipped the gate entirely, which is the only reason some stablecoin auctions still took bids. The gate had been dormant until connected wallet addresses started being filled in; nothing about the listings changed, so to an operator it looked like the marketplace stopped taking stablecoin sales on its own.
- Fixed buy-now refusing every stablecoin purchase. The check is gone rather than corrected: this route requires the on-chain payment to have already settled before it runs, so it was asking whether a buyer could afford a payment they had just made, against a balance already reduced by exactly that payment — the more precisely someone funded their wallet, the more certainly it rejected them. The purchase is still verified by the check that always followed it, and that check is unchanged: the settled transaction is read back and its amount, sender and recipient asserted before the sale is recorded.
- Fixed bidding refusing a stablecoin auction outright. A bidder is now checked only when the auction really is on chain, and then only for the network fee they will actually pay. The bid amount is counted against their balance in the one case where the two are the same asset — an auction priced in the chain's own coin. Bids on an off-chain auction are no longer charged a network fee estimate for a transaction that is never sent.
- Changed the refusal a short bidder sees to name which cost is short, because "you need 0.000009 BNB" on a USDT auction reads as a bug unless it says it means the network fee.
An operator cancelling an accepted sale left the buyer's money held
Accepting an offer moves no money — the buyer's funds stay reserved in their own wallet and the token comes off the market — so an accepted offer is a sale in flight. The admin offer list's on/off switch treated that as an ordinary status change: it answered success, wrote the offer to cancelled, and released nothing. The buyer stayed short, the token stayed off the market, and because the sweep that rescues abandoned sales looks only at accepted offers, cancelling the row put it permanently beyond the one thing that would have refunded it.
- Fixed cancelling an accepted offer to return the buyer's escrow and put the token back on the market before the offer is closed, and to record the outcome as a cancellation rather than an expiry so the admin list says what actually happened.
- Fixed the same switch silently voiding a sale that had already settled on chain, where the escrow has already been spent and there is nothing left to return. That is now refused, and points the operator at the dispute queue.
- Fixed the switch answering success when the buyer's funds could not be returned. It now refuses, says why, and deliberately leaves the offer accepted so the sweep can still escalate it — answering success there is what left operators believing a sale was voided while the buyer stayed out of pocket.
Changing the marketplace fee while an offer was live paid out the wrong total
When a buyer makes an offer, the amount plus the marketplace fee is reserved from their wallet at the fee in force that day. Settlement released exactly that reservation but recomputed the platform's cut from the fee setting as it read at the moment of settlement. Offers run for days and the confirmation grace period alone is twenty-four hours, so any fee change in between made the two disagree: on a 1,000 USDT offer, a fee raised from 2.5% to 5% released 1,025 from escrow and paid out 1,050 — 25 USDT credited that no wallet was debited for. Lowered, the residue stayed reserved in the buyer's wallet belonging to nobody. Neither case errored, and the only witness was the sum of the wallets.
- Fixed accepted-offer settlement so the platform's cut is whatever the escrow holds over the offer amount, never a freshly read percentage. Seller, creator and platform now always add back up to exactly what escrow released.
- Fixed the fee percentage written onto the offer and its activity record, which is the audit trail for the sale. It now records what was actually charged rather than what the setting happened to read when settlement ran.
New collections were recorded in the wrong currency
The create form showed the creator the chain's real coin on its own summary screen and then posted ETH regardless. That value is stored, not merely displayed, and it is what the collection's floor price, its volume and every listing beneath it are denominated in from then on. A Polygon collection stored as ETH mislabels every figure it will ever carry.
- Fixed collection creation to record the chain the creator actually selected. Rows already written are not corrected by this — see Upgrade Notes.
Minted tokens showed none of their traits
The trait and value pairs a creator fills in when minting were handed to the record already encoded as text, and the record encoded them a second time. Everything that reads them unwraps one layer, so what reached the screens was text where a list of traits was expected — and that is true of every token ever minted here, including one minted with no traits at all, because the stored text is never a list whatever it contains. The properties panel on a token's own page checks it has a list before it draws and quietly drew nothing. A token opened from a creator's profile hit the same text and showed an error in place of the NFT. The admin token record unwraps the text and listed the traits all along, so support could see what the customer could not. The public metadata feed that external marketplaces read unwraps repeatedly, so the same token's traits were complete on a third-party marketplace and missing on yours — which is why this reads as a display fault rather than a minting one.
- Fixed minting to store a token's traits as traits. Tokens minted from this release forward draw their properties panel, and open from a creator's profile without erroring. Tokens already minted are stored the old way and are unchanged by this — see Upgrade Notes.
The listing screen quoted a 2.5% fee whatever the operator charged
The screen where a seller decides what to charge computed the platform's cut at a hardcoded 2.5% and labelled it as such, while every route that actually charges reads the operator's marketplace fee setting. An operator running at 5% showed every seller a "you'll receive" figure that overstated their proceeds by 2.5% of the sale price.
- Fixed the listing form to read the configured marketplace fee, both in the arithmetic and in the label beside it. An install that has never changed the setting behaves exactly as before.
Public landing figures carried a currency they did not have
The marketplace's headline trading volume is a sum of every completed sale across every chain — BNB added to ETH added to USDT — and the landing page printed it with a dollar sign in front of it. That is a claim about a unit the number does not have, made publicly to every visitor. The per-chain figures beside it do have a real unit, and it is not dollars either.
- Fixed the headline trading volume being marked as dollars. It is shown as a magnitude, with no currency, because it is a total across denominations and has none.
- Fixed each chain's 24-hour volume being marked as dollars. It is grouped by chain, so each figure is now labelled in that chain's own coin.
- Fixed volumes below a thousand rendering as "0K" — a genuine 400 BNB of daily volume advertised a live chain as dead, and a collection with 12 BNB of daily volume showed "0.0K". Figures are only abbreviated once there is something to abbreviate.
- The trending collections strip repeats its rows to scroll seamlessly, and the repeated pass still abbreviates unconditionally, so a low-volume collection can still read "0.0K" in the second half of the loop.