Created
September 7, 2017 06:54
-
-
Save tina1998612/7a5c80bb3116f4331bbf4ace709676fa to your computer and use it in GitHub Desktop.
This file contains hidden or 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; | |
/** | |
* @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; | |
/** | |
* @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 { | |
if (newOwner != address(0)) { | |
owner = newOwner; | |
} | |
} | |
} | |
/** | |
* @title Pausable | |
* @dev Base contract which allows children to implement an emergency stop mechanism. | |
*/ | |
contract Pausable is Ownable { | |
event Pause(); | |
event Unpause(); | |
bool public paused = false; | |
/** | |
* @dev modifier to allow actions only when the contract IS paused | |
*/ | |
modifier whenNotPaused() { | |
require(!paused); | |
_; | |
} | |
/** | |
* @dev modifier to allow actions only when the contract IS NOT paused | |
*/ | |
modifier whenPaused { | |
require(paused); | |
_; | |
} | |
/** | |
* @dev called by the owner to pause, triggers stopped state | |
*/ | |
function pause() onlyOwner whenNotPaused returns (bool) { | |
paused = true; | |
Pause(); | |
return true; | |
} | |
/** | |
* @dev called by the owner to unpause, returns to normal state | |
*/ | |
function unpause() onlyOwner whenPaused returns (bool) { | |
paused = false; | |
Unpause(); | |
return true; | |
} | |
} | |
/** | |
* @title ERC20 interface | |
* @dev see https://github.com/ethereum/EIPs/issues/20 | |
*/ | |
contract ERC20 { | |
uint256 public totalSupply; | |
function balanceOf(address _owner) constant returns (uint256); | |
function transfer(address _to, uint256 _value) returns (bool); | |
function transferFrom(address _from, address _to, uint256 _value) returns (bool); | |
function approve(address _spender, uint256 _value) returns (bool); | |
function allowance(address _owner, address _spender) constant returns (uint256); | |
event Transfer(address indexed _from, address indexed _to, uint256 _value); | |
event Approval(address indexed _owner, address indexed _spender, uint256 _value); | |
} | |
/** | |
* | |
* Standard Mintable ERC20 Token | |
* https://github.com/ethereum/EIPs/issues/20 | |
* Based on code by FirstBlood: | |
* https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol | |
*/ | |
contract TestingTokenHi is ERC20, Ownable { | |
using SafeMath for uint256; | |
mapping(address => uint) balances; | |
mapping (address => mapping (address => uint)) allowed; | |
string public constant name = "Testing Token"; | |
string public constant symbol = "TTT"; | |
uint8 public constant decimals = 18; | |
bool public mintingFinished = false; | |
event Mint(address indexed to, uint256 amount); | |
event MintFinished(); | |
function TestingTokenHi() {} | |
function() payable { | |
revert(); | |
} | |
function balanceOf(address _owner) constant returns (uint256) { | |
return balances[_owner]; | |
} | |
function transfer(address _to, uint _value) returns (bool) { | |
balances[msg.sender] = balances[msg.sender].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
Transfer(msg.sender, _to, _value); | |
return true; | |
} | |
function transferFrom(address _from, address _to, uint _value) returns (bool) { | |
var _allowance = allowed[_from][msg.sender]; | |
balances[_to] = balances[_to].add(_value); | |
balances[_from] = balances[_from].sub(_value); | |
allowed[_from][msg.sender] = _allowance.sub(_value); | |
Transfer(_from, _to, _value); | |
return true; | |
} | |
function approve(address _spender, uint _value) returns (bool) { | |
allowed[msg.sender][_spender] = _value; | |
Approval(msg.sender, _spender, _value); | |
return true; | |
} | |
function allowance(address _owner, address _spender) constant returns (uint256) { | |
return allowed[_owner][_spender]; | |
} | |
modifier canMint() { | |
require(!mintingFinished); | |
_; | |
} | |
/** | |
* Function to mint tokens | |
* @param _to The address that will recieve the minted tokens. | |
* @param _amount The amount of tokens to mint. | |
* @return A boolean that indicates if the operation was successful. | |
*/ | |
function mint(address _to, uint256 _amount) onlyOwner canMint returns (bool) { | |
totalSupply = totalSupply.add(_amount); | |
balances[_to] = balances[_to].add(_amount); | |
Mint(_to, _amount); | |
return true; | |
} | |
/** | |
* Function to stop minting new tokens. | |
* @return True if the operation was successful. | |
*/ | |
function finishMinting() onlyOwner returns (bool) { | |
mintingFinished = true; | |
MintFinished(); | |
return true; | |
} | |
} | |
/** | |
* | |
* token purchases and assigns them tokens based | |
* on a token per ETH rate. Funds collected are forwarded to a wallet | |
* as they arrive. | |
*/ | |
contract TestingTokenHiSale is Pausable { | |
using SafeMath for uint256; | |
TestingTokenHi public token; | |
address public wallet; //wallet towards which the funds are forwarded | |
uint256 public weiRaised; //total amount of ether raised | |
uint256 public cap; // cap above which the presale ends | |
uint256 public minInvestment; // minimum investment (10 ether) | |
uint256 public rate; // number of tokens for one ether (20) | |
bool public isFinalized; | |
string public contactInformation; | |
/** | |
* 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); | |
/** | |
* event for signaling finished crowdsale | |
*/ | |
event Finalized(); | |
function TestingTokenHiSale() { | |
token = createTokenContract(); | |
wallet = 0x99892Ac6DA1b3851167Cb959fE945926bca89f09; | |
rate = 20; | |
minInvestment = 10 * (10**18); //minimum investment in wei (=10 ether) | |
cap = 295257 * (10**18); //cap in token base units (=295257 tokens) | |
} | |
// creates presale token | |
function createTokenContract() internal returns (TestingTokenHi) { | |
return new TestingTokenHi(); | |
} | |
// fallback function to buy tokens | |
function () payable { | |
buyTokens(msg.sender); | |
} | |
/** | |
* Low level token purchse function | |
* @param beneficiary will recieve the tokens. | |
*/ | |
function buyTokens(address beneficiary) payable whenNotPaused { | |
require(beneficiary != 0x0); | |
require(validPurchase()); | |
uint256 weiAmount = msg.value; | |
// update weiRaised | |
weiRaised = weiRaised.add(weiAmount); | |
// compute amount of tokens created | |
uint256 tokens = weiAmount.mul(rate); | |
token.mint(beneficiary, tokens); | |
TokenPurchase(msg.sender, beneficiary, weiAmount, tokens); | |
forwardFunds(); | |
} | |
// send ether to the fund collection wallet | |
function forwardFunds() internal { | |
wallet.transfer(msg.value); | |
} | |
// return true if the transaction can buy tokens | |
function validPurchase() internal constant returns (bool) { | |
uint256 weiAmount = weiRaised.add(msg.value); | |
bool notSmallAmount = msg.value >= minInvestment; | |
bool withinCap = weiAmount.mul(rate) <= cap; | |
return (notSmallAmount && withinCap); | |
} | |
//allow owner to finalize the presale once the presale is ended | |
function finalize() onlyOwner { | |
require(!isFinalized); | |
require(hasEnded()); | |
token.finishMinting(); | |
Finalized(); | |
isFinalized = true; | |
} | |
function setContactInformation(string info) onlyOwner { | |
contactInformation = info; | |
} | |
//return true if crowdsale event has ended | |
function hasEnded() public constant returns (bool) { | |
bool capReached = (weiRaised.mul(rate) >= cap); | |
return capReached; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment