-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHivePointsToken.sol
More file actions
242 lines (168 loc) · 8.06 KB
/
HivePointsToken.sol
File metadata and controls
242 lines (168 loc) · 8.06 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
pragma solidity ^0.8.0;
interface IBEP20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function getOwner() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address _owner, address spender) external view returns (uint256);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
interface SharesInterface {
function test() external returns(bool);
function setToken(address contractAddress) external returns(bool);
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint256);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address _owner, address spender) external view returns (uint256);
function setAcceptnce(bool state) external returns(bool);
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function mint(address to, uint256 amount) external;
function burn(address user, uint256 amount) external returns(bool);
}
interface HiveInterface {
function isAddress(address user) external view returns(bool);
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint256);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address _owner, address spender) external view returns (uint256);
function stake(uint256 amount) external returns(bool);
function stakingStats(address user) external view returns (uint256 staked, uint256 rewards, uint256 stakingBlock);
function unstake(uint256 amount) external returns(bool);
function claim(address user) external;
function approve(address spender, uint256 amount) external returns (bool);
function increaseAllowance(address spender, uint256 addedValue) external;
function decreaseAllowance(address spender, uint256 subtractedValue) external;
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function burn(uint256 amount) external returns(bool);
function burnFor(address user, uint256 amount) external returns(bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract HivePointsToken is HiveInterface {
IBEP20 public token;
SharesInterface public sharesToken;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => uint256) private _block;
uint256 private _totalSupply = 0;
uint8 private _decimals = 18;
string private _symbol = "HP";
string private _name = "HivePoints";
function isAddress(address user) external view override returns(bool){
if(user == address(this)){return true;}
else{return false;}
}
bool tokenSet = false;
function setToken(address contractAddress) external {
require(!tokenSet);
token = IBEP20(contractAddress);
tokenSet = true;
}
bool tokenSet1 = false;
function setShares(address contractAddress) external {
require(!tokenSet1);
sharesToken = SharesInterface(contractAddress);
tokenSet1 = true;
}
function decimals() external view override returns (uint256) {
return 18;
}
function symbol() external view override returns (string memory) {
return _symbol;
}
function name() external view override returns (string memory) {
return _name;
}
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external view override returns (uint256) {
return _balances[account];
}
function allowance(address owner, address spender) external view override returns (uint256) {
return _allowances[owner][spender];
}
function stakingStats(address user) external view override returns (uint256 staked, uint256 rewards, uint256 stakingBlock){
staked = sharesToken.balanceOf(user);
rewards = sharesToken.balanceOf(user) / 1000 * (block.number - _block[user]) * 1;
stakingBlock = _block[user];
}
function claimRewards(address user) internal {
uint256 reward = sharesToken.balanceOf(user) / 1000 * (block.number - _block[user]) * 1;
_balances[user] += reward;
_block[user] = block.number;
_totalSupply += reward;
emit Transfer(address(this), user, reward);
}
function transfer(address recipient, uint256 amount) external override returns (bool) {
_balances[msg.sender] -= amount;
_balances[recipient] += amount;
emit Transfer(msg.sender, recipient, amount);
return true;
}
function stake(uint256 amount) external override returns(bool){
require(token.allowance(msg.sender, address(this)) >= amount);
require(token.balanceOf(msg.sender) >= amount);
claimRewards(msg.sender);
token.transferFrom(msg.sender, address(this), amount);
sharesToken.mint(msg.sender, amount);
return true;
}
function unstake(uint256 amount) external override returns(bool){
require(block.number - _block[msg.sender] >= 86400 );
require(sharesToken.balanceOf(msg.sender) >= amount);
claimRewards(msg.sender);
sharesToken.burn(msg.sender, amount);
token.transfer(msg.sender, amount);
return true;
}
function claim(address user) external override{
claimRewards(user);
}
function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
require(_allowances[sender][msg.sender] >= amount);
_balances[sender] -= amount;
_balances[recipient] += amount;
_allowances[sender][msg.sender] -= amount;
emit Transfer(msg.sender, recipient, amount);
return true;
}
function approve(address spender, uint256 amount) external override returns (bool) {
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, _allowances[msg.sender][spender]);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) external override {
_allowances[msg.sender][spender] += addedValue;
emit Approval(msg.sender, spender, _allowances[msg.sender][spender]);
}
function decreaseAllowance(address spender, uint256 subtractedValue) external override {
if(subtractedValue > _allowances[msg.sender][spender]){_allowances[msg.sender][spender] = 0;}
else {_allowances[msg.sender][spender] -= subtractedValue;}
emit Approval(msg.sender, spender, _allowances[msg.sender][spender]);
}
function burn(uint256 amount) external override returns(bool){
_balances[msg.sender] -= amount;
emit Transfer(msg.sender, address(this), 0);
return true;
}
function burnFor(address user, uint256 amount) external override returns(bool){
require(_allowances[user][msg.sender] >= amount);
_balances[user] -= amount;
_allowances[user][msg.sender] -= amount;
emit Transfer(user, address(this), 0);
return true;
}
}