-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBlockArkToken.sol
More file actions
66 lines (50 loc) · 2.23 KB
/
BlockArkToken.sol
File metadata and controls
66 lines (50 loc) · 2.23 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
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract BlockArkToken is ERC20, Ownable {
uint256 public constant TOTAL_SUPPLY = 999 * (10**18); // Total supply of 999 tokens
address[] private members;
mapping(address => bool) private isManager;
mapping(address => uint256) private votes; // Votes per member
uint256 public constant MIN_MEMBER_HOLDING = 300 * (10**18); // Minimum holding for a Member
constructor(address[] memory initialMembers) ERC20("BlockArk Studios Token", "ARK") Ownable(msg.sender) {
require(initialMembers.length > 0, "At least one member is required");
uint256 memberCount = initialMembers.length;
uint256 tokensPerMember = TOTAL_SUPPLY / memberCount;
for (uint256 i = 0; i < memberCount; i++) {
address member = initialMembers[i];
_mint(member, tokensPerMember);
members.push(member);
isManager[member] = true;
}
}
modifier onlyMember() {
require(balanceOf(msg.sender) >= MIN_MEMBER_HOLDING, "Only members can call this function");
_;
}
modifier onlyManager() {
require(isManager[msg.sender], "Only managers can call this function");
_;
}
function vote(address _recipient) external onlyMember {
require(balanceOf(_recipient) >= MIN_MEMBER_HOLDING, "Recipient is not a member");
votes[_recipient] += balanceOf(msg.sender);
}
function getVotes(address _member) external view returns (uint256) {
return votes[_member];
}
function addManager(address _manager) external onlyMember {
require(balanceOf(_manager) >= MIN_MEMBER_HOLDING, "Address is not a member");
require(!isManager[_manager], "Address is already a manager");
isManager[_manager] = true;
}
function removeManager(address _manager) external onlyOwner {
require(isManager[_manager], "Address is not a manager");
isManager[_manager] = false;
}
function isMember(address _address) external view returns (bool) {
return balanceOf(_address) >= MIN_MEMBER_HOLDING;
}
// Additional functions and features can be added as needed
}