Insecure Integer Arithmetic

Why is this important?

An overflow/underflow happens when an arithmetic operation reaches the maximum or minimum size of a type. For instance, if a number is stored in the uint8 type, it means that the number is stored in an 8 bits unsigned number ranging from 0 to 2^8-1. In computer programming, an integer overflow occurs when an arithmetic operation attempts to create a numeric value that is outside of the range that can be represented with a given number of bits – either larger than the maximum or lower than the minimum representable value.

For Solidity contracts, this could mean that attackers could get extremely large amounts of tokens and/or manipulate other crypto-currencies as a result.

Using Integer Arithmetic Securely

Option A: Adding Arithmetic Checks

  1. Go through the issues that GuardRails identified in the PR.
  2. Add the SafeMath library to your code.
  3. Identify the code that looks like this:

     pragma solidity 0.4.24;
    
     contract OverflowVulnerableAndFixed {
         mapping (address => uint256) public balanceOf;
         // INSECURE
         function transfer(address _to, uint256 _value) public {
             /* Check if sender has balance */
             require(balanceOf[msg.sender] >= _value);
             /* Add and subtract new balances */
             balanceOf[msg.sender] -= _value;
             balanceOf[_to] += _value;
         }
     }
    
  4. Replace it with the following pattern:

     function transfer(address _to, uint256 _value) public {
         /* Check if sender has balance and for overflows */
         require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to]);
         /* Add and subtract new balances */
         balanceOf[msg.sender] -= _value;
         balanceOf[_to] += _value;
     }
    
  5. Test it

  6. Ship it 🚢 and relax 🌴

Option B: Using Safe Math Libraries

  1. Go through the issues that GuardRails identified in the PR.
  2. Add the SafeMath library to your code.
  3. Identify the code that looks like this:

         uint256 amount = uint256(cnt) * _value;
    
  4. Use the SafeMath library like so:

         using SafeMath for uint256; // use SafeMath for uint256 variables
         // Change the previous line to this:
         uint256 amount = uint256(cnt).mul(_value);
    
  5. Test it

  6. Ship it 🚢 and relax 🌴

More information: