This repository contains the Community Contract, a smart contract that manages roles and permissions within a community.
- The owner can create roles and manage roles and permissions for other roles.
- When a role is granted to a user, the user obtains an NFT for each role.
- Supports the protocol of Native Meta Transactions (ERC-2771).
- Supports the ownable interface from the OpenZeppelin library, accessible to any user in the "owners" role.
- Uses the standard for representing ownership of non-fungible tokens (ERC-721) with small changes:
-
- Every person who has a role also has an NFT that represents belonging to this role. Such an NFT cannot be transferred or burnt. However, when an admin revokes a role from the user, the NFT also disappears.
You can clone the repository from GitHub:
git clone git@github.com:Intercoin/CommunityContract.git
or install it using npm:
npm i @artman325/community
Any user can create their own community by calling the produce method of the CommunityFactory contract: produce(hook, invitedHook, name, symbol).
Link for the factory below
There are 6 predefined roles:
role name | role index |
---|---|
owners |
1 |
admins |
2 |
members |
3 |
alumni |
4 |
visitors |
5 |
The owners role is a single role that can manage itself, meaning one owner can add or remove other owners.
The contract can be used as external storage for getting a list of members.
Any user obtains an NFT with tokenID = (roleid << 160) + walletaddress.
Anyone who can manage a certain role can set up the tokenURI for this role by calling setRoleURI.
Full methods for each contract can be found here: Community. The most usable methods will be described below:
method name | called by | description |
---|---|---|
grantRoles | Any role which manage "roles" | adding members to new "roles" |
revokeRoles | Any role which manage "roles" | removing members from "roles". Revert if any roles can not be managed by sender |
createRole | only `owners` | Creating new role |
manageRole | only `owners` | allow account with "byRole" setup "ofRole" to any another account |
getAddresses | anyone | Returns all accounts belong to "role" |
getRoles | anyone | Returns all roles which account belong to |
addressesCount | anyone | Returns number of all members belong to "role" |
Adds accounts to new roles. Can be called by any role that manages roles. Reverts if any roles cannot be managed by the sender.
Params:
name | type | description |
---|---|---|
accounts | address[] | account's address |
roles | uint8[] | indexes of roles |
Removes roles from certain accounts. Can be called by any role that manages roles. Reverts if any roles cannot be managed by the sender.
Params:
name | type | description |
---|---|---|
accounts | address[] | accounts's address |
roles | uint8[] | indexes of roles |
Creates a new role. Can only be called by owners.
Params:
name | type | description |
---|---|---|
role | string | name of role |
Allows an account with byRole to set up ofRole for another account with the default role (members). Can only be called by owners.
Params:
name | type | description |
---|---|---|
byRole | uint8 | index of source role |
ofRole | uint8 | index of target role |
canGrantRole | bool | if true then byRole can grant ofRole to account, overwise - disabled |
canRevokeRole | bool | if true then byRole can revoke ofRole from account, overwise - disabled |
requireRole | uint8 | target account should be in role requireRole to be able to obtain ofRole . if zero - then available to everyone |
maxAddresses | uint256 | amount of addresses that be available to grant in duration period(bucket) if zero - then no limit |
duration | uint64 | if zero - then no buckets. but if maxAddresses != 0 then it's real total maximum addresses available to grant |
Returns all accounts belonging to a role.
Params:
name | type | description |
---|---|---|
role | uint8 | index of role. |
Returns all roles that a member belongs to.
Params:
name | type | description |
---|---|---|
account | address | account's address. [optional] if not specified returned all roles |
Returns the number of all accounts belonging to a role.
Params:
name | type | description |
---|---|---|
role | uint8 | index of role. |
visit wiki