Merge remote-tracking branch 'upstream/master' into add-smart-token

pull/518/head
AugustoL 7 years ago
commit d060d29912
  1. 1
      .gitattributes
  2. 1
      .github/ISSUE_TEMPLATE.md
  3. 2
      .github/PULL_REQUEST_TEMPLATE.md
  4. 26
      .soliumrc.json
  5. 1
      .travis.yml
  6. 16
      contracts/Bounty.sol
  7. 1
      contracts/DayLimit.sol
  8. 5
      contracts/MerkleProof.sol
  9. 1
      contracts/ReentrancyGuard.sol
  10. 19
      contracts/crowdsale/CappedCrowdsale.sol
  11. 36
      contracts/crowdsale/Crowdsale.sol
  12. 7
      contracts/crowdsale/FinalizableCrowdsale.sol
  13. 5
      contracts/crowdsale/RefundVault.sol
  14. 24
      contracts/crowdsale/RefundableCrowdsale.sol
  15. 8
      contracts/examples/SampleCrowdsale.sol
  16. 6
      contracts/examples/SimpleToken.sol
  17. 2
      contracts/lifecycle/Migrations.sol
  18. 4
      contracts/lifecycle/TokenDestructible.sol
  19. 2
      contracts/math/Math.sol
  20. 13
      contracts/math/SafeMath.sol
  21. 2
      contracts/mocks/BasicTokenMock.sol
  22. 3
      contracts/mocks/BurnableTokenMock.sol
  23. 2
      contracts/mocks/CappedCrowdsaleImpl.sol
  24. 2
      contracts/mocks/DayLimitMock.sol
  25. 5
      contracts/mocks/DetailedERC20Mock.sol
  26. 2
      contracts/mocks/ECRecoveryMock.sol
  27. 5
      contracts/mocks/ERC23TokenMock.sol
  28. 2
      contracts/mocks/FinalizableCrowdsaleImpl.sol
  29. 1
      contracts/mocks/ForceEther.sol
  30. 1
      contracts/mocks/HasNoEtherTest.sol
  31. 4
      contracts/mocks/InsecureTargetBounty.sol
  32. 2
      contracts/mocks/LimitBalanceMock.sol
  33. 2
      contracts/mocks/PausableMock.sol
  34. 3
      contracts/mocks/PausableTokenMock.sol
  35. 2
      contracts/mocks/PullPaymentMock.sol
  36. 2
      contracts/mocks/RBACMock.sol
  37. 1
      contracts/mocks/ReentrancyAttack.sol
  38. 17
      contracts/mocks/ReentrancyMock.sol
  39. 2
      contracts/mocks/RefundableCrowdsaleImpl.sol
  40. 7
      contracts/mocks/SafeERC20Helper.sol
  41. 2
      contracts/mocks/SafeMathMock.sol
  42. 2
      contracts/mocks/SecureTargetBounty.sol
  43. 2
      contracts/mocks/StandardTokenMock.sol
  44. 1
      contracts/ownership/CanReclaimToken.sol
  45. 2
      contracts/ownership/Claimable.sol
  46. 5
      contracts/ownership/Contactable.sol
  47. 4
      contracts/ownership/DelayedClaimable.sol
  48. 1
      contracts/ownership/HasNoContracts.sol
  49. 1
      contracts/ownership/HasNoEther.sol
  50. 1
      contracts/ownership/HasNoTokens.sol
  51. 1
      contracts/ownership/NoOwner.sol
  52. 2
      contracts/ownership/Ownable.sol
  53. 49
      contracts/ownership/rbac/RBAC.sol
  54. 22
      contracts/payment/PullPayment.sol
  55. 31
      contracts/payment/SplitPayment.sol
  56. 4
      contracts/token/BasicToken.sol
  57. 3
      contracts/token/BurnableToken.sol
  58. 3
      contracts/token/CappedToken.sol
  59. 3
      contracts/token/DetailedERC20.sol
  60. 2
      contracts/token/ERC20.sol
  61. 4
      contracts/token/MintableToken.sol
  62. 6
      contracts/token/PausableToken.sol
  63. 5
      contracts/token/SafeERC20.sol
  64. 4
      contracts/token/StandardToken.sol
  65. 4
      contracts/token/TokenTimelock.sol
  66. 9
      contracts/token/TokenVesting.sol
  67. 1490
      package-lock.json
  68. 5
      package.json
  69. 4
      test/Bounty.test.js
  70. 25
      test/Math.test.js
  71. 10
      test/crowdsale/CappedCrowdsale.test.js
  72. 10
      test/crowdsale/Crowdsale.test.js
  73. 8
      test/crowdsale/FinalizableCrowdsale.test.js
  74. 4
      test/crowdsale/RefundVault.test.js
  75. 10
      test/crowdsale/RefundableCrowdsale.test.js
  76. 10
      test/examples/SampleCrowdsale.test.js
  77. 2
      test/lifecycle/Destructible.test.js
  78. 2
      test/lifecycle/Pausable.test.js
  79. 2
      test/lifecycle/TokenDestructible.test.js
  80. 4
      test/math/SafeMath.test.js
  81. 17
      test/mocks/MathMock.sol
  82. 2
      test/ownership/CanReclaimToken.test.js
  83. 2
      test/ownership/Claimable.test.js
  84. 0
      test/ownership/Contactable.test.js
  85. 17
      test/ownership/DelayedClaimble.test.js
  86. 2
      test/ownership/HasNoContracts.test.js
  87. 4
      test/ownership/HasNoEther.test.js
  88. 2
      test/ownership/HasNoTokens.test.js
  89. 2
      test/ownership/Ownable.test.js
  90. 18
      test/ownership/rbac/RBAC.test.js
  91. 0
      test/payment/PullPayment.test.js
  92. 2
      test/payment/SplitPayment.test.js
  93. 2
      test/token/BasicToken.test.js
  94. 2
      test/token/BurnableToken.test.js
  95. 4
      test/token/CappedToken.test.js
  96. 0
      test/token/DetailedERC20.test.js
  97. 2
      test/token/MintableToken.test.js
  98. 2
      test/token/PausableToken.test.js
  99. 2
      test/token/SafeERC20.test.js
  100. 2
      test/token/StandardToken.test.js
  101. Some files were not shown because too many files have changed in this diff Show More

1
.gitattributes vendored

@ -0,0 +1 @@
*.sol linguist-language=Solidity

@ -1,4 +1,3 @@
## The Problem
- [ ] 🐛 This is a bug report. - [ ] 🐛 This is a bug report.
- [ ] 📈 This is a feature request. - [ ] 📈 This is a feature request.

@ -3,7 +3,7 @@
- [ ] 📘 I've reviewed the [OpenZeppelin Contributor Guidelines](/docs/CONTRIBUTING.md) - [ ] 📘 I've reviewed the [OpenZeppelin Contributor Guidelines](/docs/CONTRIBUTING.md)
- [ ] ✅ I've added tests where applicable to test my new functionality. - [ ] ✅ I've added tests where applicable to test my new functionality.
- [ ] 📖 I've made sure that my contracts are well-documented. - [ ] 📖 I've made sure that my contracts are well-documented.
- [ ] 🎨 I've run the JavaScript linter (`npm run lint:fix`) and fixed all issues. - [ ] 🎨 I've run the JS/Solidity linters (`npm run lint:all:fix`) and fixed any issues.
<!-- **Does this close any open issues?** If so, list them here. --> <!-- **Does this close any open issues?** If so, list them here. -->

