Last active
April 4, 2018 14:04
-
-
Save Gim6626/63966a7a501bb752063b61537cbd827c 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; | |
/** | |
* Math operations with safety checks | |
* https://github.com/Dexaran/ERC223-token-standard/blob/master/SafeMath.sol | |
*/ | |
library SafeMath { | |
function mul(uint a, uint b) pure internal returns (uint) { | |
uint c = a * b; | |
assert(a == 0 || c / a == b); | |
return c; | |
} | |
function div(uint a, uint b) pure internal returns (uint) { | |
// assert(b > 0); // Solidity automatically throws when dividing by 0 | |
uint c = a / b; | |
// assert(a == b * c + a % b); // There is no case in which this doesn't hold | |
return c; | |
} | |
function sub(uint a, uint b) pure internal returns (uint) { | |
assert(b <= a); | |
return a - b; | |
} | |
function add(uint a, uint b) pure internal returns (uint) { | |
uint c = a + b; | |
assert(c >= a); | |
return c; | |
} | |
function max64(uint64 a, uint64 b) pure internal returns (uint64) { | |
return a >= b ? a : b; | |
} | |
function min64(uint64 a, uint64 b) pure internal returns (uint64) { | |
return a < b ? a : b; | |
} | |
function max256(uint256 a, uint256 b) pure internal returns (uint256) { | |
return a >= b ? a : b; | |
} | |
function min256(uint256 a, uint256 b) pure internal returns (uint256) { | |
return a < b ? a : b; | |
} | |
} | |
/** | |
* @title Contract that will work with ERC223 tokens. | |
* https://github.com/Dexaran/ERC223-token-standard/blob/ERC20_compatible/ERC223_receiving_contract.sol | |
*/ | |
contract ERC223ReceivingContract { | |
/** | |
* @dev Standard ERC223 function that will handle incoming token transfers. | |
* | |
* @param _from Token sender address. | |
* @param _value Amount of tokens. | |
* @param _data Transaction metadata. | |
*/ | |
function tokenFallback(address _from, uint _value, bytes _data) public; | |
} | |
/* | |
* @title ERC223 interface | |
* https://github.com/Dexaran/ERC223-token-standard/blob/ERC20_compatible/ERC223_interface.sol | |
*/ | |
contract ERC223Interface { | |
uint public totalSupply; | |
function balanceOf(address who) constant public returns (uint); | |
function transfer(address to, uint value) public; | |
function transfer(address to, uint value, bytes data) public; | |
event Transfer(address indexed from, address indexed to, uint value, bytes indexed data); | |
} | |
/* | |
* @title More compatibility with ERC20 | |
* https://github.com/Dexaran/ERC223-token-standard/blob/ERC20_compatible/ERC20_functions.sol with additions from ERC223Token from https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/ERC223_Token.sol | |
*/ | |
contract ERC20CompatibleToken { | |
using SafeMath for uint; | |
mapping(address => uint) balances; // List of user balances. | |
string public name; | |
string public symbol; | |
uint8 public decimals; | |
uint256 public totalSupply; | |
event Transfer(address indexed from, address indexed to, uint value); | |
event Approval(address indexed owner, address indexed spender, uint256 value); | |
mapping (address => mapping (address => uint256)) internal allowed; | |
// 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; | |
} | |
/** | |
* @dev Transfer tokens from one address to another | |
* @param _from address The address which you want to send tokens from | |
* @param _to address The address which you want to transfer to | |
* @param _value uint256 the amount of tokens to be transferred | |
*/ | |
function transferFrom(address _from, address _to, uint256 _value) public returns (bool); | |
/** | |
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. | |
* | |
* Beware that changing an allowance with this method brings the risk that someone may use both the old | |
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this | |
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: | |
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 | |
* @param _spender The address which will spend the funds. | |
* @param _value The amount of tokens to be spent. | |
*/ | |
function approve(address _spender, uint256 _value) public returns (bool) { | |
allowed[msg.sender][_spender] = _value; | |
emit Approval(msg.sender, _spender, _value); | |
return true; | |
} | |
/** | |
* @dev Function to check the amount of tokens that an owner allowed to a spender. | |
* @param _owner address The address which owns the funds. | |
* @param _spender address The address which will spend the funds. | |
* @return A uint256 specifying the amount of tokens still available for the spender. | |
*/ | |
function allowance(address _owner, address _spender) public view returns (uint256) { | |
return allowed[_owner][_spender]; | |
} | |
/** | |
* approve should be called when allowed[_spender] == 0. To increment | |
* allowed value is better to use this function to avoid 2 calls (and wait until | |
* the first transaction is mined) | |
* From MonolithDAO Token.sol | |
*/ | |
function increaseApproval(address _spender, uint _addedValue) public returns (bool) { | |
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); | |
emit 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] = oldValue.sub(_subtractedValue); | |
} | |
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); | |
return true; | |
} | |
} | |
/** | |
* @title Reference implementation of the ERC223 standard token. | |
* https://github.com/Dexaran/ERC223-token-standard/blob/ERC20_compatible/Token.sol | |
*/ | |
contract ERC223Token is ERC223Interface, ERC20CompatibleToken { | |
using SafeMath for uint; | |
/** | |
* @dev Transfer tokens from one address to another | |
* @param _from address The address which you want to send tokens from | |
* @param _to address The address which you want to transfer to | |
* @param _value uint256 the amount of tokens to be transferred | |
*/ | |
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] = balances[_from].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); | |
emit Transfer(_from, _to, _value); | |
bytes memory empty; | |
emit Transfer(_from, _to, _value, empty); | |
return true; | |
} | |
/** | |
* @dev Transfer the specified amount of tokens to the specified address. | |
* Invokes the `tokenFallback` function if the recipient is a contract. | |
* The token transfer fails if the recipient is a contract | |
* but does not implement the `tokenFallback` function | |
* or the fallback function to receive funds. | |
* | |
* @param _to Receiver address. | |
* @param _value Amount of tokens that will be transferred. | |
* @param _data Transaction metadata. | |
*/ | |
function transfer(address _to, uint _value, bytes _data) public { | |
// Standard function transfer similar to ERC20 transfer with no _data . | |
// Added due to backwards compatibility reasons . | |
uint codeLength; | |
assembly { | |
// Retrieve the size of the code on target address, this needs assembly . | |
codeLength := extcodesize(_to) | |
} | |
balances[msg.sender] = balances[msg.sender].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
if(codeLength>0) { | |
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to); | |
receiver.tokenFallback(msg.sender, _value, _data); | |
} | |
emit Transfer(msg.sender, _to, _value); | |
emit Transfer(msg.sender, _to, _value, _data); | |
} | |
/** | |
* @dev Transfer the specified amount of tokens to the specified address. | |
* This function works the same with the previous one | |
* but doesn't contain `_data` param. | |
* Added due to backwards compatibility reasons. | |
* | |
* @param _to Receiver address. | |
* @param _value Amount of tokens that will be transferred. | |
*/ | |
function transfer(address _to, uint _value) public { | |
uint codeLength; | |
bytes memory empty; | |
assembly { | |
// Retrieve the size of the code on target address, this needs assembly . | |
codeLength := extcodesize(_to) | |
} | |
balances[msg.sender] = balances[msg.sender].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
if(codeLength>0) { | |
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to); | |
receiver.tokenFallback(msg.sender, _value, empty); | |
} | |
emit Transfer(msg.sender, _to, _value); | |
emit Transfer(msg.sender, _to, _value, empty); | |
} | |
/** | |
* @dev Returns balance of the `_owner`. | |
* | |
* @param _owner The address whose balance will be returned. | |
* @return balance Balance of the `_owner`. | |
*/ | |
function balanceOf(address _owner) public constant 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