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 }