Last active
April 2, 2018 16:45
-
-
Save Gim6626/4d3233f1f5bc866c7be268092f88287a 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
pragma solidity ^0.4.21; | |
// From https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/Receiver_Interface.sol | |
contract ContractReceiver { | |
function tokenFallback(address _from, uint _value, bytes _data) public; | |
} | |
// From https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/ERC223_Interface.sol | |
contract ERC223 { | |
uint public totalSupply; | |
function balanceOf(address who) public view returns (uint); | |
function name() public view returns (string _name); | |
function symbol() public view returns (string _symbol); | |
function decimals() public view returns (uint8 _decimals); | |
function totalSupply() public view returns (uint256 _supply); | |
function transfer(address to, uint value) public returns (bool ok); | |
function transfer(address to, uint value, bytes data) public returns (bool ok); | |
function transfer(address to, uint value, bytes data, string custom_fallback) public returns (bool ok); | |
event Transfer(address indexed from, address indexed to, uint value, bytes indexed data); | |
} | |
/* https://github.com/LykkeCity/EthereumApiDotNetCore/blob/master/src/ContractBuilder/contracts/token/SafeMath.sol */ | |
contract SafeMath { | |
uint256 constant public MAX_UINT256 = | |
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; | |
function safeAdd(uint256 x, uint256 y) pure internal returns (uint256 z) { | |
if (x > MAX_UINT256 - y) revert(); | |
return x + y; | |
} | |
function safeSub(uint256 x, uint256 y) pure internal returns (uint256 z) { | |
if (x < y) revert(); | |
return x - y; | |
} | |
function safeMul(uint256 x, uint256 y) pure internal returns (uint256 z) { | |
if (y == 0) return 0; | |
if (x > MAX_UINT256 / y) revert(); | |
return x * y; | |
} | |
} | |
/** | |
* ERC223 token by Dexaran | |
* | |
* https://github.com/Dexaran/ERC223-token-standard | |
*/ | |
contract ERC223Token is ERC223, SafeMath { | |
mapping(address => uint) balances; | |
string public name; | |
string public symbol; | |
uint8 public decimals; | |
uint256 public totalSupply; | |
// Function to access name of token . | |
function name() public view returns (string _name) { | |
return name; | |
} | |
// Function to access symbol of token . | |
function symbol() public view returns (string _symbol) { | |
return symbol; | |
} | |
// Function to access decimals of token . | |
function decimals() public view returns (uint8 _decimals) { | |
return decimals; | |
} | |
// Function to access total supply of tokens . | |
function totalSupply() public view returns (uint256 _totalSupply) { | |
return totalSupply; | |
} | |
// Function that is called when a user or another contract wants to transfer funds . | |
function transfer(address _to, uint _value, bytes _data, string _custom_fallback) public returns (bool success) { | |
if(isContract(_to)) { | |
if (balanceOf(msg.sender) < _value) revert(); | |
balances[msg.sender] = safeSub(balanceOf(msg.sender), _value); | |
balances[_to] = safeAdd(balanceOf(_to), _value); | |
assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data)); | |
emit Transfer(msg.sender, _to, _value, _data); | |
return true; | |
} | |
else { | |
return transferToAddress(_to, _value, _data); | |
} | |
} | |
// Function that is called when a user or another contract wants to transfer funds . | |
function transfer(address _to, uint _value, bytes _data) public returns (bool success) { | |
if(isContract(_to)) { | |
return transferToContract(_to, _value, _data); | |
} | |
else { | |
return transferToAddress(_to, _value, _data); | |
} | |
} | |
// Standard function transfer similar to ERC20 transfer with no _data . | |
// Added due to backwards compatibility reasons . | |
function transfer(address _to, uint _value) public returns (bool success) { | |
//standard function transfer similar to ERC20 transfer with no _data | |
//added due to backwards compatibility reasons | |
bytes memory empty; | |
if(isContract(_to)) { | |
return transferToContract(_to, _value, empty); | |
} | |
else { | |
return transferToAddress(_to, _value, empty); | |
} | |
} | |
//assemble the given address bytecode. If bytecode exists then the _addr is a contract. | |
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); | |
} | |
//function that is called when transaction target is an address | |
function transferToAddress(address _to, uint _value, bytes _data) private returns (bool success) { | |
if (balanceOf(msg.sender) < _value) revert(); | |
balances[msg.sender] = safeSub(balanceOf(msg.sender), _value); | |
balances[_to] = safeAdd(balanceOf(_to), _value); | |
emit Transfer(msg.sender, _to, _value, _data); | |
return true; | |
} | |
//function that is called when transaction target is a contract | |
function transferToContract(address _to, uint _value, bytes _data) private returns (bool success) { | |
if (balanceOf(msg.sender) < _value) revert(); | |
balances[msg.sender] = safeSub(balanceOf(msg.sender), _value); | |
balances[_to] = safeAdd(balanceOf(_to), _value); | |
ContractReceiver receiver = ContractReceiver(_to); | |
receiver.tokenFallback(msg.sender, _value, _data); | |
emit Transfer(msg.sender, _to, _value, _data); | |
return true; | |
} | |
function balanceOf(address _owner) public view returns (uint balance) { | |
return balances[_owner]; | |
} | |
} | |
contract QZToken is ERC223Token { | |
/* Initializes contract with initial supply tokens to the creator of the contract */ | |
function QZToken(string tokenName, string tokenSymbol, uint8 decimalUnits, uint256 initialSupply) public { | |
name = tokenName; // Set the name for display purposes | |
symbol = tokenSymbol; // Set the symbol for display purposes | |
decimals = decimalUnits; // Amount of decimals for display purposes | |
totalSupply = initialSupply * 10 ** uint(decimalUnits); // Update total supply | |
balances[msg.sender] = totalSupply; // Give the creator all initial tokens | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment