ERC20.sol.in 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. SPDX-License-Identifier: GPL-3.0-or-later
  3. ERC Token Standard #20 Interface
  4. https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
  5. */
  6. pragma solidity $solc_ver_pat;
  7. contract SafeMath {
  8. function safeAdd(uint a, uint b) public pure returns (uint c) {
  9. c = a + b;
  10. require(c >= a);
  11. }
  12. function safeSub(uint a, uint b) public pure returns (uint c) {
  13. require(b <= a);
  14. c = a - b;
  15. }
  16. function safeMul(uint a, uint b) public pure returns (uint c) {
  17. c = a * b;
  18. require(a == 0 || c / a == b);
  19. }
  20. function safeDiv(uint a, uint b) public pure returns (uint c) {
  21. require(b > 0);
  22. c = a / b;
  23. }
  24. }
  25. abstract contract ERC20Interface {
  26. function totalSupply() public virtual returns (uint);
  27. function balanceOf(address tokenOwner) public virtual returns (uint balance);
  28. function allowance(address tokenOwner, address spender) public virtual returns (uint remaining);
  29. function transfer(address to, uint tokens) public virtual returns (bool success);
  30. function approve(address spender, uint tokens) public virtual returns (bool success);
  31. function transferFrom(address from, address to, uint tokens) public virtual returns (bool success);
  32. event Transfer(address indexed from, address indexed to, uint tokens);
  33. event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
  34. }
  35. contract Owned {
  36. address public owner;
  37. address public newOwner;
  38. event OwnershipTransferred(address indexed _from, address indexed _to);
  39. constructor() {
  40. owner = msg.sender;
  41. }
  42. modifier onlyOwner {
  43. require(msg.sender == owner);
  44. _;
  45. }
  46. function transferOwnership(address _newOwner) public onlyOwner {
  47. newOwner = _newOwner;
  48. }
  49. function acceptOwnership() public {
  50. require(msg.sender == newOwner);
  51. emit OwnershipTransferred(owner, newOwner);
  52. owner = newOwner;
  53. newOwner = address(0);
  54. }
  55. }
  56. // ----------------------------------------------------------------------------
  57. // ERC20 Token, with the addition of symbol, name and decimals and assisted
  58. // token transfers
  59. // ----------------------------------------------------------------------------
  60. contract Token is ERC20Interface, Owned, SafeMath {
  61. string public symbol;
  62. string public name;
  63. uint8 public decimals;
  64. uint public _totalSupply;
  65. mapping(address => uint) balances;
  66. mapping(address => mapping(address => uint)) allowed;
  67. constructor() {
  68. symbol = "$symbol";
  69. name = "$name";
  70. decimals = $decimals;
  71. _totalSupply = $supply;
  72. balances[$owner_addr] = _totalSupply;
  73. emit Transfer(address(0), $owner_addr, _totalSupply);
  74. }
  75. function totalSupply() public view override returns (uint) {
  76. return _totalSupply - balances[address(0)];
  77. }
  78. function balanceOf(address tokenOwner) public view override returns (uint balance) {
  79. return balances[tokenOwner];
  80. }
  81. function transfer(address to, uint tokens) public override returns (bool success) {
  82. balances[msg.sender] = safeSub(balances[msg.sender], tokens);
  83. balances[to] = safeAdd(balances[to], tokens);
  84. emit Transfer(msg.sender, to, tokens);
  85. return true;
  86. }
  87. function approve(address spender, uint tokens) public override returns (bool success) {
  88. allowed[msg.sender][spender] = tokens;
  89. emit Approval(msg.sender, spender, tokens);
  90. return true;
  91. }
  92. function transferFrom(address from, address to, uint tokens) public override returns (bool success) {
  93. balances[from] = safeSub(balances[from], tokens);
  94. allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], tokens);
  95. balances[to] = safeAdd(balances[to], tokens);
  96. emit Transfer(from, to, tokens);
  97. return true;
  98. }
  99. function allowance(address tokenOwner, address spender) public view override returns (uint remaining) {
  100. return allowed[tokenOwner][spender];
  101. }
  102. // Owner can transfer out any accidentally sent ERC20 tokens
  103. function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) {
  104. return ERC20Interface(tokenAddress).transfer(owner, tokens);
  105. }
  106. }