Commit 4fad1505 by Manuel Araoz

Make SafeMath a library

parent 58814299
...@@ -4,7 +4,7 @@ pragma solidity ^0.4.8; ...@@ -4,7 +4,7 @@ pragma solidity ^0.4.8;
/** /**
* Math operations with safety checks * Math operations with safety checks
*/ */
contract SafeMath { library SafeMath {
function safeMul(uint a, uint b) internal returns (uint) { function safeMul(uint a, uint b) internal returns (uint) {
uint c = a * b; uint c = a * b;
assert(a == 0 || c / a == b); assert(a == 0 || c / a == b);
......
...@@ -9,14 +9,16 @@ import '../SafeMath.sol'; ...@@ -9,14 +9,16 @@ import '../SafeMath.sol';
* Base contract supporting async send for pull payments. * Base contract supporting async send for pull payments.
* Inherit from this contract and use asyncSend instead of send. * Inherit from this contract and use asyncSend instead of send.
*/ */
contract PullPayment is SafeMath { contract PullPayment {
using SafeMath for uint;
mapping(address => uint) public payments; mapping(address => uint) public payments;
uint public totalPayments; uint public totalPayments;
// store sent amount as credit to be pulled, called by payer // store sent amount as credit to be pulled, called by payer
function asyncSend(address dest, uint amount) internal { function asyncSend(address dest, uint amount) internal {
payments[dest] = safeAdd(payments[dest], amount); payments[dest] = payments[dest].safeAdd(amount);
totalPayments = safeAdd(totalPayments, amount); totalPayments = totalPayments.safeAdd(amount);
} }
// withdraw accumulated balance, called by payee // withdraw accumulated balance, called by payee
...@@ -32,7 +34,7 @@ contract PullPayment is SafeMath { ...@@ -32,7 +34,7 @@ contract PullPayment is SafeMath {
throw; throw;
} }
totalPayments = safeSub(totalPayments, payment); totalPayments = totalPayments.safeSub(payment);
payments[payee] = 0; payments[payee] = 0;
if (!payee.send(payment)) { if (!payee.send(payment)) {
......
...@@ -9,7 +9,8 @@ import '../SafeMath.sol'; ...@@ -9,7 +9,8 @@ import '../SafeMath.sol';
* Basic token * Basic token
* Basic version of StandardToken, with no allowances * Basic version of StandardToken, with no allowances
*/ */
contract BasicToken is ERC20Basic, SafeMath { contract BasicToken is ERC20Basic {
using SafeMath for uint;
mapping(address => uint) balances; mapping(address => uint) balances;
...@@ -22,8 +23,8 @@ contract BasicToken is ERC20Basic, SafeMath { ...@@ -22,8 +23,8 @@ contract BasicToken is ERC20Basic, SafeMath {
} }
function transfer(address _to, uint _value) onlyPayloadSize(2 * 32) { function transfer(address _to, uint _value) onlyPayloadSize(2 * 32) {
balances[msg.sender] = safeSub(balances[msg.sender], _value); balances[msg.sender] = balances[msg.sender].safeSub(_value);
balances[_to] = safeAdd(balances[_to], _value); balances[_to] = balances[_to].safeAdd(_value);
Transfer(msg.sender, _to, _value); Transfer(msg.sender, _to, _value);
} }
......
...@@ -32,10 +32,10 @@ contract CrowdsaleToken is StandardToken { ...@@ -32,10 +32,10 @@ contract CrowdsaleToken is StandardToken {
throw; throw;
} }
uint tokens = safeMul(msg.value, getPrice()); uint tokens = msg.value.safeMul(getPrice());
totalSupply = safeAdd(totalSupply, tokens); totalSupply = totalSupply.safeAdd(tokens);
balances[recipient] = safeAdd(balances[recipient], tokens); balances[recipient] = balances[recipient].safeAdd(tokens);
if (!multisig.send(msg.value)) { if (!multisig.send(msg.value)) {
throw; throw;
......
...@@ -22,9 +22,9 @@ contract StandardToken is BasicToken, ERC20 { ...@@ -22,9 +22,9 @@ contract StandardToken is BasicToken, ERC20 {
// Check is not needed because safeSub(_allowance, _value) will already throw if this condition is not met // Check is not needed because safeSub(_allowance, _value) will already throw if this condition is not met
// if (_value > _allowance) throw; // if (_value > _allowance) throw;
balances[_to] = safeAdd(balances[_to], _value); balances[_to] = balances[_to].safeAdd(_value);
balances[_from] = safeSub(balances[_from], _value); balances[_from] = balances[_from].safeSub(_value);
allowed[_from][msg.sender] = safeSub(_allowance, _value); allowed[_from][msg.sender] = _allowance.safeSub(_value);
Transfer(_from, _to, _value); Transfer(_from, _to, _value);
} }
......
...@@ -52,8 +52,8 @@ contract VestedToken is StandardToken, LimitedTransferToken { ...@@ -52,8 +52,8 @@ contract VestedToken is StandardToken, LimitedTransferToken {
grants[_holder][_grantId] = grants[_holder][grants[_holder].length - 1]; grants[_holder][_grantId] = grants[_holder][grants[_holder].length - 1];
grants[_holder].length -= 1; grants[_holder].length -= 1;
balances[msg.sender] = safeAdd(balances[msg.sender], nonVested); balances[msg.sender] = balances[msg.sender].safeAdd(nonVested);
balances[_holder] = safeSub(balances[_holder], nonVested); balances[_holder] = balances[_holder].safeSub(nonVested);
Transfer(_holder, msg.sender, nonVested); Transfer(_holder, msg.sender, nonVested);
} }
...@@ -98,32 +98,33 @@ contract VestedToken is StandardToken, LimitedTransferToken { ...@@ -98,32 +98,33 @@ contract VestedToken is StandardToken, LimitedTransferToken {
return tokens; return tokens;
} }
uint256 cliffTokens = safeDiv(safeMul(tokens, safeSub(cliff, start)), safeSub(vesting, start)); uint256 cliffTokens = tokens.safeMul(cliff.safeSub(start)).safeDiv(vesting.safeSub(start));
vestedTokens = cliffTokens; vestedTokens = cliffTokens;
uint256 vestingTokens = safeSub(tokens, cliffTokens); uint256 vestingTokens = tokens.safeSub(cliffTokens);
vestedTokens = safeAdd(vestedTokens, safeDiv(safeMul(vestingTokens, safeSub(time, cliff)), safeSub(vesting, cliff))); vestedTokens = vestedTokens.safeAdd(vestingTokens.safeMul(time.safeSub(cliff)).safeDiv(vesting.safeSub(cliff)));
} }
function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) { function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {
return safeSub(grant.value, vestedTokens(grant, time)); return grant.value.safeSub(vestedTokens(grant, time));
} }
function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) { function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) {
date = uint64(now); date = uint64(now);
uint256 grantIndex = grants[holder].length; uint256 grantIndex = grants[holder].length;
for (uint256 i = 0; i < grantIndex; i++) { for (uint256 i = 0; i < grantIndex; i++) {
date = max64(grants[holder][i].vesting, date); date = SafeMath.max64(grants[holder][i].vesting, date);
} }
} }
function transferableTokens(address holder, uint64 time) constant public returns (uint256 nonVested) { function transferableTokens(address holder, uint64 time) constant public returns (uint256 nonVested) {
uint256 grantIndex = grants[holder].length; uint256 grantIndex = grants[holder].length;
for (uint256 i = 0; i < grantIndex; i++) { for (uint256 i = 0; i < grantIndex; i++) {
nonVested = safeAdd(nonVested, nonVestedTokens(grants[holder][i], time)); uint256 current = nonVestedTokens(grants[holder][i], time);
nonVested = nonVested.safeAdd(current);
} }
return min256(safeSub(balances[holder], nonVested), super.transferableTokens(holder, time)); return SafeMath.min256(balances[holder].safeSub(nonVested), super.transferableTokens(holder, time));
} }
} }
...@@ -4,18 +4,18 @@ pragma solidity ^0.4.8; ...@@ -4,18 +4,18 @@ pragma solidity ^0.4.8;
import '../../contracts/SafeMath.sol'; import '../../contracts/SafeMath.sol';
contract SafeMathMock is SafeMath { contract SafeMathMock {
uint public result; uint public result;
function multiply(uint a, uint b) { function multiply(uint a, uint b) {
result = safeMul(a, b); result = SafeMath.safeMul(a, b);
} }
function subtract(uint a, uint b) { function subtract(uint a, uint b) {
result = safeSub(a, b); result = SafeMath.safeSub(a, b);
} }
function add(uint a, uint b) { function add(uint a, uint b) {
result = safeAdd(a, b); result = SafeMath.safeAdd(a, b);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment