Six bug classes drain exchanges year after year — each has a known fix.
The contract transfers funds before it updates the balance. A malicious receiver calls withdraw again while the old balance is still recorded — and drains the vault in one transaction.
The attacker borrows huge capital inside one transaction, bends a protocol (vote, pool price, collateral), profits and repays — all atomically. Own capital is not needed.
If pricing runs on a thin pool or a single feed, one large swap moves the price and liquidates honest users. The exchange logic is fine — the price input is the bug.
Two withdrawal requests pass the balance check before either debits. Both succeed on the same balance — a double-spend. Same shape in refunds and bonus claims.
Hot-wallet keys, withdrawal API tokens and admin passwords leak through JS bundles, public .env files, CI logs and support chats. One leaked key is a full payout queue.
Selfie-only checks, reusable document uploads and race conditions in the verification state machine let one person open many accounts — for laundering or bonus abuse.
Withdrawal races and key leakage. Boring, outside the contract code, and they pay out instantly.
No. TWAP windows add at most one block of latency — invisible to users, decisive against atomic manipulation.