@ -1,22 +1,12 @@
{ {
"custom-rules-filename": null, "extends": "solium:all",
"plugins": ["security"],
"rules": { "rules": {
"imports-on-top": true, "quotes": ["error", "double"],
"variable-declarations": true, "indentation": ["error", 2],
"array-declarations": true, "arg-overflow": ["warning", 3],
"operator-whitespace": true, "security/enforce-explicit-visibility": ["error"],
"lbrace": true, "security/no-block-members": ["warning"],
"mixedcase": false, "security/no-inline-assembly": ["warning"]
"camelcase": true,
"uppercase": true,
"no-with": true,
"no-empty-blocks": true,
"no-unused-vars": true,
"double-quotes": true,
"blank-lines": true,
"indentation": true,
"whitespace": true,
"deprecated-suicide": true,
"pragma-on-top": true
} }
} }

@ -18,6 +18,7 @@ before_script:
- truffle version - truffle version
script: script:
- npm run lint - npm run lint
- npm run lint:sol
- npm run test - npm run test
notifications: notifications:
slack: slack:

@ -1,8 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './payment/PullPayment.sol'; import "./payment/PullPayment.sol";
import './lifecycle/Destructible.sol'; import "./lifecycle/Destructible.sol";
/** /**
@ -34,12 +34,6 @@ contract Bounty is PullPayment, Destructible {
return target; return target;
} }
/**
* @dev Internal function to deploy the target contract.
* @return A target contract address
*/
function deployContract() internal returns(address);
/** /**
* @dev Sends the contract funds to the researcher that proved the contract is broken. * @dev Sends the contract funds to the researcher that proved the contract is broken.
* @param target contract * @param target contract
@ -53,6 +47,12 @@ contract Bounty is PullPayment, Destructible {
claimed = true; claimed = true;
} }
/**
* @dev Internal function to deploy the target contract.
* @return A target contract address
*/
function deployContract() internal returns(address);
} }

