-
-
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=
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.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); | |
} | |
} |
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.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); | |
} |
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.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); | |
} |
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.10; | |
contract ERC223ReceivingContract { | |
function tokenFallback(address _from, uint _value, bytes _data) public; | |
} |
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.10; | |
contract Ownable { | |
address public owner; | |
function Ownable() public { | |
owner = msg.sender; | |
} | |
modifier onlyOwner { | |
require(msg.sender == owner); | |
_; | |
} | |
} |
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.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; | |
} | |
} |
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.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