Skip to content

Instantly share code, notes, and snippets.

@kyriediculous
Forked from anonymous/Crowdsale.sol
Last active January 22, 2018 22:05
Show Gist options
  • Save kyriediculous/8ee78b06ec537964c8dfde0b8b658b25 to your computer and use it in GitHub Desktop.
Save kyriediculous/8ee78b06ec537964c8dfde0b8b658b25 to your computer and use it in GitHub Desktop.
Created using browser-solidity: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://ethereum.github.io/browser-solidity/#version=soljson-v0.4.19+commit.c4cbbb05.js&optimize=false&gist=
pragma solidity ^0.4.10;
import 'gist/ERC223ReceivingContract.sol';
import 'gist/SafeMath.sol';
import 'gist/StandardToken.sol';
import 'gist/Ownable.sol';
contract Crowdsale is Ownable {
using SafeMath for uint;
StandardToken public dollar;
StandardToken public vote;
uint public price;
event Buy(address _beneficiary, uint _amount);
event Round(uint _stage, uint _tokensRem, uint _newPrice);
modifier validPurchase {
require(msg.value > 0);
require(tokensAvailable() > 0);
_;
}
modifier hasEnded {
if (tokensAvailable()!=0) revert();
_;
}
function Crowdsale() public {
/**
* We choose to have the crowdsale deploy the tokens
* This guarantees the highest level of transparancy
* since it makes the crowdsale contract the owner of the tokens
* rather than the creator of the crowdsale contract
* */
price = 1 ether;
dollar = new StandardToken("Howest Dollar", "HWD", 18, 2000000000000000000000000);
vote = new StandardToken("Howest Vote", "HWV", 18, 500000000000000000000000);
StandardToken(dollar).transfer(owner, 500000000000000000000000);
}
//Fallback
function() public {
return buyFor(msg.sender);
}
function buy() public {
return buyFor(msg.sender);
}
function buyFor(address _beneficiary) public payable validPurchase{
uint amount = msg.value.div(price);
if (amount <= StandardToken(vote).balanceOf(this)) {
StandardToken(dollar).transfer(_beneficiary, amount);
StandardToken(vote).transfer(_beneficiary, amount);
Buy(_beneficiary, amount);
} else {
if (StandardToken(vote).balanceOf(this) != 0) {
StandardToken(dollar).transfer(_beneficiary, amount);
StandardToken(dollar).transfer(_beneficiary, StandardToken(vote).balanceOf(this));
price = 2 ether;
Round(2, StandardToken(dollar).balanceOf(this), price);
Buy(_beneficiary, amount);
}
StandardToken(dollar).transfer(_beneficiary, amount.div(2));
Buy(_beneficiary, amount.div(2));
}
forwardFunds();
}
function forwardFunds() internal {
owner.transfer(msg.value); //exception on failure
}
function tokensAvailable() public view returns (uint256) {
return StandardToken(dollar).balanceOf(this);
}
function kill() public hasEnded onlyOwner {
selfdestruct(owner);
}
}
pragma solidity ^0.4.10;
interface ERC20 {
function name()
public
view
returns (string);
function symbol()
public
view
returns (string);
function decimals()
public
view
returns (uint8);
function totalSupply()
public
view
returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
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 Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
pragma solidity ^0.4.10;
interface ERC223 {
function transferAndCall(address to, uint value, bytes data) public returns (bool);
event TransferAndCall(address indexed from, address indexed to, uint value, bytes indexed data);
}
pragma solidity ^0.4.10;
contract ERC223ReceivingContract {
function tokenFallback(address _from, uint _value, bytes _data) public;
}
pragma solidity ^0.4.10;
contract Ownable {
address public owner;
function Ownable() public {
owner = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
}
pragma solidity ^0.4.10;
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 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 c;
}
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) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
pragma solidity ^0.4.10;
import 'gist/SafeMath.sol';
import 'gist/ERC20.sol';
import 'gist/ERC223.sol';
import 'gist/ERC223ReceivingContract.sol';
contract StandardToken is ERC20, ERC223 {
using SafeMath for uint;
string internal _name;
string internal _symbol;
uint8 internal _decimals;
uint256 internal _totalSupply;
mapping (address => uint256) internal balances;
mapping (address => mapping (address => uint256)) internal allowed;
function StandardToken(string name, string symbol, uint8 decimals, uint256 totalSupply) public {
_symbol = symbol;
_name = name;
_decimals = decimals;
_totalSupply = totalSupply;
balances[msg.sender] = totalSupply;
}
function name()
public
view
returns (string) {
return _name;
}
function symbol()
public
view
returns (string) {
return _symbol;
}
function decimals()
public
view
returns (uint8) {
return _decimals;
}
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] = SafeMath.sub(balances[msg.sender], _value);
balances[_to] = SafeMath.add(balances[_to], _value);
Transfer(msg.sender, _to, _value);
return true;
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
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] = SafeMath.sub(balances[_from], _value);
balances[_to] = SafeMath.add(balances[_to], _value);
allowed[_from][msg.sender] = SafeMath.sub(allowed[_from][msg.sender], _value);
Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
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] = SafeMath.add(allowed[msg.sender][_spender], _addedValue);
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] = SafeMath.sub(oldValue, _subtractedValue);
}
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
function transferAndCall(address _to, uint _value, bytes _data) public returns (bool) {
require(_value > 0 );
if(isContract(_to)) {
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
receiver.tokenFallback(msg.sender, _value, _data);
}
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
TransferAndCall(msg.sender, _to, _value, _data);
return true;
}
function isContract(address _addr) private view returns (bool is_contract) {
uint length;
assembly {
//retrieve the size of the code on target address, this needs assembly
length := extcodesize(_addr)
}
return (length>0);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment