// SPDX-License-Identifier: MIT
pragma solidity ^0.6.6;
import "https://github.com/qq79324055/openzeppelin-contracts/blob/release-v3.0.0/contracts/token/ERC20/ERC20.sol";
interface HackerFederation {
function isUser(address _userAddress) external view returns (bool);
}
contract HE3 is ERC20 {
// Current supply
uint256 public _currentSupply;
// Manager
address public _owner;
// Burn address
address public _burnAddress;
// Fee address
address public _feeAddress;
// Initial Address
address public _initialAddress;
// Initial amount
uint256 public _initialToken;
// HF address
address public _interfacehf;
/**
* Constuctor func.
*
* Requirements:
*
* - `initialSupply`: total amount
* - `name`: token name
* - `symbol`: token symbol
*/
constructor(
uint256 initialSupply,
string memory name,
string memory symbol,
address initialAddress,
uint256 initialToken,
address feeAddress,
address burnAddress,
address hfcontract
) ERC20(name, symbol) public {
_owner = msg.sender;
_interfacehf = hfcontract;
_initialAddress = initialAddress;
_initialToken = initialToken;
_feeAddress = feeAddress;
_burnAddress = burnAddress;
_totalSupply = _totalSupply.add(initialSupply * 10 ** uint256(decimals()));
_balances[_initialAddress] = _balances[_initialAddress].add(_initialToken * 10 ** uint256(decimals()));
_currentSupply = _currentSupply.add(_initialToken * 10 ** uint256(decimals()));
emit Transfer(address(0), _initialAddress, _initialToken * 10 ** uint256(decimals()));
}
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)");
_;
}
// Update owner
function updateOwnerAddress(address newOwnerAddress) public onlyOwner notAddress0(newOwnerAddress) {
_owner = newOwnerAddress;
}
// Update burn address
function updateBurnAddress(address newBurnAddress) public onlyOwner notAddress0(newBurnAddress) {
_burnAddress = newBurnAddress;
}
// Update fee address
function updateFeeAddress(address newFeeAddress) public onlyOwner notAddress0(newFeeAddress) {
_feeAddress = newFeeAddress;
}
// Update hfcontract address
function updateHfcontractAddress(address newHfcontractAddress) public onlyOwner notAddress0(newHfcontractAddress) {
_interfacehf = newHfcontractAddress;
}
/**
* Mint token, only owner have permission
*
* Requirements:
*
* `userAddress`: to account address
* - `userToken`: reward amount
* - `feeToken`: fee amount
*/
function mint(address userAddress, uint256 userToken, uint256 feeToken) public onlyOwner{
require(userAddress != address(0), "ERC20: mint to the zero address");
require(HackerFederation(_interfacehf).isUser(userAddress), "userAddress must be user");
uint256 mintTotal = userToken.add(feeToken);
_currentSupply = _currentSupply.add(mintTotal);
require(_currentSupply <= _totalSupply, "TotalMintBalance should be less than or equal totalSupply");
_balances[_feeAddress] = _balances[_feeAddress].add(feeToken);
emit Transfer(address(0), _feeAddress, feeToken);
// mint to user
_balances[userAddress] = _balances[userAddress].add(userToken);
emit Transfer(address(0), userAddress, userToken);
}
/**
* Only owner can burn token
*
* Requirements:
*
* - `_amount`: burn amount
*/
function burnFromOwner(uint256 amount) public onlyOwner {
_totalSupply = _totalSupply.sub(amount);
_balances[_burnAddress] = _balances[_burnAddress].add(amount);
emit Transfer(address(0), _burnAddress, amount);
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
if (recipient == _burnAddress) {
_totalSupply = _totalSupply.sub(amount);
_currentSupply = _currentSupply.sub(amount);
}
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
}
{
"compilationTarget": {
"hrerc20.sol": "HE3"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"initialAddress","type":"address"},{"internalType":"uint256","name":"initialToken","type":"uint256"},{"internalType":"address","name":"feeAddress","type":"address"},{"internalType":"address","name":"burnAddress","type":"address"},{"internalType":"address","name":"hfcontract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_initialAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_initialToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_interfacehf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFromOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"userToken","type":"uint256"},{"internalType":"uint256","name":"feeToken","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBurnAddress","type":"address"}],"name":"updateBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeAddress","type":"address"}],"name":"updateFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newHfcontractAddress","type":"address"}],"name":"updateHfcontractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwnerAddress","type":"address"}],"name":"updateOwnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]