diff --git a/contracts/crowdsale/Crowdsale.sol b/contracts/crowdsale/Crowdsale.sol index c1302ede4..f425718fd 100644 --- a/contracts/crowdsale/Crowdsale.sol +++ b/contracts/crowdsale/Crowdsale.sol @@ -57,7 +57,7 @@ contract Crowdsale { * @param wallet Address where collected funds will be forwarded to * @param token Address of the token being sold */ - constructor(uint256 rate, address wallet, IERC20 token) public { + constructor(uint256 rate, address wallet, IERC20 token) internal { require(rate > 0); require(wallet != address(0)); require(token != address(0)); @@ -152,6 +152,7 @@ contract Crowdsale { uint256 weiAmount ) internal + view { require(beneficiary != address(0)); require(weiAmount != 0); @@ -167,6 +168,7 @@ contract Crowdsale { uint256 weiAmount ) internal + view { // optional override } diff --git a/contracts/crowdsale/distribution/FinalizableCrowdsale.sol b/contracts/crowdsale/distribution/FinalizableCrowdsale.sol index a640dca83..bcdfa4563 100644 --- a/contracts/crowdsale/distribution/FinalizableCrowdsale.sol +++ b/contracts/crowdsale/distribution/FinalizableCrowdsale.sol @@ -15,7 +15,7 @@ contract FinalizableCrowdsale is TimedCrowdsale { event CrowdsaleFinalized(); - constructor() public { + constructor() internal { _finalized = false; } diff --git a/contracts/crowdsale/distribution/PostDeliveryCrowdsale.sol b/contracts/crowdsale/distribution/PostDeliveryCrowdsale.sol index da9392aed..ca05f6d66 100644 --- a/contracts/crowdsale/distribution/PostDeliveryCrowdsale.sol +++ b/contracts/crowdsale/distribution/PostDeliveryCrowdsale.sol @@ -13,6 +13,8 @@ contract PostDeliveryCrowdsale is TimedCrowdsale { mapping(address => uint256) private _balances; + constructor() internal {} + /** * @dev Withdraw tokens only after crowdsale ends. * @param beneficiary Whose tokens will be withdrawn. diff --git a/contracts/crowdsale/distribution/RefundableCrowdsale.sol b/contracts/crowdsale/distribution/RefundableCrowdsale.sol index d55a573fb..d670f9ced 100644 --- a/contracts/crowdsale/distribution/RefundableCrowdsale.sol +++ b/contracts/crowdsale/distribution/RefundableCrowdsale.sol @@ -22,7 +22,7 @@ contract RefundableCrowdsale is FinalizableCrowdsale { * @dev Constructor, creates RefundEscrow. * @param goal Funding goal */ - constructor(uint256 goal) public { + constructor(uint256 goal) internal { require(goal > 0); _escrow = new RefundEscrow(wallet()); _goal = goal; diff --git a/contracts/crowdsale/emission/AllowanceCrowdsale.sol b/contracts/crowdsale/emission/AllowanceCrowdsale.sol index 736635e0b..ec9918feb 100644 --- a/contracts/crowdsale/emission/AllowanceCrowdsale.sol +++ b/contracts/crowdsale/emission/AllowanceCrowdsale.sol @@ -19,7 +19,7 @@ contract AllowanceCrowdsale is Crowdsale { * @dev Constructor, takes token wallet address. * @param tokenWallet Address holding the tokens, which has approved allowance to the crowdsale */ - constructor(address tokenWallet) public { + constructor(address tokenWallet) internal { require(tokenWallet != address(0)); _tokenWallet = tokenWallet; } diff --git a/contracts/crowdsale/emission/MintedCrowdsale.sol b/contracts/crowdsale/emission/MintedCrowdsale.sol index 62b03189a..3ebea857d 100644 --- a/contracts/crowdsale/emission/MintedCrowdsale.sol +++ b/contracts/crowdsale/emission/MintedCrowdsale.sol @@ -9,6 +9,7 @@ import "../../token/ERC20/ERC20Mintable.sol"; * Token ownership should be transferred to MintedCrowdsale for minting. */ contract MintedCrowdsale is Crowdsale { + constructor() internal {} /** * @dev Overrides delivery by minting tokens upon purchase. diff --git a/contracts/crowdsale/price/IncreasingPriceCrowdsale.sol b/contracts/crowdsale/price/IncreasingPriceCrowdsale.sol index 386c6202b..70189a168 100644 --- a/contracts/crowdsale/price/IncreasingPriceCrowdsale.sol +++ b/contracts/crowdsale/price/IncreasingPriceCrowdsale.sol @@ -20,7 +20,7 @@ contract IncreasingPriceCrowdsale is TimedCrowdsale { * @param initialRate Number of tokens a buyer gets per wei at the start of the crowdsale * @param finalRate Number of tokens a buyer gets per wei at the end of the crowdsale */ - constructor(uint256 initialRate, uint256 finalRate) public { + constructor(uint256 initialRate, uint256 finalRate) internal { require(finalRate > 0); require(initialRate >= finalRate); _initialRate = initialRate; diff --git a/contracts/crowdsale/validation/CappedCrowdsale.sol b/contracts/crowdsale/validation/CappedCrowdsale.sol index 21708c34a..4d9eb604d 100644 --- a/contracts/crowdsale/validation/CappedCrowdsale.sol +++ b/contracts/crowdsale/validation/CappedCrowdsale.sol @@ -16,7 +16,7 @@ contract CappedCrowdsale is Crowdsale { * @dev Constructor, takes maximum amount of wei accepted in the crowdsale. * @param cap Max amount of wei to be contributed */ - constructor(uint256 cap) public { + constructor(uint256 cap) internal { require(cap > 0); _cap = cap; } @@ -46,6 +46,7 @@ contract CappedCrowdsale is Crowdsale { uint256 weiAmount ) internal + view { super._preValidatePurchase(beneficiary, weiAmount); require(weiRaised().add(weiAmount) <= _cap); diff --git a/contracts/crowdsale/validation/IndividuallyCappedCrowdsale.sol b/contracts/crowdsale/validation/IndividuallyCappedCrowdsale.sol index d00cb602e..5a5d4e317 100644 --- a/contracts/crowdsale/validation/IndividuallyCappedCrowdsale.sol +++ b/contracts/crowdsale/validation/IndividuallyCappedCrowdsale.sol @@ -14,6 +14,8 @@ contract IndividuallyCappedCrowdsale is Crowdsale, CapperRole { mapping(address => uint256) private _contributions; mapping(address => uint256) private _caps; + constructor() internal {} + /** * @dev Sets a specific beneficiary's maximum contribution. * @param beneficiary Address to be capped @@ -53,6 +55,7 @@ contract IndividuallyCappedCrowdsale is Crowdsale, CapperRole { uint256 weiAmount ) internal + view { super._preValidatePurchase(beneficiary, weiAmount); require( diff --git a/contracts/crowdsale/validation/TimedCrowdsale.sol b/contracts/crowdsale/validation/TimedCrowdsale.sol index 098112cae..d39242578 100644 --- a/contracts/crowdsale/validation/TimedCrowdsale.sol +++ b/contracts/crowdsale/validation/TimedCrowdsale.sol @@ -26,7 +26,7 @@ contract TimedCrowdsale is Crowdsale { * @param openingTime Crowdsale opening time * @param closingTime Crowdsale closing time */ - constructor(uint256 openingTime, uint256 closingTime) public { + constructor(uint256 openingTime, uint256 closingTime) internal { // solium-disable-next-line security/no-block-members require(openingTime >= block.timestamp); require(closingTime >= openingTime); @@ -77,6 +77,7 @@ contract TimedCrowdsale is Crowdsale { ) internal onlyWhileOpen + view { super._preValidatePurchase(beneficiary, weiAmount); } diff --git a/contracts/mocks/CrowdsaleMock.sol b/contracts/mocks/CrowdsaleMock.sol new file mode 100644 index 000000000..834105e6a --- /dev/null +++ b/contracts/mocks/CrowdsaleMock.sol @@ -0,0 +1,9 @@ +pragma solidity ^0.4.24; + +import "../crowdsale/Crowdsale.sol"; + +contract CrowdsaleMock is Crowdsale { + constructor(uint256 rate, address wallet, IERC20 token) public + Crowdsale(rate, wallet, token) { + } +} diff --git a/test/crowdsale/Crowdsale.test.js b/test/crowdsale/Crowdsale.test.js index 8875e9157..b7528e4e9 100644 --- a/test/crowdsale/Crowdsale.test.js +++ b/test/crowdsale/Crowdsale.test.js @@ -10,7 +10,7 @@ require('chai') .use(require('chai-bignumber')(BigNumber)) .should(); -const Crowdsale = artifacts.require('Crowdsale'); +const Crowdsale = artifacts.require('CrowdsaleMock'); const SimpleToken = artifacts.require('SimpleToken'); contract('Crowdsale', function ([_, investor, wallet, purchaser]) {