pragma solidity ^0.5.0; import "./Roles.sol"; contract ERC20Interface{ function totlasupply() public view returns(uint); function balanceOf (address tokenOwner) public view returns(uint balance); function transfer(address to, uint tokens) public returns(bool success); function allowance(address TokenOwner, address spender) public view returns(uint remaining); function approve(address spender, uint token) public returns(bool success); function transferFrom(address from, address to, uint token) public returns(bool success); event Transfer(address indexed from, address indexed to,uint tokens); event Approval(address indexed tokenOwner,address indexed spender,uint token); } contract Crypto is ERC20Interface{ using Roles for Roles.Role; Roles.Role private Deployer; Roles.Role private admins; Roles.Role private publishers; Roles.Role private voters; Roles.Role private solvers; Roles.Role private guests; string public name="StackCoin"; string public symbol="STC"; uint public decimals=0; uint public supply; address public founder; uint public minAmountPublisher=1000; uint public minAmountSolver=800; uint public minAmountVoter=500; event Transfer(address indexed from, address indexed to,uint tokens); constructor ()public{ supply=1000000; founder=msg.sender; Deployer.add(founder); balances[founder]=supply; } mapping(address=>uint) public balances; mapping(address=>mapping(address=>uint)) public allowed; //add admins function addAdmins(address _newAdmin) external onlyDeployer(){ admins.add(_newAdmin); } modifier onlyDeployer(){ require(Deployer.has(msg.sender),"Only Deployer can add Admins"); _; } //add guests function addGuest() external{ guests.add(msg.sender); } //verify guests function verifyGuest() external view returns(bool){ return guests.has(msg.sender); } //add publisher function addPublisher() external{ require(balances[msg.sender]>=minAmountPublisher); balances[msg.sender]-=minAmountPublisher; balances[founder]+=minAmountPublisher; publishers.add(msg.sender); } //verify publisher function verifyPublisher() external view returns(bool){ return publishers.has(msg.sender); } //add solvers function addSolver() external{ require(balances[msg.sender]>=minAmountSolver); balances[msg.sender]-=minAmountSolver; balances[founder]+=minAmountSolver; solvers.add(msg.sender); } //verify solvers function verifySolver() external view returns(bool){ return solvers.has(msg.sender); } //add voters function addVoter() external{ require(balances[msg.sender]>=minAmountVoter); balances[msg.sender]-=minAmountVoter; balances[founder]+=minAmountVoter; voters.add(msg.sender); } //verify voters function verifyVoter() external view returns(bool){ return voters.has(msg.sender); } function allowance(address TokenOwner, address spender) public view returns(uint remaining){ return allowed[TokenOwner][spender]; } function approve(address spender, uint tokens) public returns(bool){ require(balances[msg.sender]>= tokens); require(tokens>0); allowed[msg.sender][spender] = tokens; // emit Approval(msg.sender,spender,tokens); return true; } function transferFrom(address from, address to, uint token) public returns(bool){ require(allowed[from][to]>= token); require(balances[from]>=token); balances[from]-=token; balances[to]+=token; allowed[from][to]-=token; return true; } function totlasupply() public view returns(uint){ return supply; } function balanceOf (address tokenOwner) public view returns(uint balance){ return balances[tokenOwner]; } function transfer(address to, uint tokens) public returns(bool success){ require(balances[msg.sender]>=tokens && tokens>0); balances[to]+=tokens; balances[msg.sender]-=tokens; emit Transfer(msg.sender,to,tokens); return true; } }
0.4.18