diff --git a/contracts/utils/contracts/src/MixinSafeMathRichErrors.sol b/contracts/utils/contracts/src/MixinSafeMathRichErrors.sol new file mode 100644 index 0000000000..dc856e0da1 --- /dev/null +++ b/contracts/utils/contracts/src/MixinSafeMathRichErrors.sol @@ -0,0 +1,47 @@ +pragma solidity ^0.5.9; + +import "./RichErrors.sol"; + + +contract MixinSafeMathRichErrors is + RichErrors +{ + // bytes4(keccak256("Uint256OverflowError(uint256,uint256)")) + bytes4 internal constant UINT256_OVERFLOW_ERROR = + 0x55101607; + + // bytes4(keccak256("Uint256UnderflowError(uint256,uint256)")) + bytes4 internal constant UINT256_UNDERFLOW_ERROR = + 0x60ee612f; + + // solhint-disable func-name-mixedcase + function Uint256OverflowError( + uint256 a, + uint256 b + ) + internal + pure + returns (bytes memory) + { + return abi.encodeWithSelector( + UINT256_OVERFLOW_ERROR, + a, + b + ); + } + + function Uint256UnderflowError( + uint256 a, + uint256 b + ) + internal + pure + returns (bytes memory) + { + return abi.encodeWithSelector( + UINT256_UNDERFLOW_ERROR, + a, + b + ); + } +} diff --git a/contracts/utils/contracts/src/SafeMath.sol b/contracts/utils/contracts/src/SafeMath.sol index 0a0c2db757..623515ab86 100644 --- a/contracts/utils/contracts/src/SafeMath.sol +++ b/contracts/utils/contracts/src/SafeMath.sol @@ -1,7 +1,11 @@ pragma solidity ^0.5.9; +import "./MixinSafeMathRichErrors.sol"; -contract SafeMath { + +contract SafeMath is + MixinSafeMathRichErrors +{ function _safeMul(uint256 a, uint256 b) internal @@ -12,10 +16,12 @@ contract SafeMath { return 0; } uint256 c = a * b; - require( - c / a == b, - "UINT256_OVERFLOW" - ); + if (c / a != b) { + _rrevert(Uint256OverflowError( + a, + b + )); + } return c; } @@ -33,10 +39,12 @@ contract SafeMath { pure returns (uint256) { - require( - b <= a, - "UINT256_UNDERFLOW" - ); + if (b > a) { + _rrevert(Uint256UnderflowError( + a, + b + )); + } return a - b; } @@ -46,10 +54,12 @@ contract SafeMath { returns (uint256) { uint256 c = a + b; - require( - c >= a, - "UINT256_OVERFLOW" - ); + if (c < a) { + _rrevert(Uint256OverflowError( + a, + b + )); + } return c; }