diff --git a/contracts/BaseToken.sol b/contracts/BaseToken.sol new file mode 100644 index 000000000..4fbea044f --- /dev/null +++ b/contracts/BaseToken.sol @@ -0,0 +1,54 @@ +pragma solidity ^0.4.0; + +// Everything throws instead of returning false on failure. +import './ERC20.sol'; + +/** + * ERC 20 token + * + * https://github.com/ethereum/EIPs/issues/20 + * Based on original code by FirstBlood: + * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol + */ +contract BaseToken is ERC20 { + + function transfer(address _to, uint256 _value) returns (bool success) { + if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) { + balances[msg.sender] -= _value; + balances[_to] += _value; + Transfer(msg.sender, _to, _value); + return true; + } else { return false; } + } + + function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { + if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) { + balances[_to] += _value; + balances[_from] -= _value; + allowed[_from][msg.sender] -= _value; + Transfer(_from, _to, _value); + return true; + } else { return false; } + } + + function balanceOf(address _owner) constant returns (uint256 balance) { + return balances[_owner]; + } + + function approve(address _spender, uint256 _value) returns (bool success) { + allowed[msg.sender][_spender] = _value; + Approval(msg.sender, _spender, _value); + return true; + } + + function allowance(address _owner, address _spender) constant returns (uint256 remaining) { + return allowed[_owner][_spender]; + } + + mapping(address => uint256) balances; + + mapping (address => mapping (address => uint256)) allowed; + + uint256 public totalSupply; + +} diff --git a/contracts/ERC20.sol b/contracts/ERC20.sol index 2ed37f73e..157bd9077 100644 --- a/contracts/ERC20.sol +++ b/contracts/ERC20.sol @@ -1,4 +1,8 @@ pragma solidity ^0.4.0; + + +// see https://github.com/ethereum/EIPs/issues/20 + contract ERC20 { function totalSupply() constant returns (uint); function balanceOf(address who) constant returns (uint); diff --git a/contracts/Token.sol b/contracts/Token.sol deleted file mode 100644 index 5e22ec2eb..000000000 --- a/contracts/Token.sol +++ /dev/null @@ -1,73 +0,0 @@ -pragma solidity ^0.4.0; -// Source: https://github.com/nexusdev/erc20 -// Flat file implementation of `dappsys/token/base.sol::DSTokenBase` - -// Everything throws instead of returning false on failure. -import './ERC20.sol'; - -contract Token is ERC20 { - - mapping( address => uint ) _balances; - mapping( address => mapping( address => uint ) ) _approvals; - uint _supply; - - function Token( uint initial_balance ) { - _balances[msg.sender] = initial_balance; - _supply = initial_balance; - } - - function totalSupply() constant returns (uint supply) { - return _supply; - } - - function balanceOf( address who ) constant returns (uint value) { - return _balances[who]; - } - - function transfer( address to, uint value) returns (bool ok) { - if( _balances[msg.sender] < value ) { - throw; - } - if( !safeToAdd(_balances[to], value) ) { - throw; - } - _balances[msg.sender] -= value; - _balances[to] += value; - Transfer( msg.sender, to, value ); - return true; - } - - function transferFrom( address from, address to, uint value) returns (bool ok) { - // if you don't have enough balance, throw - if( _balances[from] < value ) { - throw; - } - // if you don't have approval, throw - if( _approvals[from][msg.sender] < value ) { - throw; - } - if( !safeToAdd(_balances[to], value) ) { - throw; - } - // transfer and return true - _approvals[from][msg.sender] -= value; - _balances[from] -= value; - _balances[to] += value; - Transfer( from, to, value ); - return true; - } - - function approve(address spender, uint value) returns (bool ok) { - _approvals[msg.sender][spender] = value; - Approval( msg.sender, spender, value ); - return true; - } - - function allowance(address owner, address spender) constant returns (uint _allowance) { - return _approvals[owner][spender]; - } - - function safeToAdd(uint a, uint b) internal returns (bool) { - return (a + b >= a); - } -}