P2P Trading 6.3.2
Pre-releaseThis version isn’t published on updates.mashdiv.com yet — the notes are available to preview, but it can’t be downloaded until it’s released.
23 August 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
P2P Trading v6.3.2
Release Date: August 23, 2026 Tags: MARKETPLACE, TRADES, DISPUTES, PRESENCE, UPLOADS
Overview
The board now says who you would be dealing with, and the payment window has stopped ending trades. Every name on the market is a link to that trader's record; every avatar carries a dot saying whether they are there now; and under each name is how long they actually take to release or to pay, measured over their last ten completed trades.
The change that needs a decision is the payment window. It used to cancel a trade the moment it ran out, which took the buyer's confirm button with it — a transfer held for review or a phone that lost signal ended the trade and put a cancellation on the buyer's record. The deadline no longer ends anything: the buyer can still pay, and the seller gets a Cancel trade button they never had. Read Upgrade Notes before updating.
Also fixed: dispute evidence and chat images silently refused anything over about 3.6 MB, which is every real screen recording. Requires Core v6.7.1.
Update Instructions
pnpm updatorRestart the backend and ship the frontend build. There is no database change and no migration. The presence dot and the request heartbeat it reads live in core, so this release needs Core v6.7.1 installed alongside it.
Upgrade Notes
An unpaid trade is no longer cancelled at its deadline
This is a change in what the payment window means, and it is worth telling your support desk before your traders find it.
Previously the timeout job closed a PENDING trade as EXPIRED the moment its
window elapsed. Now the deadline hands out exits instead of taking them away:
- the buyer keeps their I've sent… button and can pay late — the lateness lands in their payment-time figure and nowhere else;
- the seller gains a Cancel trade button once the window has passed, so they stop waiting on their own terms rather than depending on a sweep;
- the job becomes a backstop, closing a trade nobody touched a day after its window, so a forgotten trade cannot hold escrow indefinitely.
p2pAutoCancelUnpaidTrades still switches the backstop off entirely, and an
offer whose own window is never is unaffected in either direction. In practice
most unpaid trades will now end as CANCELLED by one side rather than
EXPIRED, which changes what your dispute and trade reports are counting.
Release times on the board will move
Release time was a lifetime average and is now measured over a trader's last ten completed trades, alongside a new payment-time figure for the other side of the board. A merchant who was fast a year ago and slow this month will look slow immediately. Nobody's record is rewritten — the same trades are being read through a shorter window.
nginx has to allow a larger request body
Dispute evidence carries a file as base64 inside JSON and now declares a 36 MB
ceiling so a screen recording fits. If nginx sits in front of the platform and
still has client_max_body_size 10m, nginx refuses first — with an HTML page
the frontend cannot parse, so the customer sees an upload that spins and then
fails with no message.
client_max_body_size 40m;Then nginx -t && systemctl reload nginx.
Added
Every name on the board is a way in to the person
/p2p/trader/{id} has existed since the profile shipped, and exactly three
surfaces linked to it — the traders lens, the offer permalink and the trade
room. The three places a trader actually meets a counterparty for the first time
printed the same avatar, name and trust line as inert text. The decision that
page informs is made before the trade, and the only way to reach it was to
open one.
- Added a link to the trader's profile from the identity block on the market board, the picks cards and the Overview shelf. Hover or focus tints the block and underlines the name; a payload with no trader id degrades to plain text rather than to a broken link.
Your own profile, at an address in the menu
- Added Profile (
/p2p/profile) to the P2P menu: your own trader profile, rendered from the same page a stranger reads. Every P2P surface published a trader's record to everybody except the trader — a completion rate you can see is one you can act on, and the reviews people had left about you were readable by everyone but you. - Added a line on your own copy stating plainly that this is what another trader sees, and that the only thing that moves any of it is paying and releasing on time.
A dot on every trader avatar
- Added the platform's presence dot to every P2P surface that names a trader: the Overview shelf, all three market lenses, the offer permalink, the trades list, the live trade room and the trader profile. Green within five minutes, grey between sessions, red after three days, nothing at all when the platform has no reading.
- Added the counterparty's presence to the trade room payload, which never carried it — the one screen where "are they there right now" is the whole question.
How fast they release, and how fast they pay
Under each name on the board there is now a clock — 1m, 7m — and, under
three minutes, a tag: Fast release when you are buying, Swift payment
when you are selling. Pressing either says what was measured, over how many
trades, and that it is a measurement of settled trades rather than a promise
about yours.
- Added an average payment time. The board has two sides and the counterparty owes a different thing on each: buying from somebody, what matters is how fast they release; selling to them, how fast they pay. Only the first was ever measured, so the sell side of the board was quoting a figure about an obligation that party did not have on that trade.
- Added the number of trades each figure averages, stated in the explainer. "About a minute" from one trade and from ten are different claims.
Three named slots for dispute evidence
The panel told a disputer that the two strongest exhibits are a bank statement PDF and a screen recording, and then offered a single Attach a file button. People submitted one thing, usually a cropped screenshot, and a reviewer decided the case on the chat.
- Added three slots — Bank statement, Screen recording and Something else — each with its own caption, and one button that submits up to three at once. Naming the slots is the instruction: somebody looking at an empty box called "Screen recording" knows a recording is wanted.
- Added a remaining-files count, so the tenth file is refused before its upload rather than after it.
Changed
The payment window hands out exits instead of taking them away
See Upgrade Notes for what an operator needs to know. In the product:
- Changed payment confirmation to accept a late payment for as long as the trade is still unpaid. Refusing protected nobody — the crypto is escrowed either way, and the seller does not release on that call.
- Changed the seller's cancel rule: refused before the window as before, because they published an offer promising it, and allowed once it has passed.
- Changed the trade room's wording at the deadline. It said "you can no longer confirm payment on this trade"; it now says the window has passed, that you can still pay, and that the other side is free to stop waiting.
- Changed the lapsed countdown from the destructive tone to the warning tone. Red is this platform's terminal colour and the state is not terminal.
Speed figures follow a trader's last ten trades
- Changed release time from a lifetime mean to an average over the last ten completed trades. A lifetime mean buries a change in behaviour under old evidence, and the question a taker is asking is about the next fifteen minutes.
Fixed
The Sell button on the Overview was green
Direction is a colour on every other P2P surface. The Overview's board filled its action with the brand tone on both sides of the switch, so Sell USDT came out the same green as Buy USDT — on the first screen a trader sees, and on a control whose two directions have opposite consequences.
- Fixed the Overview board's action to take the destructive tone on the sell side, matching the market board, the picks row and the trade opener.
Uploading a screen recording to a dispute never worked
The evidence route accepted a 64 MB recording on paper. It arrives as base64 inside JSON — about 1.37x the file — and the route declared no body ceiling, so the 5 MB platform floor applied and nothing over roughly 3.6 MB could be sent. The refusal arrives while the browser is still uploading the rest, which presents as a spinner rather than an error.
- Fixed by declaring a 36 MB ceiling on the route, and lowering the video cap from a fictional 64 MB to a real 25 MB — the largest recording that fits a pipeline an operator can configure end to end.
- Fixed the same defect on trade-chat images, where a 5 MB photo needed 6.85 MB of body against the same 5 MB floor. A phone photo of a receipt landed squarely in the gap.
The cancel endpoint used the wrong payment window
Deciding whether a window has passed reads it from the offer, falling back to the platform default only when the offer does not set one. The cancel endpoint did not load the offer's settings at all, so it always took the fallback — on a typical install four hours, against an offer that promised one. The trade room and the countdown said the window had closed while the endpoint still believed there was an hour to run, which is the disagreement that surfaced it.
- Fixed the cancel endpoint reading the offer's own payment window. The seller's new right to cancel is decided from the window their offer actually advertised.
"Find me someone" quoted the wrong clock on the sell side
- Fixed the pick cards, which reported a trader's release time on both sides of the board. On the sell side the counterparty is the buyer and does not release; the card now quotes the figure that applies to the trade being offered.