123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- pragma solidity ^0.4.11;
- import '../token/MintableToken.sol';
- import '../math/SafeMath.sol';
- /**
- * @title Crowdsale
- * @dev Crowdsale is a base contract for managing a token crowdsale.
- * Crowdsales have a start and end timestamps, where investors can make
- * token purchases and the crowdsale will assign them tokens based
- * on a token per ETH rate. Funds collected are forwarded to a wallet
- * as they arrive.
- */
- contract Crowdsale {
- using SafeMath for uint256;
- // The token being sold
- MintableToken public token;
- // start and end timestamps where investments are allowed (both inclusive)
- uint256 public startTime;
- uint256 public endTime;
- // address where funds are collected
- address public wallet;
- // how many token units a buyer gets per wei
- uint256 public rate;
- // amount of raised money in wei
- uint256 public weiRaised;
- /**
- * event for token purchase logging
- * @param purchaser who paid for the tokens
- * @param beneficiary who got the tokens
- * @param value weis paid for purchase
- * @param amount amount of tokens purchased
- */
- event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
- function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet) {
- require(_startTime >= now);
- require(_endTime >= _startTime);
- require(_rate > 0);
- require(_wallet != 0x0);
- token = createTokenContract();
- startTime = _startTime;
- endTime = _endTime;
- rate = _rate;
- 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
- function () payable {
- buyTokens(msg.sender);
- }
- // low level token purchase function
- function buyTokens(address beneficiary) payable {
- require(beneficiary != 0x0);
- require(validPurchase());
- uint256 weiAmount = msg.value;
- // calculate token amount to be created
- uint256 tokens = weiAmount.mul(rate);
- // update state
- weiRaised = weiRaised.add(weiAmount);
- token.mint(beneficiary, tokens);
- TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
- forwardFunds();
- }
- // send ether to the fund collection wallet
- // override to create custom fund forwarding mechanisms
- function forwardFunds() internal {
- wallet.transfer(msg.value);
- }
- // @return true if the transaction can buy tokens
- function validPurchase() internal constant returns (bool) {
- bool withinPeriod = now >= startTime && now <= endTime;
- bool nonZeroPurchase = msg.value != 0;
- return withinPeriod && nonZeroPurchase;
- }
- // @return true if crowdsale event has ended
- function hasEnded() public constant returns (bool) {
- return now > endTime;
- }
- }
|