Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pragma solidity ^0.4.21;
- contract Crowdsale {
- using SafeMath for uint256;
- // The token being sold
- ERC20 public token;
- // Address where funds are collected
- address public wallet;
- // How many token units a buyer gets per wei
- uint256 public rate;
- // Amount of wei raised
- 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);
- /**
- * @param _rate Number of token units a buyer gets per wei
- * @param _wallet Address where collected funds will be forwarded to
- * @param _token Address of the token being sold
- */
- constructor(uint256 _rate, address _wallet, ERC20 _token) public {
- require(_rate > 0);
- require(_wallet != address(0));
- require(_token != address(0));
- rate = _rate;
- wallet = _wallet;
- token = _token;
- }
- // -----------------------------------------
- // Crowdsale external interface
- // -----------------------------------------
- /**
- * @dev fallback function ***DO NOT OVERRIDE***
- */
- function () external payable {
- buyTokens(msg.sender);
- }
- /**
- * @dev low level token purchase ***DO NOT OVERRIDE***
- * @param _beneficiary Address performing the token purchase
- */
- function buyTokens(address _beneficiary) public payable {
- uint256 weiAmount = msg.value;
- _preValidatePurchase(_beneficiary, weiAmount);
- // calculate token amount to be created
- uint256 tokens = _getTokenAmount(weiAmount);
- // update state
- weiRaised = weiRaised.add(weiAmount);
- _processPurchase(_beneficiary, tokens);
- emit TokenPurchase(
- msg.sender,
- _beneficiary,
- weiAmount,
- tokens
- );
- _updatePurchasingState(_beneficiary, weiAmount);
- _forwardFunds();
- _postValidatePurchase(_beneficiary, weiAmount);
- }
- // -----------------------------------------
- // Internal interface (extensible)
- // -----------------------------------------
- /**
- * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. Use super to concatenate validations.
- * @param _beneficiary Address performing the token purchase
- * @param _weiAmount Value in wei involved in the purchase
- */
- function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal {
- require(_beneficiary != address(0));
- require(_weiAmount != 0);
- }
- /**
- * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid conditions are not met.
- * @param _beneficiary Address performing the token purchase
- * @param _weiAmount Value in wei involved in the purchase
- */
- function _postValidatePurchase(address _beneficiary, uint256 _weiAmount) internal {
- // optional override
- }
- /**
- * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends its tokens.
- * @param _beneficiary Address performing the token purchase
- * @param _tokenAmount Number of tokens to be emitted
- */
- function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal {
- token.transfer(_beneficiary, _tokenAmount);
- }
- /**
- * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens.
- * @param _beneficiary Address receiving the tokens
- * @param _tokenAmount Number of tokens to be purchased
- */
- function _processPurchase(address _beneficiary, uint256 _tokenAmount) internal {
- _deliverTokens(_beneficiary, _tokenAmount);
- }
- /**
- * @dev Override for extensions that require an internal state to check for validity (current user contributions, etc.)
- * @param _beneficiary Address receiving the tokens
- * @param _weiAmount Value in wei involved in the purchase
- */
- function _updatePurchasingState(address _beneficiary, uint256 _weiAmount) internal {
- // optional override
- }
- /**
- * @dev Override to extend the way in which ether is converted to tokens.
- * @param _weiAmount Value in wei to be converted into tokens
- * @return Number of tokens that can be purchased with the specified _weiAmount
- */
- function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) {
- return _weiAmount.mul(rate);
- }
- /**
- * @dev Determines how ETH is stored/forwarded on purchases.
- */
- function _forwardFunds() internal {
- wallet.transfer(msg.value);
- }
- }
- library SafeMath {
- function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
- if (a == 0) {
- return 0;
- }
- c = a * b;
- assert(c / a == b);
- return c;
- }
- function div(uint256 a, uint256 b) internal pure returns (uint256) {
- // assert(b > 0); // Solidity automatically throws when dividing by 0
- // uint256 c = a / b;
- // assert(a == b * c + a % b); // There is no case in which this doesn't hold
- return a / b;
- }
- function sub(uint256 a, uint256 b) internal pure returns (uint256) {
- assert(b <= a);
- return a - b;
- }
- function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
- c = a + b;
- assert(c >= a);
- return c;
- }
- }
- library Math {
- function max64(uint64 a, uint64 b) internal pure returns (uint64) {
- return a >= b ? a : b;
- }
- function min64(uint64 a, uint64 b) internal pure returns (uint64) {
- return a < b ? a : b;
- }
- function max256(uint256 a, uint256 b) internal pure returns (uint256) {
- return a >= b ? a : b;
- }
- function min256(uint256 a, uint256 b) internal pure returns (uint256) {
- return a < b ? a : b;
- }
- }
- contract ERC20Basic {
- function totalSupply() public view returns (uint256);
- function balanceOf(address who) public view returns (uint256);
- function transfer(address to, uint256 value) public returns (bool);
- event Transfer(address indexed from, address indexed to, uint256 value);
- }
- contract BasicToken is ERC20Basic {
- using SafeMath for uint256;
- mapping(address => uint256) balances;
- uint256 totalSupply_;
- function totalSupply() public view returns (uint256) {
- return totalSupply_;
- }
- function transfer(address _to, uint256 _value) public returns (bool) {
- require(_to != address(0));
- require(_value <= balances[msg.sender]);
- balances[msg.sender] = balances[msg.sender].sub(_value);
- balances[_to] = balances[_to].add(_value);
- emit Transfer(msg.sender, _to, _value);
- return true;
- }
- function balanceOf(address _owner) public view returns (uint256) {
- return balances[_owner];
- }
- }
- contract ERC20 is ERC20Basic {
- function allowance(address owner, address spender) public view returns (uint256);
- function transferFrom(address from, address to, uint256 value) public returns (bool);
- function approve(address spender, uint256 value) public returns (bool);
- event Approval(address indexed owner, address indexed spender, uint256 value);
- }
- contract StandardToken is ERC20, BasicToken {
- mapping (address => mapping (address => uint256)) internal allowed;
- function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
- require(_to != address(0));
- require(_value <= balances[_from]);
- require(_value <= allowed[_from][msg.sender]);
- balances[_from] = balances[_from].sub(_value);
- balances[_to] = balances[_to].add(_value);
- allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
- emit Transfer(_from, _to, _value);
- return true;
- }
- function approve(address _spender, uint256 _value) public returns (bool) {
- allowed[msg.sender][_spender] = _value;
- emit Approval(msg.sender, _spender, _value);
- return true;
- }
- function allowance(address _owner, address _spender) public view returns (uint256) {
- return allowed[_owner][_spender];
- }
- function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
- allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
- emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
- return true;
- }
- function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
- uint oldValue = allowed[msg.sender][_spender];
- if (_subtractedValue > oldValue) {
- allowed[msg.sender][_spender] = 0;
- } else {
- allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
- }
- emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
- return true;
- }
- }
- contract Ownable {
- address public owner;
- event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
- constructor() public {
- owner = msg.sender;
- }
- modifier onlyOwner() {
- require(msg.sender == owner);
- _;
- }
- function transferOwnership(address newOwner) public onlyOwner {
- require(newOwner != address(0));
- emit OwnershipTransferred(owner, newOwner);
- owner = newOwner;
- }
- }
- contract MintableToken is StandardToken, Ownable {
- event Mint(address indexed to, uint256 amount);
- event MintFinished();
- bool public mintingFinished = false;
- modifier canMint() {
- require(!mintingFinished);
- _;
- }
- function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
- totalSupply_ = totalSupply_.add(_amount);
- balances[_to] = balances[_to].add(_amount);
- emit Mint(_to, _amount);
- emit Transfer(address(0), _to, _amount);
- return true;
- }
- function finishMinting() onlyOwner canMint public returns (bool) {
- mintingFinished = true;
- emit MintFinished();
- return true;
- }
- }
- contract MintedCrowdsale is Crowdsale {
- constructor(uint256 _rate, address _wallet, ERC20 _token) Crowdsale(_rate, _wallet, _token) public {}
- function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal {
- require(MintableToken(token).mint(_beneficiary, _tokenAmount));
- }
- }
Add Comment
Please, Sign In to add comment