Bid Beasts

First Flight #49
Beginner FriendlyFoundrySolidityNFT
100 EXP
View results
Submission Details
Severity: medium
Valid

Bid Increment Calculation: Precision Loss Through Premature Division

Root + Impact

Description

  • The bid increment calculation in placeBid() performs division before multiplication, causing precision loss for amounts that are not evenly divisible by 100. This results in accepting bids that are lower than the intended 5% increment.


    //@audit division before multiplication
    requiredAmount = (previousBidAmount / 100) * (100 + S_MIN_BID_INCREMENT_PERCENTAGE);

Risk

Likelihood:

  • The problem is integer division truncation. When previousBidAmount is divided by 100 first, any remainder is lost, leading to imprecise calculations.


Impact:

  • Precision Loss: Bidders can submit lower bids than intended due to truncation.

Proof of Concept

function test_bidIncrement_RealWorldScenario() public {
_mintNFT();
_listNFT();
uint256 firstBid = 1 ether + 99 wei; // Amount with remainder when divided by 100
vm.prank(BIDDER_1);
market.placeBid{value: firstBid}(TOKEN_ID);
uint256 buggyRequired = (firstBid / 100) * 105; // Current calculation
uint256 correctRequired = (firstBid * 105) / 100; // Fixed calculation
console.log("First bid amount:", firstBid);
console.log("Buggy calculation requires:", buggyRequired);
console.log("Correct calculation requires:", correctRequired);
uint256 difference = correctRequired - buggyRequired;
console.log("Underpayment allowed:", difference, "wei");
assertTrue(difference > 0, "Precision loss occurs with irregular amounts");
}

Recommended Mitigation

Change the calculation order to preserve precision:

- requiredAmount = (previousBidAmount / 100) * (100 + S_MIN_BID_INCREMENT_PERCENTAGE);
+ requiredAmount = (previousBidAmount * (100 + S_MIN_BID_INCREMENT_PERCENTAGE)) / 100;
Updates

Lead Judging Commences

cryptoghost Lead Judge 2 months ago
Submission Judgement Published
Validated
Assigned finding tags:

BidBeasts Marketplace: Integer Division Precision Loss

Integer division in requiredAmount truncates fractions, allowing bids slightly lower than intended.

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!