github.com/inklabsfoundation/inkchain@v0.17.1-0.20181025012015-c3cef8062f19/examples/xc/eth/contracts/Token.sol (about) 1 pragma solidity ^0.4.19; 2 3 import "./TokenInterface.sol"; 4 import "./SafeMath.sol"; 5 6 contract Token is TokenInterface { 7 8 string public name; 9 10 string public symbol; 11 12 uint8 public decimals; 13 14 uint public totalSupply; 15 16 bool private status; 17 18 address private admin; 19 20 mapping(address => uint) private balances; 21 22 mapping(address => mapping(address => uint)) private allowed; 23 24 event Transfer(address indexed from, address indexed to, uint value); 25 26 event Approval(address indexed owner, address indexed spender, uint value); 27 28 function Token() public { 29 //TODO 30 name = "INK Coin"; 31 //TODO 32 symbol = "INK"; 33 //TODO 34 decimals = 9; 35 //TODO 36 uint initSupply = 10 * (10 ** 8); 37 38 totalSupply = SafeMath.mul(initSupply, (10 ** uint(decimals))); 39 40 balances[msg.sender] = totalSupply; 41 42 admin = msg.sender; 43 44 status = true; 45 } 46 47 function setStatus(bool _status) external { 48 49 require(msg.sender == admin); 50 51 if (status != _status) { 52 53 status = _status; 54 } 55 } 56 57 function getStatus() external view returns (bool) { 58 59 return status; 60 } 61 62 function setAdmin(address account) external { 63 64 require(msg.sender == admin); 65 66 if (admin != account) { 67 68 admin = account; 69 } 70 } 71 72 function getAdmin() external view returns (address) { 73 74 require(msg.sender == admin); 75 76 return admin; 77 } 78 79 function balanceOf(address owner) external view returns (uint) { 80 81 return balances[owner]; 82 } 83 84 function transfer(address to, uint value) external returns (bool) { 85 86 require(status); 87 88 require(to != address(0)); 89 90 require(totalSupply >= value && value > 0); 91 92 require(balances[msg.sender] >= value); 93 94 balances[msg.sender] = SafeMath.sub(balances[msg.sender], value); 95 96 balances[to] = SafeMath.add(balances[to], value); 97 98 emit Transfer(msg.sender, to, value); 99 100 return true; 101 } 102 103 function transferFrom(address from, address to, uint value) external returns (bool) { 104 105 require(status); 106 107 require(to != address(0)); 108 109 require(totalSupply >= value && value > 0); 110 111 require(balances[from] >= value); 112 113 require(allowed[from][msg.sender] >= value); 114 115 balances[from] = SafeMath.sub(balances[from], value); 116 117 balances[to] = SafeMath.add(balances[to], value); 118 119 allowed[from][msg.sender] = SafeMath.sub(allowed[from][msg.sender], value); 120 121 emit Transfer(from, to, value); 122 123 return true; 124 } 125 126 function allowance(address owner, address spender) external view returns (uint) { 127 128 return allowed[owner][spender]; 129 } 130 131 function approve(address spender, uint value) external returns (bool) { 132 133 return _approve(spender, value); 134 } 135 136 function _approve(address spender, uint value) internal returns (bool) { 137 138 allowed[msg.sender][spender] = value; 139 140 emit Approval(msg.sender, spender, value); 141 142 return true; 143 } 144 145 function increaseApproval(address spender, uint value) external returns (bool) { 146 147 return _increaseApproval(spender, value); 148 } 149 150 function _increaseApproval(address spender, uint value) internal returns (bool) { 151 152 allowed[msg.sender][spender] = SafeMath.add(allowed[msg.sender][spender], value); 153 154 emit Approval(msg.sender, spender, allowed[msg.sender][spender]); 155 156 return true; 157 } 158 159 function decreaseApproval(address spender, uint value) external returns (bool) { 160 161 return _decreaseApproval(spender, value); 162 } 163 164 function _decreaseApproval(address spender, uint value) internal returns (bool) { 165 166 if (value > allowed[msg.sender][spender]) { 167 168 allowed[msg.sender][spender] = 0; 169 } else { 170 171 allowed[msg.sender][spender] = SafeMath.sub(allowed[msg.sender][spender], value); 172 } 173 174 emit Approval(msg.sender, spender, allowed[msg.sender][spender]); 175 176 return true; 177 } 178 179 function approveAndCall(byte _symbol, address spender, uint value, bytes extraData) external returns (bool success) { 180 181 require(spender != address(0)); 182 183 require(_symbol == '-' || _symbol == '' || _symbol == '+'); 184 185 bool _status; 186 187 if (_symbol == '-') { 188 189 _status = _decreaseApproval(spender, value); 190 } 191 192 if (_symbol == '') { 193 194 _status = _approve(spender, value); 195 } 196 197 if (_symbol == '+') { 198 199 _status = _increaseApproval(spender, value); 200 } 201 202 if (_status) { 203 204 if (!spender.call(bytes4(bytes32(sha3("receiveApproval(address,uint,address,bytes)"))), msg.sender, value, this, extraData)) { 205 206 revert(); 207 } 208 209 return true; 210 } 211 } 212 }