/
F_BaseToken.sol
111 lines (82 loc) · 3.35 KB
/
F_BaseToken.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
pragma solidity ^0.4.15;
import './F_SafeMath.sol';
contract ERC20 {
function totalSupply() constant returns (uint _totalSupply);
function balanceOf(address _owner) constant returns (uint balance);
function transfer(address _to, uint _value) returns (bool success);
function transferFrom(address _from, address _to, uint _value) returns (bool success);
function approve(address _spender, uint _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint remaining);
event Transfer(address indexed _from, address indexed _to, uint _value);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
contract BaseToken is ERC20 {
address public owner;
using SafeMath for uint256;
bool public tokenStatus = false;
modifier ownerOnly(){
require(msg.sender == owner);
_;
}
modifier onlyWhenTokenIsOn(){
require(tokenStatus == true);
_;
}
function onOff () ownerOnly{
tokenStatus = !tokenStatus;
}
/**
* @dev Fix for the ERC20 short address attack.
*/
modifier onlyPayloadSize(uint size) {
require(msg.data.length >= size + 4);
_;
}
mapping (address => uint256) public balances;
mapping(address => mapping(address => uint256)) allowed;
//Token Details
string public symbol = "BASE";
string public name = "Base Token";
uint8 public decimals = 18;
uint256 public totalSupply; //will be instantiated in the derived Contracts
function totalSupply() constant returns (uint256 ){
return totalSupply;
}
function balanceOf(address _owner) constant returns (uint balance){
return balances[_owner];
}
function transfer(address _to, uint _value) onlyWhenTokenIsOn onlyPayloadSize(2 * 32) returns (bool success){
//_value = _value.mul(1e18);
require(
balances[msg.sender]>=_value
&& _value > 0);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender,_to,_value);
return true;
}
function transferFrom(address _from, address _to, uint _value) onlyWhenTokenIsOn onlyPayloadSize(3 * 32) returns (bool success){
//_value = _value.mul(10**decimals);
require(
allowed[_from][msg.sender]>= _value
&& balances[_from] >= _value
&& _value >0
);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint _value) onlyWhenTokenIsOn returns (bool success){
//_value = _value.mul(10**decimals);
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) constant returns (uint remaining){
return allowed[_owner][_spender];
}
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}