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  }