/ test / contracts / token_storage.sol
token_storage.sol
 1  // https://github.com/nexusdev/erc20/blob/master/contracts/base.sol
 2  
 3  pragma solidity ^0.4.7;
 4  
 5  contract TokenStorage {
 6  
 7    event Transfer(address indexed from, address indexed to, uint value);
 8    event Approval( address indexed owner, address indexed spender, uint value);
 9  
10    mapping( address => uint ) _balances;
11    mapping( address => mapping( address => uint ) ) _approvals;
12    uint _supply;
13    address public addr;
14  
15    constructor( uint initial_balance, address _addr) public {
16      _balances[msg.sender] = initial_balance;
17      _supply = initial_balance;
18      addr = _addr;
19    }
20  
21    function totalSupply() public view returns (uint supply) {
22      return _supply;
23    }
24  
25    function balanceOf(address who) public view returns (uint value) {
26      return _balances[who];
27    }
28  
29    function transfer(address to, uint value) public returns (bool ok) {
30      if( _balances[msg.sender] < value ) {
31        revert();
32      }
33      if( !safeToAdd(_balances[to], value) ) {
34        revert();
35      }
36      _balances[msg.sender] -= value;
37      _balances[to] += value;
38      emit Transfer( msg.sender, to, value );
39      return true;
40    }
41  
42    function transferFrom(address from, address to, uint value) public returns (bool ok) {
43      // if you don't have enough balance, throw
44      if( _balances[from] < value ) {
45        revert();
46      }
47      // if you don't have approval, throw
48      if( _approvals[from][msg.sender] < value ) {
49        revert();
50      }
51      if( !safeToAdd(_balances[to], value) ) {
52        revert();
53      }
54      // transfer and return true
55      _approvals[from][msg.sender] -= value;
56      _balances[from] -= value;
57      _balances[to] += value;
58      emit Transfer( from, to, value );
59      return true;
60    }
61  
62    function approve(address spender, uint value) public returns (bool ok) {
63      // TODO: should increase instead
64      _approvals[msg.sender][spender] = value;
65      emit Approval( msg.sender, spender, value );
66      return true;
67    }
68  
69    function allowance(address owner, address spender) public view returns (uint _allowance) {
70      return _approvals[owner][spender];
71    }
72  
73    function safeToAdd(uint a, uint b) internal pure returns (bool) {
74      return (a + b >= a);
75    }
76  }