-
Notifications
You must be signed in to change notification settings - Fork 0
/
CCN-all-in-one.sol
223 lines (191 loc) · 7.76 KB
/
CCN-all-in-one.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
pragma solidity 0.4.25;
contract ERC20 {
uint256 public totalSupply;
function balanceOf(address who) public view returns (uint256 _user);
function transfer(address to, uint256 value) public returns (bool success);
function allowance(address owner, address spender) public view returns (uint256 value);
function transferFrom(address from, address to, uint256 value) public returns (bool success);
function approve(address spender, uint256 value) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
uint c = a + b;
assert(c>=a);
return c;
}
function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
}
contract OnlyOwner {
address public owner;
address private controller;
//log the previous and new controller when event is fired.
event SetNewController(address prev_controller, address new_controller);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor() public {
owner = msg.sender;
controller = owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier isOwner {
require(msg.sender == owner);
_;
}
/**
* @dev Throws if called by any account other than the controller.
*/
modifier isController {
require(msg.sender == controller);
_;
}
function replaceController(address new_controller) isController public returns(bool){
require(new_controller != address(0x0));
controller = new_controller;
emit SetNewController(msg.sender,controller);
return true;
}
}
contract StandardToken is ERC20{
using SafeMath for uint256;
mapping(address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
function _transfer(address _from, address _to, uint256 _value) internal returns (bool success){
//prevent sending of tokens from genesis address or to self
require(_from != address(0) && _from != _to);
require(_to != address(0));
//subtract tokens from the sender on transfer
balances[_from] = balances[_from].safeSub(_value);
//add tokens to the receiver on reception
balances[_to] = balances[_to].safeAdd(_value);
return true;
}
function transfer(address _to, uint256 _value) public returns (bool success)
{
require(_value <= balances[msg.sender]);
_transfer(msg.sender,_to,_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
uint256 _allowance = allowed[_from][msg.sender];
//value must be less than allowed value
require(_value <= _allowance);
//balance of sender + token value transferred by sender must be greater than balance of sender
require(balances[_to] + _value > balances[_to]);
//call transfer function
_transfer(_from,_to,_value);
//subtract the amount allowed to the sender
allowed[_from][msg.sender] = _allowance.safeSub(_value);
//trigger Transfer event
emit Transfer(_from, _to, _value);
return true;
}
function balanceOf(address _owner) public constant returns (uint balance) {
return balances[_owner];
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value) public returns (bool) {
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(_spender,0)` if it is not
// already 0 to mitigate the race condition described here:
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
require((_value == 0) || (allowed[msg.sender][_spender] == 0));
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
}
contract CCN is StandardToken, OnlyOwner{
uint256 public constant decimals = 18;
string public constant name = "CustomContractNetwork";
string public constant symbol = "CCN";
string public constant version = "1.0";
uint256 public constant totalSupply = 890000000000*10**18;
uint256 private approvalCounts =0;
uint256 private minRequiredApprovals =2;
address public burnedTokensReceiver;
constructor() public{
balances[msg.sender] = totalSupply;
burnedTokensReceiver = 0x0000000000000000000000000000000000000000;
}
/**
* @dev Function to set approval count variable value.
* @param _value uint The value by which approvalCounts variable will be set.
*/
function setApprovalCounts(uint _value) public isController {
approvalCounts = _value;
}
/**
* @dev Function to set minimum require approval variable value.
* @param _value uint The value by which minRequiredApprovals variable will be set.
* @return true.
*/
function setMinApprovalCounts(uint _value) public isController returns (bool){
require(_value > 0);
minRequiredApprovals = _value;
return true;
}
/**
* @dev Function to get approvalCounts variable value.
* @return approvalCounts.
*/
function getApprovalCount() public view isController returns(uint){
return approvalCounts;
}
/**
* @dev Function to get burned Tokens Receiver address.
* @return burnedTokensReceiver.
*/
function getBurnedTokensReceiver() public view isController returns(address){
return burnedTokensReceiver;
}
function controllerApproval(address _from, uint256 _value) public isOwner returns (bool) {
require(minRequiredApprovals <= approvalCounts);
require(_value <= balances[_from]);
balances[_from] = balances[_from].safeSub(_value);
balances[burnedTokensReceiver] = balances[burnedTokensReceiver].safeAdd(_value);
emit Transfer(_from,burnedTokensReceiver, _value);
return true;
}
}