Quick answer: Trading is the highest-risk economy feature because two players and the server all hold state at once. QA the escrow flow so items and currency are locked, swapped atomically, and released to the right side, and hunt the exploits: duplication via interrupted trades, cancel races, and listing edits. Test concurrency, interruptions, and adversarial timing, not just the happy path.
Player-to-player trade and marketplaces are where in-game economies get rich and where they get destroyed. The instant two players can move items and currency between them, you have created a target, because a single duplication bug discovered by one player can flood the economy and devalue everyone's hard-earned goods within hours. Trade is also genuinely hard to build correctly: it is a multi-party transaction where two clients and a server must agree on who owns what, and any window where the state is inconsistent is a window an exploiter can drive a truck through. This post covers how to QA trade and marketplace systems with the adversarial mindset they demand.
Lock state with escrow
A safe trade never lets both sides hold their goods while the swap is in flight. The moment a trade is confirmed, each party's offered items and currency should move into escrow, locked so they cannot be sold, used, or offered in a second trade, and only then is the swap executed. QA should verify that escrowed items genuinely disappear from the player's usable inventory, that they cannot be listed on the marketplace while escrowed, and that they reappear correctly if the trade is cancelled.
The release step is equally important: when the swap commits, each item must land in exactly one destination inventory, never both and never neither. Test the full lifecycle, offer, confirm, escrow, commit, release, and confirm the final ownership is exactly right for both players. Then test cancellation at every stage and verify everything returns to its original owner with nothing stranded in escrow, because a stuck escrow that swallows an item generates a support ticket and a lost player.
Make the swap atomic
The actual exchange must be atomic: either both players receive what they were promised or neither does, with no state where one side has been credited and the other has not. QA should force a crash or disconnect at the exact moment of the swap and confirm the system resolves to a clean state on recovery, rolling the whole trade back or completing it fully. A partial commit that gives player A the item but never debits it from player B is precisely the duplication bug that wrecks economies.
Test the recovery path explicitly, not just the failure. After an interrupted trade, both players should be able to reconnect and find their inventories in a single consistent state, with the trade either clearly completed or clearly cancelled, never ambiguous. Reconcile both players' inventories before and after, because the only acceptable outcome is that the total count of every item across both accounts is unchanged by the act of trading, only the ownership shifted.
Hunt the duplication exploits
Item duplication is the cardinal sin of trade systems, and it almost always comes from a race condition. Try the cancel race: confirm a trade and cancel it at nearly the same instant from one client while the other side commits, and see whether the item ends up in both inventories. Try double-offering the same item into two trades simultaneously, and try trading an item while it is also being sold, equipped, or consumed. Each of these is a real exploit pattern that players will find if you do not.
Approach this section as an attacker, not a tester running a script. Manipulate timing deliberately, replay captured trade requests, and probe what happens when a client sends a malformed or out-of-order sequence. The server must be the sole authority on item ownership and must reject any client claim that contradicts its own record. Any path where the client's word is trusted about what it owns is a duplication exploit in waiting, so verify every ownership check happens server-side.
Listings, pricing, and the marketplace
An asynchronous marketplace or auction house adds its own surface: listings persist over time, prices can be edited, and buyers act on data that may be stale. QA should confirm that listing an item escrows it so it cannot be sold elsewhere, that buying a listing transfers the item and currency atomically, and that two buyers racing for the same single listing result in exactly one sale and one refunded or rejected buyer. Test editing or cancelling a listing the instant someone buys it, a classic race.
Pricing logic deserves its own attention. Verify floors, ceilings, and any tax or fee are calculated and applied correctly, that the seller receives the net amount and the system collects the fee exactly once, and that currency rounding never creates or destroys value. Test listings that expire while a purchase is in flight, and confirm the marketplace search and display stay consistent with actual availability so players are not buying items that are already gone.
Setting it up with Bugnet
Trade bugs are reported by confused or angry players who often cannot describe what happened, only that an item vanished or a trade froze. Bugnet's in-game report button captures the player's inventory state and the context of their last trade automatically, so instead of a vague claim you get the actual state to compare against the server's record. Custom fields for trade ID and the involved item let a triager pull the exact transaction and determine whether it was a genuine loss, a stuck escrow, or an attempted exploit.
Duplication exploits spread fast, and occurrence grouping is how you spot the spread: when a particular trade path starts misbehaving, Bugnet folds the incoming reports into one issue with a count, so a sudden spike is a loud signal that an exploit is live and needs an emergency fix. Stack traces from crashes in the trade flow arrive in the same dashboard, and filtering by item or trade type helps you confirm that a patch closed the hole without breaking legitimate trades that were working fine.
Build adversarial regression tests
Because trade exploits are concurrency and timing bugs, they regress easily and silently when someone refactors the inventory or networking code months later. Capture every exploit you find or imagine as an automated test that issues concurrent and interrupted trade requests and asserts that item totals across accounts are conserved. These tests are your economy's seatbelt, and running them on every build catches the reintroduction of a duplication bug long before a player does.
Pair that with live vigilance. Monitor for sudden surges in the supply of specific items, which is the economic signature of an active duplication exploit, and keep a fast path to disable trading entirely if one is confirmed, because halting trade for an hour is far cheaper than letting a dupe run overnight. A trade system that conserves every item and resolves every interruption cleanly is what lets players trust your economy enough to invest in it.
Trade is the easiest place to break an economy. Lock state in escrow, make the swap atomic, and test it like an attacker hunting a dupe.