@ -1,5 +1,6 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
/** /**
* @title DayLimit * @title DayLimit
* @dev Base contract that enables methods to be protected by placing a linear limit (specifiable) * @dev Base contract that enables methods to be protected by placing a linear limit (specifiable)

@ -1,5 +1,6 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
/* /*
* @title MerkleProof * @title MerkleProof
* @dev Merkle proof verification * @dev Merkle proof verification
@ -15,7 +16,9 @@ library MerkleProof {
*/ */
function verifyProof(bytes _proof, bytes32 _root, bytes32 _leaf) public pure returns (bool) { function verifyProof(bytes _proof, bytes32 _root, bytes32 _leaf) public pure returns (bool) {
// Check if proof length is a multiple of 32 // Check if proof length is a multiple of 32
if (_proof.length % 32 != 0) return false; if (_proof.length % 32 != 0) {
return false;
}
bytes32 proofElement; bytes32 proofElement;
bytes32 computedHash = _leaf; bytes32 computedHash = _leaf;

@ -1,5 +1,6 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
/** /**
* @title Helps contracts guard agains reentrancy attacks. * @title Helps contracts guard agains reentrancy attacks.
* @author Remco Bloemen <remco@2π.com> * @author Remco Bloemen <remco@2π.com>

@ -1,7 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
import './Crowdsale.sol'; import "./Crowdsale.sol";
/** /**
* @title CappedCrowdsale * @title CappedCrowdsale
@ -17,13 +18,6 @@ contract CappedCrowdsale is Crowdsale {
cap = _cap; cap = _cap;
} }
// overriding Crowdsale#validPurchase to add extra cap logic
// @return true if investors can buy at the moment
function validPurchase() internal view returns (bool) {
bool withinCap = weiRaised.add(msg.value) <= cap;
return super.validPurchase() && withinCap;
}
// overriding Crowdsale#hasEnded to add cap logic // overriding Crowdsale#hasEnded to add cap logic
// @return true if crowdsale event has ended // @return true if crowdsale event has ended
function hasEnded() public view returns (bool) { function hasEnded() public view returns (bool) {
@ -31,4 +25,11 @@ contract CappedCrowdsale is Crowdsale {
return super.hasEnded() || capReached; return super.hasEnded() || capReached;
} }
// overriding Crowdsale#validPurchase to add extra cap logic
// @return true if investors can buy at the moment
function validPurchase() internal view returns (bool) {
bool withinCap = weiRaised.add(msg.value) <= cap;
return super.validPurchase() && withinCap;
}
} }

@ -1,7 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/MintableToken.sol'; import "../token/MintableToken.sol";
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
/** /**
* @title Crowdsale * @title Crowdsale
@ -53,13 +54,6 @@ contract Crowdsale {
wallet = _wallet; wallet = _wallet;
} }
// creates the token to be sold.
// override this method to have crowdsale of a specific mintable token.
function createTokenContract() internal returns (MintableToken) {
return new MintableToken();
}
// fallback function can be used to buy tokens // fallback function can be used to buy tokens
function () external payable { function () external payable {
buyTokens(msg.sender); buyTokens(msg.sender);
@ -73,7 +67,7 @@ contract Crowdsale {
uint256 weiAmount = msg.value; uint256 weiAmount = msg.value;
// calculate token amount to be created // calculate token amount to be created
uint256 tokens = weiAmount.mul(rate); uint256 tokens = getTokenAmount(weiAmount);
// update state // update state
weiRaised = weiRaised.add(weiAmount); weiRaised = weiRaised.add(weiAmount);
@ -84,6 +78,22 @@ contract Crowdsale {
forwardFunds(); forwardFunds();
} }
// @return true if crowdsale event has ended
function hasEnded() public view returns (bool) {
return now > endTime;
}
// creates the token to be sold.
// override this method to have crowdsale of a specific mintable token.
function createTokenContract() internal returns (MintableToken) {
return new MintableToken();
}
// Override this method to have a way to add business logic to your crowdsale when buying
function getTokenAmount(uint256 weiAmount) internal view returns(uint256) {
return weiAmount.mul(rate);
}
// send ether to the fund collection wallet // send ether to the fund collection wallet
// override to create custom fund forwarding mechanisms // override to create custom fund forwarding mechanisms
function forwardFunds() internal { function forwardFunds() internal {
@ -97,10 +107,4 @@ contract Crowdsale {
return withinPeriod && nonZeroPurchase; return withinPeriod && nonZeroPurchase;
} }
// @return true if crowdsale event has ended
function hasEnded() public view returns (bool) {
return now > endTime;
}
} }

@ -1,8 +1,9 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
import '../ownership/Ownable.sol'; import "../ownership/Ownable.sol";
import './Crowdsale.sol'; import "./Crowdsale.sol";
/** /**
* @title FinalizableCrowdsale * @title FinalizableCrowdsale

@ -1,7 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
import '../ownership/Ownable.sol'; import "../ownership/Ownable.sol";
/** /**
* @title RefundVault * @title RefundVault

@ -1,9 +1,9 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
import './FinalizableCrowdsale.sol'; import "./FinalizableCrowdsale.sol";
import './RefundVault.sol'; import "./RefundVault.sol";
/** /**
@ -27,13 +27,6 @@ contract RefundableCrowdsale is FinalizableCrowdsale {
goal = _goal; goal = _goal;
} }
// We're overriding the fund forwarding from Crowdsale.
// In addition to sending the funds, we want to call
// the RefundVault deposit function
function forwardFunds() internal {
vault.deposit.value(msg.value)(msg.sender);
}
// if crowdsale is unsuccessful, investors can claim refunds here // if crowdsale is unsuccessful, investors can claim refunds here
function claimRefund() public { function claimRefund() public {
require(isFinalized); require(isFinalized);
@ -42,6 +35,10 @@ contract RefundableCrowdsale is FinalizableCrowdsale {
vault.refund(msg.sender); vault.refund(msg.sender);
} }
function goalReached() public view returns (bool) {
return weiRaised >= goal;
}
// vault finalization task, called when owner calls finalize() // vault finalization task, called when owner calls finalize()
function finalization() internal { function finalization() internal {
if (goalReached()) { if (goalReached()) {
@ -53,8 +50,11 @@ contract RefundableCrowdsale is FinalizableCrowdsale {
super.finalization(); super.finalization();
} }
function goalReached() public view returns (bool) { // We're overriding the fund forwarding from Crowdsale.
return weiRaised >= goal; // In addition to sending the funds, we want to call
// the RefundVault deposit function
function forwardFunds() internal {
vault.deposit.value(msg.value)(msg.sender);
} }
} }

@ -4,6 +4,7 @@ import "../crowdsale/CappedCrowdsale.sol";
import "../crowdsale/RefundableCrowdsale.sol"; import "../crowdsale/RefundableCrowdsale.sol";
import "../token/MintableToken.sol"; import "../token/MintableToken.sol";
/** /**
* @title SampleCrowdsaleToken * @title SampleCrowdsaleToken
* @dev Very simple ERC20 Token that can be minted. * @dev Very simple ERC20 Token that can be minted.
@ -11,12 +12,13 @@ import "../token/MintableToken.sol";
*/ */
contract SampleCrowdsaleToken is MintableToken { contract SampleCrowdsaleToken is MintableToken {
string public constant name = "Sample Crowdsale Token"; string public constant name = "Sample Crowdsale Token"; // solium-disable-line uppercase
string public constant symbol = "SCT"; string public constant symbol = "SCT"; // solium-disable-line uppercase
uint8 public constant decimals = 18; uint8 public constant decimals = 18; // solium-disable-line uppercase
} }
/** /**
* @title SampleCrowdsale * @title SampleCrowdsale
* @dev This is an example of a fully fledged crowdsale. * @dev This is an example of a fully fledged crowdsale.

@ -12,9 +12,9 @@ import "../token/StandardToken.sol";
*/ */
contract SimpleToken is StandardToken { contract SimpleToken is StandardToken {
string public constant name = "SimpleToken"; string public constant name = "SimpleToken"; // solium-disable-line uppercase
string public constant symbol = "SIM"; string public constant symbol = "SIM"; // solium-disable-line uppercase
uint8 public constant decimals = 18; uint8 public constant decimals = 18; // solium-disable-line uppercase
uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals)); uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals));

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import "../ownership/Ownable.sol";
import '../ownership/Ownable.sol';
/** /**
* @title Migrations * @title Migrations

@ -1,9 +1,9 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import "../ownership/Ownable.sol"; import "../ownership/Ownable.sol";
import "../token/ERC20Basic.sol"; import "../token/ERC20Basic.sol";
/** /**
* @title TokenDestructible: * @title TokenDestructible:
* @author Remco Bloemen <remco@2π.com> * @author Remco Bloemen <remco@2π.com>
@ -24,7 +24,7 @@ contract TokenDestructible is Ownable {
function destroy(address[] tokens) onlyOwner public { function destroy(address[] tokens) onlyOwner public {
// Transfer tokens to owner // Transfer tokens to owner
for(uint256 i = 0; i < tokens.length; i++) { for (uint256 i = 0; i < tokens.length; i++) {
ERC20Basic token = ERC20Basic(tokens[i]); ERC20Basic token = ERC20Basic(tokens[i]);
uint256 balance = token.balanceOf(this); uint256 balance = token.balanceOf(this);
token.transfer(owner, balance); token.transfer(owner, balance);

@ -1,10 +1,10 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
/** /**
* @title Math * @title Math
* @dev Assorted math operations * @dev Assorted math operations
*/ */
library Math { library Math {
function max64(uint64 a, uint64 b) internal pure returns (uint64) { function max64(uint64 a, uint64 b) internal pure returns (uint64) {
return a >= b ? a : b; return a >= b ? a : b;

@ -6,6 +6,10 @@ pragma solidity ^0.4.18;
* @dev Math operations with safety checks that throw on error * @dev Math operations with safety checks that throw on error
*/ */
library SafeMath { library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) { function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) { if (a == 0) {
return 0; return 0;
@ -15,6 +19,9 @@ library SafeMath {
return c; return c;
} }
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) { function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0 // assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b; uint256 c = a / b;
@ -22,11 +29,17 @@ library SafeMath {
return c; return c;
} }
/**
* @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) { function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a); assert(b <= a);
return a - b; return a - b;
} }
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) { function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b; uint256 c = a + b;
assert(c >= a); assert(c >= a);

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/BasicToken.sol'; import "../token/BasicToken.sol";
// mock class using BasicToken // mock class using BasicToken

@ -1,6 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/BurnableToken.sol'; import "../token/BurnableToken.sol";
contract BurnableTokenMock is BurnableToken { contract BurnableTokenMock is BurnableToken {

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../crowdsale/CappedCrowdsale.sol'; import "../crowdsale/CappedCrowdsale.sol";
contract CappedCrowdsaleImpl is CappedCrowdsale { contract CappedCrowdsaleImpl is CappedCrowdsale {

@ -1,6 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import "../../contracts/DayLimit.sol"; import "../../contracts/DayLimit.sol";
contract DayLimitMock is DayLimit { contract DayLimitMock is DayLimit {
uint256 public totalSpending; uint256 public totalSpending;

@ -1,7 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/StandardToken.sol'; import "../token/StandardToken.sol";
import '../token/DetailedERC20.sol'; import "../token/DetailedERC20.sol";
contract DetailedERC20Mock is StandardToken, DetailedERC20 { contract DetailedERC20Mock is StandardToken, DetailedERC20 {
function DetailedERC20Mock(string _name, string _symbol, uint8 _decimals) DetailedERC20(_name, _symbol, _decimals) public {} function DetailedERC20Mock(string _name, string _symbol, uint8 _decimals) DetailedERC20(_name, _symbol, _decimals) public {}

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../ECRecovery.sol'; import "../ECRecovery.sol";
contract ECRecoveryMock { contract ECRecoveryMock {

@ -1,13 +1,14 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/BasicToken.sol'; import "../token/BasicToken.sol";
contract ERC23ContractInterface { contract ERC23ContractInterface {
function tokenFallback(address _from, uint256 _value, bytes _data) external; function tokenFallback(address _from, uint256 _value, bytes _data) external;
} }
contract ERC23TokenMock is BasicToken { contract ERC23TokenMock is BasicToken {
function ERC23TokenMock(address initialAccount, uint256 initialBalance) public { function ERC23TokenMock(address initialAccount, uint256 initialBalance) public {
@ -24,7 +25,7 @@ contract ERC23TokenMock is BasicToken {
assembly { assembly {
is_contract := not(iszero(extcodesize(_to))) is_contract := not(iszero(extcodesize(_to)))
} }
if(is_contract) { if (is_contract) {
ERC23ContractInterface receiver = ERC23ContractInterface(_to); ERC23ContractInterface receiver = ERC23ContractInterface(_to);
receiver.tokenFallback(msg.sender, _value, _data); receiver.tokenFallback(msg.sender, _value, _data);
} }

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../crowdsale/FinalizableCrowdsale.sol'; import "../crowdsale/FinalizableCrowdsale.sol";
contract FinalizableCrowdsaleImpl is FinalizableCrowdsale { contract FinalizableCrowdsaleImpl is FinalizableCrowdsale {

@ -1,5 +1,6 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
// @title Force Ether into a contract. // @title Force Ether into a contract.
// @notice even // @notice even
// if the contract is not payable. // if the contract is not payable.

@ -2,6 +2,7 @@ pragma solidity ^0.4.18;
import "../../contracts/ownership/HasNoEther.sol"; import "../../contracts/ownership/HasNoEther.sol";
contract HasNoEtherTest is HasNoEther { contract HasNoEtherTest is HasNoEther {
// Constructor with explicit payable should still fail // Constructor with explicit payable should still fail

@ -1,15 +1,15 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import {Bounty, Target} from "../../contracts/Bounty.sol"; import {Bounty, Target} from "../../contracts/Bounty.sol";
contract InsecureTargetMock is Target { contract InsecureTargetMock is Target {
function checkInvariant() public returns(bool){ function checkInvariant() public returns(bool) {
return false; return false;
} }
} }
contract InsecureTargetBounty is Bounty { contract InsecureTargetBounty is Bounty {
function deployContract() internal returns (address) { function deployContract() internal returns (address) {
return new InsecureTargetMock(); return new InsecureTargetMock();

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../LimitBalance.sol'; import "../LimitBalance.sol";
// mock class using LimitBalance // mock class using LimitBalance

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../lifecycle/Pausable.sol'; import "../lifecycle/Pausable.sol";
// mock class using Pausable // mock class using Pausable

@ -1,6 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/PausableToken.sol'; import "../token/PausableToken.sol";
// mock class using PausableToken // mock class using PausableToken
contract PausableTokenMock is PausableToken { contract PausableTokenMock is PausableToken {

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../payment/PullPayment.sol'; import "../payment/PullPayment.sol";
// mock class using PullPayment // mock class using PullPayment

@ -1,6 +1,6 @@
pragma solidity ^0.4.8; pragma solidity ^0.4.8;
import '../ownership/rbac/RBAC.sol'; import "../ownership/rbac/RBAC.sol";
contract RBACMock is RBAC { contract RBACMock is RBAC {

@ -1,5 +1,6 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
contract ReentrancyAttack { contract ReentrancyAttack {
function callSender(bytes4 data) public { function callSender(bytes4 data) public {

@ -1,7 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../ReentrancyGuard.sol'; import "../ReentrancyGuard.sol";
import './ReentrancyAttack.sol'; import "./ReentrancyAttack.sol";
contract ReentrancyMock is ReentrancyGuard { contract ReentrancyMock is ReentrancyGuard {
@ -11,12 +12,12 @@ contract ReentrancyMock is ReentrancyGuard {
counter = 0; counter = 0;
} }
function count() private { function callback() external nonReentrant {
counter += 1; count();
} }
function countLocalRecursive(uint256 n) public nonReentrant { function countLocalRecursive(uint256 n) public nonReentrant {
if(n > 0) { if (n > 0) {
count(); count();
countLocalRecursive(n - 1); countLocalRecursive(n - 1);
} }
@ -24,7 +25,7 @@ contract ReentrancyMock is ReentrancyGuard {
function countThisRecursive(uint256 n) public nonReentrant { function countThisRecursive(uint256 n) public nonReentrant {
bytes4 func = bytes4(keccak256("countThisRecursive(uint256)")); bytes4 func = bytes4(keccak256("countThisRecursive(uint256)"));
if(n > 0) { if (n > 0) {
count(); count();
bool result = this.call(func, n - 1); bool result = this.call(func, n - 1);
require(result == true); require(result == true);
@ -37,8 +38,8 @@ contract ReentrancyMock is ReentrancyGuard {
attacker.callSender(func); attacker.callSender(func);
} }
function callback() external nonReentrant { function count() private {
count(); counter += 1;
} }
} }

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../crowdsale/RefundableCrowdsale.sol'; import "../crowdsale/RefundableCrowdsale.sol";
contract RefundableCrowdsaleImpl is RefundableCrowdsale { contract RefundableCrowdsaleImpl is RefundableCrowdsale {

@ -1,7 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/ERC20.sol'; import "../token/ERC20.sol";
import '../token/SafeERC20.sol'; import "../token/SafeERC20.sol";
contract ERC20FailingMock is ERC20 { contract ERC20FailingMock is ERC20 {
function transfer(address, uint256) public returns (bool) { function transfer(address, uint256) public returns (bool) {
@ -25,6 +26,7 @@ contract ERC20FailingMock is ERC20 {
} }
} }
contract ERC20SucceedingMock is ERC20 { contract ERC20SucceedingMock is ERC20 {
function transfer(address, uint256) public returns (bool) { function transfer(address, uint256) public returns (bool) {
return true; return true;
@ -47,6 +49,7 @@ contract ERC20SucceedingMock is ERC20 {
} }
} }
contract SafeERC20Helper { contract SafeERC20Helper {
using SafeERC20 for ERC20; using SafeERC20 for ERC20;

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
contract SafeMathMock { contract SafeMathMock {

@ -1,6 +1,5 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import {Bounty, Target} from "../../contracts/Bounty.sol"; import {Bounty, Target} from "../../contracts/Bounty.sol";
@ -10,6 +9,7 @@ contract SecureTargetMock is Target {
} }
} }
contract SecureTargetBounty is Bounty { contract SecureTargetBounty is Bounty {
function deployContract() internal returns (address) { function deployContract() internal returns (address) {
return new SecureTargetMock(); return new SecureTargetMock();

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../token/StandardToken.sol'; import "../token/StandardToken.sol";
// mock class using StandardToken // mock class using StandardToken

@ -4,6 +4,7 @@ import "./Ownable.sol";
import "../token/ERC20Basic.sol"; import "../token/ERC20Basic.sol";
import "../token/SafeERC20.sol"; import "../token/SafeERC20.sol";
/** /**
* @title Contracts that should be able to recover tokens * @title Contracts that should be able to recover tokens
* @author SylTi * @author SylTi

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './Ownable.sol'; import "./Ownable.sol";
/** /**

@ -1,13 +1,14 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './Ownable.sol'; import "./Ownable.sol";
/** /**
* @title Contactable token * @title Contactable token
* @dev Basic version of a contactable contract, allowing the owner to provide a string with their * @dev Basic version of a contactable contract, allowing the owner to provide a string with their
* contact information. * contact information.
*/ */
contract Contactable is Ownable{ contract Contactable is Ownable {
string public contactInformation; string public contactInformation;

@ -1,7 +1,6 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import "./Claimable.sol";
import './Claimable.sol';
/** /**
@ -26,7 +25,6 @@ contract DelayedClaimable is Claimable {
start = _start; start = _start;
} }
/** /**
* @dev Allows the pendingOwner address to finalize the transfer, as long as it is called within * @dev Allows the pendingOwner address to finalize the transfer, as long as it is called within
* the specified start and end time. * the specified start and end time.

@ -2,6 +2,7 @@ pragma solidity ^0.4.18;
import "./Ownable.sol"; import "./Ownable.sol";
/** /**
* @title Contracts that should not own Contracts * @title Contracts that should not own Contracts
* @author Remco Bloemen <remco@2π.com> * @author Remco Bloemen <remco@2π.com>

@ -2,6 +2,7 @@ pragma solidity ^0.4.18;
import "./Ownable.sol"; import "./Ownable.sol";
/** /**
* @title Contracts that should not own Ether * @title Contracts that should not own Ether
* @author Remco Bloemen <remco@2π.com> * @author Remco Bloemen <remco@2π.com>

@ -2,6 +2,7 @@ pragma solidity ^0.4.18;
import "./CanReclaimToken.sol"; import "./CanReclaimToken.sol";
/** /**
* @title Contracts that should not own Tokens * @title Contracts that should not own Tokens
* @author Remco Bloemen <remco@2π.com> * @author Remco Bloemen <remco@2π.com>

@ -4,6 +4,7 @@ import "./HasNoEther.sol";
import "./HasNoTokens.sol"; import "./HasNoTokens.sol";
import "./HasNoContracts.sol"; import "./HasNoContracts.sol";
/** /**
* @title Base contract for contracts that should not own things. * @title Base contract for contracts that should not own things.
* @author Remco Bloemen <remco@2π.com> * @author Remco Bloemen <remco@2π.com>

@ -21,7 +21,6 @@ contract Ownable {
owner = msg.sender; owner = msg.sender;
} }
/** /**
* @dev Throws if called by any account other than the owner. * @dev Throws if called by any account other than the owner.
*/ */
@ -30,7 +29,6 @@ contract Ownable {
_; _;
} }
/** /**
* @dev Allows the current owner to transfer control of the contract to a newOwner. * @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to. * @param newOwner The address to transfer ownership to.

@ -1,6 +1,6 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './Roles.sol'; import "./Roles.sol";
/** /**
@ -36,30 +36,6 @@ contract RBAC {
addRole(msg.sender, ROLE_ADMIN); addRole(msg.sender, ROLE_ADMIN);
} }
/**
* @dev add a role to an address
* @param addr address
* @param roleName the name of the role
*/
function addRole(address addr, string roleName)
internal
{
roles[roleName].add(addr);
RoleAdded(addr, roleName);
}
/**
* @dev remove a role from an address
* @param addr address
* @param roleName the name of the role
*/
function removeRole(address addr, string roleName)
internal
{
roles[roleName].remove(addr);
RoleRemoved(addr, roleName);
}
/** /**
* @dev reverts if addr does not have role * @dev reverts if addr does not have role
* @param addr address * @param addr address
@ -111,6 +87,29 @@ contract RBAC {
removeRole(addr, roleName); removeRole(addr, roleName);
} }
/**
* @dev add a role to an address
* @param addr address
* @param roleName the name of the role
*/
function addRole(address addr, string roleName)
internal
{
roles[roleName].add(addr);
RoleAdded(addr, roleName);
}
/**
* @dev remove a role from an address
* @param addr address
* @param roleName the name of the role
*/
function removeRole(address addr, string roleName)
internal
{
roles[roleName].remove(addr);
RoleRemoved(addr, roleName);
}
/** /**
* @dev modifier to scope access to a single role (uses msg.sender as addr) * @dev modifier to scope access to a single role (uses msg.sender as addr)

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
/** /**
@ -15,16 +15,6 @@ contract PullPayment {
mapping(address => uint256) public payments; mapping(address => uint256) public payments;
uint256 public totalPayments; uint256 public totalPayments;
/**
* @dev Called by the payer to store the sent amount as credit to be pulled.
* @param dest The destination address of the funds.
* @param amount The amount to transfer.
*/
function asyncSend(address dest, uint256 amount) internal {
payments[dest] = payments[dest].add(amount);
totalPayments = totalPayments.add(amount);
}
/** /**
* @dev withdraw accumulated balance, called by payee. * @dev withdraw accumulated balance, called by payee.
*/ */
@ -40,4 +30,14 @@ contract PullPayment {
assert(payee.send(payment)); assert(payee.send(payment));
} }
/**
* @dev Called by the payer to store the sent amount as credit to be pulled.
* @param dest The destination address of the funds.
* @param amount The amount to transfer.
*/
function asyncSend(address dest, uint256 amount) internal {
payments[dest] = payments[dest].add(amount);
totalPayments = totalPayments.add(amount);
}
} }

@ -1,6 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
/** /**
* @title SplitPayment * @title SplitPayment
@ -29,19 +30,9 @@ contract SplitPayment {
} }
/** /**
* @dev Add a new payee to the contract. * @dev payable fallback
* @param _payee The address of the payee to add.
* @param _shares The number of shares owned by the payee.
*/ */
function addPayee(address _payee, uint256 _shares) internal { function () public payable {}
require(_payee != address(0));
require(_shares > 0);
require(shares[_payee] == 0);
payees.push(_payee);
shares[_payee] = _shares;
totalShares = totalShares.add(_shares);
}
/** /**
* @dev Claim your share of the balance. * @dev Claim your share of the balance.
@ -64,7 +55,17 @@ contract SplitPayment {
} }
/** /**
* @dev payable fallback * @dev Add a new payee to the contract.
* @param _payee The address of the payee to add.
* @param _shares The number of shares owned by the payee.
*/ */
function () public payable {} function addPayee(address _payee, uint256 _shares) internal {
require(_payee != address(0));
require(_shares > 0);
require(shares[_payee] == 0);
payees.push(_payee);
shares[_payee] = _shares;
totalShares = totalShares.add(_shares);
}
} }

