Created
September 25, 2017 09:59
-
-
Save computerphysicslab/3990c706a2f36fed56e31e72f59b61fb 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
/* | |
Watafan ICO Smart Contract v1.0 | |
developed by: | |
MarketPay.io , 2017 | |
https://marketpay.io/ | |
http://lnked.in/blockchain | |
v1.0 https://gist.github.com/computerphysicslab/3990c706a2f36fed56e31e72f59b61fb | |
+ ICO with deadline and synchronous wallet transfers | |
*/ | |
pragma solidity ^0.4.11; | |
/** | |
* @title SafeMath | |
* @dev Math operations with safety checks that throw on error | |
*/ | |
library SafeMath { | |
function mul(uint256 a, uint256 b) internal constant returns (uint256) { | |
uint256 c = a * b; | |
assert(a == 0 || c / a == b); | |
return c; | |
} | |
function div(uint256 a, uint256 b) internal constant 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 c; | |
} | |
function sub(uint256 a, uint256 b) internal constant returns (uint256) { | |
assert(b <= a); | |
return a - b; | |
} | |
function add(uint256 a, uint256 b) internal constant returns (uint256) { | |
uint256 c = a + b; | |
assert(c >= a); | |
return c; | |
} | |
} | |
/** | |
* @title Ownable | |
* @dev The Ownable contract has an owner address, and provides basic authorization control | |
* functions, this simplifies the implementation of "user permissions". | |
*/ | |
contract Ownable { | |
address public owner; | |
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); | |
/** | |
* @dev The Ownable constructor sets the original `owner` of the contract to the sender | |
* account. | |
*/ | |
function Ownable() { | |
owner = msg.sender; | |
} | |
/** | |
* @dev Throws if called by any account other than the owner. | |
*/ | |
modifier onlyOwner() { | |
require(msg.sender == owner); | |
_; | |
} | |
/** | |
* @dev Allows the current owner to transfer control of the contract to a newOwner. | |
* @param newOwner The address to transfer ownership to. | |
*/ | |
function transferOwnership(address newOwner) onlyOwner public { | |
require(newOwner != address(0)); | |
OwnershipTransferred(owner, newOwner); | |
owner = newOwner; | |
} | |
} | |
// Minimal interface of ERC20 token contract, just to cast the contract address and make it callable from the ICO contract | |
contract IFerc20Token { | |
function transfer(address _to, uint256 _amount) returns (bool success); | |
} | |
/** | |
* @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 | |
IFerc20Token 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); | |
// @notice A generic error log | |
event Error(string error); | |
function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, address _token) { | |
require(_startTime >= now); | |
require(_endTime >= _startTime); | |
require(_rate > 0); | |
require(_wallet != 0x0); | |
require(_token != 0x0); | |
startTime = _startTime; | |
endTime = _endTime; | |
rate = _rate; | |
wallet = _wallet; | |
token = IFerc20Token(_token); | |
} | |
// fallback function can be used to buy tokens | |
function () payable { | |
buyTokens(msg.sender); | |
} | |
// low level token purchase function | |
function buyTokens(address beneficiary) public payable returns (bool) { | |
if (beneficiary == 0x0) { | |
Error('buyTokens: beneficiary == 0x0'); | |
return false; | |
} | |
if (!validPurchase()) { | |
Error('buyTokens: Not validPurchase'); | |
return false; | |
} | |
uint256 weiAmount = msg.value; | |
// calculate token amount to be created | |
uint256 tokens = weiAmount.mul(rate); | |
// update state | |
weiRaised = weiRaised.add(weiAmount); | |
token.transfer(beneficiary, tokens); | |
TokenPurchase(msg.sender, beneficiary, weiAmount, tokens); | |
forwardFunds(); | |
return true; | |
} | |
// 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; | |
if (!withinPeriod) { | |
Error('validPurchase: Not withinPeriod'); | |
return false; | |
} | |
bool nonZeroPurchase = msg.value != 0; | |
if (!nonZeroPurchase) { | |
Error('validPurchase: ZeroPurchase'); | |
return false; | |
} | |
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