# Quixotic: fillSellOrder signature check bypass drains OP

Quixotic NFT marketplace only validated the seller's signature on fillSellOrder, letting an attacker forge order params and drain OP tokens.

- Payout: Real-world hack
- Severity: critical
- Program: Quixotic
- Analysis by: DeFiHackLabs
- Disclosed: 2022-07-01
- Write-up quality: 6/10
- Original: https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2022-07/Quixotic_exp.sol
- Library page: http://bugbountylibrary.com/r/dhl%3A20220701-quixotic
- Tags: area:web3 domain:web3 impact:funds-loss kind:incident platform:defihacklabs sev:critical tech:evm technique:source-review vuln:access-control vuln:business-logic vuln:signature-replay

**Target:** fillSellOrder on Optimism NFT marketplace contract
**Root cause:** fillSellOrder validated only the seller signature and did not bind/verify the order fields (price, quantity, expiration, paymentERC20) against the signed data, so arbitrary parameters could be supplied.
**Steps:**
1. Fork Optimism at block 13591383.
2. Call `fillSellOrder(seller, contractAddress, tokenId, startTime, expiration, price, quantity, createdAtBlockNumber, paymentERC20, signature, buyer)` with attacker as seller/buyer and inflated price/quantity and expiration set to max uint.
3. Pass the seller's signature `0x28bc2ff1...` while supplying attacker-chosen price/quantity/paymentERC20.
4. Contract pays out OP tokens (0x4200...0042) to the attacker.
**How found:** Noticed fillSellOrder only checked the seller signature and did not verify the order parameters matched the signed payload.
**Exploitation:** Attacker reused a valid seller signature but supplied their own price, quantity, expiration and paymentERC20 fields, causing the marketplace to transfer OP tokens to the attacker's address.
**Insight:** On NFT marketplaces, check whether order fields (price, quantity, payment token, expiration) are actually covered by the signature; if only the seller is signed, any caller can rewrite the economics.

