Skip to content

Instantly share code, notes, and snippets.

@hydai
Created January 21, 2019 04:53
Show Gist options
  • Save hydai/c81205d66bab7e712da524352a6ce59e to your computer and use it in GitHub Desktop.
Save hydai/c81205d66bab7e712da524352a6ce59e to your computer and use it in GitHub Desktop.
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;
}
}
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
);
}
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