Created
March 1, 2018 19:14
-
-
Save Ramarti/9a63feb9c23cd83859b0929578e6ffbd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 != address(0)); | |
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) public payable { | |
require(beneficiary != address(0)); | |
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment