# CarefulMath

Derived from OpenZeppelin's SafeMath library\
<https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol>

## MathError

*Possible error codes that we can return*

```solidity
enum MathError {
  NO_ERROR,
  DIVISION_BY_ZERO,
  INTEGER_OVERFLOW,
  INTEGER_UNDERFLOW
}
```

## mulUInt

```solidity
function mulUInt(uint256 a, uint256 b) internal pure returns (enum CarefulMath.MathError, uint256)
```

*Multiplies two numbers, returns an error on overflow.*

## divUInt

```solidity
function divUInt(uint256 a, uint256 b) internal pure returns (enum CarefulMath.MathError, uint256)
```

*Integer division of two numbers, truncating the quotient.*

## subUInt

```solidity
function subUInt(uint256 a, uint256 b) internal pure returns (enum CarefulMath.MathError, uint256)
```

*Subtracts two numbers, returns an error on overflow (i.e. if subtrahend is greater than minuend).*

## addUInt

```solidity
function addUInt(uint256 a, uint256 b) internal pure returns (enum CarefulMath.MathError, uint256)
```

*Adds two numbers, returns an error on overflow.*

## addThenSubUInt

```solidity
function addThenSubUInt(uint256 a, uint256 b, uint256 c) internal pure returns (enum CarefulMath.MathError, uint256)
```

*add a and b and then subtract c*

## min

```solidity
function min(uint256 a, uint256 b) internal pure returns (uint256)
```

*min and max functions*

## max

```solidity
function max(uint256 a, uint256 b) internal pure returns (uint256)
```

## MAXUINT

```solidity
uint256 MAXUINT
```

## MAXUINT96

```solidity
uint256 MAXUINT96
```

## MAXUINT24

```solidity
uint256 MAXUINT24
```