@ -1,8 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './ERC20Basic.sol'; import "./ERC20Basic.sol";
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
/** /**

@ -1,6 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './BasicToken.sol'; import "./BasicToken.sol";
/** /**
* @title Burnable Token * @title Burnable Token

@ -1,6 +1,7 @@
pragma solidity ^0.4.11; pragma solidity ^0.4.11;
import './MintableToken.sol'; import "./MintableToken.sol";
/** /**
* @title Capped token * @title Capped token

@ -1,6 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './ERC20.sol'; import "./ERC20.sol";
contract DetailedERC20 is ERC20 { contract DetailedERC20 is ERC20 {
string public name; string public name;

@ -1,7 +1,7 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './ERC20Basic.sol'; import "./ERC20Basic.sol";
/** /**

@ -1,8 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './StandardToken.sol'; import "./StandardToken.sol";
import '../ownership/Ownable.sol'; import "../ownership/Ownable.sol";

@ -1,14 +1,14 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './StandardToken.sol'; import "./StandardToken.sol";
import '../lifecycle/Pausable.sol'; import "../lifecycle/Pausable.sol";
/** /**
* @title Pausable token * @title Pausable token
* *
* @dev StandardToken modified with pausable transfers. * @dev StandardToken modified with pausable transfers.
**/ **/
contract PausableToken is StandardToken, Pausable { contract PausableToken is StandardToken, Pausable {
function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) { function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) {

@ -1,7 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './ERC20Basic.sol'; import "./ERC20Basic.sol";
import './ERC20.sol'; import "./ERC20.sol";
/** /**
* @title SafeERC20 * @title SafeERC20

@ -1,8 +1,8 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './BasicToken.sol'; import "./BasicToken.sol";
import './ERC20.sol'; import "./ERC20.sol";
/** /**

@ -1,9 +1,9 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import "./ERC20Basic.sol";
import './ERC20Basic.sol';
import "../token/SafeERC20.sol"; import "../token/SafeERC20.sol";
/** /**
* @title TokenTimelock * @title TokenTimelock
* @dev TokenTimelock is a token holder contract that will allow a * @dev TokenTimelock is a token holder contract that will allow a

@ -1,9 +1,10 @@
pragma solidity ^0.4.18; pragma solidity ^0.4.18;
import './ERC20Basic.sol'; import "./ERC20Basic.sol";
import './SafeERC20.sol'; import "./SafeERC20.sol";
import '../ownership/Ownable.sol'; import "../ownership/Ownable.sol";
import '../math/SafeMath.sol'; import "../math/SafeMath.sol";
/** /**
* @title TokenVesting * @title TokenVesting

1490
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -6,6 +6,10 @@
"test": "scripts/test.sh", "test": "scripts/test.sh",
"lint": "eslint .", "lint": "eslint .",
"lint:fix": "eslint . --fix", "lint:fix": "eslint . --fix",
"lint:sol": "solium -d .",
"lint:sol:fix": "solium -d . --fix",
"lint:all": "npm run lint && npm run lint:sol",
"lint:all:fix": "npm run lint:fix && npm run lint:sol:fix",
"console": "truffle console", "console": "truffle console",
"coverage": "scripts/coverage.sh" "coverage": "scripts/coverage.sh"
}, },
@ -47,6 +51,7 @@
"ethereumjs-util": "^5.1.2", "ethereumjs-util": "^5.1.2",
"mocha-lcov-reporter": "^1.3.0", "mocha-lcov-reporter": "^1.3.0",
"solidity-coverage": "^0.4.3", "solidity-coverage": "^0.4.3",
"solium": "^1.1.2",
"truffle": "^4.0.0", "truffle": "^4.0.0",
"truffle-hdwallet-provider": "0.0.3" "truffle-hdwallet-provider": "0.0.3"
}, },

@ -74,7 +74,7 @@ contract('Bounty', function (accounts) {
web3.eth.getBalance(bounty.address).toNumber()); web3.eth.getBalance(bounty.address).toNumber());
} }
}; };
bounty.createTarget({ from: researcher }); await bounty.createTarget({ from: researcher });
await awaitEvent(event, watcher); await awaitEvent(event, watcher);
}); });
}); });
@ -104,7 +104,7 @@ contract('Bounty', function (accounts) {
assert.equal(0, web3.eth.getBalance(bounty.address).toNumber()); assert.equal(0, web3.eth.getBalance(bounty.address).toNumber());
}; };
bounty.createTarget({ from: researcher }); await bounty.createTarget({ from: researcher });
await awaitEvent(event, watcher); await awaitEvent(event, watcher);
}); });
}); });

@ -0,0 +1,25 @@
var MathMock = artifacts.require('./mocks/MathMock.sol');
contract('Math', function (accounts) {
let math;
before(async function () {
math = await MathMock.new();
});
it('returns max correctly', async function () {
let a = 5678;
let b = 1234;
await math.max64(a, b);
let result = await math.result();
assert.equal(result, a);
});
it('returns min correctly', async function () {
let a = 5678;
let b = 1234;
await math.min64(a, b);
let result = await math.result();
assert.equal(result, b);
});
});

@ -1,8 +1,8 @@
import ether from './helpers/ether'; import ether from '../helpers/ether';
import { advanceBlock } from './helpers/advanceToBlock'; import { advanceBlock } from '../helpers/advanceToBlock';
import { increaseTimeTo, duration } from './helpers/increaseTime'; import { increaseTimeTo, duration } from '../helpers/increaseTime';
import latestTime from './helpers/latestTime'; import latestTime from '../helpers/latestTime';
import EVMRevert from './helpers/EVMRevert'; import EVMRevert from '../helpers/EVMRevert';
const BigNumber = web3.BigNumber; const BigNumber = web3.BigNumber;

@ -1,8 +1,8 @@
import ether from './helpers/ether'; import ether from '../helpers/ether';
import { advanceBlock } from './helpers/advanceToBlock'; import { advanceBlock } from '../helpers/advanceToBlock';
import { increaseTimeTo, duration } from './helpers/increaseTime'; import { increaseTimeTo, duration } from '../helpers/increaseTime';
import latestTime from './helpers/latestTime'; import latestTime from '../helpers/latestTime';
import EVMRevert from './helpers/EVMRevert'; import EVMRevert from '../helpers/EVMRevert';
const BigNumber = web3.BigNumber; const BigNumber = web3.BigNumber;

@ -1,7 +1,7 @@
import { advanceBlock } from './helpers/advanceToBlock'; import { advanceBlock } from '../helpers/advanceToBlock';
import { increaseTimeTo, duration } from './helpers/increaseTime'; import { increaseTimeTo, duration } from '../helpers/increaseTime';
import latestTime from './helpers/latestTime'; import latestTime from '../helpers/latestTime';
import EVMRevert from './helpers/EVMRevert'; import EVMRevert from '../helpers/EVMRevert';
const BigNumber = web3.BigNumber; const BigNumber = web3.BigNumber;

@ -1,5 +1,5 @@
import ether from './helpers/ether'; import ether from '../helpers/ether';
import EVMRevert from './helpers/EVMRevert'; import EVMRevert from '../helpers/EVMRevert';
const BigNumber = web3.BigNumber; const BigNumber = web3.BigNumber;

@ -1,8 +1,8 @@
import ether from './helpers/ether'; import ether from '../helpers/ether';
import { advanceBlock } from './helpers/advanceToBlock'; import { advanceBlock } from '../helpers/advanceToBlock';
import { increaseTimeTo, duration } from './helpers/increaseTime'; import { increaseTimeTo, duration } from '../helpers/increaseTime';
import latestTime from './helpers/latestTime'; import latestTime from '../helpers/latestTime';
import EVMRevert from './helpers/EVMRevert'; import EVMRevert from '../helpers/EVMRevert';
const BigNumber = web3.BigNumber; const BigNumber = web3.BigNumber;

@ -1,8 +1,8 @@
import ether from './helpers/ether'; import ether from '../helpers/ether';
import { advanceBlock } from './helpers/advanceToBlock'; import { advanceBlock } from '../helpers/advanceToBlock';
import { increaseTimeTo, duration } from './helpers/increaseTime'; import { increaseTimeTo, duration } from '../helpers/increaseTime';
import latestTime from './helpers/latestTime'; import latestTime from '../helpers/latestTime';
import EVMRevert from './helpers/EVMRevert'; import EVMRevert from '../helpers/EVMRevert';
const BigNumber = web3.BigNumber; const BigNumber = web3.BigNumber;

@ -1,6 +1,6 @@
var Destructible = artifacts.require('../contracts/lifecycle/Destructible.sol'); var Destructible = artifacts.require('../contracts/lifecycle/Destructible.sol');
require('./helpers/transactionMined.js'); require('../helpers/transactionMined.js');
contract('Destructible', function (accounts) { contract('Destructible', function (accounts) {
it('should send balance to owner after destruction', async function () { it('should send balance to owner after destruction', async function () {

@ -1,5 +1,5 @@
import assertRevert from './helpers/assertRevert'; import assertRevert from '../helpers/assertRevert';
const PausableMock = artifacts.require('mocks/PausableMock.sol'); const PausableMock = artifacts.require('mocks/PausableMock.sol');
contract('Pausable', function (accounts) { contract('Pausable', function (accounts) {

@ -1,7 +1,7 @@
var TokenDestructible = artifacts.require('../contracts/lifecycle/TokenDestructible.sol'); var TokenDestructible = artifacts.require('../contracts/lifecycle/TokenDestructible.sol');
var StandardTokenMock = artifacts.require('mocks/StandardTokenMock.sol'); var StandardTokenMock = artifacts.require('mocks/StandardTokenMock.sol');
require('./helpers/transactionMined.js'); require('../helpers/transactionMined.js');
contract('TokenDestructible', function (accounts) { contract('TokenDestructible', function (accounts) {
let destructible; let destructible;

@ -1,5 +1,5 @@
import assertRevert from './helpers/assertRevert'; import assertRevert from '../helpers/assertRevert';
const assertJump = require('./helpers/assertJump'); const assertJump = require('../helpers/assertJump');
var SafeMathMock = artifacts.require('mocks/SafeMathMock.sol'); var SafeMathMock = artifacts.require('mocks/SafeMathMock.sol');
contract('SafeMath', function (accounts) { contract('SafeMath', function (accounts) {

@ -0,0 +1,17 @@
pragma solidity ^0.4.18;
import "../../contracts/math/Math.sol";
contract MathMock {
uint64 public result;
function max64(uint64 a, uint64 b) public {
result = Math.max64(a, b);
}
function min64(uint64 a, uint64 b) public {
result = Math.min64(a, b);
}
}

@ -1,5 +1,5 @@
import expectThrow from './helpers/expectThrow'; import expectThrow from '../helpers/expectThrow';
const CanReclaimToken = artifacts.require('../contracts/ownership/CanReclaimToken.sol'); const CanReclaimToken = artifacts.require('../contracts/ownership/CanReclaimToken.sol');
const BasicTokenMock = artifacts.require('mocks/BasicTokenMock.sol'); const BasicTokenMock = artifacts.require('mocks/BasicTokenMock.sol');

@ -1,5 +1,5 @@
import assertRevert from './helpers/assertRevert'; import assertRevert from '../helpers/assertRevert';
var Claimable = artifacts.require('../contracts/ownership/Claimable.sol'); var Claimable = artifacts.require('../contracts/ownership/Claimable.sol');

@ -1,3 +1,4 @@
import assertRevert from '../helpers/assertRevert';
var DelayedClaimable = artifacts.require('../contracts/ownership/DelayedClaimable.sol'); var DelayedClaimable = artifacts.require('../contracts/ownership/DelayedClaimable.sol');
@ -42,25 +43,13 @@ contract('DelayedClaimable', function (accounts) {
assert.equal(start, 100); assert.equal(start, 100);
let pendingOwner = await delayedClaimable.pendingOwner(); let pendingOwner = await delayedClaimable.pendingOwner();
assert.equal(pendingOwner, accounts[1]); assert.equal(pendingOwner, accounts[1]);
var err = null; await assertRevert(delayedClaimable.claimOwnership({ from: accounts[1] }));
try {
await delayedClaimable.claimOwnership({ from: accounts[1] });
} catch (error) {
err = error;
}
assert.isFalse(err.message.search('revert') === -1);
let owner = await delayedClaimable.owner(); let owner = await delayedClaimable.owner();
assert.isTrue(owner !== accounts[1]); assert.isTrue(owner !== accounts[1]);
}); });
it('set end and start invalid values fail', async function () { it('set end and start invalid values fail', async function () {
await delayedClaimable.transferOwnership(accounts[1]); await delayedClaimable.transferOwnership(accounts[1]);
var err = null; await assertRevert(delayedClaimable.setLimits(1001, 1000));
try {
await delayedClaimable.setLimits(1001, 1000);
} catch (error) {
err = error;
}
assert.isFalse(err.message.search('revert') === -1);
}); });
}); });

@ -1,5 +1,5 @@
import expectThrow from './helpers/expectThrow'; import expectThrow from '../helpers/expectThrow';
const Ownable = artifacts.require('../contracts/ownership/Ownable.sol'); const Ownable = artifacts.require('../contracts/ownership/Ownable.sol');
const HasNoContracts = artifacts.require( const HasNoContracts = artifacts.require(

@ -1,6 +1,6 @@
import expectThrow from './helpers/expectThrow'; import expectThrow from '../helpers/expectThrow';
import toPromise from './helpers/toPromise'; import toPromise from '../helpers/toPromise';
const HasNoEtherTest = artifacts.require('../mocks/HasNoEtherTest.sol'); const HasNoEtherTest = artifacts.require('../mocks/HasNoEtherTest.sol');
const ForceEther = artifacts.require('../mocks/ForceEther.sol'); const ForceEther = artifacts.require('../mocks/ForceEther.sol');

@ -1,5 +1,5 @@
import expectThrow from './helpers/expectThrow'; import expectThrow from '../helpers/expectThrow';
const HasNoTokens = artifacts.require('../contracts/lifecycle/HasNoTokens.sol'); const HasNoTokens = artifacts.require('../contracts/lifecycle/HasNoTokens.sol');
const ERC23TokenMock = artifacts.require('mocks/ERC23TokenMock.sol'); const ERC23TokenMock = artifacts.require('mocks/ERC23TokenMock.sol');

@ -1,5 +1,5 @@
import assertRevert from './helpers/assertRevert'; import assertRevert from '../helpers/assertRevert';
var Ownable = artifacts.require('../contracts/ownership/Ownable.sol'); var Ownable = artifacts.require('../contracts/ownership/Ownable.sol');

@ -1,5 +1,5 @@
import expectThrow from './helpers/expectThrow'; import expectThrow from '../../helpers/expectThrow';
import expectEvent from './helpers/expectEvent'; import expectEvent from '../../helpers/expectEvent';
const RBACMock = artifacts.require('mocks/RBACMock.sol'); const RBACMock = artifacts.require('mocks/RBACMock.sol');
@ -45,17 +45,17 @@ contract('RBAC', function (accounts) {
.should.be.fulfilled; .should.be.fulfilled;
}); });
it('does not allow admins to call #nobodyCanDoThis', async () => { it('does not allow admins to call #nobodyCanDoThis', async () => {
expectThrow( await expectThrow(
mock.nobodyCanDoThis({ from: admin }) mock.nobodyCanDoThis({ from: admin })
); );
}); });
it('does not allow advisors to call #nobodyCanDoThis', async () => { it('does not allow advisors to call #nobodyCanDoThis', async () => {
expectThrow( await expectThrow(
mock.nobodyCanDoThis({ from: advisors[0] }) mock.nobodyCanDoThis({ from: advisors[0] })
); );
}); });
it('does not allow anyone to call #nobodyCanDoThis', async () => { it('does not allow anyone to call #nobodyCanDoThis', async () => {
expectThrow( await expectThrow(
mock.nobodyCanDoThis({ from: anyone }) mock.nobodyCanDoThis({ from: anyone })
); );
}); });
@ -69,14 +69,14 @@ contract('RBAC', function (accounts) {
}); });
it('announces a RoleAdded event on addRole', async () => { it('announces a RoleAdded event on addRole', async () => {
expectEvent.inTransaction( await expectEvent.inTransaction(
mock.adminAddRole(futureAdvisor, ROLE_ADVISOR, { from: admin }), mock.adminAddRole(futureAdvisor, ROLE_ADVISOR, { from: admin }),
'RoleAdded' 'RoleAdded'
); );
}); });
it('announces a RoleRemoved event on removeRole', async () => { it('announces a RoleRemoved event on removeRole', async () => {
expectEvent.inTransaction( await expectEvent.inTransaction(
mock.adminRemoveRole(futureAdvisor, ROLE_ADVISOR, { from: admin }), mock.adminRemoveRole(futureAdvisor, ROLE_ADVISOR, { from: admin }),
'RoleRemoved' 'RoleRemoved'
); );
@ -85,12 +85,12 @@ contract('RBAC', function (accounts) {
context('in adversarial conditions', () => { context('in adversarial conditions', () => {
it('does not allow an advisor to remove another advisor', async () => { it('does not allow an advisor to remove another advisor', async () => {
expectThrow( await expectThrow(
mock.removeAdvisor(advisors[1], { from: advisors[0] }) mock.removeAdvisor(advisors[1], { from: advisors[0] })
); );
}); });
it('does not allow "anyone" to remove an advisor', async () => { it('does not allow "anyone" to remove an advisor', async () => {
expectThrow( await expectThrow(
mock.removeAdvisor(advisors[0], { from: anyone }) mock.removeAdvisor(advisors[0], { from: anyone })
); );
}); });

@ -5,7 +5,7 @@ require('chai')
.use(require('chai-bignumber')(BigNumber)) .use(require('chai-bignumber')(BigNumber))
.should(); .should();
const EVMThrow = require('./helpers/EVMThrow.js'); const EVMThrow = require('../helpers/EVMThrow.js');
const SplitPayment = artifacts.require('../contracts/payment/SplitPayment.sol'); const SplitPayment = artifacts.require('../contracts/payment/SplitPayment.sol');
contract('SplitPayment', function ([owner, payee1, payee2, payee3, nonpayee1, payer1]) { contract('SplitPayment', function ([owner, payee1, payee2, payee3, nonpayee1, payer1]) {

@ -1,4 +1,4 @@
import assertRevert from './helpers/assertRevert'; import assertRevert from '../helpers/assertRevert';
var BasicTokenMock = artifacts.require('mocks/BasicTokenMock.sol'); var BasicTokenMock = artifacts.require('mocks/BasicTokenMock.sol');

@ -1,5 +1,5 @@
const EVMRevert = require('./helpers/EVMRevert.js'); const EVMRevert = require('../helpers/EVMRevert.js');
const BurnableTokenMock = artifacts.require('mocks/BurnableTokenMock.sol'); const BurnableTokenMock = artifacts.require('mocks/BurnableTokenMock.sol');
const BigNumber = web3.BigNumber; const BigNumber = web3.BigNumber;

@ -1,6 +1,6 @@
import expectThrow from './helpers/expectThrow'; import expectThrow from '../helpers/expectThrow';
import ether from './helpers/ether'; import ether from '../helpers/ether';
var CappedToken = artifacts.require('../contracts/Tokens/CappedToken.sol'); var CappedToken = artifacts.require('../contracts/Tokens/CappedToken.sol');

@ -1,5 +1,5 @@
import expectThrow from './helpers/expectThrow'; import expectThrow from '../helpers/expectThrow';
var MintableToken = artifacts.require('../contracts/Tokens/MintableToken.sol'); var MintableToken = artifacts.require('../contracts/Tokens/MintableToken.sol');
contract('Mintable', function (accounts) { contract('Mintable', function (accounts) {

@ -1,6 +1,6 @@
'user strict'; 'user strict';
import assertRevert from './helpers/assertRevert'; import assertRevert from '../helpers/assertRevert';
var PausableTokenMock = artifacts.require('./mocks/PausableTokenMock.sol'); var PausableTokenMock = artifacts.require('./mocks/PausableTokenMock.sol');
contract('PausableToken', function (accounts) { contract('PausableToken', function (accounts) {

@ -1,4 +1,4 @@
import EVMThrow from './helpers/EVMThrow'; import EVMThrow from '../helpers/EVMThrow';
require('chai') require('chai')
.use(require('chai-as-promised')) .use(require('chai-as-promised'))

@ -1,5 +1,5 @@
import assertRevert from './helpers/assertRevert'; import assertRevert from '../helpers/assertRevert';
var StandardTokenMock = artifacts.require('mocks/StandardTokenMock.sol'); var StandardTokenMock = artifacts.require('mocks/StandardTokenMock.sol');

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save