-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMineBlocks.sol
More file actions
295 lines (203 loc) · 8.43 KB
/
MineBlocks.sol
File metadata and controls
295 lines (203 loc) · 8.43 KB
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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
pragma solidity ^0.4.19;
//vicent nos & enrique santos
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
function div(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;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function Ownable() internal {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
//////////////////////////////////////////////////////////////
// //
// MineBlocks, Shareholder's ERC20 //
// //
//////////////////////////////////////////////////////////////
contract MineBlocks is Ownable {
uint256 public totalSupply;
using SafeMath for uint256;
mapping(address => uint256) balances;
mapping(address => uint256) holded;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
if(block.number>blockEndICO || msg.sender==owner){
// SafeMath.sub will throw if there is not enough balance.
balances[msg.sender] = balances[msg.sender].sub(_value);
holded[_to]=block.number;
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
return true;
}
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
mapping (address => mapping (address => uint256)) internal allowed;
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
holded[_to]=block.number;
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, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
string public constant standard = "ERC20 MineBlocks";
/* Public variables for the ERC20 token, defined when calling the constructor */
string public name;
string public symbol;
uint8 public constant decimals = 8; // hardcoded to be a constant
// Contract variables and constants
uint256 public constant minPrice = 10e12;
uint256 public blockEndICO = block.number + uint256(259200);
uint256 public buyPrice = minPrice;
uint256 constant initialSupply=1000000000000000;
string constant tokenName="MineBlocks Token";
string constant tokenSymbol="MBK";
uint256 public tokenReward = 0;
// constant to simplify conversion of token amounts into integer form
uint256 private constant tokenUnit = uint256(10)**decimals;
// Spread in parts per 100 millions, such that expressing percentages is
// just to append the postfix 'e6'. For example, 4.53% is: spread = 4.53e6
address public MineBlocksAddr = 0xa9a3027bf228f1E85385BF06b4Db0eF62c66c14C;
//Declare logging events
event LogDeposit(address sender, uint amount);
/* Initializes contract with initial supply tokens to the creator of the contract */
function MineBlocks() public {
balances[msg.sender] = initialSupply; // Give the creator all initial tokens
totalSupply = initialSupply; // Update total supply
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
}
function () public payable {
buy(); // Allow to buy tokens sending ether direcly to contract
}
modifier status() {
_; // modified function code should go before prices update
if(balances[this]>900000000000000){
buyPrice=1500000000000000;
}else if(balances[this]>800000000000000 && balances[this]<=900000000000000){
buyPrice=2000000000000000;
}else if(balances[this]>700000000000000 && balances[this]<=800000000000000){
buyPrice=2500000000000000;
}else if(balances[this]>600000000000000 && balances[this]<=700000000000000){
buyPrice=3000000000000000;
}else{
buyPrice=4000000000000000;
}
}
function deposit() public payable status returns(bool success) {
// Check for overflows;
assert (this.balance + msg.value >= this.balance); // Check for overflows
tokenReward=this.balance/totalSupply;
//executes event to reflect the changes
LogDeposit(msg.sender, msg.value);
return true;
}
function withdrawReward() public status{
///if(block.number-holded[msg.sender]>172800){ //1 month
if(block.number-holded[msg.sender]>10){
holded[msg.sender]=block.number;
//send eth to owner address
msg.sender.transfer(tokenReward*balances[msg.sender]);
//executes event ro register the changes
LogWithdrawal(msg.sender, tokenReward*balances[msg.sender]);
}
}
event LogWithdrawal(address receiver, uint amount);
function withdraw(uint value) public onlyOwner {
//send eth to owner address
msg.sender.transfer(value);
//executes event ro register the changes
LogWithdrawal(msg.sender, value);
}
function transferBuy(address _to, uint256 _value) internal returns (bool) {
require(_to != address(0));
require(_value <= balances[this]);
// SafeMath.sub will throw if there is not enough balance.
balances[this] = balances[this].sub(_value);
holded[_to]=block.number;
balances[_to] = balances[_to].add(_value);
Transfer(this, _to, _value);
return true;
}
function buy() public payable status{
require (msg.sender.balance >= msg.value); // Check if the sender has enought eth to buy
assert (msg.sender.balance + msg.value >= msg.sender.balance); //check for overflows
uint256 tokenAmount = (msg.value / buyPrice)*tokenUnit ; // calculates the amount
transferBuy(msg.sender, tokenAmount);
MineBlocksAddr.transfer(msg.value);
}
/* Approve and then communicate the approved contract in a single tx */
function approveAndCall(address _spender, uint256 _value, bytes _extraData) public onlyOwner returns (bool success) {
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
}
contract tokenRecipient {
function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public ;
}