github.com/klaytn/klaytn@v1.12.1/contracts/cnstaking/SafeMath.sol (about) 1 // Copyright 2019 The klaytn Authors 2 // This file is part of the klaytn library. 3 // 4 // The klaytn library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The klaytn library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the klaytn library. If not, see <http://www.gnu.org/licenses/>. 16 17 pragma solidity 0.4.24; 18 19 /** 20 * @title SafeMath 21 * @dev Unsigned math operations with safety checks that revert on error 22 */ 23 library SafeMath { 24 /** 25 * @dev Multiplies two unsigned integers, reverts on overflow. 26 */ 27 function mul(uint256 a, uint256 b) internal pure returns (uint256) { 28 // Gas optimization: this is cheaper than requiring 'a' not being zero, but the 29 // benefit is lost if 'b' is also tested. 30 // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 31 if (a == 0) { 32 return 0; 33 } 34 35 uint256 c = a * b; 36 require(c / a == b); 37 38 return c; 39 } 40 41 /** 42 * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. 43 */ 44 function div(uint256 a, uint256 b) internal pure returns (uint256) { 45 // Solidity only automatically asserts when dividing by 0 46 require(b > 0); 47 uint256 c = a / b; 48 // assert(a == b * c + a % b); // There is no case in which this doesn't hold 49 50 return c; 51 } 52 53 /** 54 * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). 55 */ 56 function sub(uint256 a, uint256 b) internal pure returns (uint256) { 57 require(b <= a); 58 uint256 c = a - b; 59 60 return c; 61 } 62 63 /** 64 * @dev Adds two unsigned integers, reverts on overflow. 65 */ 66 function add(uint256 a, uint256 b) internal pure returns (uint256) { 67 uint256 c = a + b; 68 require(c >= a); 69 70 return c; 71 } 72 73 /** 74 * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), 75 * reverts when dividing by zero. 76 */ 77 function mod(uint256 a, uint256 b) internal pure returns (uint256) { 78 require(b != 0); 79 return a % b; 80 } 81 }