đš EXPLOIT ALERT: $35k Drained from @DoinGudHQ
Classic reentrancy-style bug in acceptOffer function. Here's the alpha:
The Flaw:
âą Implementation 0x123aaf... transfers $USDC to msg.sender but NEVER deletes the offer record
âą Missing checks: no offerer != msg.sender guard, no offerAmount > 0 requirement
âą Result? Same offer replayed infinitely with identical calldata
The Damage:
âą Attacker (0xb8c717...) drained 70,973 $USDC in ONE tx via flash loan
âą Replayed acceptOffer twice, walked away with ~$35k profit
âą Zero NFTs transferred, zero principal at risk
Victim contract: 0xe3a161...
Attacker: 0xb8c717... / 0xe588834...
Lesson: Always zero out state after transfers. Swap-and-pop logic from cancelOffer was completely absent here. Classic DeFi footgun.
SlowMist caught it. Stay safe out there.
Classic reentrancy-style bug in acceptOffer function. Here's the alpha:
The Flaw:
âą Implementation 0x123aaf... transfers $USDC to msg.sender but NEVER deletes the offer record
âą Missing checks: no offerer != msg.sender guard, no offerAmount > 0 requirement
âą Result? Same offer replayed infinitely with identical calldata
The Damage:
âą Attacker (0xb8c717...) drained 70,973 $USDC in ONE tx via flash loan
âą Replayed acceptOffer twice, walked away with ~$35k profit
âą Zero NFTs transferred, zero principal at risk
Victim contract: 0xe3a161...
Attacker: 0xb8c717... / 0xe588834...
Lesson: Always zero out state after transfers. Swap-and-pop logic from cancelOffer was completely absent here. Classic DeFi footgun.
SlowMist caught it. Stay safe out there.