Raisebox Faucet

First Flight #50
Beginner FriendlySolidity
100 EXP
Submission Details
Impact: low
Likelihood: high

Off-by-one / inequality in balance check prior to transfer

Author Revealed upon completion

Off-by-one / inequality in balance check prior to transfer

Description

  • In claimFaucetTokens() the code checks:

@> if (balanceOf(address(this)) <= faucetDrip) {
revert RaiseBoxFaucet_InsufficientContractBalance();
}

If the contract balance equals exactly faucetDrip, the check reverts (i.e., the function requires strictly greater than faucetDrip). Typically the desired check is to allow transfer when balance >= faucetDrip (i.e., revert when < faucetDrip). Using <= disallows the last token drip.

Impact: Users are prevented from claiming when the contract holds exactly one faucetDrip unit; reduces usability (small).

Risk

Likelihood: High (easy to happen)

Impact: Low (minor UX/logical)

Proof of Concept

If `balanceOf(address(this)) == faucetDrip`, `claimFaucetTokens()` will revert with `InsufficientContractBalance()`.

Recommended Mitigation

Use < rather than <=:

- if (balanceOf(address(this)) <= faucetDrip) {
- revert RaiseBoxFaucet_InsufficientContractBalance();
- }
+ if (balanceOf(address(this)) < faucetDrip) {
+ revert RaiseBoxFaucet_InsufficientContractBalance();
+ }

Support

FAQs

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