In normal protocol behavior, a user should not be able to fill an expired order. The buyOrder
function includes a deadlineTimestamp
check to prevent this.
Because the contract relies on block.timestamp
, miners can shift the time slightly (up to ~15 seconds). This lets them fill orders that should have already expired, breaking the expected behavior of the protocol.
Likelihood:
Miners can adjust block.timestamp
slightly to favor their own or selected transactions.
This becomes especially relevant when orders are filled close to the expiration boundary, which is common in tight trading scenarios or sniping attempts.
Impact:
Orders may be filled even though they have technically expired.
This breaks time-based guarantees and can be exploited in race conditions.
No PoC required, as the vulnerability is due to protocol-level miner behavior affecting block.timestamp
.
Use Chainlink Automation (or other off-chain services) to flag expired orders based on timestamp and mark them inactive, removing reliance on block.timestamp
within user transactions.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.