The marketplace computes the minimum next bid using integer division then multiplication:
Because Solidity integer division truncates toward zero, this ordering can understate the true required increment. Concretely, when previousBidAmount is not divisible by 100, the contract computes a lower requiredAmount than the mathematically correct (previousBidAmount * (100 + inc)) / 100. An attacker can exploit this to outbid using a smaller amount than intended by the auction rules.
*Root: ordering of arithmetic operations causes rounding down too early (/100 before * (100 + inc)), losing precision.
Effect: incorrect requiredAmount value that may be lower than the expected increment.
Impact
Economic loss: attacker can win auctions (or keep overbidding cheaply) by offering slightly lower increments repeatedly.
Market integrity: breaks expectations for minimum increment policy; off-chain systems that assume strict increments may misbehave.
Very likely in normal operation — first bids and many bids are not multiples of 100 wei or 100 gwei etc., so rounding cases occur frequently.
Low skill required for exploitation — attacker only needs to bid the smaller computed amount.
Save as test/BidIncrementPoC.t.sol and run forge test --match-contract BidIncrementPoC -vvv.
Integer division in requiredAmount truncates fractions, allowing bids slightly lower than intended.
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.