Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use require in SafeMath #1187

Merged
merged 2 commits into from
Aug 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions contracts/math/SafeMath.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@ pragma solidity ^0.4.24;

/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
* @dev Math operations with safety checks that revert on error
*/
library SafeMath {

/**
* @dev Multiplies two numbers, throws on overflow.
* @dev Multiplies two numbers, reverts on overflow.
*/
function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (_a == 0) {
return 0;
}

uint256 c = _a * _b;
assert(c / _a == _b);
require(c / _a == _b);

return c;
}
Expand All @@ -28,29 +28,29 @@ library SafeMath {
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
// assert(_b > 0); // Solidity automatically throws when dividing by 0
require(_b > 0); // Solidity only automatically asserts when dividing by 0
uint256 c = _a / _b;
// assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

return c;
}

/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
* @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
assert(_b <= _a);
require(_b <= _a);
uint256 c = _a - _b;

return c;
}

/**
* @dev Adds two numbers, throws on overflow.
* @dev Adds two numbers, reverts on overflow.
*/
function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
uint256 c = _a + _b;
assert(c >= _a);
require(c >= _a);

return c;
}
Expand Down
18 changes: 9 additions & 9 deletions test/math/SafeMath.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { assertJump } = require('../helpers/assertJump');
const { assertRevert } = require('../helpers/assertRevert');
const BigNumber = web3.BigNumber;
const SafeMathMock = artifacts.require('SafeMathMock');

Expand All @@ -22,11 +22,11 @@ contract('SafeMath', () => {
result.should.be.bignumber.equal(a.plus(b));
});

it('throws an error on addition overflow', async function () {
it('throws a revert error on addition overflow', async function () {
const a = MAX_UINT;
const b = new BigNumber(1);

await assertJump(this.safeMath.add(a, b));
await assertRevert(this.safeMath.add(a, b));
});
});

Expand All @@ -39,11 +39,11 @@ contract('SafeMath', () => {
result.should.be.bignumber.equal(a.minus(b));
});

it('throws an error if subtraction result would be negative', async function () {
it('throws a revert error if subtraction result would be negative', async function () {
const a = new BigNumber(1234);
const b = new BigNumber(5678);

await assertJump(this.safeMath.sub(a, b));
await assertRevert(this.safeMath.sub(a, b));
});
});

Expand All @@ -64,11 +64,11 @@ contract('SafeMath', () => {
result.should.be.bignumber.equal(a.times(b));
});

it('throws an error on multiplication overflow', async function () {
it('throws a revert error on multiplication overflow', async function () {
const a = MAX_UINT;
const b = new BigNumber(2);

await assertJump(this.safeMath.mul(a, b));
await assertRevert(this.safeMath.mul(a, b));
});
});

Expand All @@ -81,11 +81,11 @@ contract('SafeMath', () => {
result.should.be.bignumber.equal(a.div(b));
});

it('throws an error on zero division', async function () {
it('throws a revert error on zero division', async function () {
const a = new BigNumber(5678);
const b = new BigNumber(0);

await assertJump(this.safeMath.div(a, b));
await assertRevert(this.safeMath.div(a, b));
});
});
});