/
HackerFederation.sol
189 lines (158 loc) · 5.78 KB
/
HackerFederation.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
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.6;
import 'https://github.com/qq79324055/openzeppelin-contracts/blob/release-v3.0.0/contracts/math/SafeMath.sol';
interface Token {
function balanceOf(address account) external view returns (uint256);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
contract HackerFederation {
using SafeMath for uint256;
// Hashrate decimals
uint256 public constant hashRateDecimals = 5;
// 10 usdt = 1 T
uint256 public constant hashRatePerUsdt = 10;
// Manager address
address public owner;
// Root address
address public rootAddress;
// Burn address
address public burnAddress;
// DAI-HE3 pair address
address public daiToHe3Address;
// DAI ERC20 address
address public daiTokenAddress;
Token tokenDai;
// HE-3 ERC20 address
address public he3TokenAddress;
Token tokenHe3;
// HE-1 ERC20 address
address public he1TokenAddress;
// Userinfo
struct User {
address superior;
uint256 hashRate;
bool isUser;
}
mapping(address => User) public users;
// Buy hashrate event
event LogBuyHashRate(address indexed owner, address indexed superior, uint256 hashRate);
constructor(
address _rootAddress,
address _burnAddress,
address _daiToHe3Address,
address _daiTokenAddress,
address _he3TokenAddress,
address _he1TokenAddress
) public {
owner = msg.sender;
rootAddress = _rootAddress;
burnAddress = _burnAddress;
daiToHe3Address = _daiToHe3Address;
daiTokenAddress = _daiTokenAddress;
tokenDai = Token(daiTokenAddress);
he3TokenAddress = _he3TokenAddress;
tokenHe3 = Token(he3TokenAddress);
he1TokenAddress = _he1TokenAddress;
}
// Modifier func
modifier onlyOwner() {
require(msg.sender == owner, "This function is restricted to the owner");
_;
}
modifier notAddress0(address newAddress) {
require(newAddress != address(0), "Address should not be address(0)");
_;
}
/**
* Use HE-1 to buy hashrate
*
* Requirements:
*
* - `_tokenAmount`: Amount of HE-1
* - `_superior`: User's inviter
*/
function buyHashRateWithHE1(uint256 _tokenAmount, address _superior) public {
_buyHashRate(he1TokenAddress, _tokenAmount, _tokenAmount.div(10**12), _superior);
}
/**
* Use HE-3 to buy hashrate
*
* Requirements:
*
* - `_tokenAmount`: Amount of HE-3
* - `_superior`: User's inviter
*/
function buyHashRateWithHE3(uint256 _tokenAmount, address _superior) public {
uint256 totalDai = getHe3ToDai(_tokenAmount);
_buyHashRate(he3TokenAddress, _tokenAmount, totalDai.div(10**12), _superior);
}
/**
* Buy hashrate
*
* Requirements:
*
* - `_token`: HE-1 or HE-3 address
* - `_tokenAmount`: Amount of token
* - `_usdtAmount`: Value of _tokenAmount to USDT
* - `_superior`: inviter
*/
function _buyHashRate(address _tokenAddress,uint256 _tokenAmount, uint256 _usdtAmount, address _superior) internal {
// require _superior
require(users[_superior].isUser || _superior == rootAddress, "Superiorshould be a user or rootAddress");
// burn the token sent by user
bool sent = Token(_tokenAddress).transferFrom(msg.sender, burnAddress, _tokenAmount);
require(sent, "Token transfer failed");
// USDT decimals = 6
require(_usdtAmount >= 10000000, "Usdt should be great than or equal 10");
uint256 hashRate = _usdtAmount.div(10).div(hashRatePerUsdt);
if (users[msg.sender].isUser) {
users[msg.sender].hashRate = users[msg.sender].hashRate.add(hashRate);
} else {
users[msg.sender].superior = _superior;
users[msg.sender].hashRate = hashRate;
users[msg.sender].isUser = true;
}
// Buy hashrate event
emit LogBuyHashRate(msg.sender, _superior, hashRate);
}
// Update owner address
function updateOwnerAddress(address _newOwnerAddress) public onlyOwner {
owner = _newOwnerAddress;
}
// Update burn address
function updateBurnAddress(address _newBurnAddress) public onlyOwner {
burnAddress = _newBurnAddress;
}
// update HE-3 contract address
function updateHe3TokenAddress(address _he3TokenAddress) public onlyOwner notAddress0(_he3TokenAddress) {
he3TokenAddress = _he3TokenAddress;
tokenHe3 = Token(he3TokenAddress);
}
// update HE-1 contract address
function updateHe1TokenAddress(address _he1TokenAddress) public onlyOwner notAddress0(_he1TokenAddress) {
he1TokenAddress = _he1TokenAddress;
}
// update DAI contract address
function updateDaiToHe3AddressAddress(address _daiToHe3Address) public onlyOwner notAddress0(_daiToHe3Address) {
daiToHe3Address = _daiToHe3Address;
}
// update DAI-HE3 uniswap pair contract address
function updateDaiTokenAddress(address _daiTokenAddress) public onlyOwner notAddress0(_daiTokenAddress) {
daiTokenAddress = _daiTokenAddress;
tokenDai = Token(daiTokenAddress);
}
/**
* Is user?
*/
function isUser(address _userAddress) public view returns (bool) {
return users[_userAddress].isUser;
}
// Get amount 1 HE3 to DAI
function getDaiPerHe3() public view returns (uint256) {
return getHe3ToDai(10**18);
}
// Get amount _he3Amount HE3 to DAI
function getHe3ToDai(uint256 _he3Amount) internal view returns (uint256) {
return tokenDai.balanceOf(daiToHe3Address).mul(_he3Amount).div(tokenHe3.balanceOf(daiToHe3Address));
}
}