On 2026-09-21, a Polygon marketplace facet accepted two byte-identical acceptOffer calls and paid out the escrow twice for one offer, netting the helper 35,380 USDC.
Logged as “2026-09-21: Acceptoffer Replay Via Missing Offer Cleanup On The Amount0 Path on DoinGud”.
The DoinGud marketplace facet on Polygon paid out the same offer's USDC twice on 2026-09-21 after acceptOffer failed to clear its bookkeeping on a single code path (attack transaction, block 94170781). DeFiHackLabs reconstructs the double-pay on a Polygon fork and reproduces both escrow payouts and the helper's net profit to the wei.
The marketplace tracks each listing in an Offer record. acceptOffer runs the buyer's payment, releases the escrowed asset to the buyer, and is then expected to clear the offer so it cannot be replayed. The cleanup is only performed on the code path taken when the buyer's input amount is non-zero; the amount == 0 branch skips it. The same offer record therefore remains live, and a second acceptOffer call with identical calldata is paid again. Each payout sent 35,486.935717 USDC to the attacker, so two payouts over the same escrow left the helper 70,973.87 USDC gross, minus the 35,593.72 USDC repayment of a UniV2 flash swap that funded the first payment, for a net 35,380.15 USDC.
The attacker funded the first payment with a flash swap and reused the second payout to repay it, leaving the marketplace escrow drained of both halves.
The facet is not source-verified on Polygonscan; DeFiHackLabs reconstructed the relevant selectors from the attack trace. The fix is straightforward: clear the Offer record on every exit branch, including the amount == 0 one.
Query every incident yourself — free, no signup
Updated 14 Oct 2026. Figures are as reported by the sources listed above and are not independently verified.