Created
December 17, 2021 01:32
-
-
Save twfarland/55a4c6338a4e44b3ecbe87cee0d35432 to your computer and use it in GitHub Desktop.
Role based access organisation smart contract
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: GPL-3.0 | |
pragma solidity >=0.7.0 <0.9.0; | |
// RbacOrgManager (index of orgs, invites for self) | |
// RbacOrg | |
/** | |
* @title RbacOrg | |
* @dev Autonomous organisation with role based access | |
*/ | |
enum Role { NONE, READER, EDITOR, ADMIN, OWNER } | |
struct Invitation { | |
address invitee; | |
address inviter; | |
Role role; | |
} | |
contract RbacOrg { | |
string public name; | |
string public description; | |
mapping(address => Invitation) internal invitations; | |
mapping(address => Role) internal members; | |
constructor( | |
string memory _name, | |
string memory _description | |
) { | |
name = _name; | |
description = _description; | |
members[msg.sender] = Role.OWNER; | |
} | |
function getMember(address member) public view returns (Role) { | |
return members[member]; | |
} | |
function removeMember(address member) public { | |
Role senderRole = members[msg.sender]; | |
assert(senderRole >= Role.ADMIN && senderRole >= members[member]); | |
delete members[member]; | |
} | |
function updateMember(address member, Role role) public { | |
Role senderRole = members[msg.sender]; | |
assert(senderRole >= Role.ADMIN && senderRole >= members[member] && senderRole >= role); | |
members[member] = role; | |
} | |
function invite(address invitee, Role role) public { | |
Role senderRole = members[msg.sender]; | |
assert(senderRole >= Role.ADMIN && senderRole >= role); | |
invitations[invitee] = Invitation(invitee, msg.sender, role); | |
} | |
function rescindInvitation(address invitee) public { | |
Role senderRole = members[msg.sender]; | |
assert(senderRole >= Role.ADMIN && senderRole >= invitations[invitee].role); | |
delete invitations[invitee]; | |
} | |
function acceptInvitation() public { | |
Invitation memory invitation = invitations[msg.sender]; | |
assert(invitation.invitee == msg.sender); | |
members[msg.sender] = invitation.role; | |
delete invitations[msg.sender]; | |
} | |
function rejectInvitation() public { | |
Invitation memory invitation = invitations[msg.sender]; | |
assert(invitation.invitee == msg.sender); | |
delete invitations[msg.sender]; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment