Since the V2 upgrade, my trading bot is broken in a really weird way. Polymarket's order book tells me my orders are filling, but when I check the blockchain, the trades never actually happen. The wallets I'm being matched against have $0 in them. Is anyone else seeing this? And how is anyone actually trading right now?
My setup
- Rust bot trading Polymarket's 5-minute crypto Up/Down markets (BTC, ETH, SOL, XRP)
- Using V2 (the new system that launched April 28)
- My wallet (Gnosis Safe) has ~2000 pUSD in it, with full approval set for the new V2 exchange contract
- I rest limit orders 2–7 minutes before market close, then tighten as the deadline approaches
- This same bot was working fine before V2 — nothing has settled successfully since the upgrade
What's happening
Here's the pattern, every time:
- I post an order (e.g. buy YES at $0.30, 107 contracts)
- Polymarket's API says "Matched! Success!" and gives me a transaction hash
- My Telegram bot pings me: "FILLED!"
- I look up the transaction on Polygonscan → REVERTED, 600k gas wasted
- My Polymarket portfolio is unchanged, and the site sends me a "Limit Buy Up failed" notification
So the order book thinks I traded, but the blockchain says nothing happened. Classic ghost fill.
What's actually going wrong
I dug into the failed transactions and figured out what's breaking:
- The error code is
0x7939f424— that'sTransferFromFailed()from the Solady library. Basically: "I tried to move tokens out of someone's wallet and it failed." - When I decoded the failed transaction data, I found my buy order was getting matched against another user's opposite order (e.g. my BUY-YES at $0.30 paired with someone's BUY-NO at $0.70 — they add to $1.00, so the exchange treats it as a valid match).
- I simulated the trade locally and discovered the other person's wallet has literally zero pUSD in it. They've signed an order, set max approval, and their order is sitting there looking valid — but they have no money to actually pay.
- This isn't one bad wallet. I've seen it happen with multiple different empty wallets. It's a pattern.
The core problem: Polymarket's V2 matching engine checks signatures and approvals, but it doesn't check whether the counterparty actually has any pUSD. So zombie orders from empty wallets are sitting on the order book, and every time my bot crosses into one, the trade reverts.
What I've already ruled out
- ✅ My wallet's balance and approval are fine (I tested moving tokens out — works perfectly)
- ✅ My signature is valid (the exchange accepts my orders, the problem isn't on my side)
- ✅ My signer-to-Safe wallet mapping resolves correctly
- ✅ I added an on-chain checker that watches for the actual transaction within 60 seconds — now my Telegram alerts only celebrate trades that actually happened
- 🆕 I just turned on
postOnlymode, so my orders won't cross the book — I can only fill when someone with real tokens hits my resting bid
What I need help with
- Is this a known V2 bug? I can't find anything about it in Polymarket's docs or Discord. Has anyone else hit this?
- How is anyone getting real fills right now? If I'm in postOnly mode, I can only fill when someone holding actual YES/NO tokens sells into my bid. That barely happens in 5-minute crypto markets where everyone's just opening fresh positions.
- Should I be filtering out empty wallets before placing orders? Like, do I need to check
pUSD.balanceOf(maker)for every order on the book before I cross? Is there a Polymarket endpoint for this, or do I really need to RPC-call every single level of the order book myself? - Is Polymarket planning to add balance checks to the matcher? Or is dodging zombie orders just something every bot operator has to handle on their own now?
Any insight or war stories appreciated. I have all the failed transaction hashes and decoded data if anyone wants to verify what I'm seeing.
u/PresentationNo9872 — 12 days ago