Browse Source

Add Modulo operation for getting the quotient (#915)

* Add Modulo operation for getting the quotient

* Improved modulo tests and implementation.

* Removed assertion.
jeano 7 năm trước cách đây
mục cha
commit
9aa30e1960

+ 9 - 0
contracts/math/SafeMath.sol

@@ -54,4 +54,13 @@ library SafeMath {
 
     return c;
   }
+
+  /**
+  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
+  * reverts when dividing by zero.
+  */
+  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
+    require(b != 0);
+    return a % b;
+  }
 }

+ 4 - 0
contracts/mocks/SafeMathMock.sol

@@ -21,4 +21,8 @@ contract SafeMathMock {
   function add(uint256 _a, uint256 _b) public pure returns (uint256) {
     return SafeMath.add(_a, _b);
   }
+
+  function mod(uint256 a, uint256 b) public pure returns (uint256) {
+    return SafeMath.mod(a, b);
+  }
 }

+ 40 - 0
test/math/SafeMath.test.js

@@ -1,4 +1,5 @@
 const { assertRevert } = require('../helpers/assertRevert');
+
 const BigNumber = web3.BigNumber;
 const SafeMathMock = artifacts.require('SafeMathMock');
 
@@ -88,4 +89,43 @@ contract('SafeMath', () => {
       await assertRevert(this.safeMath.div(a, b));
     });
   });
+
+  describe('mod', function () {
+    describe('modulos correctly', async function () {
+      it('when the dividend is smaller than the divisor', async function () {
+        const a = new BigNumber(284);
+        const b = new BigNumber(5678);
+
+        (await this.safeMath.mod(a, b)).should.be.bignumber.equal(a.mod(b));
+      });
+
+      it('when the dividend is equal to the divisor', async function () {
+        const a = new BigNumber(5678);
+        const b = new BigNumber(5678);
+
+        (await this.safeMath.mod(a, b)).should.be.bignumber.equal(a.mod(b));
+      });
+
+      it('when the dividend is larger than the divisor', async function () {
+        const a = new BigNumber(7000);
+        const b = new BigNumber(5678);
+
+        (await this.safeMath.mod(a, b)).should.be.bignumber.equal(a.mod(b));
+      });
+
+      it('when the dividend is a multiple of the divisor', async function () {
+        const a = new BigNumber(17034); // 17034 == 5678 * 3
+        const b = new BigNumber(5678);
+
+        (await this.safeMath.mod(a, b)).should.be.bignumber.equal(a.mod(b));
+      });
+    });
+
+    it('reverts with a 0 divisor', async function () {
+      const a = new BigNumber(5678);
+      const b = new BigNumber(0);
+
+      await assertRevert(this.safeMath.mod(a, b));
+    });
+  });
 });