Created
January 21, 2019 04:53
-
-
Save hydai/c81205d66bab7e712da524352a6ce59e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.25; | |
import "./SafeMath.sol"; | |
import "./IERC20.sol"; | |
contract ERC20 is IERC20 { | |
using SafeMath for uint256; | |
string public constant name = "haha token"; | |
uint8 public constant decimals = 18; | |
string public constant symbol = "HHT"; | |
uint256 private _totalSupply; | |
mapping(address => uint256) _balances; | |
mapping(address => mapping(address => uint256)) _approve; | |
// 所有存在的 Token 數量 | |
function totalSupply() external view returns (uint256) { | |
return _totalSupply; | |
} | |
// 讀取 tokenOwner 這個 address 所持有的 Token 數量 | |
// address => uint256 | |
function balanceOf(address tokenOwner) external view returns (uint256 balance) { | |
return _balances[tokenOwner]; | |
} | |
// 從 msg.sender 轉 tokens 個 Token 給 to 這個 address | |
// msg.sender ---tokens---> to | |
function transfer(address to, uint256 tokens) external returns (bool success) { | |
return _transfer(msg.sender, to, tokens); | |
} | |
// 得到 tokenOwner 授權給 spender 使用的 Token 剩餘數量 | |
function allowance(address tokenOwner, address spender) external view returns (uint256 remaining) { | |
return _approve[tokenOwner][spender]; | |
} | |
// tokenOwner -> spender -> tokens | |
// address => address => uint256 | |
// msg.sender 授權給 spender 可使用自己的 tokens 個 Token | |
function approve(address spender, uint256 tokens) external returns (bool success) { | |
_approve[msg.sender][spender] = tokens; | |
emit Approval(msg.sender, spender, tokens); | |
return true; | |
} | |
// 將 tokens 個 Token 從 from 轉到 to | |
function transferFrom(address from, address to, uint256 tokens) external returns (bool success) { | |
_approve[from][msg.sender] = _approve[from][msg.sender].sub(tokens); | |
return _transfer(from, to, tokens); | |
} | |
function _transfer(address from, address to, uint256 tokens) internal returns (bool success) { | |
_balances[from] = _balances[from].sub(tokens); | |
_balances[to] = _balances[to].add(tokens); | |
emit Transfer(from, to, tokens); | |
return true; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.25; | |
interface IERC20 { | |
// 所有存在的 Token 數量 | |
function totalSupply() external view returns (uint256); | |
// 讀取 tokenOwner 這個 address 所持有的 Token 數量 | |
function balanceOf(address tokenOwner) external view returns (uint256 balance); | |
// 從 msg.sender 轉 tokens 個 Token 給 to 這個 address | |
function transfer(address to, uint256 tokens) external returns (bool success); | |
// 得到 tokenOwner 授權給 spender 使用的 Token 剩餘數量 | |
function allowance(address tokenOwner, address spender) | |
external view returns (uint256 remaining); | |
// msg.sender 授權給 spender 可使用自己的 tokens 個 Token | |
function approve(address spender, uint256 tokens) | |
external returns (bool success); | |
// 將 tokens 個 Token 從 from 轉到 to | |
function transferFrom(address from, address to, uint256 tokens) | |
external returns (bool success); | |
event Transfer( | |
address indexed from, | |
address indexed to, | |
uint256 tokens | |
); | |
event Approval( | |
address indexed owner, | |
address indexed spender, | |
uint256 tokens | |
); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.25; | |
library SafeMath { | |
function mul(uint256 a, uint256 b) internal pure returns (uint256) { | |
uint256 c = a * b; | |
require(c / a == b); | |
return c; | |
} | |
function div(uint256 a, uint256 b) internal pure returns (uint256) { | |
require(b > 0); // Solidity only automatically asserts when dividing by 0 | |
uint256 c = a / b; | |
return c; | |
} | |
function sub(uint256 a, uint256 b) internal pure returns (uint256) { | |
require(b <= a); // underflow | |
uint256 c = a - b; | |
return c; | |
} | |
function add(uint256 a, uint256 b) internal pure returns (uint256) { | |
uint256 c = a + b; | |
require(c >= a); // overflow | |
return c; | |
} | |
function mod(uint256 a, uint256 b) internal pure returns (uint256) { | |
require(b != 0); | |
return a % b; | |
} | |
} | |
contract Main { | |
function test() public pure returns (uint256) { | |
uint256 a = 100; | |
uint256 b = 10; | |
return SafeMath.add(a, b); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment