Voronoi/smart_contracts/voronoi_ERC20.sol

281 lines
10 KiB
Solidity

// SPDX-License-Identifier: Apache-2.0
// Example of Voronoi Solidity solution, by QRUCIAL OÜ
// Code state: Beta
// Coder: Six
pragma solidity ^0.8.11;
contract VoronoiToken {
string public constant name = "VoronoiERC20";
string public constant symbol = "VE2";
uint8 public constant decimals = 0;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
event major_impact_call(bool value); // Event when a Major Impact Function is called
event minor_impact_call(bool value); // Event when a Minor Impact Function is called
event function_unlock(uint256 value); // Unlock event, when a function gets unlocked, unit256 -> func ID
mapping(address => uint256) balances;
mapping(address => mapping (address => uint256)) allowed;
mapping (uint256 => address) internal unlocker_ids; // Needs to be in sync with the unlocker_ids, max 10
mapping (uint256 => uint256) internal unlocker_stakes; // Address to threshold amount (single account can have multiple)
uint256 private totalSupply_ = 100000000;
address private admin;
uint256 private _voronoi_count;
uint256 private threshold;
uint256 private _voronoi_last_time;
bool private _paused;
constructor() {
admin = msg.sender;
balances[msg.sender] = totalSupply_;
_paused = false;
_voronoi_count = 0;
threshold = 3;
_voronoi_last_time = block.timestamp;
unlocker_ids[0] = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
unlocker_ids[1] = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;
unlocker_ids[2] = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
unlocker_ids[3] = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;
unlocker_ids[4] = 0x617F2E2fD72FD9D5503197092aC168c91465E7f2;
unlocker_ids[5] = 0x1aE0EA34a72D944a8C7603FfB3eC30a6669E454C;
unlocker_ids[6] = 0x583031D1113aD414F02576BD6afaBfb302140225;
unlocker_ids[7] = 0x583031D1113aD414F02576BD6afaBfb302140225;
unlocker_ids[8] = 0x0A098Eda01Ce92ff4A4CCb7A4fFFb5A43EBC70DC;
unlocker_ids[9] = 0x0A098Eda01Ce92ff4A4CCb7A4fFFb5A43EBC70DC;
unlocker_stakes[0] = 1;
unlocker_stakes[1] = 1;
unlocker_stakes[2] = 1;
unlocker_stakes[3] = 1;
unlocker_stakes[4] = 1;
unlocker_stakes[5] = 1;
unlocker_stakes[6] = 1;
unlocker_stakes[7] = 1;
unlocker_stakes[8] = 1;
unlocker_stakes[9] = 1;
}
function voronoi_stake_up() external returns (bool success){
emit minor_impact_call(true);
require(msg.sender == unlocker_ids[0] ||
msg.sender == unlocker_ids[1] ||
msg.sender == unlocker_ids[2] ||
msg.sender == unlocker_ids[3] ||
msg.sender == unlocker_ids[4] ||
msg.sender == unlocker_ids[5] ||
msg.sender == unlocker_ids[6] ||
msg.sender == unlocker_ids[7] ||
msg.sender == unlocker_ids[8] ||
msg.sender == unlocker_ids[9]);
if (msg.sender == unlocker_ids[0]){
require(unlocker_stakes[0] == 1);
unlocker_stakes[0] = 0;
}
else if (msg.sender == unlocker_ids[1]) {
require(unlocker_stakes[1] == 1);
unlocker_stakes[1] = 0;
}
else if (msg.sender == unlocker_ids[2]) {
require(unlocker_stakes[2] == 1);
unlocker_stakes[2] = 0;
}
else if (msg.sender == unlocker_ids[3]) {
require(unlocker_stakes[3] == 1);
unlocker_stakes[3] = 0;
}
else if (msg.sender == unlocker_ids[4]) {
require(unlocker_stakes[4] == 1);
unlocker_stakes[4] = 0;
}
else if (msg.sender == unlocker_ids[5]) {
require(unlocker_stakes[5] == 1);
unlocker_stakes[5] = 0;
}
else if (msg.sender == unlocker_ids[6]) {
require(unlocker_stakes[6] == 1);
unlocker_stakes[6] = 0;
}
else if (msg.sender == unlocker_ids[7]) {
require(unlocker_stakes[7] == 1);
unlocker_stakes[7] = 0;
}
else if (msg.sender == unlocker_ids[8]) {
require(unlocker_stakes[8] == 1);
unlocker_stakes[8] = 0;
}
else if (msg.sender == unlocker_ids[9]) {
require(unlocker_stakes[9] == 1);
unlocker_stakes[9] = 0;
}
_voronoi_count = _voronoi_count + 1;
return true;
}
function vcheck_stake(uint256 _idToCheck) external view returns(uint256 success){
return unlocker_stakes[_idToCheck];
}
function vcheck_count() external view returns(uint256 success){
return _voronoi_count;
}
function v_reset() external returns (bool success){
emit major_impact_call(true);
require(msg.sender == unlocker_ids[0] ||
msg.sender == unlocker_ids[1] ||
msg.sender == unlocker_ids[2] ||
msg.sender == unlocker_ids[3] ||
msg.sender == unlocker_ids[4] ||
msg.sender == unlocker_ids[5] ||
msg.sender == unlocker_ids[6] ||
msg.sender == unlocker_ids[7] ||
msg.sender == unlocker_ids[8] ||
msg.sender == unlocker_ids[9]);
require(block.timestamp >= _voronoi_last_time + 1 minutes); // You can only do it once every hour to secure voting logic
_voronoi_last_time = block.timestamp;
_voronoi_count = 0;
unlocker_stakes[0] = 1;
unlocker_stakes[1] = 1;
unlocker_stakes[2] = 1;
unlocker_stakes[3] = 1;
unlocker_stakes[4] = 1;
unlocker_stakes[5] = 1;
unlocker_stakes[6] = 1;
unlocker_stakes[7] = 1;
unlocker_stakes[8] = 1;
unlocker_stakes[9] = 1;
return true;
}
function unlocker_role_change(uint256 _id, address _new_unlocker) external returns (bool){
emit major_impact_call(true);
require(msg.sender == unlocker_ids[0] ||
msg.sender == unlocker_ids[1] ||
msg.sender == unlocker_ids[2] ||
msg.sender == unlocker_ids[3] ||
msg.sender == unlocker_ids[4] ||
msg.sender == unlocker_ids[5] ||
msg.sender == unlocker_ids[6] ||
msg.sender == unlocker_ids[7] ||
msg.sender == unlocker_ids[8] ||
msg.sender == unlocker_ids[9]);
require(_voronoi_count >= threshold);
unlocker_ids[_id] = _new_unlocker;
return true;
}
function pause() external returns (bool success) {
emit major_impact_call(true);
require(msg.sender == unlocker_ids[0] ||
msg.sender == unlocker_ids[1] ||
msg.sender == unlocker_ids[2] ||
msg.sender == unlocker_ids[3] ||
msg.sender == unlocker_ids[4] ||
msg.sender == unlocker_ids[5] ||
msg.sender == unlocker_ids[6] ||
msg.sender == unlocker_ids[7] ||
msg.sender == unlocker_ids[8] ||
msg.sender == unlocker_ids[9]);
emit major_impact_call(true);
require(_voronoi_count >= threshold);
_paused = true;
return _paused;
}
function unpause() external returns (bool success) {
emit major_impact_call(true);
require(msg.sender == unlocker_ids[0] ||
msg.sender == unlocker_ids[1] ||
msg.sender == unlocker_ids[2] ||
msg.sender == unlocker_ids[3] ||
msg.sender == unlocker_ids[4] ||
msg.sender == unlocker_ids[5] ||
msg.sender == unlocker_ids[6] ||
msg.sender == unlocker_ids[7] ||
msg.sender == unlocker_ids[8] ||
msg.sender == unlocker_ids[9]);
emit major_impact_call(true);
require(_voronoi_count >= threshold);
_paused = false;
return _paused;
}
function adminChange(address newAdmin) external returns (address to) {
emit major_impact_call(true);
require(msg.sender == unlocker_ids[0] ||
msg.sender == unlocker_ids[1] ||
msg.sender == unlocker_ids[2] ||
msg.sender == unlocker_ids[3] ||
msg.sender == unlocker_ids[4] ||
msg.sender == unlocker_ids[5] ||
msg.sender == unlocker_ids[6] ||
msg.sender == unlocker_ids[7] ||
msg.sender == unlocker_ids[8] ||
msg.sender == unlocker_ids[9]);
emit major_impact_call(true);
require(_voronoi_count >= threshold);
require(address(newAdmin) != address(0));
admin = newAdmin;
return newAdmin;
}
function totalSupply() external view returns (uint256) {
return totalSupply_;
}
function balanceOf(address _owner) external view returns (uint256 balance) {
return balances[_owner];
}
function transfer(address _to, uint256 _value) external returns (bool success) {
emit minor_impact_call(true);
require(_paused == false);
require(_value <= balances[msg.sender]);
balances[msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) external returns (bool success) {
emit minor_impact_call(true);
require(_paused == false);
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) external returns (bool success) {
emit minor_impact_call(true);
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) external view returns (uint remaining) {
return allowed[_owner][_spender];
}
function adminWithdraw() external returns (bool success) {
emit major_impact_call(true);
require(msg.sender == admin, "Not authorized");
require(_voronoi_count >= threshold);
payable(msg.sender).transfer(address(this).balance);
return true;
}
fallback() external payable {}
receive() external payable {}
}